3、语音信号处理基础:预加重、分帧、加窗、短时傅里叶变换(STFT)、频谱图

语音信号本质上是非平稳的时变信号,其统计特性和频谱特性随时间快速变化。然而,在极短的时间尺度内(通常为10~30ms),语音信号可以被近似视为平稳信号。这一“短时平稳性”假设是几乎所有语音处理算法的基石。本章将系统讲解语音信号进入深度学习或传统识别系统前的标准预处理链路:预加重、分帧、加窗、短时傅里叶变换(STFT)以及频谱图的生成与解读。理解这一链路中每一步的数学含义与工程取舍,是后续构建语音识别特征(如Fbank、MFCC)和训练声学模型的前提。

语音信号预处理与STFT特征提取链路 原始语音 s(n) 16kHz/16bit 预加重 y(n)=s(n)-αs(n-1) 分帧 帧长25ms 帧移10ms 加窗 汉明窗 w(n) STFT FFT → 频谱 频谱图 时间-频率-能量 Fbank/MFCC 后续章节 关键参数 • 采样率: 16kHz • 帧长: 400点(25ms) • 帧移: 160点(10ms) • FFT点数: 512 • 窗函数: 汉明窗 短时平稳性假设:语音在10~30ms内近似平稳,因此可以分段处理 预加重补偿高频衰减 → 分帧保证平稳性 → 加窗减少频谱泄漏 → STFT得到时频表示 频谱图是STFT的可视化,横轴时间、纵轴频率、颜色深浅表示能量强度

上图展示了从原始语音到频谱图的完整处理链路。下面将逐一拆解每个环节的数学原理、工程实现与常见陷阱。

3.1 预加重:补偿高频衰减

核心原理

语音信号在发声过程中,声门激励的频谱能量随频率升高以约12dB/倍频程的速率下降。同时,口唇辐射效应也会对高频分量产生衰减。预加重的目的是通过一个一阶高通滤波器提升高频分量,使频谱变得平坦,便于后续进行频谱分析和特征提取。其传递函数为:

H(z) = 1 - α·z⁻¹

对应的时域差分方程为:

y(n) = s(n) - α·s(n-1)

其中α为预加重系数,典型取值范围为0.95~0.99,常用值0.97。当α=0时,相当于不进行预加重。

操作流程与参数选择

  • 确定α值:对于16kHz采样率的语音,α=0.97是经验最优值;对于8kHz采样率,可适当调小至0.95。
  • 逐样本计算:对每个采样点执行y(n)=s(n)-α·s(n-1),注意n=0时s(-1)=0。
  • 验证效果:预加重后,语音信号的高频能量明显增强,频谱倾斜被校正。
经验提醒:预加重并非必须步骤。在深度学习中,如果使用原始波形作为输入(如端到端模型),预加重层可以被网络的第一层卷积自动学习。但在传统特征提取(Fbank/MFCC)中,预加重能显著提升识别鲁棒性,尤其是在噪声环境下。

案例拆解:预加重对语音识别的实际影响

某智能音箱项目在嘈杂厨房环境下测试,使用未经预加重的Fbank特征时,唤醒词识别准确率为82.3%。加入α=0.97的预加重后,准确率提升至87.6%。原因在于预加重增强了辅音(如/t/、/k/)的高频能量,这些音素在噪声中容易被掩盖。但需注意,预加重也会放大高频噪声,因此若信噪比极低(<5dB),可考虑将α降至0.95或结合谱减法使用。

常见误区

  • 误区一:认为预加重会丢失低频信息。实际上,预加重只是相对提升高频,低频分量仍然保留,只是相对幅度降低。
  • 误区二:对所有语音统一使用α=0.97。对于电话语音(8kHz采样率)或带限信号,应适当调整α值。

3.2 分帧与加窗:短时平稳性的工程实现

核心原理

语音信号是时变的,但在一段极短的时间内(10~30ms),其频谱特性可以认为是稳定的。分帧操作将连续语音切分为重叠的短时帧,帧长通常取25ms(400点@16kHz),帧移取10ms(160点@16kHz),重叠率为60%。分帧后,每一帧信号被近似视为平稳信号,可以独立进行频谱分析。

加窗则是将每一帧信号与窗函数相乘,目的是减少帧边界处的频谱泄漏。直接截断相当于使用矩形窗,其频谱旁瓣较高(-13dB),会导致频谱能量泄漏到旁瓣。汉明窗(Hamming Window)是语音处理中最常用的窗函数,其旁瓣衰减可达-43dB:

w(n) = 0.54 - 0.46·cos(2πn/(N-1)),  0 ≤ n ≤ N-1

其中N为帧长。加窗后的信号为:

x_w(n) = x(n) · w(n)

操作流程

  1. 确定帧长与帧移:帧长N=400点(25ms),帧移H=160点(10ms)。
  2. 计算总帧数:总帧数 = ⌈(信号长度 - N) / H⌉ + 1,不足部分补零。
  3. 生成窗函数:使用NumPy或MATLAB生成汉明窗:np.hamming(400)。
  4. 逐帧加窗:对每一帧信号乘以窗函数向量。

案例拆解:帧长选择对频谱分辨率的影响

在语音识别中,帧长选择需要在时间分辨率和频率分辨率之间权衡。帧长越长,频率分辨率越高(Δf = fs/N),但时间分辨率越低。例如:

