2、语音唤醒基础:语音信号的基本特征、采样率、帧、窗函数、时域与频域表示
语音唤醒(Keyword Spotting, KWS)任务的核心,是从连续的麦克风音频流中实时检测出预设的唤醒词(如“小爱同学”“Hey Siri”)。在进入模型训练之前,我们必须先理解语音信号本身:它如何产生、如何被数字化、如何被切分成模型可处理的短片段,以及如何从时域转换到频域。这一章的内容是后续所有特征工程和模型设计的物理基础。如果你不理解“帧”和“窗函数”的含义,就无法理解为什么TinyML模型输入的是二维数组而不是一维波形;如果你不理解采样率与频率分辨率的权衡,就无法正确设置MFCC(梅尔频率倒谱系数)或滤波器组参数。本章将沿着“物理信号→数字信号→短时帧→频域特征”这条主线,把语音唤醒中最基础但最关键的几个概念讲透。
上图展示了从模拟语音到频域特征的完整链路。在TinyML设备上,这条链路通常由麦克风(模拟信号)、编解码器(ADC,模数转换器)、DSP(数字信号处理器)或MCU(微控制器)上的软件算法共同完成。理解每个环节的参数选择,是优化唤醒词模型性能的前提。
2.1 语音信号的基本特征与数字化
语音信号本质上是声带振动和气流通过声道(口腔、鼻腔)时产生的声波,表现为空气压力的变化。从信号处理的角度看,语音具有两个关键特性:非平稳性和短时平稳性。所谓非平稳,是指语音的统计特性(如频谱、能量)随时间快速变化——一个音节的发音可能只有几十毫秒,而不同音素之间的频谱差异巨大。但另一方面,在10~40毫秒的短时间内,声道形状和声带振动频率基本保持不变,因此可以认为语音是“短时平稳”的。这一特性是分帧处理的物理基础。
要让MCU处理语音,必须先将连续的模拟信号转换为离散的数字信号。这个过程包含两个步骤:采样(Sampling)和量化(Quantization)。采样是在时间轴上等间隔地取瞬时值,采样率(fs)表示每秒采样的次数,单位是Hz。根据奈奎斯特采样定理,采样率必须大于信号最高频率的两倍,才能无失真地重建原始信号。对于语音唤醒任务,人声的主要能量集中在300Hz~3.4kHz(电话语音带宽),因此16kHz采样率已经足够覆盖语音的绝大部分信息,同时比44.1kHz(CD音质)节省约2.7倍的数据量,这对内存和功耗敏感的TinyML设备至关重要。
量化则是将采样得到的连续电压值映射到有限个离散电平。常见的量化位深为16bit,即每个采样点用2字节表示,动态范围约为96dB。在嵌入式系统中,量化位深直接影响ADC的功耗和信噪比。例如,使用16bit量化时,一个采样点的数值范围是-32768到32767,而8bit量化只有-128到127,量化噪声会显著增加。对于唤醒词检测,16bit是业界标准选择,因为语音信号动态范围大,过低的位深会导致弱辅音(如“s”“f”)被量化噪声淹没。
fs=16kHz、16bit量化、单声道。这意味着一秒钟的语音数据量为 16000 × 2 = 32000 字节(约31.25KB)。如果MCU的RAM只有256KB,那么最多只能缓存约8秒的原始音频。因此,实际系统中通常采用“边采集边处理”的流式架构,而不是一次性缓存整段语音。
2.2 分帧与加窗:从连续流到短时帧
由于语音是短时平稳的,我们需要将连续的采样点切分成一个个“帧”(Frame),每一帧独立进行特征提取。分帧有两个关键参数:帧长(Frame Length)和帧移(Frame Shift)。帧长决定了单次分析的窗口大小,通常取20~40ms;帧移是相邻两帧起始点之间的间隔,通常取帧长的一半(即50%重叠)。例如,帧长30ms、帧移15ms,在16kHz采样率下,一帧包含480个采样点,相邻帧有240个采样点重叠。
为什么需要重叠?因为语音的发音是连续变化的,如果帧与帧之间没有重叠,那么位于帧边界附近的特征变化会被截断,导致频谱突变。50%重叠可以保证每个采样点至少被两个帧覆盖,从而平滑特征的时间连续性。在KWS模型中,输入通常是“帧序列”——例如,一个1秒的唤醒词,按30ms帧长、15ms帧移计算,会产生约66帧。模型需要同时处理这些帧的时序关系,才能捕捉到唤醒词的动态发音过程。
分帧之后,还需要对每一帧乘以一个窗函数(Window Function)。直接对截断的帧做FFT(快速傅里叶变换)会导致“频谱泄漏”——即原本集中在某个频率的能量扩散到相邻频点。这是因为矩形窗(即不加窗)在频域等效于一个sinc函数,其旁瓣衰减很慢。汉明窗(Hamming Window)是最常用的选择,其表达式为:
w[n] = 0.54 - 0.46 × cos(2πn / (N-1)), 0 ≤ n ≤ N-1
其中N为帧长。汉明窗的主瓣宽度约为矩形窗的两倍(频率分辨率略降),但旁瓣衰减可达-42dB,能有效抑制频谱泄漏。在KWS中,加窗是标准操作,因为唤醒词通常包含多个音素,频谱泄漏会模糊音素之间的边界,降低模型区分相似发音(如“开”和“关”)的能力。
| 窗类型 | 主瓣宽度 | 旁瓣衰减 | 适用场景 |
|---|---|---|---|
| 矩形窗 | 最窄 | -13dB | 瞬态分析,不推荐用于语音 |
| 汉明窗 | 较宽 | -42dB | 语音识别/唤醒词(最常用) |
| 汉宁窗 | 较宽 | -31dB | 频谱分析,旁瓣衰减略差 |
| 布莱克曼窗 | 最宽 | -58dB | 高动态范围测量,但频率分辨率低 |
2.3 时域与频域表示:从波形到频谱
分帧加窗后,每一帧仍然是一段时域波形(480个采样点)。但时域波形难以直接用于分类——它包含了大量冗余信息,且对噪声和幅度变化敏感。因此,我们需要将每一帧转换到频域,提取出能代表语音特征的频谱信息。
离散傅里叶变换(DFT)是时频转换的数学工具。对于长度为N的帧x[n],其DFT定义为:
X[k] = Σ_{n=0}^{N-1} x[n] × e^(-j2πkn/N), k = 0, 1, ..., N-1
实际工程中,使用快速傅里叶变换(FFT)算法,计算复杂度从O(N²)降低到O(N log N)。对于N=512的FFT,输出是256个复数频点(因为对称性,只取前N/2个)。每个频点的幅度|X[k]|表示该频率成分的能量,相位信息通常被丢弃(因为人耳对相位不敏感,且相位特征在噪声环境下不稳定)。
频率分辨率Δf = fs / N。当fs=16kHz、N=512时,Δf = 31.25Hz。这意味着频谱上相邻两个频点之间的间隔是31.25Hz。对于语音来说,基频(F0)通常在85~255Hz之间,而共振峰(声道谐振频率)间隔约为1000Hz,因此31.25Hz的分辨率足以区分主要的语音特征。如果帧长过短(如10ms,N=160),Δf会增大到100Hz,导致低频段的共振峰细节丢失;如果帧长过长(如50ms),虽然频率分辨率提高,但语音的短时平稳性假设不再成立,频谱会“模糊化”。
在KWS中,我们通常不直接使用原始FFT幅度谱,而是进一步转换为梅尔频谱(Mel Spectrogram)或MFCC。梅尔刻度模拟人耳对频率的非线性感知——在低频区域分辨率高,在高频区域分辨率低。转换公式为:
Mel(f) = 2595 × log10(1 + f/700)
通过一组三角滤波器(通常24~40个)将FFT幅度谱映射到梅尔刻度上,得到每个滤波器的对数能量。这一步不仅压缩了数据维度(从256个频点降到40个),还增强了特征对噪声的鲁棒性。MFCC则进一步对梅尔频谱做离散余弦变换(DCT),得到倒谱系数,通常取前13~20个系数。
2.4 案例拆解:16kHz/30ms/15ms参数下的特征维度计算
为了将上述概念串联起来,我们以一个具体的KWS前端配置为例,计算从原始音频到模型输入张量的完整维度变化。假设我们使用16kHz采样率、帧长30ms、帧移15ms、FFT点数512、40个梅尔滤波器,并取13个MFCC系数。
- 原始音频:1秒语音 = 16000个采样点。
- 分帧:帧长30ms = 480采样点;帧移15ms = 240采样点。总帧数 = (16000 - 480) / 240 + 1 ≈ 66帧。
- 加窗与FFT:每帧480点,补零到512点做FFT,得到256个有效频点(0~8kHz)。
- 梅尔滤波:40个三角滤波器将256个频点压缩为40个对数能量值。
- DCT:对40个对数能量做DCT,取前13个系数(不含第0阶,即能量项),得到13维MFCC向量。
- 模型输入:如果模型一次处理1秒音频,则输入张量形状为 (66, 13)。若加上一阶差分(Δ)和二阶差分(ΔΔ),则变为 (66, 39)。
这个计算过程揭示了几个关键点:第一,模型输入维度远小于原始音频(66×13=858个浮点数 vs 16000个采样点),这大大降低了MCU的内存和计算需求。第二,帧移决定了模型的时间分辨率——15ms的帧移意味着模型每15ms产生一个特征向量,这对于实时唤醒检测(要求延迟小于100ms)是足够的。第三,如果使用更小的帧移(如10ms),帧数会增加到约99帧,模型输入维度增大50%,但时间分辨率更高,可能对短促的唤醒词(如“Hi”只有200ms)更友好。
2.5 总结复盘:参数选择的权衡与工程约束
本章的核心是理解语音信号从模拟到数字、从时域到频域的转换链路,以及每个环节的参数选择如何影响KWS系统的性能。我们用一个对比表来总结关键权衡:
| 参数 | 调高(或调大)的影响 | 调低(或调小)的影响 | TinyML推荐值 |
|---|---|---|---|
| 采样率 fs | 频率范围更宽,但数据量增大 | 数据量减小,但丢失高频信息 | 16kHz(平衡语音带宽与算力) |
| 帧长 | 频率分辨率更高,但时间分辨率降低 | 时间分辨率更高,但频率分辨率降低 | 30ms(兼顾两者) |
| 帧移 | 帧数减少,计算量降低,但时间信息丢失 | 帧数增多,时间信息更丰富,但计算量增大 | 15ms(50%重叠) |
| FFT点数 | 频率分辨率更高,但计算量增大 | 计算量减小,但频率分辨率降低 | 512(与帧长匹配) |
| 梅尔滤波器数 | 特征维度更高,可能过拟合 | 特征维度低,可能丢失细节 | 40(常用) |
在实际工程中,这些参数并非孤立选择。例如,帧长30ms对应FFT点数512(因为480点补零到512),而帧移15ms则决定了模型每15ms推理一次。如果MCU的算力有限,可以适当增大帧移到20ms(重叠率33%),帧数减少约25%,但时间分辨率下降,可能影响对快速发音的捕捉。反之,如果唤醒词包含较多摩擦音(如“Siri”中的“s”),则需要更高的频率分辨率,可以考虑将帧长增加到40ms,但此时帧移也要相应调整,以保持时间覆盖。