语音检测基础:语音信号基本特征、采样率、帧与窗、时域与频域表示
在TinyML低功耗语音检测系统中,无论是唤醒词检测(Wake Word Detection)还是语音活动检测(Voice Activity Detection, VAD),其底层都依赖于对语音信号本身的数字化理解。语音信号是一种非平稳的时变信号,其统计特性随时间快速变化,但在一段极短的时间(通常为20-50毫秒)内,可以近似视为平稳信号。这一“短时平稳”假设是语音信号处理的理论基石,也是我们后续进行分帧、加窗、特征提取的前提。本章将系统梳理语音信号的基本物理特征、采样与量化原理、帧与窗的工程实现,以及时域与频域两种视角下的表示方法,为后续TinyML模型设计提供必要的信号处理知识储备。
语音信号的物理本质与基本特征
语音是由人体发声器官(肺、声带、声道)协同运动产生的声学信号。从物理角度看,语音信号是空气压强的连续波动,其频率范围主要集中在 80Hz 至 4000Hz 之间,其中大部分能量集中在 300Hz 至 3400Hz 的频带内。这一频带范围直接决定了语音通信系统的采样率设计——根据奈奎斯特采样定理,要无失真地恢复最高频率为 f_max 的信号,采样率必须至少为 2×f_max。因此,传统电话系统采用 8kHz 采样率(覆盖 0-4kHz 频带),而音乐或高质量语音采集则常用 16kHz 或 44.1kHz 采样率。
语音信号具有三个关键特性:短时平稳性、非平稳性和周期性/随机性混合。在 10-30ms 的时间尺度内,声道的形状和激励源的变化相对缓慢,信号可以视为平稳随机过程;但超过这个时间窗口,语音的统计特性(如能量、频谱包络)会发生显著变化。此外,浊音(元音)具有明显的基频周期性(男性基频约 80-200Hz,女性约 200-350Hz),而清音(辅音如 /s/、/f/)则更接近随机噪声。这些特性为 VAD 和唤醒词检测提供了物理依据——例如,浊音段通常具有较高的短时能量和较低的过零率,而清音段则相反。
采样率、位深与量化对 TinyML 的影响
模拟语音信号经过采样和量化后变为数字信号。采样率决定了时间分辨率,位深(bit depth)决定了幅度分辨率。在 TinyML 系统中,这两者的选择直接影响内存占用和计算复杂度。
| 参数 | 典型值 | 内存占用(1秒音频) | TinyML 适用性 |
|---|---|---|---|
| 采样率 | 8kHz / 16kHz | 8k / 16k 样本 | 8kHz 适合 VAD,16kHz 适合唤醒词 |
| 位深 | 16bit / 32bit float | 16KB / 64KB(16kHz) | 16bit 定点数最常用,避免浮点 |
| 帧长 | 20-40ms | 320-640 样本(16kHz) | 帧长越短,延迟越低但频率分辨率越差 |
| 帧移 | 10ms | 160 样本(16kHz) | 帧移决定特征更新频率 |
量化误差是另一个需要关注的维度。16bit 量化提供约 96dB 的动态范围,足以覆盖从低声细语到正常交谈的幅度变化。在 MCU 上,我们通常将音频数据以 int16_t 格式存储,计算时转换为 int32_t 或 q15 定点格式,避免浮点运算带来的功耗和延迟开销。若使用 32bit 浮点,虽然精度更高,但 Cortex-M0+ 等低功耗内核没有 FPU,浮点运算会消耗大量 CPU 周期。
分帧与加窗:短时分析的核心操作
由于语音信号的非平稳性,我们不能直接对整个信号进行频谱分析。标准做法是将信号切分为短时帧,并对每一帧进行加窗处理。分帧参数的选择直接影响特征的时间分辨率和频率分辨率。
帧长与帧移的权衡:帧长决定了频率分辨率(Δf = fs / N,N 为帧内样本数),帧移决定了特征提取的时间步长。以 16kHz 采样率为例:
- 帧长 32ms(512 样本):频率分辨率约 31.25Hz,适合提取 Mel 频谱和 MFCC,是唤醒词检测的常用配置。
- 帧长 20ms(320 样本):频率分辨率约 50Hz,时间分辨率更高,适合 VAD 的快速响应。
- 帧移 10ms(160 样本):相邻帧有 50% 重叠,保证特征序列的平滑性,避免因帧边界导致的特征突变。
窗函数的作用:直接对信号截断会产生频谱泄漏——即能量从真实频率扩散到相邻频点。加窗可以缓解这一问题。常用的窗函数包括:
- 汉明窗(Hamming):旁瓣衰减约 40dB,是语音处理最常用的窗,适合大多数特征提取场景。
- 汉宁窗(Hann):旁瓣衰减更快,但主瓣稍宽,适合需要更平滑频谱的场景。
- 矩形窗:主瓣最窄,但旁瓣高,频谱泄漏严重,一般不推荐用于语音特征提取。
在 TinyML 实现中,窗函数系数可以预先计算并存储为常量数组,避免运行时计算。例如,512 点的汉明窗系数表占用 1KB 内存(16bit 存储),这在大多数 MCU 上是可以接受的。
// 16kHz采样率,32ms帧长,10ms帧移的典型配置
#define SAMPLE_RATE 16000
#define FRAME_LEN 512 // 32ms
#define FRAME_SHIFT 160 // 10ms
#define NUM_FRAMES (SAMPLE_RATE / FRAME_SHIFT) // 每秒100帧
// 汉明窗系数预计算(仅需一次)
float hamming[FRAME_LEN];
for (int i = 0; i < FRAME_LEN; i++) {
hamming[i] = 0.54 - 0.46 * cos(2 * M_PI * i / (FRAME_LEN - 1));
}
时域表示:短时能量与过零率
时域特征直接对采样点进行计算,计算量小,非常适合 TinyML 的 VAD 前端。最常用的两个时域特征是短时能量和短时过零率。
短时能量(STE)反映了一帧信号的幅度强弱,计算公式为:
E = Σ(x[n]²) for n = 0 to N-1
在实际实现中,为避免平方运算的开销,可以使用平均幅度值(AM)替代:
AM = Σ|x[n]| / N
短时能量可以区分静音、清音和浊音:静音段能量极低,清音段能量中等,浊音段能量较高。在 VAD 中,我们通常设定一个自适应阈值,当能量超过阈值时判定为语音活动。
短时过零率(ZCR)统计一帧内信号符号变化的次数,反映了信号的频率特性。计算公式为:
ZCR = (1/2N) * Σ|sign(x[n]) - sign(x[n-1])|
清音和噪声通常具有较高的过零率(因为高频成分多),而浊音过零率较低。在 VAD 中,ZCR 可以作为辅助特征,帮助区分语音和稳态噪声(如风扇声、空调声)。
频域表示:从 FFT 到 Mel 频谱
频域特征能更本质地反映语音的声学特性。在 TinyML 中,我们通常使用 FFT 将时域帧转换为频谱,再进一步压缩为低维特征。
FFT 计算与内存优化:对于 512 点的 FFT,使用基-2 蝶形算法需要 (N/2)×log2(N) = 2304 次复数乘法。在 Cortex-M4 上,使用 CMSIS-DSP 库的实数 FFT 函数,单次 512 点 FFT 约耗时 0.5-1ms(以 100MHz 主频估算)。内存方面,需要 512 个复数缓冲区(1024 个 float,即 4KB),加上窗函数和输入缓冲区,总内存占用约 6-8KB,这在大多数 MCU 上是可行的。
Mel 频谱与 MFCC:人耳对频率的感知是非线性的,Mel 刻度模拟了这一特性。将 FFT 频谱映射到 Mel 滤波器组(通常 20-40 个滤波器),可以大幅降低特征维度。例如,从 256 个 FFT 频点压缩到 20 个 Mel 频带,数据量减少 92%。MFCC(Mel 频率倒谱系数)进一步对 Mel 频谱取对数并进行 DCT,得到 13-20 个系数,是唤醒词检测最常用的特征。
在 TinyML 中,Mel 滤波器组系数可以预先计算并存储为稀疏矩阵。以 20 个滤波器、512 点 FFT 为例,非零系数约 2000 个,以 int16 存储占用 4KB 内存。计算时只需对非零项进行乘加运算,避免全矩阵乘法。
案例拆解:8kHz VAD 前端的时频特征协同
我们设计一个面向电池供电设备的 VAD 前端,目标是在 10dB 信噪比环境下实现 95% 以上的语音检出率,同时将特征提取的功耗控制在 1mW 以内(使用 STM32L4 系列 MCU,主频 80MHz)。
初始参数与约束:
- 采样率:8kHz(覆盖 0-4kHz 频带,满足语音主要能量范围)
- 帧长:25ms(200 样本),帧移:10ms(80 样本)
- 特征:短时能量(1 维)+ 过零率(1 维)+ 16 维 Mel 频谱
- 内存预算:特征缓冲区 2KB,中间计算缓冲区 4KB
实现步骤:
- 使用 ADC 以 8kHz 采样,DMA 直接搬运到内存环形缓冲区,CPU 仅在每帧完成时被中断唤醒。
- 对 200 个样本计算短时能量和过零率,使用 int16 累加,避免浮点。
- 对同一帧数据加汉明窗(预存 200 点 int16 系数),执行 256 点 FFT(补零到 256 点以利用基-2 算法)。
- 将 128 个有效频点映射到 16 个 Mel 滤波器,每个滤波器覆盖约 250Hz 带宽,计算对数能量。
- 将 18 维特征(能量 + 过零率 + 16 Mel)送入一个 2 层全连接神经网络(每层 8 个神经元),输出语音/非语音概率。
结果与复盘:实测在 10dB 白噪声环境下,语音检出率为 96.3%,误检率为 4.1%。特征提取总耗时约 1.2ms/帧(80MHz 主频),平均功耗约 0.8mW。复盘发现,Mel 滤波器的计算占用了 60% 的 CPU 时间,通过将滤波器系数量化为 int16 并采用查表法,将耗时降低到 0.7ms/帧。进一步优化发现,前 8 个 Mel 频带已经包含了 90% 的判别信息,可以裁剪后 8 个频带,将特征维度降至 10 维,模型大小减小 40%,准确率仅下降 0.8 个百分点。
常见误区与总结复盘
在语音检测基础的学习和工程实践中,以下误区值得特别注意:
- 误区一:采样率越高越好。实际上,过高的采样率会成倍增加 FFT 计算量和内存占用,而语音的有效频带有限。应根据应用场景选择最低可接受的采样率。
- 误区二:忽略窗函数的影响。直接截断信号会导致频谱泄漏,使 VAD 在噪声环境下产生误判。务必使用汉明窗或汉宁窗。
- 误区三:时域特征和频域特征二选一。在 TinyML 中,时域特征(能量、过零率)计算量极小,适合作为第一级粗检测;频域特征(Mel 频谱)判别力更强,适合作为第二级精细检测。两者协同使用,可以在功耗和准确率之间取得最佳平衡。
- 误区四:特征维度越多越好。高维特征不仅增加计算量,还可能导致过拟合。在 MCU 上,10-20 维特征通常已经足够。通过特征选择(如基于互信息或主成分分析)可以进一步压缩维度。
总结而言,语音检测的基础在于理解信号的物理特性,并据此选择合适的数字化参数和特征表示。在 TinyML 场景下,每一个参数的选择(采样率、帧长、窗函数、特征类型)都直接影响功耗、延迟和准确率。建议在项目初期就建立完整的参数评估矩阵,通过实际测量而非理论推导来确定最优配置。下一阶段,我们将在此基础上深入探讨 VAD 的具体算法实现和低功耗优化策略。