2、语音唤醒基础:语音信号的基本特征、采样率、帧、窗函数、时域与频域表示

语音唤醒(Keyword Spotting, KWS)任务的核心,是从连续的麦克风音频流中实时检测出预设的唤醒词(如“小爱同学”“Hey Siri”)。在进入模型训练之前,我们必须先理解语音信号本身:它如何产生、如何被数字化、如何被切分成模型可处理的短片段,以及如何从时域转换到频域。这一章的内容是后续所有特征工程和模型设计的物理基础。如果你不理解“帧”和“窗函数”的含义,就无法理解为什么TinyML模型输入的是二维数组而不是一维波形;如果你不理解采样率与频率分辨率的权衡,就无法正确设置MFCC(梅尔频率倒谱系数)或滤波器组参数。本章将沿着“物理信号→数字信号→短时帧→频域特征”这条主线,把语音唤醒中最基础但最关键的几个概念讲透。

语音信号数字化与短时分析链路 模拟语音信号 连续声波(Pa) 频率范围:20Hz-20kHz 采样与量化 采样率 fs(Hz) 位深(16bit/24bit) 分帧 + 加窗 帧长:20-40ms 帧移:10-20ms 时域→频域 FFT / STFT 频谱 / 梅尔谱 关键参数与物理意义 参数 典型值 物理意义 对KWS的影响 采样率 fs 16 kHz 每秒采集样本数 决定最高频率 8kHz 帧长 30ms(480样本) 单次分析的时间窗口 频率分辨率 ≈ 33Hz 帧移 15ms(240样本) 相邻帧起始点间隔 时间分辨率,重叠率50% 窗函数 汉明窗 抑制频谱泄漏 旁瓣衰减 -42dB FFT点数 512 频域采样点数 频点间隔 ≈ 31.25Hz

上图展示了从模拟语音到频域特征的完整链路。在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”)被量化噪声淹没。

核心参数速查:在KWS系统中,最常用的配置是 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个系数。

实战经验:在TinyML设备上,FFT计算是主要算力消耗点。对于Cortex-M4内核(带FPU,浮点运算单元),512点FFT大约需要数千个时钟周期。如果MCU主频为80MHz,一次FFT约需0.1ms,而一帧的实时处理预算为15ms(帧移),因此FFT计算只占约0.7%的CPU负载,完全可行。但要注意,如果使用浮点FFT库(如CMSIS-DSP),需要确保MCU支持FPU,否则纯软件浮点模拟会慢10倍以上。

2.4 案例拆解:16kHz/30ms/15ms参数下的特征维度计算

为了将上述概念串联起来,我们以一个具体的KWS前端配置为例,计算从原始音频到模型输入张量的完整维度变化。假设我们使用16kHz采样率、帧长30ms、帧移15ms、FFT点数512、40个梅尔滤波器,并取13个MFCC系数。

  1. 原始音频:1秒语音 = 16000个采样点。
  2. 分帧:帧长30ms = 480采样点;帧移15ms = 240采样点。总帧数 = (16000 - 480) / 240 + 1 ≈ 66帧。
  3. 加窗与FFT:每帧480点,补零到512点做FFT,得到256个有效频点(0~8kHz)。
  4. 梅尔滤波:40个三角滤波器将256个频点压缩为40个对数能量值。
  5. DCT:对40个对数能量做DCT,取前13个系数(不含第0阶,即能量项),得到13维MFCC向量。
  6. 模型输入:如果模型一次处理1秒音频,则输入张量形状为 (66, 13)。若加上一阶差分(Δ)和二阶差分(ΔΔ),则变为 (66, 39)。

这个计算过程揭示了几个关键点:第一,模型输入维度远小于原始音频(66×13=858个浮点数 vs 16000个采样点),这大大降低了MCU的内存和计算需求。第二,帧移决定了模型的时间分辨率——15ms的帧移意味着模型每15ms产生一个特征向量,这对于实时唤醒检测(要求延迟小于100ms)是足够的。第三,如果使用更小的帧移(如10ms),帧数会增加到约99帧,模型输入维度增大50%,但时间分辨率更高,可能对短促的唤醒词(如“Hi”只有200ms)更友好。

常见误区:初学者常犯的错误是直接对整段语音做一次FFT,而不是分帧。这会导致频谱完全失去时间信息——你无法知道某个频率成分出现在语音的哪个位置。唤醒词“小爱同学”包含四个音节,每个音节的频谱特征不同,必须保留时间维度(即帧序列)才能让模型学习到发音的顺序模式。另一个误区是忽略窗函数,直接对截断的帧做FFT,这会导致频谱泄漏,使相邻频点之间出现“拖尾”,降低特征区分度。

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,但此时帧移也要相应调整,以保持时间覆盖。