2、声音识别基础:音频信号表示、MFCC特征提取、频谱图与梅尔滤波器组
在TinyML多类别声音识别任务中,模型性能的上限往往不取决于神经网络结构本身,而取决于输入特征的质量。声音信号本质上是随时间变化的一维压力波,直接将其原始波形送入神经网络不仅计算开销巨大,而且难以捕捉人耳听觉感知中的关键判别信息。本章将系统梳理从连续音频波形到紧凑特征向量的完整链路,重点讲解音频信号在数字域中的表示方式、短时傅里叶变换(STFT)与频谱图的生成原理、梅尔滤波器组的生物学依据,以及MFCC(Mel-Frequency Cepstral Coefficients)特征的提取流程与工程实践要点。
2.1 音频信号在数字域中的表示
声音的本质是空气压力的周期性变化,麦克风将这种机械振动转换为连续的电信号。在嵌入式系统中,模数转换器(ADC)以固定时间间隔对模拟电压进行采样,得到离散时间序列。这一过程涉及两个核心参数:采样率(每秒采样次数,单位Hz)和量化位数(每个采样点的二进制位数)。根据奈奎斯特采样定理,采样率必须至少为信号最高频率的两倍才能无失真重建。对于人声识别任务,16kHz采样率已足够覆盖语音主要能量集中的4kHz以下频段;而对于环境声音分类(如鸟鸣、玻璃破碎声),通常需要44.1kHz或48kHz采样率以保留高频细节。
量化位数决定了信号的动态范围。16bit量化提供96dB的理论信噪比,是音频处理的事实标准。在TinyML设备上,原始PCM数据通常以WAV格式存储,1秒16kHz/16bit单声道音频占用约32KB存储空间。若直接使用原始波形作为模型输入,一个1秒样本就是16000维向量,这对MCU级别的算力与内存而言是不现实的。因此,特征提取的首要目标就是在保留判别信息的前提下大幅降低数据维度。
2.2 分帧、加窗与短时傅里叶变换(STFT)
音频信号是非平稳的,其统计特性随时间变化。但在一段极短的时间窗口内(通常10-30ms),可以近似认为信号是平稳的。因此,标准做法是将长序列切分为重叠的短帧,对每一帧独立进行频谱分析。帧长决定了频率分辨率,帧移决定了时间分辨率。以16kHz采样率为例,25ms帧长对应400个采样点,10ms帧移对应160个采样点。相邻帧之间保持50%-75%的重叠率,以确保特征序列的平滑过渡。
直接对截断的帧做FFT会产生频谱泄漏——由于帧边界的不连续性,高频分量会扩散到相邻频带。为抑制这一效应,需要对每一帧乘以窗函数。汉明窗(Hamming Window)是最常用的选择,其表达式为:
w[n] = 0.54 - 0.46 * cos(2πn / (N-1)), 0 ≤ n ≤ N-1
加窗后的帧信号经过N点FFT(通常N取512或1024,不足部分补零),得到复数频谱。取幅度平方得到功率谱,将所有帧的功率谱按时间顺序堆叠,即构成频谱图(Spectrogram)。频谱图是一个二维矩阵,横轴为时间帧索引,纵轴为频率bin,颜色深浅代表能量强度。在TinyML中,频谱图常被缩放为灰度图像直接送入卷积神经网络(CNN),利用CNN的空间特征提取能力完成分类。
| 参数 | 典型值 | 对识别性能的影响 |
|---|---|---|
| 采样率 | 16kHz(语音)/ 44.1kHz(环境声) | 决定最高可分析频率;过低会丢失高频判别信息 |
| 帧长 | 20-30ms | 过长则时间分辨率差,过短则频率分辨率差 |
| 帧移 | 5-15ms | 影响特征序列长度;过小增加计算量,过大丢失时间连续性 |
| FFT点数 | 512 / 1024 | 频率bin数量;需≥帧长采样点数 |
| 窗函数 | 汉明窗 / 汉宁窗 | 抑制频谱泄漏;矩形窗不推荐 |
2.3 梅尔滤波器组与梅尔频率刻度
人耳对频率的感知并非线性,而是对低频变化更敏感、对高频变化较迟钝。梅尔刻度(Mel Scale)正是模拟这种非线性听觉特性的心理物理尺度。将普通频率f(Hz)转换为梅尔频率m的经典公式为:
m = 2595 * log10(1 + f / 700)
梅尔滤波器组是一组在梅尔刻度上等间距排列的三角带通滤波器,通常数量为40或80个。每个滤波器在对应的中心频率处响应为1,向两侧线性衰减至相邻滤波器的中心频率处为0。将FFT得到的功率谱与每个滤波器相乘并求和,得到该滤波器频带内的总能量,再取自然对数,即得到对数梅尔频谱。取对数的目的有二:一是压缩动态范围,使弱信号与强信号的差异不过于悬殊;二是近似人耳对响度的对数感知特性。
在TinyML实践中,梅尔能量特征(Log-Mel Spectrogram)往往比MFCC更受青睐。原因在于:MFCC中的DCT步骤会去除了部分相关性,但同时也丢失了某些对噪声鲁棒的细节;而梅尔能量特征保留了完整的频带能量分布,配合CNN或CRNN模型可以获得更好的抗噪性能。此外,梅尔能量的计算无需DCT,减少了计算量,更适合MCU部署。
2.4 MFCC特征提取流程与TinyML部署考量
MFCC在梅尔能量基础上增加了离散余弦变换(DCT)步骤,目的是去除各维特征之间的相关性,使特征向量更紧凑。标准流程为:
- 对每帧信号加窗并做FFT,计算功率谱;
- 将功率谱通过梅尔滤波器组,得到M个频带能量(M通常取40);
- 对每个频带能量取自然对数;
- 对M维对数能量向量做DCT,保留前12-13个系数(不含第0个直流分量);
- (可选)计算一阶差分(Δ)和二阶差分(ΔΔ),拼接为39维或40维特征向量。
在TinyML模型部署时,MFCC的DCT步骤需要额外存储一个M×K的变换矩阵(K为保留系数个数),对于40→13的变换,仅需520个浮点参数,内存开销可忽略。但需注意,DCT矩阵是全局固定的,可以预先计算并存储在Flash中,避免运行时重复计算。
// 伪代码:MFCC提取核心步骤(C语言风格)
for (int frame = 0; frame < num_frames; frame++) {
apply_hamming_window(frame_buffer, frame_size);
rfft(frame_buffer, fft_size); // 实数FFT
compute_power_spectrum(frame_buffer, power_spectrum);
for (int m = 0; m < num_mel_filters; m++) {
mel_energy[m] = 0;
for (int bin = 0; bin < fft_size/2; bin++) {
mel_energy[m] += power_spectrum[bin] * mel_filter_bank[m][bin];
}
log_mel[m] = log(mel_energy[m] + 1e-10);
}
// DCT
for (int k = 0; k < num_ceps; k++) {
mfcc[k] = 0;
for (int m = 0; m < num_mel_filters; m++) {
mfcc[k] += log_mel[m] * dct_matrix[k][m];
}
}
}
2.5 案例拆解:基于ESP32-S3的唤醒词识别特征工程
假设我们需要在ESP32-S3(240MHz双核,512KB SRAM)上实现一个"小爱同学"风格的唤醒词识别系统,要求误唤醒率低于每24小时1次,且响应延迟不超过300ms。我们选择使用40维梅尔能量特征配合一个小型CRNN模型(2层卷积+1层GRU)。
初始方案与问题:最初直接使用13维MFCC+差分特征(共39维),模型在测试集上准确率达95%,但在实际家庭环境中误唤醒率高达每3小时1次。分析日志发现,误唤醒多发生在电视背景音、厨房碗碟碰撞声等场景。进一步对比频谱图发现,MFCC的DCT步骤将高频细节压缩,导致模型过度依赖低频能量模式,而真实唤醒词与背景噪声的差异恰恰体现在中高频的时序变化上。
优化过程:将特征切换为40维梅尔能量,并增加帧移从10ms调整为7.5ms(时间分辨率提升33%)。同时,在训练阶段加入噪声增强(随机叠加白噪声、粉红噪声、室内环境噪声),信噪比范围控制在0-20dB。重新训练后,模型参数量从28K增至31K(增加约10%),但误唤醒率降至每28小时1次,满足设计要求。
关键数据对比:
| 特征类型 | 维度 | 测试准确率 | 误唤醒率(实测) | 单帧提取耗时 |
|---|---|---|---|---|
| 13维MFCC+Δ+ΔΔ | 39 | 95.2% | 每3小时1次 | 4.2ms |
| 40维梅尔能量 | 40 | 96.8% | 每28小时1次 | 3.1ms |
复盘经验:在资源受限的TinyML设备上,特征选择比模型结构更影响实际性能。MFCC的维度压缩优势在传统GMM-HMM系统中明显,但在深度神经网络中,保留完整频带信息的梅尔能量往往更有利于学习鲁棒的判别边界。此外,特征提取的耗时差异(3.1ms vs 4.2ms)虽然不大,但在持续监听场景下,每帧节省1ms意味着每小时节省约360ms的CPU占用,对电池供电设备意义重大。
2.6 常见误区与总结
误区一:采样率越高越好。高采样率意味着更多数据点、更大FFT计算量以及更高的功耗。对于人声识别,16kHz足够;对于特定频段的环境声(如玻璃破碎声的高频成分),可考虑带通滤波后降采样,而非直接使用高采样率。
误区二:MFCC是唯一正确的特征。在TinyML场景中,梅尔能量特征、甚至原始频谱的特定频段切片都可能表现更好。建议在项目初期同时实现2-3种特征提取器,用相同模型结构做对比实验后再决定。
误区三:忽略帧移对延迟的影响。帧移决定了特征序列的时间分辨率,也决定了系统的最小响应延迟。若帧移为10ms,模型需要至少看到20帧才能做出判断,则理论最小延迟为200ms。对于唤醒词等低延迟场景,可适当减小帧移。
误区四:特征提取使用浮点运算。大多数MCU没有FPU(浮点单元),浮点运算会消耗大量CPU周期。建议在PC端预先计算梅尔滤波器组的整数化版本(如Q15格式),在设备端使用定点运算。实测表明,定点化后特征提取速度可提升3-5倍,精度损失小于0.1%。
总结而言,音频特征提取是TinyML声音识别系统的基石。从原始波形到梅尔能量/MFCC的转换,不仅是数据降维的过程,更是将人类听觉先验知识注入模型的关键步骤。在实际工程中,应结合目标场景的噪声特性、可用算力、内存预算和延迟要求,综合选择采样率、帧参数、滤波器数量和特征类型。下一阶段,我们将在此基础上讨论类别不平衡问题对模型训练的影响及应对策略。