民乐团扒谱机头像
关注

【超详细】一文搞懂 MIREX 旋律提取竞赛:算法架构、评估指标与实战踩坑指南

1 MIREX 赛事起源与旋律提取的核心定义

1.1 什么是 MIREX 音乐信息检索评估大赛

音乐信息检索评估大赛(Music Information Retrieval Evaluation eXchange,简称 MIREX)是 ACM ISMIR 顶级学术会议旗下的国际权威赛事。自 2005 年创办以来,MIREX 相当于音频 signal processing 与 AI 音频领域的“ImageNet 竞赛”。赛事每年吸引来自全球顶尖高校(如 NYU MARL、QMUL C4DM、清华、浙大)以及工业界音视频巨头的研发团队同台竞技。

竞赛涵盖了音乐自动采谱、歌曲风格分类、和弦识别、节拍追踪以及音频 fingerprint 等数十个赛道。其中,Audio Melody Extraction(音频旋律提取) 始终是竞争最激烈、含金量最高的赛道之一。

1.2 旋律提取与 Pitch Tracking / Music Transcription 的区别

许多刚接触音频处理的开发者容易混淆 旋律提取(Melody Extraction)基音追踪(Pitch Tracking) 以及 自动音乐采谱(Automatic Music Transcription, AMT)。厘清三者的边界,是搞懂算法设计的第一步:

  • 基音追踪(Pitch Tracking):针对单声部(Monophonic)音频(如单独的独唱或单簧管演奏),提取随时间变化的基频 f 0 f_0 f0
  • 旋律提取(Melody Extraction):针对多声部复杂的混合音频(Polyphonic, 包含伴奏、鼓点、合音),精准定位并提取出主导旋律声部(Lead Melody) 的连续轨迹,并判断主旋律在何处发声(Voicing Detection)。
  • 自动音乐采谱(AMT):将音频直接转换为离散的乐谱事件(Note-level: 音符起始点、终止点、音高),相当于生成 MIDI 文件。

旋律提取不仅要解决多音高叠置带来的谐波干扰,还要在复杂伴奏中识别出“哪一个是主旋律”,属于 Frame-level(帧级别)的连续频率估算任务。

1.3 MIREX 旋律提取赛道的评估基准与数据集

MIREX 官方对旋律提取的测试集有严格的评测标准,经典评估数据集包括:

  • ADC2006 & MIREX05:早期的经典测试集,主要包含流行、爵士和古典乐片段。
  • MedleyDB:包含多轨道 RAW 音频和高精度人工标注的强监督数据集,是现代深度学习模型训练与评估的标准库。
  • Indian / Chinese Traditional Music Sub-dataset:针对民族音乐等特殊调式与滑音(Portamento)特征的测试集。

官方评测程序使用由 mir_eval 库定义的五大核心评价指标(在后文将详细展开计算公式),算法需要上传至 MIREX 官方服务器,在隐藏测试集上进行盲测。


2 音频信号特征提取与传统 DSP 算法演进

2.1 时频分析基础:STFT 与 CQT 的物理 Trade-off

音频信号的时域波形无法直接用于旋律提取,必须通过时频变换将其投影到时频图(Spectrogram)上。常用的两种变换方法各有优劣:

短时傅里叶变换(STFT) 的频率分辨率是固定的,公式为:

X ( m , ω ) = ∑ n = − ∞ ∞ x [ n ] w [ n − m ] e − j ω n X(m,\omega)=\sum_{n=-\infty}^{\infty}x[n]w[n-m]e^{-j\omega n} X(m,ω)=n=x[n]w[nm]ejωn

由于海森堡不确定性原理,STFT 的窗长 w [ n ] w[n] w[n] 决定了时频分辨率的权衡:窗口越长,频率分辨率越高,但时间分辨率越差。对于音乐信号而言,高音区与低音区所需的频率分辨率不同,STFT 在低频区(如低音吉他、贝斯与男低音)的频率分辨率往往不够,容易产生频谱泄露。

恒定 Q 变换(CQT, Constant-Q Transform) 则完美契合了人类听觉与十二平均律。CQT 的中心频率按对数等间隔分布,滤波器品质因数 Q Q Q 保持恒定:

Q = f k δ f k Q=\frac{f_k}{\delta f_k} Q=δfkfk

在低频段,CQT 拥有极高的频率分辨率(能够清晰区分半音);在高频段,CQT 拥有极高的解析时间分辨率。因此,对数频域下的 CQT 特征图 是传统 DSP 算法和早期神经网络的绝对首选输入。

2.2 传统信号处理框架:Salience Map 构造与峰值检索

在深度学习爆发之前,MIREX 旋律提取的主流方案基于显著性图(Salience Map) 架构,如经典的 Pitch-based 方法(如 DeCheveigné 的 YIN 算法扩展版、Salamon 的 Melodia 算法)。

