基于librosa的MFCC的音色相似度检测程序
https://gitee.com/h128/sound-color-similar-detect
import numpy as np import librosa import os import sys from sklearn.metrics.pairwise import cosine_similarity # 1. 设置路径 test_audio_path = sys.argv[1] # 用户上传的音频文件 sound_library_path = "./sound_library/" # 你的音色库目录 # 2. 加载用户音频并获取 MFCC y_test, sr_test = librosa.load(test_audio_path, sr=None) mfcc_test = librosa.feature.mfcc(y=y_test, sr=sr_test, n_mfcc=13).mean(axis=1) # 将 MFCC 转为一维向量 # 3. 遍历音色库并提取 MFCC,计算相似度 similarities = {} # 存储每个音色文件的相似度 for filename in os.listdir(sound_library_path): if filename.endswith(".wav"): # 只处理 WAV 文件 file_path = os.path.join(sound_library_path, filename) y_lib, sr_lib = librosa.load(file_path, sr=None) # 确保采样率一致(可选) if sr_lib != sr_test: y_lib = librosa.resample(y_lib, sr_lib, sr_test) mfcc_lib = librosa.feature.mfcc(y=y_lib, sr=sr_test, n_mfcc=13).mean(axis=1) # 计算余弦相似度 similarity = cosine_similarity([mfcc_test], [mfcc_lib])[0][0] similarities[filename] = similarity # 4. 输出相似度最高的音色文件 范围[-1, 1] """ 1:两个向量方向完全相同(即非常相似) 0:两个向量正交(无相似) -1:两个向量方向完全相反(非常不相似) """ similarities_sorted = sorted(similarities.items(), key=lambda x: x[1], reverse=True) print("发现相似度最高的音色匹配:") for name, score in similarities_sorted[:5]: # 打印前5个最相似的 print(f"{name}: {score:.4f}") if score >= 0.95: print(f"{name} 和{sys.argv[1]} 非常相似") elif score >= 0.5: print(f"{name} 和{sys.argv[1]} 中等相似") elif score == 0.3: print(f"{name} 和{sys.argv[1]} 有一定不相似性") elif socre == 0: print(f"{name} 和{sys.argv[1]} 完全不相似")

浙公网安备 33010602011771号