帧长(ms)点数@16kHz频率分辨率(Hz)时间分辨率(ms)适用场景
203205020快速语音、噪声环境
254004025通用语音识别
3048033.330慢速语音、音乐分析
508002050元音分析、声调识别

实际项目中,若识别语速较快的方言(如粤语),可尝试20ms帧长;若处理唱歌或情感语音,30ms帧长能更好保留低频细节。

常见误区与总结

风险提示:不要使用矩形窗进行分帧。矩形窗的频谱旁瓣衰减仅-13dB,会导致严重的频谱泄漏,使相邻频带的能量相互干扰,降低特征区分度。汉明窗或汉宁窗是语音处理的标准选择。
  • 误区一:分帧时不做重叠。不重叠的分帧会导致帧间信息丢失,且后续特征在时间轴上不连续,影响HMM或CTC等序列模型的训练。
  • 误区二:窗函数归一化。加窗后信号能量会降低(汉明窗的相干增益约0.54),若需保持能量一致,可除以窗函数的均值。

3.3 短时傅里叶变换(STFT)与频谱图

核心原理

短时傅里叶变换(STFT)是对分帧加窗后的每一帧信号执行离散傅里叶变换(DFT),得到该帧的频谱。数学表达式为:

X(m,k) = Σ_{n=0}^{N-1} x(n+mH) · w(n) · e^{-j2πkn/N}

其中m为帧索引,k为频率索引(k=0,1,...,N-1),H为帧移,w(n)为窗函数。实际计算中通常使用FFT(快速傅里叶变换)加速,FFT点数N_fft一般取大于等于帧长的2的幂次,如512或1024。若N_fft > N,则对加窗后的帧进行零填充。

频谱图(Spectrogram)是STFT结果的可视化表示:横轴为时间(帧索引),纵轴为频率(Hz),颜色或灰度表示能量强度(通常取对数幅度谱20·log10|X(m,k)|)。频谱图是语音分析中最直观的工具,能够清晰展示语音的时频结构,如共振峰轨迹、谐波结构、噪声分布等。

操作流程与参数配置

  1. 选择FFT点数:N_fft=512(帧长400时,零填充112点),频率分辨率=16000/512=31.25Hz。
  2. 计算幅度谱:对每一帧FFT结果取模:|X(m,k)|。
  3. 转换为对数谱:20·log10(|X(m,k)| + ε),ε为极小值防止log(0)。
  4. 生成频谱图:使用matplotlib的specgram或imshow绘制。

案例拆解:频谱图在语音识别中的应用

在训练语音识别模型时,频谱图是Fbank特征的基础。以Kaldi和ESPnet为例,标准流程为:

# 以Python Librosa为例
import librosa
import numpy as np

y, sr = librosa.load('speech.wav', sr=16000)
# 预加重
y_pre = np.append(y[0], y[1:] - 0.97 * y[:-1])
# 分帧加窗
frames = librosa.util.frame(y_pre, frame_length=400, hop_length=160)
window = np.hamming(400)
frames_win = frames * window[:, np.newaxis]
# STFT
stft = np.fft.rfft(frames_win, n=512, axis=0)
power_spec = np.abs(stft) ** 2
# 对数幅度谱
log_spec = 10 * np.log10(power_spec + 1e-10)
# 绘制频谱图
import matplotlib.pyplot as plt
plt.imshow(log_spec, aspect='auto', origin='lower', 
           extent=[0, len(y)/sr, 0, sr/2], cmap='viridis')
plt.xlabel('Time (s)')
plt.ylabel('Frequency (Hz)')
plt.colorbar(label='dB')
plt.show()

上述代码生成的频谱图可直接用于观察语音的时频特征。例如,元音/a/的频谱图会显示明显的共振峰(F1约800Hz,F2约1200Hz),而清辅音/s/则表现为高频区域的宽频噪声。

常见误区与工程复盘

关键经验:STFT的时频分辨率受海森堡不确定性原理限制。增加窗长可提高频率分辨率,但会降低时间分辨率。在语音识别中,40Hz的频率分辨率(25ms窗长)足以区分共振峰,而10ms的帧移能保证特征序列的平滑性。若需同时获得高时频分辨率,可考虑使用小波变换或多分辨率STFT,但计算复杂度会显著增加。
  • 误区一:忽略相位信息。语音识别特征通常只使用幅度谱,丢弃相位。但在语音增强和语音合成中,相位信息至关重要。若需重建波形,必须保留相位。
  • 误区二:FFT点数过小。若N_fft=256,频率分辨率变为62.5Hz,可能无法区分基频较低的男性语音(F0约100Hz)的谐波结构。
  • 误区三:频谱图颜色映射选择不当。应使用感知均匀的颜色映射(如viridis、magma),避免使用彩虹色(jet),因为彩虹色在灰度打印时无法区分。

总结而言,预加重、分帧、加窗和STFT构成了语音信号处理的基础链路。每一步的参数选择都直接影响后续特征的质量和识别系统的性能。在实际工程中,建议通过可视化频谱图来验证预处理效果,并针对具体场景(如噪声类型、语速、采样率)微调参数。这一基础是否扎实,将直接决定后续声学模型训练的上限。