4. 数据采集与标注
上一讲我们把特征提取的前半段讲完了,包括预加重、分帧、加窗和FFT。今天咱们继续往下走,把剩下的三个关键环节啃下来:VAD端点检测、降噪算法、以及特征归一化与增强。
说实话,这三个环节在学术界经常被一笔带过,但在工业级系统里,它们往往是决定识别精度上限的“隐形杀手”。我见过太多团队花几个月调声学模型,结果发现是前端VAD没做好,把静音段当语音送进去了——那损失,真让人心疼。
4.1 VAD端点检测:别让静音浪费算力
VAD的全称是Voice Activity Detection,说白了就是判断“这段音频里到底有没有人说话”。
你想想看,如果一段录音里只有30%是有效语音,剩下70%是背景噪声或静音,你把全部数据都送进识别引擎,不仅浪费算力,还会引入大量误判。
4.1.1 传统VAD方法
早期VAD主要靠手工特征加阈值判断。我刚开始做语音识别时,用的就是这套方法。常用的特征有:
- 短时能量:语音段的能量通常高于静音段,简单粗暴但有效。
- 过零率:清音(如/s/、/f/)的过零率高,浊音(如/a/、/o/)的过零率低,可以用来区分语音类型。
- 频谱熵:语音的频谱分布更集中,噪声的频谱更分散,熵值有差异。
但传统方法有个致命问题——阈值难调。环境一变,阈值就得重新标定。我在一个车载项目里吃过这个亏,白天和晚上的噪声底噪完全不同,固定阈值根本扛不住。
4.1.2 基于能量和过零率的双门限法
这是传统VAD里最经典的一种,至今在一些轻量级场景下还在用。它的思路是:
- 先计算每帧的短时能量和过零率。
- 设定两个门限:高门限(确定进入语音段)和低门限(确定退出语音段)。
- 用“状态机”来平滑判决结果,避免频繁跳变。
// 伪代码示例:双门限VAD
if (energy > high_threshold) {
state = SPEECH;
} else if (energy < low_threshold) {
state = SILENCE;
} else {
// 滞回区,保持上一状态
state = previous_state;
}
4.1.3 基于深度学习的VAD
现在的主流方案基本都转向了DNN-VAD。用神经网络直接对每帧做二分类(语音/非语音)。
常用的模型结构包括:
- DNN:输入MFCC或Fbank特征,输出两分类概率。
- LSTM/GRU:利用时序信息,效果更好,但计算量稍大。
- CRNN:卷积+循环,兼顾局部特征和时序依赖。
我记得有一次做远场语音识别,传统VAD在信噪比低于5dB时基本就废了。换成LSTM-VAD后,即使信噪比降到0dB,准确率还能保持在85%以上。这就是深度学习的威力。
4.2 降噪算法:把干净语音从噪声里“捞”出来
降噪是语音识别前端的重头戏。你想想看,如果麦克风采集到的信号里混着空调声、风扇声、马路上的车流声,识别引擎再强也白搭。
降噪算法有很多种,这里我重点讲两个最经典的:谱减法和维纳滤波。
4.2.1 谱减法
谱减法的思路非常直观:假设噪声是平稳的,先估计一段纯噪声的频谱,然后从带噪语音的频谱中减去它。
数学上可以写成:
|S(ω)|² = |Y(ω)|² - α · |N(ω)|²
其中|Y(ω)|²是带噪语音的功率谱,|N(ω)|²是估计的噪声功率谱,α是减法因子(通常取1~2)。
但谱减法有个臭名昭著的副作用——音乐噪声。减过头了,频谱上会出现一些孤立的尖峰,听起来像“吱吱吱”的电子音。我曾经在一个项目里被这个折磨了两周,后来发现加一个频谱平滑后处理能缓解不少。
4.2.2 维纳滤波
维纳滤波比谱减法更“聪明”一些。它不直接减噪声,而是估计一个最优滤波器,让滤波后的信号与干净语音的均方误差最小。
维纳滤波器的频域表达式为:
H(ω) = P_s(ω) / [P_s(ω) + P_n(ω)]
其中P_s(ω)是语音功率谱,P_n(ω)是噪声功率谱。你看,当信噪比高时(P_s远大于P_n),H(ω)接近1,滤波器几乎不衰减;当信噪比低时,H(ω)接近0,滤波器把这一频段压掉。
维纳滤波的优点是音乐噪声比谱减法少很多,但它需要提前知道语音和噪声的功率谱——这在现实中是未知的。所以实际工程中,我们通常用迭代维纳滤波,先估计一个初始值,然后反复迭代优化。
| 对比项 | 谱减法 | 维纳滤波 |
|---|---|---|
| 原理 | 直接减噪声谱 | 最小均方误差估计 |
| 音乐噪声 | 较严重 | 较轻 |
| 计算复杂度 | 低 | 中 |
| 噪声平稳性要求 | 高 | 中 |
| 适用场景 | 稳态噪声、低算力设备 | 中等噪声、对音质有要求 |
4.3 特征归一化与增强:让特征更“规整”
特征提取完了,但不同说话人、不同录音设备、不同环境下的特征分布差异很大。如果不做归一化,模型就会学到这些无关的差异,而不是真正的语音内容。
4.3.1 均值归一化(CMN)
CMN(Cepstral Mean Normalization)是最常用的归一化方法。它对每个特征维度减去该维度的均值,让特征分布的中心对齐到0。
公式很简单:
ŝ(t) = s(t) - μ
其中μ是整个句子或滑动窗口内的均值。
CMN能有效消除信道效应和说话人差异。我做过一个实验,在电话语音识别任务中,加上CMN后,字错误率直接降了3~5个百分点。效果非常显著。
4.3.2 方差归一化(CVN)
CMN只调整了均值,但不同维度的方差也可能不同。CVN(Cepstral Variance Normalization)在CMN的基础上,再除以标准差,让每个维度的方差都变成1。
ŝ(t) = (s(t) - μ) / σ
CMN+CVN合起来就是倒谱均值方差归一化,很多语音识别系统的标配。
4.3.3 特征增强:不止是归一化
除了归一化,还有一些特征增强技巧:
- Delta和Delta-Delta:计算特征的一阶和二阶差分,捕捉动态变化。比如MFCC的Delta特征能反映音调的变化趋势。
- VTLN(声道长度归一化):对不同说话人的声道长度差异做补偿,让特征更一致。
- fMLLR(特征空间最大似然线性回归):用自适应数据学习一个线性变换,把特征空间对齐到标准空间。
我记得在做一个多语种识别项目时,不同语种的说话人声道差异很大。加上VTLN后,识别率提升了将近10%。这个提升幅度让我印象很深。
4.4 本章知识体系总览
下面这张图把本章的核心逻辑串起来了。你可以看到,从原始音频到最终的特征向量,中间经过了VAD、降噪、归一化三个关键环节,每个环节都有多种技术可选。
嗯,到这里,特征提取工程的核心内容就讲完了。从VAD到降噪再到归一化,每一步都有它的道理,也都有它的坑。希望你在实际项目中能少踩几个坑,多提几个百分点。