# 安装依赖:pip install librosa numpy scipy
import librosa
import numpy as np
from sklearn.decomposition import PCA
from scipy.spatial.distance import cosine
def bytecover_feature_extract(audio_path, n_mfcc=20, pca_components=16):
"""
ByteCover核心特征提取函数
1. 加载音频,提取MFCC+色度特征(对应旋律核心特征)
2. PCA降维压缩(对应原文PCA-FC模块,提速8倍)
3. 输出标准化ByteCover特征向量
"""
# 1. 音频加载与预处理(固定采样率,适配抖音识曲标准)
y, sr = librosa.load(audio_path, sr=22050, mono=True)
# 去除静音片段,过滤噪音
y_trimmed, _ = librosa.effects.trim(y, top_db=20)
# 2. 提取核心声学特征(ByteCover核心:保留旋律,忽略变速变调干扰)
# MFCC特征(音色+旋律)
mfcc = librosa.feature.mfcc(y=y_trimmed, sr=sr, n_mfcc=n_mfcc)
mfcc_mean = np.mean(mfcc, axis=1)
# 色度特征(音高/旋律核心,翻唱变调不变)
chroma = librosa.feature.chroma_stft(y=y_trimmed, sr=sr)
chroma_mean = np.mean(chroma, axis=1)
# 拼接特征
feature = np.concatenate([mfcc_mean, chroma_mean])
# 3. PCA降维(ByteCover核心提速模块,压缩特征维度)
pca = PCA(n_components=pca_components)
# 适配单样本维度
feature_pca = pca.fit_transform(feature.reshape(1, -1))
# 标准化
feature_norm = feature_pca / np.linalg.norm(feature_pca)
return feature_norm.flatten()
def bytecover_match(feature1, feature2, threshold=0.15):
"""
ByteCover特征匹配函数
计算余弦相似度,阈值判断是否为同一首歌(翻唱/原版)
threshold:相似度阈值,越小匹配越严格
返回:匹配结果+相似度分数
"""
similarity = 1 - cosine(feature1, feature2)
is_match = similarity > threshold
return is_match, round(similarity, 4)
# ------------------- 运行示例 -------------------
if __name__ == "__main__":
# 替换为你的音频文件路径(支持wav/mp3,mp3需安装ffmpeg)
original_audio = "原版歌曲.wav"
cover_audio = "翻唱/改编版本.wav"
# 提取ByteCover特征
feat_original = bytecover_feature_extract(original_audio)
feat_cover = bytecover_feature_extract(cover_audio)
# 匹配比对
match_result, score = bytecover_match(feat_original, feat_cover)
print(f"匹配结果:{'同一首歌(翻唱/改编)' if match_result else '不同歌曲'}")
print(f"相似度分数:{score}")