语音基础:音频信号表示、采样率、帧长、步长、MFCC与Mel频谱特征提取原理
TinyML语音模型(如唤醒词检测、关键词识别)的输入并非原始音频波形,而是经过一系列数字信号处理(DSP)后得到的特征图。理解音频从“连续声波”到“二维特征张量”的转换链路,是选择模型结构(小型CNN或DS-CNN)的前提。本章将拆解这条链路中的五个核心环节:音频信号在计算机中的表示方式、采样率与量化精度、分帧与步长的物理意义、Mel频谱的计算逻辑,以及MFCC(Mel频率倒谱系数)与Mel频谱的适用场景差异。
音频信号在计算机中的表示:从连续声波到离散序列
声音本质是空气压力的周期性变化。麦克风将这种机械振动转换为连续的电信号(模拟信号),而计算机只能处理离散的数值序列。因此,第一步是采样(Sampling)和量化(Quantization)。采样是在时间轴上等间隔地“截取”信号幅度值,量化则是将这些幅度值映射到有限的整数集合。例如,以16kHz采样率、16bit量化精度录制1秒音频,得到16000个采样点,每个采样点取值范围为-32768到32767。在TinyML场景中,常见的采样率配置为8kHz(电话语音)或16kHz(宽带语音),量化精度通常为16bit或8bit(用于内存受限设备)。
分帧与步长:将长序列切分为短时平稳片段
语音信号具有短时平稳性:在10-30ms的时间窗口内,声道的形状和激励信号可视为近似不变。因此,需要将连续采样点切分为固定长度的“帧”。帧长(Window Length)通常取20-30ms,对应16kHz采样率下为320-480个采样点。步长(Hop Length)是相邻两帧起始点之间的间隔,通常取帧长的50%-75%(即10-20ms),以保证帧与帧之间有重叠,避免丢失帧边界处的瞬态信息。
分帧操作会产生频谱泄漏,因此每帧数据需乘以窗函数(如汉明窗、汉宁窗)。窗函数的作用是平滑帧边缘,降低旁瓣能量。以16kHz采样率、帧长30ms(480点)、步长20ms(320点)为例,1秒音频可产生约49帧((16000-480)/320 + 1 ≈ 49)。这个帧数直接决定了特征图的时间维度。
| 参数 | 典型值 | 物理意义 | 对模型影响 |
|---|---|---|---|
| 采样率 fs | 8kHz / 16kHz | 每秒采样点数 | 决定频率分辨率上限 |
| 帧长 | 20-30ms | 单次FFT分析窗口 | 频率分辨率 = 1/帧长 |
| 步长 | 10-20ms | 帧间时间位移 | 决定时间帧数(特征高度) |
| 窗函数 | 汉明窗 | 抑制频谱泄漏 | 影响特征平滑度 |
Mel频谱与MFCC:模拟人耳听觉的非线性频率刻度
人耳对频率的感知并非线性,而是对低频更敏感、对高频较迟钝。Mel刻度正是模拟这种非线性关系,其转换公式为:mel(f) = 2595 × log10(1 + f/700)。在计算Mel频谱时,首先对每帧信号做FFT得到功率谱,然后将功率谱通过一组三角滤波器(通常40-80个),每个滤波器对应一个Mel频带,最后对每个频带的能量取对数。得到的二维数组(时间帧 × Mel频带数)即为Mel频谱特征图,它保留了频率间的空间相关性,非常适合作为CNN的输入。
MFCC是在Mel频谱基础上,对每个时间帧的Mel频带向量做离散余弦变换(DCT),取前12-13个系数(不含第0阶或含)。DCT的作用是去相关并压缩维度,使得每个时间帧仅用13个系数表示。MFCC在传统GMM-HMM语音识别中占据主导地位,但在深度学习时代,其优势逐渐减弱——因为DCT是线性变换,会破坏Mel频带间的局部相关性,而CNN恰好擅长利用这种相关性。
案例拆解:1秒唤醒词“Hey Edison”的特征生成过程
假设我们要为一个唤醒词检测模型准备训练数据。原始音频为16kHz采样、16bit量化的单声道WAV文件,时长1秒,共16000个采样点。目标是将这段音频转换为适合DS-CNN输入的特征张量。
- 预加重:使用一阶高通滤波器 y[n] = x[n] - 0.97x[n-1],提升高频分量,补偿语音信号的高频衰减。
- 分帧:帧长30ms(480点),步长20ms(320点),共生成 (16000-480)/320 + 1 = 49帧。
- 加窗:每帧乘以汉明窗 w[n] = 0.54 - 0.46cos(2πn/(N-1))。
- FFT:对每帧做512点FFT(补零至512),得到256个频点(单边谱),频率分辨率 = 16000/512 = 31.25Hz。
- Mel滤波:使用40个三角滤波器,覆盖0-8kHz范围,得到40维Mel能量向量。
- 对数压缩:对每个Mel能量取log,得到log-Mel特征。
- 归一化:对整个特征矩阵做均值方差归一化(全局统计),使数据分布稳定。
最终特征张量形状为 (49, 40),即49个时间帧、40个Mel频带。若采用MFCC,则每个时间帧经DCT后取前13个系数,形状变为 (49, 13)。对于DS-CNN,通常将特征图视为单通道图像,输入形状为 (49, 40, 1),其中49对应高度(时间),40对应宽度(频率)。
常见误区与工程复盘
误区一:采样率越高越好。虽然高采样率保留更多高频信息,但会成倍增加计算量和内存占用。对于TinyML设备(如Cortex-M4内核,数百KB RAM),16kHz采样率已属上限,8kHz更常见。若任务仅需识别元音或简单命令,8kHz完全足够。
误区二:帧长越长越好。帧长决定频率分辨率(Δf = 1/帧长),但过长的帧会模糊语音的瞬态变化。例如,帧长50ms时,频率分辨率20Hz,但时间分辨率降低,可能丢失辅音起始的爆破音信息。经验值:帧长25ms、步长10ms是语音识别的“黄金比例”。
误区三:MFCC是“标准答案”。在深度学习时代,Mel频谱往往优于MFCC。一个直观对比实验:在Google Speech Commands数据集上,使用相同DS-CNN结构,Mel频谱输入(40维)的准确率比MFCC(13维)高约1-2%,且训练收敛更快。原因在于Mel频谱保留了频带间的局部相关性,而MFCC的DCT破坏了这种结构。
误区四:忽略预加重和归一化。预加重能平衡频谱能量,使高频段在训练中不被淹没;归一化则避免不同录音设备导致的幅度差异。建议在特征提取后,计算整个训练集的均值μ和标准差σ,对每个样本做 (x-μ)/σ 标准化。
总结而言,音频特征提取是TinyML语音模型的“数据入口”。理解采样率、帧长、步长、Mel频谱与MFCC的物理含义和工程权衡,能帮助你在模型结构选择、内存预算分配和精度调优时做出更合理的决策。下一环节将基于这些特征图,讨论如何设计轻量级CNN结构。