3、语音信号处理基础:采样与量化、时域与频域分析、MFCC特征提取原理
好,咱们进入正题。这一章讲的是语音信号处理的基础,说白了就是——怎么把声音变成机器能看懂的数字,再从中提炼出有用的信息。很多做嵌入式部署的朋友,一上来就急着调模型,结果发现效果差得离谱。为什么?因为前端的信号处理没做好。我踩过这个坑,所以今天咱们把这块掰开揉碎了讲清楚。
3.1 采样与量化:从连续到离散
声音本质上是连续的机械波。但计算机只认0和1。所以第一步,就是把连续信号变成离散信号。这个过程分两步:采样和量化。
3.1.1 采样:多久取一个点?
采样,就是每隔一段时间,记录一下声音的幅度值。这个时间间隔叫采样周期,它的倒数就是采样率。
这里有个铁律——奈奎斯特采样定理:采样率必须大于信号最高频率的两倍,否则就会发生混叠。混叠是什么?就是高频信号伪装成低频信号混进来,你根本分不清。
举个例子:人声的频率范围大约在300Hz到3400Hz。电话系统用8kHz采样,刚好能覆盖。但如果你要处理音乐,或者做高精度语音识别,我建议用16kHz。我在一个智能音箱项目里,一开始偷懒用了8kHz,结果识别率死活上不去。后来换成16kHz,问题迎刃而解。嗯,这里要注意,采样率不是越高越好,越高数据量越大,对边缘设备不友好。
- 语音识别常用采样率:16kHz(平衡精度与计算量)
- 电话语音:8kHz
- 高保真音频:44.1kHz或48kHz
3.1.2 量化:用多少位来存?
采样确定了时间轴上的点,但每个点的幅度值还是连续的。量化,就是用有限个离散的等级去近似这个连续值。
量化位深决定了精度。16位量化,就是把幅度范围分成65536个等级。8位量化,只有256个等级。你想想看,等级越少,误差越大,这个误差就是量化噪声。
我个人习惯,在嵌入式设备上做语音识别,至少用16位量化。8位量化虽然省存储,但信噪比太差,识别率会明显下降。我曾经在一个低功耗项目里试过8位,结果模型在安静环境下还行,一有背景噪声就崩了。
| 量化位深 | 动态范围 | 适用场景 |
|---|---|---|
| 8位 | 48 dB | 对讲机、低端玩具 |
| 16位 | 96 dB | 语音识别、音乐 |
| 24位 | 144 dB | 专业录音、高保真 |
3.2 时域与频域分析:从波形到频谱
拿到离散信号后,我们怎么分析它?两个视角:时域和频域。
3.2.1 时域分析:看波形
时域就是看信号随时间怎么变化。最直观的就是波形图。我们能从波形里看出什么?
- 短时能量:计算一帧内所有采样点的平方和。能量高,说明是语音段;能量低,可能是静音或噪声。我在做端点检测时,就用这个来区分说话和停顿。
- 过零率:一帧内信号穿过零轴的次数。清音(如/s/、/f/)的过零率高,浊音(如/a/、/o/)的过零率低。这个特征在区分音素时很有用。
- 自相关:用来找信号的周期性。基频检测就靠它。
时域分析简单直观,但信息量有限。你想想看,两个完全不同的乐器同时发声,波形混在一起,你根本分不清谁是谁。这时候就需要频域分析。
3.2.2 频域分析:看频谱
频域分析的核心工具是傅里叶变换。它能把时域信号分解成不同频率的正弦波。说白了,就是告诉你信号里有哪些频率成分,每个成分有多强。
实际应用中,我们用的是短时傅里叶变换(STFT)。为什么?因为语音信号是非平稳的,它的频率特性随时间变化。STFT的做法是:把信号切成一小段一小段(叫“帧”),假设每帧内信号是平稳的,然后对每一帧做傅里叶变换。
帧长怎么选?我一般用25ms,帧移10ms。这样相邻帧有重叠,能保证连续性。帧长太短,频率分辨率低;帧长太长,时间分辨率低。这是个权衡。
# 伪代码:STFT计算流程
1. 将信号分帧,每帧25ms,帧移10ms
2. 对每帧加窗(汉明窗),减少频谱泄漏
3. 对加窗后的每帧做FFT(快速傅里叶变换)
4. 取幅度谱或功率谱
5. 得到时频图(语谱图)
3.3 MFCC特征提取原理:语音识别的“标准答案”
好了,现在我们有了频谱。但直接用频谱做识别,维度太高,而且不符合人耳的听觉特性。人耳对频率的感知不是线性的,而是对低频更敏感,对高频不敏感。MFCC(梅尔频率倒谱系数)就是模拟人耳听觉的一套特征。
3.3.1 梅尔刻度:把频率“掰弯”
梅尔刻度是一种非线性频率刻度。公式是:
Mel(f) = 2595 * log10(1 + f/700)
你看,低频区域(0-1000Hz),梅尔刻度变化快,分辨率高;高频区域,变化慢,分辨率低。这正好匹配人耳的听觉特性。
3.3.2 MFCC提取步骤
MFCC的提取流程,我建议你背下来。因为这是语音识别最经典的前端处理流程,几乎所有模型都用它。
- 预加重:提升高频分量。语音信号的高频能量通常比低频弱,预加重可以平衡一下。公式:
y[n] = x[n] - 0.97 * x[n-1]。这个0.97是经验值,我一般不动它。 - 分帧加窗:前面讲过了,帧长25ms,帧移10ms,加汉明窗。
- FFT:对每帧做FFT,得到幅度谱。
- 梅尔滤波器组:用一组三角滤波器,在梅尔刻度上等间隔排列,对幅度谱做滤波。每个滤波器的输出,就是该频带的能量。滤波器数量通常取20-40个。我常用26个。
- 取对数:对每个滤波器的输出取对数。这模拟了人耳对声音强度的对数感知。
- DCT(离散余弦变换):对对数能量做DCT,得到倒谱系数。通常取前12-13个系数。为什么取前几个?因为DCT有去相关和能量集中的作用,后面的系数包含的语音信息少,更多是噪声。
- 动态特征:加上一阶差分和二阶差分,捕捉语音的动态变化。最终特征维度通常是39维(13个静态 + 13个一阶差分 + 13个二阶差分)。
3.3.3 为什么MFCC在边缘设备上这么流行?
你可能会问,现在深度学习这么强,直接用原始波形或者频谱图不行吗?行,但代价高。MFCC有几个好处:
- 维度低:39维 vs 几百维的频谱,计算量小很多。
- 去相关:DCT去除了特征之间的相关性,让模型更容易学习。
- 鲁棒性:对噪声和信道变化有一定容忍度。
我在一个Cortex-M4芯片上做过对比:用MFCC做关键词唤醒,模型大小只有20KB,推理一次只要5ms。如果用原始波形,模型大小翻倍,推理时间也翻倍。对于资源受限的设备,MFCC几乎是唯一的选择。
小结
这一章我们讲了语音信号处理的三个核心环节:采样与量化、时域与频域分析、MFCC特征提取。采样决定了信号的保真度,量化决定了信号的精度,时域分析简单直观,频域分析揭示频率成分,MFCC则是语音识别最经典的特征。
下一章,我们会把这些知识串起来,在嵌入式设备上实现一个完整的语音前端处理流水线。到时候,我会手把手带你写代码,把理论变成能跑的程序。
公众号:蓝海资料掘金营,微信deep3321