语音信号基础:采样率、量化、时域与频域表示、短时傅里叶变换(STFT)、频谱图的基本概念
语音信号是VAD(语音活动检测)与人声分离系统的输入源头。无论是判断一段音频中是否存在人声,还是将人声从背景音乐中剥离,所有算法的起点都是对原始声波进行数字化表示。理解采样率、量化精度、时域/频域特性以及短时傅里叶变换(STFT)与频谱图,是后续设计特征工程、训练神经网络模型、调优阈值参数的根基。本章将从数字化的物理约束出发,逐步建立从波形到频谱的完整认知框架。
2.1 采样率与量化:数字化的物理边界
核心原理:模拟语音信号是连续变化的声压波形,必须通过模数转换(ADC)变为离散序列。采样率(Sampling Rate)决定每秒采集的样本点数,量化位数(Bit Depth)决定每个样本的幅度精度。根据奈奎斯特采样定理,采样率必须大于信号最高频率的两倍,否则会产生混叠(Aliasing)现象。语音信号的能量主要集中在300Hz-3.4kHz(电话带宽),因此8kHz采样率即可满足电话通信;而音乐或高质量语音处理通常使用44.1kHz或48kHz采样率。
量化与信噪比:量化是将连续幅度映射到有限离散电平的过程。16bit量化提供65536个电平,理论信噪比约为96dB(6.02×16+1.76)。量化误差表现为背景噪声,在静音段尤为明显。对于VAD系统,量化噪声会直接影响静音检测的灵敏度——如果噪声底过高,低音量语音可能被误判为静音。
| 采样率 | 适用场景 | 最高频率 | 帧长(25ms)样本数 |
|---|---|---|---|
| 8 kHz | 电话语音、传统VAD | 4 kHz | 200 |
| 16 kHz | 语音识别、深度学习VAD | 8 kHz | 400 |
| 44.1 kHz | 音乐分离、高保真处理 | 22.05 kHz | 1102 |
| 48 kHz | 影视音频、专业制作 | 24 kHz | 1200 |
2.2 时域表示:波形、能量与过零率
时域特征:时域波形直接展示幅度随时间的变化。对于VAD,最基础的时域特征是短时能量(Short-time Energy)和短时过零率(Zero Crossing Rate, ZCR)。短时能量反映帧内样本的平方和,语音段能量通常高于静音段;过零率反映信号穿越零轴的频率,清音(如/s/、/f/)的过零率较高,浊音(如/a/、/i/)的过零率较低。
判断方法:实际应用中,VAD系统常采用双门限法——先计算每帧能量,设置高门限和低门限。当能量超过高门限时判定为语音起始;当能量低于低门限且持续超过一定帧数(如10帧)时判定为语音结束。过零率作为辅助特征,用于区分清音和静音(静音的过零率通常较低且稳定)。
import numpy as np
frame = audio[50*160 : 50*160 + 400] # 第50帧
energy = np.sum(frame ** 2) / len(frame) # 归一化能量
zcr = np.sum(np.abs(np.diff(np.sign(frame)))) / (2 * len(frame))
若能量为0.85(归一化后),ZCR为0.12,可初步判定为浊音语音段;若能量为0.02,ZCR为0.05,则更可能是静音或背景噪声。
2.3 频域表示:从傅里叶变换到短时傅里叶变换
核心原理:傅里叶变换将时域信号分解为不同频率的正弦波分量,得到全局频谱。但语音信号是非平稳的——发音器官在几十毫秒内就会变化,因此需要短时傅里叶变换(STFT)。STFT的基本思想是:用固定长度的窗函数(如Hamming窗)截取信号片段,假设窗内信号近似平稳,然后对该片段做FFT。窗函数沿时间轴滑动,得到一系列频谱,组合成二维时频表示。
STFT参数选择:窗长决定频率分辨率和时间分辨率的权衡。窗越长,频率分辨率越高(频谱更精细),但时间分辨率越低(无法捕捉快速变化);窗越短则相反。常用配置为:窗长25ms(400点@16kHz)、帧移10ms(160点)、FFT点数512(补零至2的幂次)。频率分辨率 = 采样率/FFT点数 = 16000/512 ≈ 31.25Hz。
2.4 频谱图:VAD与分离的“视觉语言”
频谱图(Spectrogram)是STFT结果的可视化:横轴为时间,纵轴为频率,颜色或亮度表示该时频点的能量幅度(通常取对数坐标,单位dB)。频谱图是VAD和人声分离模型最常用的输入特征——深度学习模型(如CNN、Transformer)可以直接将频谱图作为图像处理,或将其展平为特征序列。
案例拆解:噪声环境下的VAD特征对比
| 场景 | 时域波形特征 | 频谱图特征 | VAD判断 |
|---|---|---|---|
| 安静办公室 | 能量低、波动小 | 低频均匀分布,无谐波结构 | 静音 |
| 人声说话 | 能量中等、有包络起伏 | 基频(100-300Hz)及谐波清晰可见 | 语音 |
| 空调噪声 | 能量稳定、无起伏 | 低频(50-200Hz)持续存在 | 非语音 |
| 键盘敲击 | 短促脉冲、能量突增 | 宽带瞬态,持续时间短(<50ms) | 非语音(需结合时长) |
操作流程:从音频到频谱图的完整链路
- 预加重:对时域信号通过一阶高通滤波器(y[n]=x[n]-0.97x[n-1]),提升高频分量,补偿语音信号高频能量衰减。
- 分帧:按帧长25ms、帧移10ms切分信号,相邻帧有50%重叠,保证帧间平滑过渡。
- 加窗:每帧乘以Hamming窗(w[n]=0.54-0.46cos(2πn/(N-1))),减少频谱泄漏。
- FFT:对加窗后的帧做512点FFT,取幅度谱或功率谱(幅度平方)。
- 对数压缩:将幅度谱转换为dB刻度:20log10(|X|+ε),ε为小常数防止log(0)。
- 拼接:将所有帧的频谱按时间顺序排列,形成二维矩阵,即频谱图。
某呼叫中心需要对8kHz电话录音进行VAD,以统计客服与客户的说话时长。初始方案仅使用短时能量,但误报率高达23%——原因是电话线路中的背景噪声(约-35dBm)在静音段能量波动较大。改进方案:
- 输入:8kHz/16bit单声道录音,每帧200样本(25ms),帧移80样本(10ms)
- 特征:计算每帧的频谱图(256点FFT),提取子带能量(0-1kHz、1-2kHz、2-3kHz、3-4kHz)
- 判断:语音段在1-3kHz频带能量显著高于静音段,且谐波结构明显(相邻频带能量比稳定)
- 结果:误报率降至4.2%,召回率从88%提升至96%
- 代价:计算量增加约3倍(FFT+子带滤波),但单核CPU仍可实时处理
2.5 常见误区与总结复盘
误区一:采样率越高越好。高采样率带来更大数据量和计算开销,但对VAD而言,8kHz已覆盖电话语音主要频带,16kHz足够捕捉所有语音特征。盲目使用44.1kHz只会增加延迟和功耗。
误区二:忽略预加重。语音信号的高频分量(2-4kHz)能量较低,若不预加重,频谱图中高频细节会被压缩,影响清音检测和声纹特征提取。
误区三:窗函数选择随意。矩形窗频谱泄漏严重,会导致相邻频率分量相互干扰;Hamming窗和Hann窗是语音处理的标准选择,能有效抑制旁瓣。
误区四:将频谱图直接输入全连接网络。频谱图具有局部相关性(相邻时频点高度相关),应使用卷积或注意力机制提取局部模式,否则模型参数量巨大且泛化能力差。