第一步:谐波汇总与显著性图计算
音高(Pitch)通常由基频 f 0 f_0 f0 和多个倍频谐波(Harmonics, 2 f 0 , 3 f 0 , 4 f 0 … 2f_0, 3f_0, 4f_0 \dots 2f0,3f0,4f0)组成。传统算法通过对能量谱进行倍频叠加累加求和,增强 f 0 f_0 f0 处的能量强度,构建出时间-频率显著性矩阵:

S ( t , f ) = ∑ m = 1 M w m ⋅ ∣ X ( t , m ⋅ f ) ∣ S(t, f)=\sum_{m=1}^{M} w_m \cdot\vert{}X(t, m \cdot f)\vert{} S(t,f)=m=1MwmX(t,mf)

其中 w m w_m wm 为不同谐波次数的加权系数,通常随谐波次数增加而衰减。

第二步:连续轨迹连接(Contours Tracking)
在显著性图上提取局部极大值峰值,并基于平滑性假设(音高在相邻帧间不会发生剧烈跳变)通过动态规划或贪心跟踪,将孤立的 f 0 f_0 f0 候选点连接成连续的 Pitch Contours。

2.3 主音识别与声音活动检测(Voicing Detection)

仅找到能量最大的 Pitch 轨迹是不够的,伴奏中的间奏(Solo)、长音或打击乐常被误判为旋律。因此,传统算法必须搭配 Voicing Detection 模块:算法需要计算每个时间帧的能量均方根(RMS)谐波噪声比(HNR) 以及谱滚降点(Spectral Roll-off)。当某一帧的谐波特征过弱或整体能量低于动态阈值时,该帧被判定为 Non-Voiced(无主唱/无旋律帧),输出 f 0 = 0 f_0 = 0 f0=0 Hz。


3 深度学习时代的主流模型架构拆解

3.1 基于 CNN 与 U-Net 的 Semantic Segmentation 范式

随着深度学习引入音乐信号处理,MIREX 旋律提取彻底转向了图像语义分割范式。将音频的时频谱图视为单通道图像,输入矩阵尺寸为 ( T i m e , F r e q u e n c y ) (Time, Frequency) (Time,Frequency),模型的任务是对每一个像素点进行分类(属于基频 f 0 f_0 f0 的概率)。

经典架构 1:Fully Convolutional Networks (FCN)
以 DenseNet 或 U-Net 为骨干网络,通过多层卷积与残差连接,自适应抽取高阶时频语义。网络输入为 CQT 谱图,输出层为同样大小的二值 Mask 或热力图(Heatmap)。

经典架构 2:CREPE (Convolutional Representation for Pitch Estimation)
CREPE 直接输入原始时域采样点(Raw Audio),利用深层一维卷积(Conv1D)自适应学习滤波器组。虽然 CREPE 最初设计用于单声部,但其架构经多通道扩展后被广泛用于多声部旋律提取的前级特征编码

3.2 兼顾时序上下文的 CRNN 与 Transformer 建模

旋律具有强烈的时序连续性与音乐上下文关联,单凭 CNN 的局部感受野容易在声音交叠处产生连续性断裂。CRNN(Convolutional Recurrent Neural Network) 成为 MIREX 竞赛中的高分常客架构:

  1. 前端 CNN:提取局部时频空间的谐波与纹理特征,降低空间维度;
  2. 中端 BiLSTM / GRU:在时间轴上进行双向建模,利用前后的音乐上下文纠正单帧误判(如捕获颤音 Vibrato 的完整轨迹);
  3. 后端 MLP:映射到具体的频率 Bin。

近年来,以 FT-Transformer (Frequency-Time Transformer) 为代表的注意力机制模型开始崭露头角。通过交叉注意(Cross-Attention)分别在频率轴和时间轴上计算依赖关系,能够在全曲范围内建模声部间的动态竞争,显著提升了密集伴奏下的旋律提取精度。

3.3 FTANet / FT-UNet 等高分 SOTA 模型的创新机制

以近年在 MIREX 取得顶级名次的 FTANet (Frequency-Time Attention Network) 为例,其核心突破在于解决了传统卷积在频率轴上的平移不变性假设(Translation Invariance)与音乐频谱真实属性的冲突。

在图像处理中,猫在图片左上角右下角的特征是一致的(平移不变性)。但在音频频谱图中,低频区和高频区具有完全不同的物理特性(例如低频区半音间隔对应的绝对 Hz 数极小,高频区则极大)。

FTANet 引入了 Frequency-Attention(频率注意力机制),针对不同的频段动态分配卷积权重,并在解码器端采用 Grouped Convolution 与多尺度特征融合,极大缓解了跨频段音高误判(如八度错判)的顽疾。


