语音信号处理基础与特征工程
语音是人类传递信息最自然的载体,其本质是声带振动产生的声波经口腔、鼻腔等声道结构调制后形成的具有特定语义的物理信号。从信号处理的角度看,语音信号是一种非平稳的随机过程,其统计特性会随时间快速变化,但人类的发音器官(声带、舌头、嘴唇等)的运动速度是有限的,这使得在10~30ms的极短时间内,语音信号的统计特性可以近似认为是平稳的——这一“短时平稳假设”是整个语音信号处理领域的核心基石,后续所有声学特征的设计都建立在该假设之上。
<!-- 电子版侧边栏:短时平稳假设的合理性可以通过生理学实验验证:人类发音时,声道形状的变化速度约为每秒5~10次,对应50~200ms的变化周期,因此20ms左右的帧长完全可以保证帧内声道形状的稳定性。 -->
语音产生与感知的生理学基础
理解语音信号的特性,首先需要从人类产生和感知语音的生理机制入手。目前公认的语音产生模型是源-滤波器模型(Source-Filter Model),由瑞典语音学家Gunnar Fant于1960年提出,该模型将语音产生过程抽象为两个独立的模块:声源(激励源)和声道(滤波器)。
源-滤波器模型
从数学角度,语音信号可以表示为声源信号与声道冲激响应的卷积: $$x(n) = s(n) * h(n)$$ 其中$x(n)$是最终输出的语音信号,$s(n)$是声源信号,$h(n)$是声道冲激响应,$*$表示卷积运算。声源信号根据发音类型分为两类: 1. 浊音(Voiced):声带振动产生周期性的脉冲信号,脉冲的重复周期就是基音周期(Pitch Period),对应的频率为基音频率(F0)。成年男性的基音频率通常为80~200Hz,成年女性为200~400Hz,儿童更高。 2. 清音(Unvoiced):声带不振动,气流通过声道狭窄处产生湍流,等效为高斯白噪声信号,没有明显的周期性。
声道是由声门到嘴唇的共振腔组成,其冲激响应$h(n)$的频谱特性由共振峰(Formant)决定:共振峰是声道谐振的频率点,每个共振峰对应一个谐振频率和带宽,前三个共振峰(F1、F2、F3)携带了大部分的语义信息,决定了元音的发音特性。
<!-- 纸书:此处插入图1-1 语音产生的源-滤波器模型示意图,标注声带、声道、声源、共振峰等关键部分 -->
人耳的听觉特性是语音特征设计的核心依据,其核心特性包括: 1. 等响度曲线:人耳对不同频率的声音的敏感度不同,在1~5kHz范围内敏感度最高,低频和高频的敏感度较低,同等声压级下,人耳感知到的响度不同。 2. 临界带(Critical Band):人耳的频率分辨能力是有限的,将可分辨的频率范围划分为若干个临界带,每个临界带的宽度约为100~200Mel,低频段的临界带更窄,高频段更宽。 3. Mel频率刻度:基于人耳的对数频率感知特性定义,1Mel被定义为1000Hz纯音在人耳感知下的1/1000倍频程,Mel刻度的公式为: $$m(f) = 2595 \log_{10}\left(1 + \frac{f}{700}\right)$$ 其中$f$为物理频率(单位Hz),$m$为对应的Mel频率。该公式在低频段近似线性,高频段近似对数,完美匹配人耳的频率感知特性。
语音信号的预处理流程
原始语音信号在进入特征提取环节前,需要经过一系列预处理操作,消除无关干扰,满足
原始语音信号在进入特征提取环节前,需要经过一系列预处理操作,消除无关干扰,满足短时平稳假设的输入要求,同时抑制各类噪声和干扰,提升后续特征提取的准确性和鲁棒性。语音预处理的核心流程包括预加重、分帧、加窗三个步骤,每个步骤都针对语音信号的特定特性设计,缺一不可。
预加重:抑制低频漂移与高频补偿
预加重是一阶高通滤波操作,其核心目的是补偿语音信号高频部分的能量衰减,同时抑制低频段的直流漂移和近直流噪声。语音信号经声学信道传输后,往往存在低频能量远高于高频能量的现象:一方面,人类的发声机制中,声带的基频振动以及声道低频谐振都会带来大量低频能量;另一方面,麦克风的近讲效应、信道的低频衰落都会进一步放大低频分量,导致高频细节被低频噪声掩盖。
从数学角度,预加重的差分方程可以表示为: $$y(n) = x(n) - \alpha x(n-1)$$ 其中$x(n)$是原始语音采样,$y(n)$是预加重后的信号,$\alpha$是预加重系数,通常取值在0.9~0.97之间。对差分方程做Z变换,可以得到预加重滤波器的频率响应: $$H(e^{j\omega}) = 1 - \alpha e^{-j\omega}$$ 该频率响应在$\omega=0$(即直流分量)处的幅度为$1-\alpha$,接近0,因此可以有效抑制低频漂移;在$\omega=\pi$(即奈奎斯特频率)处的幅度为$1+\alpha$,接近2,因此可以将高频部分的能量提升1倍左右,补偿高频衰减。
<!-- 电子版侧边栏:💡 实践提示:预加重系数的选择与采样率正相关:16kHz采样率的语音通常使用0.97,48kHz高清语音使用0.95,而8kHz电话语音使用0.98。过高的预加重系数会放大高频噪声,过低则无法有效补偿高频能量。 -->
为了直观验证预加重的作用,我们可以取一段16kHz采样的男声浊音片段,分别计算原始信号和预加重后信号的功率谱密度(PSD),对比结果可以发现:预加重后100Hz以下的低频能量被抑制了15dB以上,而4kHz以上的高频能量被提升了6~8dB,高频的共振峰细节更加清晰,为后续的特征提取提供了更好的输入。
分帧:满足短时平稳假设
由于语音信号是非平稳的随机过程,其统计特性随时间快速变化,无法直接对整段语音做全局分析。而人类的发音器官运动速度有限,声道形状的变化周期约为50~200ms,因此在10~30ms的极短时间内,语音信号的统计特性可以近似认为是平稳的——这就是前文提到的短时平稳假设,分帧操作就是基于该假设设计的。
分帧的核心是确定两个参数:帧长(Frame Length)和帧移(Frame Shift)。工业界通用的标准配置是25ms帧长、10ms帧移,对应16kHz采样率下的400个采样点和160个采样点,帧与帧之间的重叠率为60%。这一配置是经过大量实验验证的最优选择: 1. 25ms的帧长足够覆盖至少2个基音周期(成年男性基音周期最长约12.5ms),可以保证帧内包含足够的周期性信息,适合基音提取、浊音/清音判定等任务; 2. 10ms的帧移可以保证时间分辨率足够高,相邻帧之间的差异不会过大,同时不会带来过高的计算冗余。
<!-- 纸书:此处插入图1-2 语音分帧示意图,标注帧长、帧移、重叠区域,以及对应的时间-domain波形 -->
加窗:抑制频谱泄漏
分帧操作相当于对原始语音信号做了截断,即将无限长的语音信号截断为有限长的帧序列。截断操作在时域上相当于乘以一个矩形窗,而矩形窗的频谱存在很高的旁瓣,会导致频谱泄漏(Spectral Leakage):即原本集中在某个频率点的能量会扩散到相邻的频率 bins 中,导致频谱失真,严重时甚至会出现虚假的频谱峰值,干扰共振峰、基音等特征的提取。
为了抑制频谱泄漏,通常会在分帧后对每一帧乘以一个缓变的窗函数,使帧两端的幅度平滑过渡到0。语音处理中最常用的窗函数是汉明窗(Hamming Window),其表达式为: $$w(n) = 0.54 - 0.46 \cos\left(\frac{2\pi n}{N-1}\right), \quad 0 \leq n \leq N-1$$ 其中$N$是帧长(采样点数)。汉明窗的主瓣宽度与矩形窗相同,但旁瓣幅度比矩形窗低20dB以上,可以有效抑制频谱泄漏,同时不会像其他高旁瓣抑制的窗函数(如布莱克曼窗)那样过度平滑主瓣,导致频率分辨率下降。
为了对比不同窗函数的效果,我们可以取一段包含两个正弦分量的信号,分别加矩形窗、汉宁窗、汉明窗后做FFT,对比频谱图可以发现:矩形窗的两个正弦峰周围有明显的泄漏波纹,汉宁窗的泄漏有所降低,而汉明窗的泄漏几乎消失,两个峰的分辨率也保持在较高水平,因此汉明窗是语音预处理的标准选择。
```mermaid graph TD A[原始16kHz语音信号] --> B[预加重<br>系数α=0.97] B --> C[分帧<br>25ms帧长/10ms帧移<br>重叠率60%] C --> D[加汉明窗<br>抑制频谱泄漏] D --> E[FFT变换<br>得到单边功率谱] E --> F[特征提取模块] ```
核心语音特征提取原理
经过预处理的语音帧,需要转换为更适合声学模型输入的特征表示。语音特征的设计需要遵循两个核心原则:一是匹配人耳的听觉感知特性,二是尽可能去除冗余信息、保留核心语义信息。目前工业界最常用的核心特征包括FBANK、MFCC、基音周期、帧能量四类,其中FBANK和MFCC是最基础的声学特征,基音和能量是重要的辅助特征。
FBANK:梅尔滤波器组能量特征
FBANK(Filter Bank Energy)是直接基于人耳Mel频率感知特性设计的特征,也是目前端到端语音识别模型最常用的输入特征。其提取流程分为三步:梅尔刻度滤波器组构造、滤波器组能量计算、对数变换。
梅尔滤波器组的构造
梅尔滤波器组由$M$个三角滤波器组成,覆盖语音的有效频率范围(通常为20Hz到奈奎斯特频率$f_s/2$,16kHz采样下为8kHz)。每个三角滤波器的中心频率均匀分布在Mel刻度上,即相邻两个滤波器的中心频率的Mel差值为常数: $$\Delta m = \frac{m(f_s/2) - m(20)}{M+1}$$ 其中$m(f)$是前文提到的Mel频率转换公式,$M$是滤波器数量,通常取23~26个。每个三角滤波器的左边缘频率为前一个滤波器的中心频率,右边缘频率为后一个滤波器的中心频率,滤波器的幅度在中心频率处为1,在边缘处为0。
以16kHz采样、23个Mel滤波器为例,其滤波器组的频率响应曲线如图所示:低频段的滤波器宽度较窄(约100Hz),高频段的滤波器宽度较宽(约300Hz),完美匹配人耳的临界带特性——低频段人耳对频率变化更敏感,需要更高的频率分辨率,高频段人耳对幅度变化更敏感,需要更宽的带宽来平滑噪声。
FBANK的计算流程
对于经过FFT变换后的单边功率谱$|X(k)|^2$($k$是频率bin的索引),FBANK的计算流程为: 1. 将每个频率bin的功率代入对应的梅尔滤波器,计算每个滤波器的输出能量,即滤波器覆盖的频率范围内的功率谱积分(实际实现中为加权求和): $$E(m) = \sum_{k=0}^{N_{fft}/2} |X(k)|^2 \cdot H_m(k), \quad m=1,2,...,M$$ 其中$H_m(k)$是第$m$个Mel滤波器在第$k$个频率bin处的幅度,$N_{fft}$是FFT的长度,通常取512(对应25ms帧长、16kHz采样)。 2. 对每个滤波器的输出能量取对数,得到对数滤波器组能量: $$F(m) = \log(E(m) + \epsilon)$$ 其中$\epsilon$是一个极小常数(通常取1e-10),避免对0取对数。取对数的原因有两个:一是人耳对声音的感知是对数关系,取对数后特征更符合听觉特性;二是语音的能量动态范围很大(静音段能量可能只有浊音段的1/1000),取对数后可以将动态范围压缩到更适合神经网络训练的区间。
FBANK的维度等于Mel滤波器的数量$M$,通常为23维或26维,相比MFCC保留了完整的频谱信息,没有信息损失,因此端到端语音识别模型(如Conformer、Transfomer)通常直接使用FBANK或对数梅尔特征作为输入。
MFCC:梅尔频率倒谱系数
MFCC(Mel-Frequency Cepstral Coefficient)是过去40年语音识别领域最经典的特征,由Davis和Mermelstein于1980年提出,至今仍然是传统GMM-HMM声学模型的标准输入。MFCC本质是在FBANK的基础上做了离散余弦变换(DCT),目的是去除FBANK各个维度之间的相关性,同时将能量集中在低阶系数上,实现降维和去噪。
DCT变换的原理与作用
FBANK的各个维度对应相邻的Mel频率,存在很强的相关性:比如第$m$个滤波器和第$m+1$个滤波器的覆盖频率范围有重叠,因此两个维度的能量数值高度相关。这种相关性会增加声学模型的训练难度,降低模型的泛化能力。DCT是一种实数域的变换,具有很好的能量集中性:对于高度相关的信号,DCT可以将大部分能量集中在变换后的前几个系数上,后续的系数能量极低,可以视为噪声。
MFCC的DCT变换公式为: $$C(n) = \sum_{m=1}^{M} F(m) \cdot \cos\left(\frac{\pi n (m - 0.5)}{M}\right), \quad n=1,2,...,N_{cep}$$ 其中$F(m)$是FBANK的对数能量,$N_{cep}$是MFCC的维度,通常取12或13。通常我们会保留前13维MFCC,丢弃后10维的高阶系数,因为后10维的能量通常只占总能量的5%以下,主要是噪声和冗余信息。
完整的MFCC提取流程
完整的MFCC提取流程包括预加重、分帧、加窗、FFT、梅尔滤波器组、对数变换、DCT变换七个步骤,其中前六步和FBANK的提取流程完全一致,最后一步是DCT变换。此外,工业界通常会在MFCC的基础上补充一阶差分和二阶差分,得到39维的静态+动态特征:
- 一阶差分:反映MFCC随时间的变化速率,对应语音的过渡特性(如辅音到元音的过渡);
- 二阶差分:反映一阶差分的变化速率,对应语音的加速度特性。
差分系数的计算公式为: $$d(n) = \frac{\sum_{k=1}^{K} k \cdot (C(n+k) - C(n-k))}{2 \sum_{k=1}^{K} k^2}$$ 通常$K$取2,即用前后各2帧的MFCC计算当前帧的差分。39维MFCC+差分特征是传统GMM-HMM时代的标配特征,在LibriSpeech等公开数据集上,基于该特征的GMM-HMM模型可以做到5%左右的词错误率(WER)。
基音周期与帧能量:关键的辅助特征
除了FBANK和MFCC这类频谱特征外,基音周期和帧能量是两类重要的辅助特征,携带了语音的韵律和声源信息,在语音合成、声纹识别、语音情感识别等任务中不可或缺。
基音周期提取
基音周期是浊音信号中相邻两个声带振动脉冲的时间间隔,对应的频率为基音频率(F0)。基音周期的提取通常基于浊音的周期性:浊音是周期性的脉冲串,其自相关函数在基音周期的整数倍处会出现明显的峰值,因此可以通过自相关法或倒谱法提取基音周期。
自相关法的原理是:对当前帧的语音信号做自相关运算,得到自相关函数$R(\tau)$,其中$\tau$是延迟时间。对于浊音帧,$R(\tau)$在$\tau$等于基音周期的整数倍处会出现峰值,因此只需要找到$R(\tau)$的第一个峰值对应的$\tau$,就是当前的基音周期$T_0$,基音频率$F_0 = 1/T_0$。
以16kHz采样的一段男声浊音为例,其自相关函数在$\tau=8ms$处出现第一个明显峰值,对应的基音频率为125Hz,符合成年男性的正常基音范围。基音提取的难点在于:清音没有周期性,自相关函数没有明显峰值;浊音和清音的过渡段(如浊辅音/g/的除阻段)基音不稳定,容易出现提取错误;噪声环境下自相关函数的峰值会被淹没,导致基音提取失败。目前工业界的基音提取工具(如Kaldi的pitch提取模块、Praat)通常采用自相关和倒谱结合的方法,基音提取准确率可以达到95%以上。
帧能量计算
帧能量是当前帧内所有采样点的平方和,反映了语音的响度特性,计算公式为: $$E = \sum_{n=0}^{N-1} y(n)^2$$ 其中$N$是帧长,$y(n)$是预处理后的语音采样。通常我们会取帧能量的对数值作为最终特征,压缩动态范围。帧能量的核心作用是: 1. 语音活动检测(VAD):静音段的帧能量通常低于浊音段的1/100,通过设定能量阈值可以快速区分静音段和语音段,减少后续模型的计算量; 2. 浊音/清音判定:浊音的能量通常比清音高3~10dB,结合基音信息可以准确区分浊音和清音; 3. 韵律建模:在语音合成任务中,帧能量的变化曲线决定了合成语音的语调起伏,是韵律特征的核心组成部分。
开源工具与可复现代码示例
为了帮助读者快速实践,本节分别给出基于librosa和Kaldi的特征提取代码示例,覆盖FBANK、MFCC、基音、能量等所有核心特征的提取流程。
基于librosa的特征提取
librosa是Python生态中最常用的音频处理库,封装了完整的语音特征提取流程,代码简洁易读,适合快速原型开发。以下代码实现了从原始语音文件到所有核心特征的完整提取流程,包含预处理、特征计算、可视化三个部分:
```python import librosa import numpy as np import matplotlib.pyplot as plt
1. 加载语音文件,16kHz采样率,单声道
audio_path = "example.wav" y, sr = librosa.load(audio_path, sr=16000, mono=True)
2. 预加重,系数0.97
y_preemph = librosa.effects.preemphasis(y, coef=0.97)
3. 分帧加窗,25ms帧长,10ms帧移,汉明窗
n_fft = 400 # 25ms * 16kHz = 400采样点 hop_length = 160 # 10ms * 16kHz = 160采样点 win_length = n_fft window = 'hamming'
4. 提取FBANK(23维梅尔滤波器组能量)
fbank = librosa.feature.melspectrogram( y=y_preemph, sr=sr, n_fft=n_fft, hop_length=hop_length, win_length=win_length, window=window, n_mels=23, fmin=20, fmax=8000 ) fbank = librosa.power_to_db(fbank, ref=np.max) # 取对数,转换为dB单位
5. 提取13维MFCC,补充一阶二阶差分得到39维特征
mfcc = librosa.feature.mfcc( y=y_preemph, sr=sr,