3. 特征提取工程(上):MFCC特征详解、FBank特征对比、Delta与Delta-Delta特征

好,我们进入特征提取环节。说实话,很多做语音识别的同学,模型调得飞起,但一问到前端特征是怎么来的,就有点含糊了。我个人觉得,特征提取是语音识别里最容易被低估的一环。你模型再强,喂进去的特征是脏的、信息丢失的,那后面再怎么折腾也是白搭。

这一章我们重点聊三个东西:MFCC、FBank,以及Delta与Delta-Delta特征。它们之间的关系,说白了就是一条流水线——从原始波形到最终能喂给模型的“干净”特征。

核心观点:特征提取不是简单的“抄作业”,每一步参数的选择都直接影响识别精度。理解每个环节的物理意义,比死记硬背公式重要得多。

3.1 从波形到频谱:预处理回顾

在进入MFCC之前,我们先快速过一遍前置步骤。这些步骤在上一章已经详细讲过,这里只提几个关键点,方便你理解后面的特征是怎么来的。

  • 预加重:提升高频能量,补偿语音信号在传播过程中的高频衰减。我习惯用系数0.97,效果比较稳。
  • 分帧:语音是非平稳信号,但短时间(20-40ms)内可以看作平稳的。帧长25ms,帧移10ms,这是工业界的黄金参数。
  • 加窗:汉明窗,减少频谱泄漏。嗯,这里要注意,窗函数的选择会影响旁瓣抑制效果,但汉明窗在大多数场景下够用了。
  • FFT:将时域信号转换到频域,得到每一帧的频谱。

做完这些,我们得到的是每一帧的幅度谱。接下来,就是MFCC和FBank的分水岭了。

3.2 MFCC特征详解

MFCC,全称Mel频率倒谱系数。名字挺长,但核心思想很简单:模拟人耳的听觉特性。人耳对频率的感知不是线性的,低频敏感,高频迟钝。Mel刻度就是用来描述这种非线性关系的。

MFCC的提取流程,我画了一张图,你可以对照着看:

MFCC特征提取流程图 MFCC特征提取流程 预加重 分帧 + 加窗 FFT Mel滤波器组 取对数 (log) DCT MFCC系数 关键说明: • Mel滤波器组:模拟人耳听觉特性,低频密集、高频稀疏 • 取对数:压缩动态范围,更符合人耳对响度的感知 • DCT:去相关,将能量集中到前几个系数

流程走到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,让模型自己去学习鲁棒的特征表示。没有绝对的好坏,关键看场景。