4 官方评估指标解析与 mir_eval 评估实战

4.1 MIREX 5 大核心评估指标数学定义

在 MIREX 竞赛中,算法生成的 f 0 f_0 f0 序列(时间点, 频率值)将与专家人工标注的 Ground Truth (GT) 进行逐帧比对。容忍误差通常设定为 ± 50 \pm 50 ±50 Cents(即半个半音 / 0.5 semitone 内算准确)

下表详细定义了 5 项核心指标(设 V g t V_{gt} Vgt 为真值发声帧集合, V e s t V_{est} Vest 为预测发声帧集合):

指标名称简称数学定义与物理意义
Voicing Recall RateVR发声召回率:GT 中有旋律的帧,模型正确预测为“有旋律”的比例。 VR = ∥ V g t ∩ V e s t ∥ ∥ V g t ∥ \text{VR} = \frac{\Vert{}V_{gt} \cap V_{est}\Vert{}}{\Vert{}V_{gt}\Vert{}} VR=VgtVgtVest
Voicing False Alarm RateVFA发声误报率:GT 中无旋律(纯伴奏/静音)的帧,模型误判为“有旋律”的比例。 VFA = ∥ V e s t ∖ V g t ∥ Total Non-Voiced Frames \text{VFA} = \frac{\Vert{}V_{est} \setminus V_{gt}\Vert{}}{\text{Total Non-Voiced Frames}} VFA=Total Non-Voiced FramesVestVgt
Raw Pitch AccuracyRPA原始音高准确率:在 GT 与预测均为发声 的帧中,预测音高在 GT 的 ± 50  Cents \pm 50 \text{ Cents} ±50 Cents 范围内的比例(忽略八度错误)。
Raw Chroma AccuracyRCA原始音度准确率:在 GT 与预测均为发声 的帧中,将预测音高和 GT 映射回同一个八度内(取模 12 半音),误差在 ± 50  Cents \pm 50 \text{ Cents} ±50 Cents 内的比例。
Overall AccuracyOA综合准确率(终极排名指标):全曲范围内,音高预测正确且 Voicing 判断正确的总帧数占总帧数的比例。
4.2 mir_eval 工具库调用实战代码

在工程实践中,我们不需要手动编写繁琐的指标判断逻辑,推荐直接使用 MIREX 官方指定的 Python 工具库 mir_eval。以下为完整的评估脚本:

import numpy as np
import mir_eval

def evaluate_melody_predictions(ref_time, ref_freq, est_time, est_freq):
    """
    使用 mir_eval 计算 MIREX 官方旋律提取指标
    
    :param ref_time: np.ndarray, Ground Truth 时间戳数组 (秒)
    :param ref_freq: np.ndarray, Ground Truth 频率数组 (Hz, <=0 表示无旋律帧)
    :param est_time: np.ndarray, 模型预测时间戳数组 (秒)
    :param est_freq: np.ndarray, 模型预测频率数组 (Hz, <=0 表示无旋律帧)
    :return: dict, 包含 VR, VFA, RPA, RCA, OA 的评估结果
    """
    # 确保输入数据类型为 float64 且一维
    ref_time = np.ascontiguousarray(ref_time, dtype=np.float64)
    ref_freq = np.ascontiguousarray(ref_freq, dtype=np.float64)
    est_time = np.ascontiguousarray(est_time, dtype=np.float64)
    est_freq = np.ascontiguousarray(est_freq, dtype=np.float64)

    # 依据 MIREX 规范重新插值对齐时间轴(采样步长通常为 10ms)
    (ref_v, ref_p, est_v, est_p) = mir_eval.melody.resample_melody_series(
        ref_time, ref_freq, est_time, est_freq, cent_tolerance=50.0
    )

    # 计算各项核心指标
    vr, vfa = mir_eval.melody.voicing_measures(ref_v, est_v)
    rpa = mir_eval.melody.raw_pitch_accuracy(ref_v, ref_p, est_v, est_p, cent_tolerance=50.0)
    rca = mir_eval.melody.raw_chroma_accuracy(ref_v, ref_p, est_v, est_p, cent_tolerance=50.0)
    oa = mir_eval.melody.overall_accuracy(ref_v, ref_p, est_v, est_p, cent_tolerance=50.0)

    results = {
        "Voicing Recall (VR)": vr,
        "Voicing False Alarm (VFA)": vfa,
        "Raw Pitch Accuracy (RPA)": rpa,
        "Raw Chroma Accuracy (RCA)": rca,
        "Overall Accuracy (OA)": oa
    }
    
    return results

