3. 语音识别系统架构
好,我们进入特征提取环节。说实话,很多做语音识别的同学,模型调得飞起,但一问到前端特征是怎么来的,就有点含糊了。我个人觉得,特征提取是语音识别里最容易被低估的一环。你模型再强,喂进去的特征是脏的、信息丢失的,那后面再怎么折腾也是白搭。
这一章我们重点聊三个东西:MFCC、FBank,以及Delta与Delta-Delta特征。它们之间的关系,说白了就是一条流水线——从原始波形到最终能喂给模型的“干净”特征。
核心观点:特征提取不是简单的“抄作业”,每一步参数的选择都直接影响识别精度。理解每个环节的物理意义,比死记硬背公式重要得多。
3.1 从波形到频谱:预处理回顾
在进入MFCC之前,我们先快速过一遍前置步骤。这些步骤在上一章已经详细讲过,这里只提几个关键点,方便你理解后面的特征是怎么来的。
- 预加重:提升高频能量,补偿语音信号在传播过程中的高频衰减。我习惯用系数0.97,效果比较稳。
- 分帧:语音是非平稳信号,但短时间(20-40ms)内可以看作平稳的。帧长25ms,帧移10ms,这是工业界的黄金参数。
- 加窗:汉明窗,减少频谱泄漏。嗯,这里要注意,窗函数的选择会影响旁瓣抑制效果,但汉明窗在大多数场景下够用了。
- FFT:将时域信号转换到频域,得到每一帧的频谱。
做完这些,我们得到的是每一帧的幅度谱。接下来,就是MFCC和FBank的分水岭了。
3.2 MFCC特征详解
MFCC,全称Mel频率倒谱系数。名字挺长,但核心思想很简单:模拟人耳的听觉特性。人耳对频率的感知不是线性的,低频敏感,高频迟钝。Mel刻度就是用来描述这种非线性关系的。
MFCC的提取流程,我画了一张图,你可以对照着看:
流程走到FFT之后,我们得到的是线性频率的幅度谱。接下来,Mel滤波器组登场了。它是一组三角滤波器,在Mel刻度上等间距分布,但在线性频率上却是低频密、高频疏。每个滤波器与幅度谱相乘,得到一个能量值。
取对数这一步,很多人不理解为什么。其实很简单:人耳对声音响度的感知是对数级的。你想想看,音量翻一倍,人耳感觉并没有翻一倍。取对数就是模拟这个特性。
最后一步是DCT(离散余弦变换)。这一步的目的是去相关。FBank特征相邻维度之间相关性很强,DCT可以把能量集中到前几个系数上。通常我们取12-13个MFCC系数,加上第0个(能量项),一共13维。
我的经验:MFCC的维度不是越多越好。我曾经在项目里试过取20维MFCC,结果识别率反而下降了。因为后面的系数包含的更多是噪声和细节,对识别反而是干扰。13维是经过大量实践验证的黄金数字。
3.3 FBank特征对比
FBank,全称Filter Bank,中文叫滤波器组特征。它和MFCC的区别,就在DCT这一步。
看上面的流程图,MFCC在取对数之后做了DCT,而FBank不做DCT。就这么简单。
那为什么还要用FBank?我直接说结论:深度学习时代,FBank正在取代MFCC。
| 对比维度 | MFCC | FBank |
|---|---|---|
| 维度 | 13维(常用) | 40-80维(常用) |
| DCT | 有 | 无 |
| 相关性 | 低(去相关) | 高(相邻维度相关) |
| 信息量 | 有损(DCT丢弃了部分信息) | 无损(保留全部频谱信息) |
| 适用模型 | GMM-HMM(传统模型) | DNN/CNN/Transformer(深度学习模型) |
| 噪声鲁棒性 | 较好(DCT去噪) | 较差(保留噪声) |
为什么深度学习模型更喜欢FBank?因为DNN、CNN这些模型自己会学去相关。你想想看,MFCC通过DCT强行去相关,相当于替模型做了一次特征筛选。但模型自己学到的筛选,往往比人工规则更优。所以,把原始信息保留下来,让模型自己去决定哪些有用,效果反而更好。
避坑指南:我曾经在一个远场语音识别项目里,直接套用MFCC,结果识别率惨不忍睹。后来换成FBank,配合CNN前端做特征提取,识别率直接提升了5个点。但要注意,FBank维度高,模型参数量会增大,训练时间也会变长。这是一个trade-off。
3.4 Delta与Delta-Delta特征
好,现在我们已经有了MFCC或FBank特征。但这些都是静态特征——每一帧独立计算,没有考虑帧与帧之间的变化。
语音是连续的,前后帧之间有很强的关联。比如一个音素的发音,会持续好几帧,而且能量、频率都在变化。静态特征捕捉不到这种动态信息。怎么办?引入Delta特征。
Delta特征,说白了就是一阶差分。它计算当前帧与前后帧的差异,反映特征的变化趋势。
公式很简单:
Delta(t) = (c(t+1) - c(t-1)) / 2
其中c(t)是第t帧的静态特征(比如MFCC系数)。这个公式计算的是前后帧的斜率。你想想看,如果特征在上升,Delta就是正的;下降就是负的;平稳就是0。
Delta-Delta特征,就是二阶差分,对Delta再做一次差分。它反映的是加速度,也就是变化率的变化。
通常,我们使用39维MFCC:13维静态 + 13维Delta + 13维Delta-Delta。这是语音识别领域最经典的特征配置。
关键理解:Delta特征捕捉的是“变化”,Delta-Delta捕捉的是“变化的快慢”。这两个特征让模型能够感知语音的动态过程,而不仅仅是静态的快照。
3.5 实践中的参数选择
说了这么多理论,最后给一些实际参数建议。这些是我在多个项目里验证过的,你可以直接参考。
| 参数 | 推荐值 | 说明 |
|---|---|---|
| 帧长 | 25ms | 太短频率分辨率不够,太长平稳假设失效 |
| 帧移 | 10ms | 保证帧之间有重叠,信息连续 |
| FFT点数 | 512或1024 | 取决于采样率,16kHz用512,8kHz用256 |
| Mel滤波器数量 | 40(FBank)或 23(MFCC) | FBank用40,MFCC用23然后降到13 |
| MFCC维度 | 13 | 包含第0个能量系数 |
| Delta窗口 | 2帧(前后各1帧) | 窗口越大,平滑越强,但会丢失细节 |
我的习惯:在安静环境下,我倾向于用MFCC+Delta+Delta-Delta的39维配置。但在噪声环境下,我会换成FBank,让模型自己去学习鲁棒的特征表示。没有绝对的好坏,关键看场景。