4. 开发环境搭建
说到语音特征提取,MFCC 绝对是个绕不开的名字。我刚开始做唤醒词项目时,第一反应就是「先提 MFCC 再说」。为什么大家都用它?说白了,它模仿了人耳听声音的方式。
你想想看,人耳并不是一个平坦的麦克风。它对低频敏感,对高频越来越迟钝。MFCC 就是抓住了这个特性,把声音信号映射到「人耳听起来是什么样的」空间里。这样一来,模型学到的特征就更贴近我们实际感知的声音。
4.1 人耳听觉特性:为什么需要梅尔尺度?
先问一个问题:1kHz 到 2kHz 的变化,和 10kHz 到 11kHz 的变化,人耳听起来一样吗?
答案是否定的。人耳对低频的分辨率远高于高频。100Hz 到 200Hz 的变化我们听得清清楚楚,但 10kHz 到 10.1kHz 的变化几乎感觉不到。
梅尔尺度(Mel Scale)就是用来描述这种非线性关系的。它的公式长这样:
Mel(f) = 2595 * log10(1 + f / 700)
嗯,不用死记硬背。你只需要知道:梅尔尺度把物理频率映射到了「人耳感知频率」上。低频段拉伸,高频段压缩,这样每个梅尔单位对应的感知变化就均匀了。
核心理解:MFCC 之所以有效,是因为它先做了梅尔尺度的非线性映射,再去提取特征。这一步让特征更符合人耳的听觉习惯,模型学起来也更轻松。
我在项目中遇到过一个问题:直接用线性频率做特征,模型在安静环境下还行,一有背景噪声就崩。换成 MFCC 后,鲁棒性明显提升。原因就是梅尔尺度天然抑制了高频噪声的影响。
4.2 MFCC 提取流程:一步步拆解
MFCC 的提取流程看起来步骤多,但每一步都有它的道理。我习惯把它分成 7 个阶段:
- 预加重 — 提升高频能量,补偿口唇辐射损失
- 分帧 — 把长信号切成短段,通常 20-40ms 一帧
- 加窗 — 减少帧边界处的频谱泄漏
- FFT — 把时域信号转到频域
- 梅尔滤波器组 — 按梅尔尺度做三角滤波
- 取对数 — 模拟人耳对响度的对数感知
- DCT — 去相关,压缩维度
下面这张图把整个流程串起来了:
4.2.1 预加重
语音信号的高频能量通常比低频低很多。预加重就是用一个简单的高通滤波器把高频抬起来。公式是:
y[n] = x[n] - α * x[n-1]
α 通常取 0.97 左右。我习惯用 0.97,效果稳定。
4.2.2 分帧与加窗
语音信号是非平稳的,但在很短的时间内(比如 20ms)可以看作平稳。所以我们把它切成帧。帧长一般 20-40ms,帧移 10ms 左右。
加窗是为了避免 FFT 时出现频谱泄漏。常用的窗函数有汉明窗(Hamming Window):
w[n] = 0.54 - 0.46 * cos(2πn / (N-1))
我的经验:帧长选 25ms,帧移 10ms,汉明窗,这套参数在大多数唤醒词场景下都够用。不用纠结,先跑起来再说。
4.2.3 FFT 与梅尔滤波器组
对每一帧做 FFT,得到频谱。然后通过梅尔滤波器组,把线性频率映射到梅尔尺度上。
滤波器组通常用 26 到 40 个三角滤波器。每个滤波器的中心频率在梅尔尺度上是等间距的,但在线性频率上低频密、高频疏。
4.2.4 取对数与 DCT
取对数有两个作用:一是模拟人耳对响度的对数感知,二是把乘性噪声变成加性噪声,方便后续处理。
DCT(离散余弦变换)的作用是去相关。梅尔滤波器组的输出是相关的,DCT 可以把能量集中到前几个系数上。通常我们只取前 13 个系数作为 MFCC 特征。
注意:DCT 之后得到的第一个系数(MFCC_0)代表帧能量,通常保留。但有些场景下会去掉它,因为能量信息容易受音量影响。我建议先保留,看效果再决定。
4.3 MFCC 在语音识别中的作用
MFCC 在语音识别中的地位,有点像「标准接口」。几乎所有主流系统都用它作为前端特征。为什么?
- 去相关性强 — DCT 后的系数相关性低,适合用 GMM、HMM 等模型处理
- 抗噪性好 — 梅尔尺度的非线性映射天然抑制了高频噪声
- 维度可控 — 通常 13 维,加上一阶差分、二阶差分也就 39 维,计算量小
- 跨场景泛化 — 不同说话人、不同麦克风录制的语音,MFCC 的分布相对稳定
我记得有一次做唤醒词模型,用原始波形直接训练,准确率只有 85% 左右。换成 MFCC 后,同样的模型结构,准确率直接跳到 93%。这就是特征工程的力量。
4.4 一阶差分与二阶差分
单帧的 MFCC 只包含静态信息。但语音是动态的,前后帧的变化也很重要。所以我们通常会加上一阶差分(Delta)和二阶差分(Delta-Delta)。
一阶差分的计算很简单:
ΔMFCC[t] = (MFCC[t+1] - MFCC[t-1]) / 2
二阶差分就是对一阶差分再做一次差分。
最终的特征维度通常是 13(静态)+ 13(一阶差分)+ 13(二阶差分)= 39 维。这个 39 维的向量就是大多数语音识别系统的标准输入。
总结一下:MFCC 的核心价值在于它模拟了人耳的听觉特性,把物理频率映射到感知频率,再通过 DCT 去相关得到紧凑的特征。对于唤醒词模型来说,MFCC 是最稳妥的起点。我建议你先用 39 维 MFCC 跑通流程,再考虑要不要尝试其他特征。
嗯,这一章的内容就到这。MFCC 虽然看起来步骤多,但每一步都有明确的物理意义。你只要理解了「梅尔尺度模拟人耳」这个核心思想,后面的细节就都好办了。