import numpy as np
import librosa
import os
from sklearn.metrics.pairwise import cosine_similarity
# 1. 设置路径
test_audio_path = "./test_audio.wav" # 用户上传的音频文件
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. 输出相似度最高的音色文件
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}")