基于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]} 完全不相似")
