You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将音频谱图距离矩阵转换为关联文件名的字典?

解决方案

核心逻辑

距离矩阵的行/列索引和你传入full_distance_matrix的谱图列表ls的索引完全对应。只要维护一个和ls顺序一致的文件名列表,就能把矩阵中的距离值和音频文件一一关联。

具体步骤

1. 维护文件名与谱图的对应关系

生成谱图列表时,同步保存对应的文件名列表,确保两者顺序严格匹配:

# 示例:假设已完成音频转谱图的步骤
spectrograms = [spec_a, spec_b, spec_c]  # 传入full_distance_matrix的ls参数
filenames = ["audio_a.wav", "audio_b.wav", "audio_c.wav"]  # 顺序必须与spectrograms完全一致

2. 生成距离矩阵

调用你的函数生成矩阵:

dist_matrix = full_distance_matrix(spectrograms)

3. 转换为文件名关联的字典

根据需求选择以下两种字典格式:

格式1:所有两两文件对的距离字典(键为文件名元组)

pairwise_dist_dict = {}
for i in range(len(filenames)):
    for j in range(len(filenames)):
        if i != j:  # 可选:排除文件与自身的距离(通常为0)
            # 用元组存储文件对,例如("audio_a.wav", "audio_b.wav")
            pairwise_dist_dict[(filenames[i], filenames[j])] = dist_matrix[i][j]

格式2:每个文件对应其他所有文件的嵌套字典

file_dist_dict = {fname: {} for fname in filenames}
for i, fname_i in enumerate(filenames):
    for j, fname_j in enumerate(filenames):
        if i != j:
            file_dist_dict[fname_i][fname_j] = dist_matrix[i][j]

原函数注释翻译(中文)

def full_distance_matrix(ls, dtw_func=dfw, method=euclidean, n_jobs=-1, weight=1.):
    """
    给定数组列表ls,计算列表中元素的两两距离。
    """
    assert len(set([_.ndim for _ in ls])) == 1, '所有元素必须具有相同的维度'
    assert len(set([_.shape[-1] for _ in ls])) == 1, '列表中元素的最后一维大小必须相同'

    with Parallel(n_jobs=n_jobs) as par:
        results = par(delayed(dtw_func)(ls[i], ls[j], method=method, weight=weight)
            for i in range(1, len(ls))
                for j in range(i))
        # print(results)
    results = scipy.spatial.distance.squareform(results)
    return results

内容的提问来源于stack exchange,提问作者Tom

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.21 23:42:50