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

 

image

 

posted on 2025-12-21 20:54  小沙盒工作室  阅读(0)  评论(0)    收藏  举报