语音信号处理基础与声学特征
语音信号作为一种最自然、最便捷的人际交流媒介,在人类文明演进中扮演着举足轻重的角色。从远古时代的口头传承到现代社会的电话通信、视频会议、智能语音助手,语音始终是信息传递的核心载体之一。随着计算声学与人工智能技术的深度融合,语音信号处理已成为连接人类语言与机器智能的关键桥梁,其研究范畴涵盖从原始声波到高级语义的完整信息链路。
本章作为全书的开篇,旨在为读者建立语音信号处理的完整知识框架。我们将从语音的物理产生机制出发,沿着信号采集、数字转换、预处理、特征提取的技术脉络展开论述,最终落脚于经典声学特征MFCC、FBank和语谱图的数学原理与实践考量。这一知识体系不仅是理解后续章节(如端到端模型、注意力机制、预训练语言模型)的必要基础,更是把握语音技术发展脉络、进行创新研究的重要支点。在内容安排上,我们特别注重理论与实践的结合,每个核心概念都配有直观的物理解释和可运行的代码示例,使读者能够在抽象公式与具体实现之间建立双向映射。
语音信号的产生机理
声带振动与激励源模型
语音的产生是一个复杂的流体动力学与声学耦合过程,其核心机制可以用源-滤波器模型(Source-Filter Model)来描述。这一理论由Gunnar Fant在20世纪50年代提出,至今仍是语音学与语音编码领域的基础理论框架。源-滤波器模型的核心思想是:语音信号可以分解为声门激励源(Source)与声道谐振系统(Filter)两个独立成分的级联。
在浊音(Voiced Sound)产生过程中,肺部呼出的气流经由气管到达喉部,驱动声带(Vocal Folds)产生周期性振动。这种振动是一种典型的流致振动现象,其基本原理可以用双质量块模型(Two-Mass Model)或弹簧-质量-阻尼系统来描述。声带振动的基本频率称为基频(Fundamental Frequency,记作$F_0$),它决定了语音的音高(Pitch)。成年男性的基频范围通常在80至180赫兹之间,成年女性为150至300赫兹,而儿童的基频则更高,可达300至500赫兹。基频的精确值不仅与说话人的声带长度、张力、质量分布有关,还受到呼吸气压、声门闭合程度等生理因素的动态调制。
声门激励信号的频谱具有谐波结构,其能量主要集中在基频及其整数倍频率处。这种谐波分布可以表示为一系列脉冲序列的频域表示:
$$S(e^{j\omega}) = \sum_{k=-\infty}^{\infty} \delta\left(\omega - \frac{2\pi k}{T_0}\right)$$
其中$T_0 = 1/F_0$为基音周期。在理想情况下,这些谐波分量的幅度是平坦的,但实际观测到的激励谱往往在高频区域呈现一定的衰减趋势,这主要由声门波的非理想脉冲特性决定。
与浊音不同,清音(Unvoiced Sound)的产生不涉及声带振动。当清辅音(如/p/、/t/、/k/、/s/、/f/等)产生时,声门保持开放,气流在声道某处产生湍流或快速成阻(Constriction)。这种随机性激励的频谱特性接近白噪声,其功率谱在相当宽的频率范围内近似均匀分布。在语音合成与编码系统中,浊音通常用周期性的脉冲序列建模,而清音则用高斯白噪声或有色噪声来模拟。
声道谐振与语音频谱特性
声门激励信号在通过声道(Vocal Tract)时,会被声道形状进行调制。声道是一个复杂的声学管道,从声门延伸至嘴唇或鼻孔,其形状由舌、唇、腭、下颌等发音器官的相对位置决定。在发不同元音时,声道形成不同的共振腔,对特定频率的声波产生增强或抑制作用,这些被增强的频率称为共振峰(Formant)。
第一共振峰$F_1$主要与舌位的高低相关:发高元音(如/i/、/u/)时,舌头抬高,口腔容积减小,$F_1$降低(约200至300赫兹);发低元音(如/a/)时,舌头降低,口腔打开,$F_1$升高(可达800至1000赫兹)。第二共振峰$F_2$与舌位的前后相关:发前元音(如/i/、/e/)时,舌头前伸,声道前腔缩短,$F_2$升高(可达2500至3000赫兹);发后元音(如/u/、/o/)时,舌头后缩,$F_2$降低(通常低于1000赫兹)。第三共振峰$F_3$与卷舌程度相关,在某些语音识别任务中(如区分卷舌音与非卷舌音)具有重要作用。
声道对输入激励的频率响应可以用全极点(All-Pole)模型来近似表示:
$$H(z) = \frac{G}{1 - \sum_{k=1}^{p} a_k z^{-k}} = \frac{G}{A(z)}$$
其中$p$为预测阶数,$a_k$为线性预测系数(Linear Prediction Coefficients, LPC),$G$为增益因子。$A(z)$称为预测误差多项式,其根对应于共振峰频率。实践表明,对于窄带语音信号,$p = 10$至12阶的全极点模型足以精确描述声道频谱特性;对于宽带语音,通常需要$p = 16$至20阶。LPC模型不仅在语音编码(如CELP编码器)中具有核心地位,其系数和由其导出的其他参数(如LSP、PARCOR)也是语音识别系统中的重要特征。
从信号处理的角度看,浊音语音的短时频谱呈现明显的谐波结构与共振峰包络的双重特征。谐波结构反映了声门激励的周期性,其频率间隔等于基频$F_0$;共振峰包络则刻画了声道对激励信号的滤波效应,是区分不同元音的核心依据。这种频谱结构可以用语谱图(Spectrogram)直观地可视化展示,我们将在后续章节详细讨论其数学原理与显示方法。
采样与量化
连续信号到离散信号的桥梁
现实世界中的语音信号是时间的连续函数,是空气压力随时间的连续变化。要将这种模拟信号(Analog Signal)转换为计算机能够处理的数字信号(Digital Signal),需要经历两个核心步骤:采样(Sampling)与量化(Quantization)。采样将连续时间离散化,量化将连续幅度离散化,二者共同完成了模拟到数字的转换过程。
采样过程可以建模为连续信号$x_a(t)$与理想冲激串$p(t)$的乘积:
$$x_s(t) = x_a(t) \cdot p(t) = x_a(t) \cdot \sum_{n=-\infty}^{\infty} \delta(t - nT_s)$$
其中$T_s$为采样周期,其倒数$f_s = 1/T_s$为采样频率(单位:赫兹)。根据采样定理(奈奎斯特-香农采样定理,Nyquist-Shannon Sampling Theorem),当采样频率$f_s$大于信号最高频率$f_{\max}$的两倍时:
$$f_s > 2f_{\max}$$
采样后的离散信号可以无失真地恢复原始连续信号。语音信号的频率范围大约在20赫兹至20千赫兹之间(人耳可闻范围),但对于语音处理任务而言,保留300赫兹至3400赫兹的频率范围即可满足可懂度要求,这也是传统电话系统采用的300至3400赫兹带宽标准的依据。
在现代语音识别与合成系统中,通常采用16千赫兹(16 kHz)或48千赫兹(48 kHz)的采样频率。16 kHz采样可以无失真地恢复至8 kHz的频率成分,这对于捕捉大部分语音共振峰信息已绰绰有余;48 kHz采样则是专业音频制作的标准采样率,能够保留更丰富的高频细节(如摩擦辅音的能量分布)。需要注意的是,更高的采样率意味着更大的存储空间和更高的计算成本,在实际系统设计中需要在保真度与效率之间做出权衡。
采样后信号的频谱是原始信号频谱的周期延拓:
$$X_s(e^{j\omega}) = \frac{1}{T_s} \sum_{k=-\infty}^{\infty} X_a\left(j\left(\omega - \frac{2\pi k}{T_s}\right)\right)$$
当采样频率不满足奈奎斯特条件时,频谱的各周期延拓会发生重叠,这种现象称为混叠(Aliasing)。混叠导致高频成分被错误地映射到低频区域,造成不可逆的失真。为防止混叠,模数转换器(ADC)前端通常需要接入抗混叠滤波器(Anti-Aliasing Filter),其通带截止频率设置为$f_s/2$。
量化与有限精度表示
量化(Quantization)将采样后的连续幅度值映射到有限的离散集合。对于$B$位量化器,每个采样点可以用$B$比特二进制数表示,共有$L = 2^B$个可能的量化电平。量化过程可以表示为:
$$\hat{x}[n] = Q(x[n]) = x[n] + e[n]$$
其中$e[n]$为量化误差,定义为量化值与原始值之差。在均匀量化(Uniform Quantization)条件下,量化阶距(Step Size)$\Delta$为常数,量化误差在$-\Delta/2$到$\Delta/2$之间均匀分布。
量化信噪比(Signal-to-Quantization-Noise Ratio, SQNR)是衡量量化质量的关键指标。对于满幅度正弦信号,理论SQNR为:
$$\text{SQNR} = 6.02B + 1.76 \text{ (dB)}$$
这意味着每增加1位量化精度,SQNR理论上提升约6分贝。16位线性量化($B=16$)的理论SQNR约为98分贝,远超语音信号的动态范围需求,这也是CD音频和大多数语音处理系统采用16位量化的原因。
然而,上述分析假设输入信号能够充分激励所有量化电平。当信号动态范围较小时,有效量化精度会显著下降。为解决这一问题,压扩(Companding)技术被广泛应用于语音量化。$\mu$律压扩(主要用于北美和日本)和$A$律压扩(主要用于欧洲和中国)是两种国际标准,其核心思想是对大幅值信号进行压缩,对小幅值信号进行放大,使量化噪声在各幅度区间相对均匀:
$$\mu\text{-law: } y = \frac{\ln(1 + \mu|x|)}{\ln(1 + \mu)} \cdot \text{sgn}(x)$$
在数字语音通信中,8位$\mu$律或$A$律压扩的量化效果等效于12至14位线性量化,显著降低了传输带宽需求。值得注意的是,随着存储成本持续下降和编解码算法不断优化,压扩在现代语音处理系统中的应用已逐渐减少,线性16位量化已成为主流选择。
实践中的采样率转换
在实际语音处理系统中,经常需要在不同采样率之间进行转换。例如,从48 kHz的CD音频提取16 kHz的语音特征,或将合成语音上采样后进行后滤波处理。采样率转换(Sampling Rate Conversion)分为整数倍上采样(Upsampling)和整数倍下采样(Downsampling)两种基本操作。
整数比$M:N$的采样率转换可以通过先上采样后下采样来实现。更高效的实现方式是利用多相滤波器结构直接进行有理数比转换。上采样过程包含内插(Interpolation)与低通滤波两个步骤:
$$x_{\uparrow M}[n] = \begin{cases} x[n/M], & n \text{ 为 } M \text{ 的整数倍} \\ 0, & \text{其他} \end{cases}$$
内插后的信号频谱包含原始频谱及其$M-1$个镜像,需要通过截止频率为$\pi/M$的低通滤波器(称为镜像抑制滤波器)去除这些镜像分量。下采样过程则需要先进行抗混叠低通滤波,再进行抽取(Decimation):
$$x_{\downarrow N}[n] = x_{\text{LPF}}[nN]$$
以下代码演示了如何使用Python进行高质量的采样率转换:
```python import numpy as np from scipy import signal
def resample_audio(x, orig_fs, target_fs, num_taps=101): """ 高质量音频重采样
参数: x: 输入音频信号 orig_fs: 原始采样率 target_fs: 目标采样率 num_taps: FIR滤波器阶数
返回: y: 重采样后的信号 """ gcd = np.gcd(orig_fs, target_fs) up_factor = target_fs // gcd down_factor = orig_fs // gcd
计算归一化截止频率
cutoff = 1.0 / max(up_factor, down_factor)
设计低通滤波器
nyq = max(orig_fs, target_fs) / 2 b = signal.firwin(num_taps, cutoff / nyq, window='hamming')
上采样
if up_factor > 1: x_up = np.zeros(len(x) * up_factor) x_up[::up_factor] = x x_up = signal.lfilter(b, 1, x_up) else: x_up = x
下采样
if down_factor > 1: y = x_up[::down_factor] else: y = x_up
return y ```
该实现采用多相滤波器的简化形式,实际生产环境中的重采样器(如libsamplerate库)使用更复杂的算法(如Sinc插值)以获得更好的通带平坦度和阻带衰减性能。
数字信号预处理
预加重:高频补偿
语音信号在从声门传播到嘴唇的过程中,高频成分会因嘴唇辐射、声道黏性损耗等因素而衰减。实验测量表明,语音谱在高频区域(约2至4 kHz以上)呈现约6分贝/倍频程的下降趋势。这种高频衰减会影响后续特征提取的质量,特别是对于依赖频谱斜率( spectral slope)的特征。
预加重(Pre-emphasis)滤波器是一个一阶高通滤波器,其作用是对高频成分进行补偿,同时提升信噪比:
$$H(z) = 1 - \alpha z^{-1}$$
其中$\alpha$为预加重系数,通常取0.97至0.99之间的值。差分方程形式为:
$$\bar{x}[n] = x[n] - \alpha x[n-1]$$
频率响应为:
$$H(e^{j\omega}) = 1 - \alpha e^{-j\omega} = \sqrt{1 - 2\alpha\cos\omega + \alpha^2} \cdot e^{-j\phi(\omega)}$$
幅度响应在$\omega = 0$处为$|1-\alpha|$,随频率增加而上升,在高频处趋近于$1+\alpha$。当$\alpha = 0.97$时,滤波器在8 kHz处提供约3分贝的高频提升。
预加重不仅具有物理上的合理性,在数学上也带来便利:预加重后的语音信号更接近线性预测残差,其频谱更加平坦,有利于基于同态处理(Homomorphic Processing)的倒谱分析。倒谱分析将卷积运算转换为乘积运算,而预加重恰好将声道响应与激励的卷积关系简化为近似加性组合。
以下代码实现了预加重滤波器及其逆滤波器(用于恢复原始信号):
```python import numpy as np
class PreEmphasis: """预加重滤波器"""
def __init__(self, alpha=0.97): self.alpha = alpha
def apply(self, x): """应用预加重""" return np.append(x[0], x[1:] - self.alpha * x[:-1])
def inverse(self, x_emphasized): """逆预加重(去加重)""" return np.cumsum(x_emphasized) * (1 - self.alpha)
def apply_batch(self, x_batch): """批量处理""" return np.column_stack([self.apply(x) for x in x_batch])
使用示例
preemph = PreEmphasis(alpha=0.97) x = np.random.randn(16000) # 1秒16kHz语音 x_emphasized = preemph.apply(x) x_recovered = preemph.inverse(x_emphasized) ```
分帧:短时分析原理
语音信号的一个重要统计特性是其短时平稳性(Short-Term Stationarity)。虽然语音信号的全局统计特性随时间剧烈变化,但在10至30毫秒的时间窗口内,可以近似认为信号是广义平稳(Wide-Sense Stationary)的。这一假设是语音信号处理中分帧(Framing)技术的理论基础。
分帧过程将连续语音信号划分为一系列重叠的短时帧。典型参数配置为:
- **帧长(Frame Length)**:通常为20至30毫秒,对应16 kHz采样率下320至480个采样点
- **帧移(Frame Shift / Hop Size)**:通常为10毫秒(即帧长的50%重叠),对应160个采样点
- **帧数(Number of Frames)**:$\lceil (N_{\text{samples}} - N_{\text{length}}) / N_{\text{shift}} \rceil + 1$
帧长的选择需要在频率分辨率与时间分辨率之间做出权衡。较长的帧长提供更高的频率分辨率(因为频率分辨率$\Delta f \approx 1/T$,其中$T$为帧长),但时间分辨率降低,且帧内信号的非平稳性增加;较短的帧长提供更好的时间分辨率,但频率分辨率下降,对于低频共振峰的精确定位不利。对于大多数语音识别任务,25毫秒帧长配合10毫秒帧移是经验最优的参数组合。
分帧的数学表达可以写作:
$$x_n[m] = x[n \cdot N_{\text{shift}} + m] \cdot w[m], \quad m = 0, 1, \ldots, N_{\text{length}}-1$$
其中$w[m]$为窗函数,$n$为帧索引。窗函数的作用是平滑帧边界、减少频谱泄漏(Leakage),我们将在下一小节详细讨论。