参数设置
采样频率 F_s = 16000 Hz,帧长 N = 512,预加重系数 α = 0.97。噪声由确定性 LCG 生成。
MFCC 提取流程
从上到下:输入信号 x[n](蓝)/功率谱 |X[k]|²(绿)/梅尔滤波器组对数能量 log E_m(橙)/MFCC 系数 c_n(红)
理论与主要公式
MFCC 把「模拟人耳的梅尔尺度」与「倒谱分析」相结合,对语音信号进行压缩。处理顺序为:预加重 → 加窗 → DFT → 梅尔滤波器组 → 取对数 → DCT。
预加重提升高频(α ≈ 0.97):
$$y[n] = x[n] - \alpha\,x[n-1]$$
对加汉明窗后的 N 个样本做 DFT,得到功率谱 $|X[k]|^2$。梅尔尺度变换:
$$m(f) = 2595\,\log_{10}\!\left(1 + \frac{f}{700}\right)$$
在梅尔轴上等间隔放置 M 个三角梅尔滤波器 $H_m$,得到对数滤波器组能量:
$$\log E_m = \log\!\left(\sum_{k} H_m[k]\,|X[k]|^2\right)$$
最后通过 DCT 得到倒谱系数:
$$c_n = \sum_{m=0}^{M-1} \log E_m \cdot \cos\!\left(\frac{\pi n (m+\tfrac{1}{2})}{M}\right)$$
DCT 的作用是分离对数频谱的「包络(声道)」与「精细结构(声带)」。低阶 c_n 对应声道形状,高阶 c_n 对应声带振动。
MFCC 特征模拟器是什么
🙋
老听到「语音识别」,但电脑总不会拿原始波形直接来比对吧?
🎓
看得很准。同一个「啊」,因说话人、声调和录音环境不同,原始波形完全不一样。所以我们要把它转换成「特征向量」——一组数值,使得音素更容易区分。MFCC(Mel-Frequency Cepstral Coefficients,梅尔频率倒谱系数)就是一种经典而强大的特征。上面的模拟器把波形→频谱→梅尔对数→DCT 这四个阶段以四张堆叠的图直观地展示出来。
🎓
人耳对低频敏感,对高频迟钝。1000 Hz 与 2000 Hz 的差距感觉很大,但 6000 Hz 与 7000 Hz 的差距几乎听不出来。梅尔尺度就是模拟这种听觉特性的非线性轴,定义为 $m(f) = 2595\,\log_{10}(1 + f/700)$。看第三张图,滤波器在低频段密集、高频段稀疏,正是这种设计。
🙋
最后的 DCT 是为了什么?取对数之后还要再变换一次?
🎓
DCT 兼具「压缩」与「分离」两个作用。对数梅尔频谱里混杂着声道形状(包络)与声带振动(精细结构)。经过 DCT 之后,缓变成分——声道形状——会进入低阶系数,而快变成分——声带——则进入高阶系数。识别音素主要靠声道形状,所以只取前 12~13 个就够了。把模拟器中的 L 从 4 调到 20,可以看到后半部分的系数都很小,承载的信息少。
🙋
原来如此。把梅尔滤波器数量 M 调到 10,第三张图的柱子就少了。M 调得太小会有问题吗?
🎓
完全正确。M 决定频谱分辨率。10 太粗,音素之间细微的区别会被抹掉。调到 40 分辨率虽高,但相邻滤波器的相关性变强,后面的 DCT 就显得冗余了。实际中 20~40 之间比较合适,特别是 26 和 40 用得最多。一边改 M 一边对比第三和第四张图,就能体会到这种取舍。
常见问题
由于声带激励的影响,语音信号的能量集中在低频,高频以约 -6 dB/oct 的速率衰减。预加重 $y[n] = x[n] - \alpha x[n-1]$(α ≈ 0.97)是一种高频提升滤波器,用来补偿这种斜率,避免后续频谱表示中高频的音素信息(特别是辅音)被淹没。
DFT 假设信号是周期的,所以截取有限长帧时,两端的不连续会在频谱中产生伪高频成分(频谱泄漏)。汉明窗是一种把帧两端平滑下降到 0 的锥形窗,能大幅降低泄漏并锐化主成分的峰。窗函数的选择(汉明、汉宁、Blackman 等)是峰锐度与旁瓣的折中。
三角形之所以被广泛采用,是因为计算简单,并且在梅尔轴上很容易让相邻滤波器各重叠一半。物理上它近似了人耳「临界带宽」对应的频带积分,每个滤波器对应一条听觉通道。换成高斯型或矩形也几乎不影响结果,三角形是工程上的折中。
不同麦克风、房间混响和信道响应会在对数谱上添加直流偏置,使整个 MFCC 整体偏移。CMVN 在一段语音或几秒的窗口内,对 MFCC 各维度减去均值再除以标准差,从而得到对信道不变的特征。在生产环境中它几乎是必备的后处理,可以大幅提升对说话人和录音条件失配的鲁棒性。
实际应用
自动语音识别(ASR):HMM-GMM 时代的标准前端是每 10 ms 提取 13 维 MFCC + Δ + ΔΔ 共 39 维向量,并送入声学模型。在如今广泛使用的 Kaldi 等语音识别工具包中,MFCC 仍是默认的基本特征。
说话人识别与声纹核验:说话人的声道形状与声带特性会强烈反映在 MFCC 的包络中。从经典的 GMM-UBM、i-vector 到现代的 x-vector 等说话人嵌入方法,许多都使用 MFCC 作为输入特征。手机的「OK Google」「Hey Siri」等说话人相关唤醒词检测内部也使用类似特征。
音乐信息处理:在乐器音色识别、流派分类、乐曲相似度检索中,MFCC 也是基础特征。某些音乐指纹算法也将 MFCC 作为辅助特征组合使用。Librosa 等 Python 音乐分析库默认提供 MFCC 提取函数。
异常声检测与预测性维护:在监测机械声音的 CAE 周边领域,MFCC 是把时间波形压缩为低维特征的一种有效手段。旋转机械的轴承故障、电力设备的电晕放电、汽车发动机的爆震检测等「人靠耳朵就能听出差异」的任务,常用 MFCC 特征实现自动化。
常见误解与注意事项
最常见的误解是把 MFCC 当成「频率谱本身」。MFCC 是对数频谱再做一次 DCT 后的「倒谱」。其横轴并不是频率,而是被称为 quefrency 的时间维度。低阶 c_n 描述对数频谱的整体形状(声道),高阶 c_n 描述快速变化(声带音高、噪声)。请把模拟器第三张图(log E_m)与第四张图(c_n)对照来看——虽然两者纵轴都是对数能量,但横轴的物理含义完全不同。
其次常见的错误是认为「帧长 N 越大越准」。本模拟器固定 N = 512(约 32 ms),这是语音处理的典型值。N 太长会让一帧内出现多个音素或浊音/清音的过渡,特征变模糊;太短则低频分辨率不足。实际工程中通常采用 20~30 ms 的帧长配合 10 ms 的帧移,兼顾时间与频率分辨率。
最后请注意,不要盲目相信「MFCC 是万能的语音特征」。MFCC 是与线性预测、傅里叶变换并列的经典特征,但近年的端到端神经语音识别中,对数梅尔语谱图(log-mel spectrogram,去掉 DCT 的同一流程)甚至原始波形被越来越多地直接输入。DCT 的降维带来计算量与参数数目的优势,但也舍弃了高阶信息。MFCC、log-mel 还是原始波形哪个最合适,需要根据任务、计算资源和模型结构来判断。