语音信号处理基础:特征、感知与预处理
语音,这一人类最自然的交流媒介,其物理本质是一维的声压随时间变化的连续波形。然而,要让机器理解语音,我们必须回答一个根本问题:如何从这看似简单的声波中,提取出承载语义和韵律的丰富信息?这个问题构成了语音信号处理的基石,也是本章的核心议题。语音信号处理并非简单的数学变换,而是一门融合了声学、生理学、心理学和信息科学的交叉学科。其核心目标是将原始的、高维的、冗余的时域波形,转换为一种紧凑的、判别性的、且与人类感知高度相关的特征表示。这种表示将作为后续自动语音识别(ASR)、语音合成(TTS)乃至说话人验证等任务的输入。本章将系统性地构建这一知识体系,从语音产生的物理机制与人类听觉的感知原理出发,深入剖析时域与频域的分析方法,并详细阐述以梅尔频率倒谱系数(MFCC)及其变体为代表的特征提取全流程。我们将不仅展示“如何做”,更将阐明“为何这样做”,通过对比不同特征在后续深度学习模型中的表现,揭示特征设计与模型架构之间深刻的协同演进关系。最终,本章还将探讨语音增强与端点检测等关键预处理技术,为构建鲁棒的语音AI系统奠定坚实的数据基础。
语音产生的物理与生理模型:源-滤波器理论
理解语音信号,首先需要理解它的产生机制。人类发声是一个精密的生理过程,其物理模型可高度概括为源-滤波器模型(Source-Filter Model)。该模型由日本声学专家铃木重道等人于20世纪50年代提出,至今仍是语音产生理论的基石。
源:激励信号的产生
“源”指的是激励声带振动的气流。当肺部呼出的气流通过紧闭的声门时,会迫使声带(一对位于喉部的弹性组织)产生周期性振动。这种振动产生的是近似于三角波的复杂周期性脉冲序列,其基频(Pitch, F0)由声带的张力、质量和长度决定,通常范围在80Hz(低音)到300Hz(高音)之间,女性与儿童的基频普遍高于男性。这一周期性脉冲序列是浊音(Voiced Sound)的声源,如元音 /a/, /i/, /u/ 以及辅音 /z/, /v/ 等。对于清音(Unvoiced Sound),如 /p/, /t/, /k/, /s/, /f/,声带不振动,气流直接通过开放的声门,其激励信号更接近宽带的随机噪声。因此,从信号角度看,语音的激励源是一个在时域上表现为周期性脉冲(浊音)或随机噪声(清音)的序列。
滤波器:声道的调制
“滤波器”指的是从声门到嘴唇的声道路径,它像一个动态的共振器,对声源进行整形。声道包括咽腔、口腔和鼻腔(发鼻音时鼻腔参与)。其形状由舌位、下颌开合、唇形等构音器官的运动决定。声道的形状决定了哪些频率分量会被增强(共振峰,Formants)或衰减。共振峰是声道频率响应的峰值,通常用前三个共振峰F1, F2, F3来描述元音的音质。例如,元音 /i/(如“衣”)的F1低、F2高,而元音 /a/(如“啊”)的F1和F2都较高。这种通过改变声道形状来产生不同音素的过程,称为调音(Articulation)。
```mermaid graph TD A[肺部气流] --> B[声门] B --> C{声带振动?} C -->|是| D[周期性脉冲序列<br/>基频F0] C -->|否| E[宽带随机噪声] D --> F[声道滤波器] E --> F F --> G[辐射效应] G --> H[输出语音波形] ```
辐射效应与完整模型
在嘴唇处,声波会向周围空气辐射,这个过程相当于一个高通滤波器(约$1/f$特性),会轻微提升高频分量。因此,完整的语音产生模型可表示为:输出语音 = 激励源(经声道滤波) × 辐射效应。在数学上,这可以表示为线性时变系统:$s(t) = e(t) * h(t) + n(t)$,其中$s(t)$是输出语音,$e(t)$是激励,$h(t)$是时变的声道冲激响应,$*$表示卷积,$n(t)$代表环境噪声。源-滤波器模型的美妙之处在于它将复杂的语音产生过程解耦为两个相对独立的部分:激励主要决定音高(韵律)和清浊音,而声道滤波器主要决定音素(音质)。这一解耦思想深刻影响了后续特征提取的设计理念,例如倒谱分析正是为了将这两者分离。
人类听觉系统的感知原理:为何我们需要Mel尺度?
机器提取的特征必须与人类听觉感知相关,才能最大化信息利用率。理解人耳的工作原理是设计MFCC等感知相关特征的理论前提。
外耳与中耳:声波到机械振动的转换
外耳(耳廓和外耳道)起到收集声波和提供频率选择性的作用,其共振峰在2-5kHz,这解释了为何该频段对语音清晰度至关重要。声波经过外耳道撞击鼓膜,中耳的三块听小骨(锤骨、砧骨、镫骨)将鼓膜的机械振动放大并传递到内耳。这一过程提供了约20-30dB的声压增益,以补偿从空气到液体介质传播时的巨大声阻抗失配。
内耳与基底膜:频率分析的物理实现
内耳中的耳蜗是一个充满液体的螺旋形结构,其核心是基底膜。基底膜的特性是其宽度和刚度从底部到顶部连续变化:底部窄而 stiff,对高频敏感;顶部宽而松弛,对低频敏感。当声波振动通过耳蜗液体传递时,会在基底膜的不同位置引起最大振动,从而实现频率分解。这种分析是非线性的,在低频区分辨率高,在高频区分辨率低。这种非线性特性正是Mel尺度的生理学基础。
听觉神经与感知特性
基底膜上的毛细胞将机械振动转换为神经电信号。听觉神经纤维的发放率与声音的瞬时振幅相关,但其相位锁定能力在4kHz以上会丧失。更重要的是,人耳存在多种感知非线性现象:
- **频率掩蔽(Frequency Masking)**:强音会掩盖邻近频率的弱音,且低频音对高频音的掩蔽效应更强。
- **时间掩蔽(Temporal Masking)**:强音出现前后短暂时间内的弱音难以被察觉。
- **响度(Loudness)**:人耳对声音强度的感知大致与声强的对数成正比(韦伯-费希纳定律),即$L \propto \log(I)$。
- **临界频带(Critical Band)**:人耳对频率的感知是非线性的,在低频区,频率分辨率高(窄临界频带),在高频区分辨率低(宽临界频带)。Mel尺度正是对临界频带宽度的一种经验性模拟。
这些感知特性直接指导了语音特征设计:我们采用对数压缩模拟响度感知,采用Mel尺度的滤波器组模拟基底膜的非线性频率分析,而倒谱分离则部分模拟了人耳对音源和音色(共振峰)的分离感知能力。
时域与频域分析基础:从波形到频谱图
原始语音波形是时域信号,其直观但信息冗余。为了提取有效特征,必须转换到能更好揭示语音本质的域进行分析。
时域分析
时域分析直接操作波形$s[n]$,其核心统计量包括:
- **短时能量(Short-Time Energy)**:$E_n = \sum_{m=-\infty}^{\infty} [s[m]w[n-m]]^2$,其中$w[n]$是窗函数。用于区分浊音(高能量)、清音(低能量)和静音(极低能量),是端点检测的基础。
- **短时过零率(Zero-Crossing Rate, ZCR)**:$Z_n = \frac{1}{2} \sum_{m=-\infty}^{\infty} |sgn[s[m]w[n-m]] - sgn[s[m-1]w[n-m-1]]|$,其中$sgn$是符号函数。清音(如/s/)由于高频噪声成分多,ZCR高;浊音由于周期性,ZCR低。ZCR与能量结合可有效区分清浊音和静音。
- **自相关函数(Autocorrelation)**:$R_n[k] = \sum_{m=-\infty}^{\infty} s[m]w[n-m] s[m+k]w[n-m-k]$。用于基频提取,浊音的自相关函数在基频整数倍位置有显著峰值。
时域分析计算简单,但对频谱信息不敏感,通常作为辅助特征。
频域分析:短时傅里叶变换(STFT)
语音是非平稳信号,其统计特性随时间变化。因此,必须采用短时分析思想:将长信号切分为短时帧(通常25ms,对应约400个采样点,在16kHz采样率下),并假设每帧内信号是平稳的。对每帧加窗(如汉明窗)后,进行离散傅里叶变换(DFT),得到短时傅里叶变换(STFT): $$S_n[k] = \sum_{m=0}^{N-1} s[n+m] w[m] e^{-j2\pi km/N}$$ 其中$n$是帧索引,$k$是频率索引,$N$是FFT点数(通常为512或1024)。$S_n[k]$是复数,其幅度谱$|S_n[k]|$或功率谱$|S_n[k]|^2$反映了该帧在频率$k$处的能量分布。
将各帧的幅度谱按时间顺序堆叠,就形成了频谱图(Spectrogram),它是语音最常用的可视化表示,横轴是时间,纵轴是频率,颜色深浅表示能量大小。频谱图直观展示了语音的时频结构:元音表现为水平的暗带(共振峰),辅音表现为瞬态的宽带或窄带能量。
从线性谱到对数谱:感知压缩
人耳对频率的感知是线性的吗?不是。对频率的感知近似于Mel尺度,其定义为: $$m = 2595 \log_{10}(1 + f/700)$$ 其中$f$是线性频率(Hz)。在低频区,Mel变化快;高频区,Mel变化慢。更重要的是,人耳对声音强度的感知是对数的。因此,在特征提取流程中,对功率谱取对数成为标准步骤,这模拟了人耳的响度感知,并压缩了动态范围。
倒谱分析:源-滤波器分离的数学实现
倒谱(Cepstrum)是语音处理中的一项关键数学工具,其名称由“频谱(Spectrum)”字母重排而来,意为“频谱的频谱”。其计算步骤为:对一帧信号进行FFT得到频谱$S[k]$,取对数得到$\log|S[k]|$,再进行逆傅里叶变换(IDFT): $$c[n] = \frac{1}{N} \sum_{k=0}^{N-1} \log|S[k]| e^{j2\pi kn/N}$$ 得到的$c[n]$就是倒谱系数。其物理意义在于:由于源(激励)和滤波器(声道)在时域是卷积关系,在频域是乘积关系,取对数后变为加法。因此,$\log|S[k]| = \log|E[k]| + \log|H[k]|$。对$\log|S[k]|$做IDFT,就相当于将两者在倒谱域分离:低阶倒谱系数(通常前12-13个)主要对应声道响应$\log|H[k]|$(音素信息),而高阶系数($n > 12$)主要对应基频轮廓$\log|E[k]|$(韵律信息)。这种分离正是源-滤波器模型的完美数学体现。MFCC正是取倒谱的低阶系数。
核心特征提取技术:MFCC、FBank与Pitch
基于上述理论,我们深入讲解业界最核心的三种特征:MFCC、FBank和基频(Pitch)。
梅尔频率倒谱系数(MFCC)详解
MFCC是目前应用最广泛、最具代表性的语音特征,其完整流程如下,每一步都有其物理或感知依据:
1. 预加重(Pre-emphasis):原始语音波形经过声门激励和声道滤波后,高频能量通常衰减。为了补偿这种衰减,并突出高频共振峰信息,通常施加一个一阶高通滤波器:$s'[n] = s[n] - \alpha s[n-1]$,其中$\alpha$通常取0.95-0.97。这相当于在频域乘以$|H(\omega)|^2 = 1 + \alpha^2 - 2\alpha\cos\omega$,提升高频分量。预加重也能改善数值计算稳定性。
2. 分帧与加窗(Framing & Windowing):将预加重后的信号切分为重叠的短时帧。典型参数:帧长25ms(400点@16kHz),帧移10ms(160点),重叠15ms。加窗(如汉明窗$w[n] = 0.54 - 0.46\cos(2\pi n/(N-1))$)是为了减少频谱泄漏,因为截断相当于在时域乘以矩形窗,其频域是sinc函数,会导致频谱拖尾。
3. 快速傅里叶变换(FFT):对每帧加窗信号做N点FFT(N通常为512),得到复数频谱$S_n[k]$。
4. 梅尔滤波器组(Mel Filterbank)能量计算:这是MFCC最具“感知特色”的一步。我们将线性频率轴(0到奈奎斯特频率$f_s/2$)映射到Mel轴,并在Mel轴上均匀分布一组三角滤波器(通常26-40个)。每个滤波器的中心频率和带宽按Mel尺度定义。将功率谱$|S_n[k]|^2$通过这组滤波器并积分,得到每个滤波器的输出能量: $$E_n[m] = \sum_{k=0}^{N/2} |S_n[k]|^2 \cdot H_m[k]$$ 其中$H_m[k]$是第$m$个Mel滤波器的频率响应。这一步直接模拟了人耳基底膜的临界频带分析,将线性频谱“扭曲”并聚合到感知均匀的Mel尺度上。得到的$E_n[m]$称为FBank特征(Filterbank Energies),它已经是比线性谱更接近人耳感知的特征。
5. 对数压缩(Log Compression):对每个滤波器的能量取自然对数或以10为底的对数:$\log E_n[m]$。这模拟了人耳对响度的对数感知,并进一步压缩动态范围。
6. 离散余弦变换(DCT):对对数滤波器能量序列做DCT: $$c_n[i] = \sum_{m=0}^{M-1} \log E_n[m] \cdot \cos\left(\frac{\pi i (m + 0.5)}{M}\right)$$ 其中$M$是滤波器数量。DCT是一种能量压缩变换,其主要目的是将滤波后的能量谱进行去相关,使得得到的倒谱系数$c_n[i]$之间尽可能独立。这有利于后续模型(如GMM-HMM)的假设(各维度独立同分布)并减少冗余。通常取前12-13个系数($i=1$到$12$或$13$),$i=0$系数(直流分量)代表平均能量,有时也保留。此外,为了模拟音高信息,有时会加入一阶差分(Delta)和二阶差分(Delta-Delta)系数,形成39维(13+13+13)的经典MFCC特征。
```python
伪代码:MFCC提取核心步骤
import numpy as np
def compute_mfcc(signal, sr=16000, n_fft=512, n_mels=26, n_mfcc=13):
1. 预加重
preemph = 0.97 signal_preemph = np.append(signal[0], signal[1:] - preemph * signal[:-1])
2. 分帧加窗
frame_length = int(0.025 * sr) # 25ms frame_step = int(0.010 * sr) # 10ms frames = frame_signal(signal_preemph, frame_length, frame_step) frames *= np.hamming(frame_length)
3. FFT
magnitude_spectrum = np.abs(np.fft.rfft(frames, n=n_fft)) power_spectrum = (1.0 / n_fft) * (magnitude_spectrum ** 2)
4. Mel滤波器组
mel_filters = get_mel_filterbanks(sr, n_fft, n_mels) filter_banks = np.dot(power_spectrum, mel_filters.T) filter_banks = np.where(filter_banks == 0, np.finfo(float).eps, filter_banks) # 避免log(0)
5. 对数
log_filter_banks = np.log(filter_banks)
6. DCT
mfcc = dct(log_filter_banks, type=2, axis=1, norm='ortho')[:, :n_mfcc]
可选:添加动态特征(一阶、二阶差分)
return mfcc ```
滤波器组(FBank)特征:MFCC的前身与复兴
FBank特征就是MFCC流程中的第5步输出:$\log E_n[m]$,即对数梅尔滤波器组能量。它没有经过DCT步骤。在深度学习时代,FBank特征经历了“复兴”。原因在于:
- **信息保留更完整**:DCT是一种有损压缩,会丢弃部分信息。对于强大的端到端深度学习模型(如CNN、Transformer),它们有能力从更原始、信息量更大的FBank中自动学习到最优的变换(类似于DCT的作用),并可能发现DCT未能捕捉的判别性模式。
- **与声学模型训练目标更兼容**:MFCC的DCT步骤是固定的、与任务无关的变换。而端到端模型(如CTC、RNN-T)直接从帧级别预测音素或词元,使用FBank作为输入,允许模型在训练过程中自适应地优化特征表示。
- **实践验证**:大量实验表明,在相同的深度学习模型架构下,FBank输入通常能达到与MFCC相当或略优的性能,且对模型超参数(如学习率)的敏感度更低。
因此,在现代语音AI系统中,FBank(通常为40-80维,包含一阶差分)已成为比MFCC更主流的选择。MFCC的“经典”地位更多源于其在GMM-HMM时代的辉煌历史。
基频(Pitch/F0)特征:韵律的基石
基频是语音韵律(Prosody)的核心,决定了音高轮廓,对情感识别、语调分析、以及TTS中的自然度至关重要。在ASR中,基频信息虽对音素识别帮助有限,但在多模态任务(如音素-音素对齐、说话人自适应)中仍有价值。
基频提取的基本原理:对于浊音段,其波形具有周期性,自相关函数在基频整数倍处有峰值;对于清音和静音,基频无定义。主流算法包括:
- **自相关法(ACF)**:计算帧内信号的自相关函数,找到第一个显著峰值对应的延迟,即基音周期$T_0$,$F0 = sr / T_0$。需设置峰值检测阈值和有效$F0$范围(如50-500Hz)。
- **倒谱法(Cepstrum)**:利用倒谱中代表基频的“谐波峰值”进行检测。由于倒谱分离了源和滤波器,对共振峰不敏感,因此对音色变化更鲁棒。
- **基于深度学习的方法**:如使用CNN或RNN直接从频谱图或波形预测基频概率分布(如PYIN算法),显著提升了在噪声环境和复杂音色下的鲁棒性。
提取的基频通常以Hz为单位,但在特征向量中,常取对数($\log F0$)以压缩动态范围,并与其他特征(如FBank)拼