# 测试用例演示
if __name__ == "__main__":
    # 模拟 1 秒的数据,帧间隔 10ms (100帧)
    times = np.linspace(0.0, 1.0, 100)
    
    # 真实标注:前 80 帧为 440Hz (A4),后 20 帧无旋律 (0Hz)
    ground_truth_f0 = np.array([440.0 if i < 80 else 0.0 for i in range(100)])
    
    # 模型预测:前 75 帧预测正确,中间有微弱偏移,后 25 帧有误报
    prediction_f0 = np.array([442.0 if i < 75 else (220.0 if i < 85 else 0.0) for i in range(100)])

    metrics = evaluate_melody_predictions(times, ground_truth_f0, times, prediction_f0)
    
    for k, v in metrics.items():
        print(f"**{k}**: {v * 100:.2f}%")


5 工程落地遇到的经典痛点与避坑指南

5.1 八度错判(Octave Error)的根源与平滑后处理方案

八度错判(Octave Doubling/Halving) 是音频领域最顽固的 Bug。由于声学物理特性,基频 f 0 f_0 f0 与二次谐波 2 f 0 2f_0 2f0 或下八度 0.5 f 0 0.5f_0 0.5f0 在频域上具有极高的泛音重合度。神经网络在训练时,极易将高音女声识别为其下八度,或将低音男声判为其上八度。

优化方案:基于 Viterbi 算法的隐马尔可夫模型(HMM)后处理
模型预测输出不直接取 argmax,而是输出所有频率 Bin 的概率分布向量 P t ( f ) P_t(f) Pt(f)。构建动态规划状态转移矩阵,引入物理约束:

C ( f t , f t − 1 ) = λ ⋅ log ⁡ ( 1 + ∣ log ⁡ 2 ( f t f t − 1 ) ∣ ) C(f_t, f_{t-1}) = \lambda \cdot \log\left(1 + \left\vert{} \log_2\left(\frac{f_t}{f_{t-1}}\right) \right\vert{}\right) C(ft,ft1)=λlog(1+ log2(ft1ft) )

惩罚跨帧间的剧烈音高跳变(尤其是 12 12 12 个半音即倍频的跃迁),使用 Viterbi 算法求解全局最优路径,可瞬间规避 80% 以上的孤立八度跳变点。

5.2 泛音列干扰与多乐器混音消融技巧

当伴奏中存在强谐波乐器(如长笛、小提琴或失真电吉他)时,其泛音能量往往超过演唱者的主唱基频。

工程落地建议:源信号分离(Source Separation)预处理
不要直接将原始混合音频传入旋律提取模型!在工业级 Pipeline 中,先调用 SpleeterDemucsOpen-Unmix 将原始音频拆解为 Vocals(人声)与 Acc(伴奏)。

将提取出的 Vocals 轨道单独喂给旋律提取网络,即使分离出的 Vocal 轨道带有少许伪影(Artifacts),模型对人声基频的捕捉准确率(RPA)也能直线上升 10%~15%。

5.3 连续滑音(Portamento)与颤音(Vibrato)的拟合策略

传统音乐学中的音高是离散的(如 MIDI 键位),但人类演唱过程包含大量的滑音与颤音,频率变化呈现连续的正弦波弧线。

如果网络的离散分类 Bin 粒度太粗(例如半音级别,100 Cents 一个 Bin),预测出的轨迹就会出现阶梯状的断层离散化,导致 RPA 大幅下降。

最佳实践:粗粒度分类 + 细粒度回归(Classification-Regression Hybrid)
网络输出分为两个 Head:

  1. Classification Head:将 31 Hz 到 2050 Hz 划分为 360 个 Cents 级分类 Bin(每 20 Cents 一个 Bin),预测音高区间;
  2. Regression Head:预测目标偏移量 Δ f ∈ [ − 10 , + 10 ]  Cents \Delta f \in [-10, +10] \text{ Cents} Δf[10,+10] Cents

最终预测频率公式为:

f f i n a l = f b i n _ c e n t e r + Δ f f_{final} = f_{bin\_center} + \Delta f ffinal=fbin_center+Δf

该策略既保留了分类交叉熵损失函数(Cross-Entropy)收敛快、抗噪强优势,又具备了连续回归对滑音和细微颤音的精准捕捉能力。


与图像或文本领域不同,音频旋律提取是一个融合了深度学习与经典声学信号处理的复合型赛道。从时频分辨率的确定,到模型架构的设计,再到 Viterbi 后处理与源分离的辅助,每一步都需要对音频物理特性有深刻的理解。

你在音频处理或旋律提取项目开发中遇到过哪些奇葩的坑?欢迎在评论区留言交流!

转载自 CSDN-专业IT技术社区

原文链接:https://blog.csdn.net/Harrytutu_ZuiYue/article/details/163801650

文章来源转载

评论

赞0

评论列表

微信小程序
QQ小程序

关于作者

点赞数:0
关注数:0
粉丝:0
文章:0
关注标签:0
加入于:--