2、语音信号基础:采样率、量化、帧移、窗函数、短时傅里叶变换(STFT)、频谱特征(MFCC、FilterBank、Mel谱)
语音唤醒(KWS)系统的前端处理质量,直接决定了后端唤醒模型的识别上限。无论采用传统的GMM-HMM方案,还是基于DNN/Transformer的端到端方案,所有语音算法都建立在统一的数字信号处理(DSP)基础之上。本章将系统梳理从连续模拟声波到离散特征张量的完整链路,重点讲解采样率与量化精度的工程权衡、分帧加窗的物理意义、STFT的时频变换逻辑,以及MFCC、FilterBank、Mel谱三种主流频谱特征的区别与适用场景。理解这些基础概念,是后续优化唤醒率、降低误唤醒率、适配不同麦克风阵列的前提。
2.1 采样率与量化:数字语音的“分辨率”
核心原理
模拟语音信号是连续时间、连续幅度的波形,必须通过模数转换器(ADC)转换为离散时间、离散幅度的数字序列。采样率(Sampling Rate)决定时间分辨率,量化位数(Bit Depth)决定幅度分辨率。根据奈奎斯特采样定理,采样率必须大于信号最高频率的两倍才能无混叠重建。语音唤醒场景中,人声主要能量集中在300Hz-3.4kHz,因此16kHz采样率(覆盖8kHz带宽)是业界标准选择。量化位数则直接影响动态范围和信噪比,每增加1bit,理论信噪比提升约6dB。16bit量化提供96dB动态范围,足以覆盖从轻声细语到近场大声说话的幅度差异。
工程判断方法
- 采样率选择:KWS任务推荐16kHz;若目标唤醒词包含高频摩擦音(如“小”字的x音),可考虑48kHz但需评估算力成本。
- 量化位数:嵌入式平台常用16bit;8bit量化会明显损失弱信号细节,导致远场唤醒率下降。
- 实际验证:录制同一唤醒词,分别用8kHz/16kHz/48kHz采样,对比唤醒率和误唤醒率差异。
案例拆解:采样率不匹配导致的唤醒失败
某智能音箱项目在移植唤醒模型时,发现唤醒率从92%骤降至65%。排查发现:训练阶段使用16kHz音频,但设备端音频驱动误配置为8kHz采样率输出。由于8kHz采样率无法还原4kHz以上的高频成分,唤醒词“你好小贝”中的“贝”字(含高频共振峰)信息丢失,导致模型置信度大幅下降。修正驱动配置后,唤醒率恢复至91.5%。此案例说明,采样率是前端链路中最基础也最容易被忽视的配置项。
常见误区
- 误以为采样率越高越好,忽略算力和内存限制。
- 量化位数不足时,用软件增益放大信号,反而放大量化噪声。
- 未检查ADC的时钟源精度,导致实际采样率偏移(如16kHz变成15.8kHz),长期运行后特征漂移。
2.2 分帧、帧移与窗函数:从连续流到“短时平稳”片段
核心原理
语音信号具有短时平稳性——在10-30ms的时间尺度内,声道的物理特性近似不变,频谱特征相对稳定。因此,需要将连续语音流切分为固定长度的帧(Frame),并让相邻帧部分重叠(帧移,Frame Shift),以捕捉动态变化。标准配置为:帧长25ms(16kHz采样率下对应400个采样点),帧移10ms(160个采样点),即相邻帧有60%重叠。直接对时域信号做FFT会产生频谱泄漏(Spectral Leakage),因为矩形窗的旁瓣衰减慢。因此需要施加窗函数(如汉明窗、汉宁窗),在帧边缘将信号平滑衰减到零,抑制旁瓣干扰。
操作流程
- 确定帧长N和帧移M(以采样点计),计算总帧数:
num_frames = (len(signal) - N) // M + 1。 - 对每一帧信号乘以窗函数:
windowed_frame = frame * hamming_window(N)。 - 将加窗后的帧送入FFT,得到该帧的频谱。
| 参数 | 典型值 | 影响 | KWS推荐 |
|---|---|---|---|
| 帧长 | 20-30ms | 频率分辨率 = 1/帧长;帧长越长,频率分辨率越高,但时间分辨率降低 | 25ms(400点@16kHz) |
| 帧移 | 5-15ms | 帧移越小,特征帧率越高,计算量增大;帧移过大则丢失动态信息 | 10ms(160点@16kHz) |
| 窗函数 | 汉明窗/汉宁窗 | 旁瓣衰减;汉明窗旁瓣峰值-43dB,汉宁窗-31dB | 汉明窗(KWS常用) |
案例拆解:帧移对唤醒延迟的影响
某车载KWS系统要求唤醒响应时间小于300ms。若采用帧移20ms,则每帧特征间隔20ms,唤醒词“你好小迪”约0.8秒,模型需要约40帧才能完成判断,加上模型推理时间,总延迟约350ms,超出指标。将帧移调整为10ms后,特征帧率翻倍,模型在20帧内即可输出结果,总延迟降至280ms,满足要求。代价是前端特征计算量增加约一倍,但通过优化FFT实现(使用CMSIS-DSP库)得以解决。
常见误区
- 帧长设置过短(<15ms),频率分辨率不足,无法区分相近的元音。
- 帧移设置过大(>20ms),导致唤醒词中的快速过渡音素(如塞音)被遗漏。
- 忘记加窗或使用矩形窗,频谱泄漏严重,影响后续Mel滤波器组输出。
2.3 短时傅里叶变换(STFT):时频域分析的桥梁
核心原理
STFT将长时非平稳语音信号分解为一系列短时平稳频谱的集合。对每一帧加窗后的信号执行N点FFT,得到复数频谱,取模得到幅度谱,取模平方得到功率谱。STFT的输出是一个二维矩阵:横轴为帧索引(时间),纵轴为频率bin(0到Fs/2),数值为幅度或功率。在KWS中,通常只保留幅度谱或功率谱,丢弃相位信息,因为人耳对相位不敏感,且相位信息对唤醒任务贡献有限。
关键参数与判断方法
- FFT点数:通常取512或1024(16kHz采样率下,512点对应频率分辨率31.25Hz,1024点对应15.625Hz)。KWS推荐512点,兼顾精度与算力。
- 频率范围:有效频率为0-8kHz(16kHz采样率),但语音唤醒主要关注300Hz-4kHz,可截断高频部分减少计算量。
- 归一化:FFT输出需除以帧长N,避免幅度随帧长变化。
案例拆解:FFT点数选择对唤醒率的影响
在低功耗蓝牙耳机KWS项目中,使用256点FFT(频率分辨率62.5Hz)时,唤醒词“小迪小迪”中的元音/i/和/u/的共振峰(F1约300Hz,F2约2300Hz)在频谱上混叠,导致特征区分度下降,唤醒率仅78%。改用512点FFT后,频率分辨率提升至31.25Hz,共振峰清晰分离,唤醒率提升至89%。虽然FFT计算量增加约30%,但通过硬件加速器(FFT协处理器)解决了性能瓶颈。
常见误区
- 保留全部FFT bin(512点),而实际有效信息集中在低频段,浪费内存和计算。
- 忽略窗函数对幅度的影响,未做幅度校正(如汉明窗的相干增益约0.54)。
- 在低信噪比环境下,直接使用功率谱会放大噪声,应使用幅度谱或做谱减法预处理。
2.4 频谱特征:Mel谱、FilterBank与MFCC
核心原理
人耳对频率的感知是非线性的:对低频变化敏感,对高频变化迟钝。Mel刻度模拟了这一特性,将线性频率映射到Mel频率:mel = 2595 * log10(1 + f/700)。基于Mel刻度设计三角滤波器组,将FFT频谱映射到Mel域,得到FilterBank特征(Fbank)。对Fbank取对数(模拟人耳响度感知),得到Log-Mel谱。对Log-Mel谱做离散余弦变换(DCT),去除相关性并降维,得到MFCC。三者的核心区别在于:Mel谱是经过Mel滤波器组和对数操作后的二维谱图;FilterBank是Mel谱的向量形式(每帧一个向量);MFCC则进一步通过DCT压缩维度,通常取13-40维。
| 特征类型 | 维度(典型) | 信息保留 | KWS适用性 | 计算量 |
|---|---|---|---|---|
| Mel谱 | 64×T(T为帧数) | 完整保留时频能量分布 | 适合CNN/CRNN模型输入 | 中 |
| FilterBank | 40-80维/帧 | 保留Mel域对数能量,相关性较高 | DNN/Transformer主流选择 | 低 |
| MFCC | 13-40维/帧 | 去相关后,丢失部分细节 | 传统GMM/小模型常用 | 低(需DCT) |
操作流程:从FFT到MFCC
- 对每帧FFT幅度谱取平方得到功率谱。
- 设计M个Mel三角滤波器(通常40个),覆盖0-8kHz,每个滤波器加权求和得到M个能量值。
- 对M个能量值取自然对数,得到Log-Mel特征(即Fbank)。
- 对Log-Mel特征做DCT,取前13-40个系数,即为MFCC。
案例拆解:Fbank与MFCC在KWS中的性能对比
某智能家居项目在同等条件下对比Fbank(40维)和MFCC(13维)的唤醒性能。使用相同的DNN模型结构(两层LSTM+全连接),Fbank特征达到94.2%唤醒率,MFCC为91.8%。原因在于MFCC的DCT去相关操作丢失了部分非线性信息,而DNN模型本身具备特征学习能力,不需要额外的去相关处理。但MFCC的优势在于维度低,模型参数量减少约30%,适合内存受限的MCU。最终方案:在算力充足的SoC上使用Fbank,在MCU上使用MFCC并配合模型量化。
常见误区
- 盲目追求高维特征(如80维Fbank),忽略嵌入式平台的内存带宽限制。
- MFCC的DCT系数截取过多(如取40维),反而引入噪声,降低泛化能力。
- 未做均值归一化或方差归一化,导致不同麦克风、不同信道下的特征分布偏移。
2.5 特征归一化与实战要点
核心原理
不同设备、不同环境下的语音信号幅度差异较大,直接使用原始特征会导致模型输入分布不稳定。常用的归一化方法包括:均值归一化(减去均值)、方差归一化(除以标准差)、全局对比度归一化(GCN)。在KWS中,推荐使用在线均值方差归一化(Online MVN),即对当前帧及其前后若干帧计算均值和方差,实时归一化,避免引入未来帧的延迟。
操作流程
# 在线MVN伪代码
window_size = 5 # 前后各2帧
for t in range(num_frames):
start = max(0, t - window_size//2)
end = min(num_frames, t + window_size//2 + 1)
mean = np.mean(features[start:end], axis=0)
std = np.std(features[start:end], axis=0) + 1e-6
normalized[t] = (features[t] - mean) / std
案例拆解:归一化对远场唤醒的改善
某智能音箱在3米远场场景下唤醒率仅70%,近场为95%。分析发现远场信号衰减导致特征幅度整体偏低,模型置信度下降。引入在线MVN后,远场唤醒率提升至88%,近场保持94%。归一化消除了距离带来的幅度差异,使模型更关注频谱形状而非能量。但需注意,MVN会削弱能量信息,对于依赖响度判断的唤醒词(如“大声喊”场景)需谨慎使用。
常见误区
- 使用全局统计量归一化(需预先统计整个音频的均值和方差),在流式KWS中不可行。
- 归一化窗口过大(如10帧),导致响应延迟增加。
- 忽略静音帧的归一化处理,静音帧的方差极小,归一化后可能产生异常大值。
语音信号基础是KWS系统的“地基”。采样率、量化、分帧、加窗、STFT和特征提取的每一个参数选择,都直接影响唤醒率和误唤醒率。在实际项目中,建议先使用标准配置(16kHz/16bit/25ms/10ms/汉明窗/40维Fbank)跑通基线,再根据具体场景(远场、噪声、低功耗)逐步调优。下一阶段将深入探讨唤醒词模型的结构设计与训练策略,但请务必确保前端特征提取的稳定性和一致性——这是所有上层算法有效性的前提。