语音基础:音频信号表示、采样率、帧长、步长、MFCC与Mel频谱特征提取原理

TinyML语音模型(如唤醒词检测、关键词识别)的输入并非原始音频波形,而是经过一系列数字信号处理(DSP)后得到的特征图。理解音频从“连续声波”到“二维特征张量”的转换链路,是选择模型结构(小型CNN或DS-CNN)的前提。本章将拆解这条链路中的五个核心环节:音频信号在计算机中的表示方式、采样率与量化精度、分帧与步长的物理意义、Mel频谱的计算逻辑,以及MFCC(Mel频率倒谱系数)与Mel频谱的适用场景差异。

音频特征提取链路:从波形到特征图 模拟声波 连续气压变化 频率20Hz-20kHz 采样 离散波形 采样率fs=16kHz 量化位深16bit 分帧 帧序列 帧长30ms(480点) 步长20ms(320点) 频谱 Mel频谱/滤波器组 40-80个Mel频带 对数压缩 路径A:Mel频谱直接作为特征 适合CNN输入(保留空间相关性) 路径B:MFCC(DCT压缩) 适合传统ML/小模型 输出特征张量形状 (时间帧数, Mel频带数) 例如 (49, 40) 或 (49, 10) MFCC 采样定理:fs ≥ 2×fmax 帧移 = 步长/采样率

音频信号在计算机中的表示:从连续声波到离散序列

声音本质是空气压力的周期性变化。麦克风将这种机械振动转换为连续的电信号(模拟信号),而计算机只能处理离散的数值序列。因此,第一步是采样(Sampling)和量化(Quantization)。采样是在时间轴上等间隔地“截取”信号幅度值,量化则是将这些幅度值映射到有限的整数集合。例如,以16kHz采样率、16bit量化精度录制1秒音频,得到16000个采样点,每个采样点取值范围为-32768到32767。在TinyML场景中,常见的采样率配置为8kHz(电话语音)或16kHz(宽带语音),量化精度通常为16bit或8bit(用于内存受限设备)。

关键公式:采样率fs决定了可表示的最高频率(奈奎斯特频率 = fs/2)。对于语音识别,人声主要能量集中在300Hz-3.4kHz,因此8kHz采样率已足够;若需保留更多高频细节(如摩擦音),则建议16kHz。

分帧与步长:将长序列切分为短时平稳片段

语音信号具有短时平稳性:在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)。这个帧数直接决定了特征图的时间维度。

参数典型值物理意义对模型影响
采样率 fs8kHz / 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恰好擅长利用这种相关性。

选择建议:对于TinyML中的小型CNN或DS-CNN,推荐直接使用Mel频谱(40维)而非MFCC(13维)。原因有二:一是Mel频谱保留了更多原始信息,CNN可通过卷积核自动学习频带间关系;二是MFCC的DCT步骤增加了计算量,且丢弃了部分高频细节,在低信噪比环境下鲁棒性较差。

案例拆解:1秒唤醒词“Hey Edison”的特征生成过程

假设我们要为一个唤醒词检测模型准备训练数据。原始音频为16kHz采样、16bit量化的单声道WAV文件,时长1秒,共16000个采样点。目标是将这段音频转换为适合DS-CNN输入的特征张量。

  1. 预加重:使用一阶高通滤波器 y[n] = x[n] - 0.97x[n-1],提升高频分量,补偿语音信号的高频衰减。
  2. 分帧:帧长30ms(480点),步长20ms(320点),共生成 (16000-480)/320 + 1 = 49帧。
  3. 加窗:每帧乘以汉明窗 w[n] = 0.54 - 0.46cos(2πn/(N-1))。
  4. FFT:对每帧做512点FFT(补零至512),得到256个频点(单边谱),频率分辨率 = 16000/512 = 31.25Hz。
  5. Mel滤波:使用40个三角滤波器,覆盖0-8kHz范围,得到40维Mel能量向量。
  6. 对数压缩:对每个Mel能量取log,得到log-Mel特征。
  7. 归一化:对整个特征矩阵做均值方差归一化(全局统计),使数据分布稳定。

最终特征张量形状为 (49, 40),即49个时间帧、40个Mel频带。若采用MFCC,则每个时间帧经DCT后取前13个系数,形状变为 (49, 13)。对于DS-CNN,通常将特征图视为单通道图像,输入形状为 (49, 40, 1),其中49对应高度(时间),40对应宽度(频率)。

常见误区:部分初学者将MFCC的13维系数直接作为全连接层的输入,而忽略了时间维度的上下文信息。在TinyML中,若使用MFCC,建议保留时间帧维度(如49×13),并采用时序卷积或循环结构处理,而非简单展平。

常见误区与工程复盘

误区一:采样率越高越好。虽然高采样率保留更多高频信息,但会成倍增加计算量和内存占用。对于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-μ)/σ 标准化。

工程复盘:在某智能音箱唤醒词项目中,初始方案采用MFCC(13维)+ 全连接网络,准确率仅91%。后改为Mel频谱(40维)+ DS-CNN(深度可分离卷积),准确率提升至96.5%,模型参数量从120K降至68K,推理时间从45ms降至28ms(基于STM32F746 @ 216MHz)。关键改动正是特征输入从MFCC切换为Mel频谱,并配合BN层和深度可分离卷积。

总结而言,音频特征提取是TinyML语音模型的“数据入口”。理解采样率、帧长、步长、Mel频谱与MFCC的物理含义和工程权衡,能帮助你在模型结构选择、内存预算分配和精度调优时做出更合理的决策。下一环节将基于这些特征图,讨论如何设计轻量级CNN结构。