如何将音频谱图距离矩阵转换为关联文件名的字典?
解决方案
核心逻辑
距离矩阵的行/列索引和你传入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
相关产品推荐
相关产品推荐

