ByteCover算法核心复现代码

jinhezx2周前python17
# 安装依赖: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}")


相关文章

Windows下安装Flask

Flask介绍是一个轻量级的 Web应用框架, 使用 Python编写。基于 Werkzeug WSGI工具箱和 Jinja2 模板引擎。 Flask使用 BSD 授权。Flask也被称为 “micr...

纯音乐库特征提取

# 安装musly(Python绑定) pip install musly-python # 安装FAISS(CPU版,GPU版需单独编译) pip install faiss-cpu...