语音信号基础:声波、频谱与数字表示 / Fundamentals of Speech Signals: Waves, Spectra, and Digital Representation
声音,这一我们每日沉浸其中的现象,其本质是振动的空气分子在空间中传播形成的压力波。当声带振动、气流通过,或物体碰撞时,便会产生这种机械波。人类语言,作为信息传递的核心载体,便是由一系列复杂而有序的声波构成的。从物理声学角度看,语音信号是一种非平稳的随机过程,其能量主要分布在300Hz至3400Hz的“电话带宽”内,但丰富的语音信息却隐藏在其细微的时频结构之中。理解这些声波的物理属性、它们如何被人类发音器官调制,以及最终如何被计算机“听”懂,是开启语音人工智能大门的钥匙。本章将引领读者穿越从连续的物理声波到离散的数字序列的完整旅程,建立对语音信号处理基础的直观而深刻的理解。
声学基础:声音的物理本质与度量
声音在物理学中被定义为一种纵波,其传播依赖于介质(如空气)分子的疏密交替振动。声波的核心物理参数包括频率(Frequency)、振幅(Amplitude) 和相位(Phase)。频率,单位为赫兹(Hz),决定了声音的“音高”,成年人的基频通常在85Hz到255Hz之间;振幅,对应声压级(SPL,单位分贝dB),决定了声音的“响度”;相位则描述了振动周期中的特定位置,对音色有重要影响,但在许多语音处理任务中常被忽略。
人类听觉系统对频率的感知并非线性。在低频区域,人耳能分辨较小的频率差异;而在高频区域,分辨能力下降。这种非线性感知特性直接催生了梅尔刻度(Mel Scale) 的诞生。梅尔刻度试图模拟人耳对音高感知的非线性特性,其近似转换公式为:$m = 2595 \log_{10}(1 + f/700)$,其中$f$为频率(Hz),$m$为梅尔值。在1000Hz以下,梅尔刻度与线性频率近似,超过1000Hz后,梅尔值的增长远慢于线性频率。这一特性将在后续的梅尔滤波器组设计中发挥核心作用。
声波的能量传播遵循平方反比定律:在自由场中,声强与到声源距离的平方成反比。这意味着声音在传播过程中会迅速衰减。在实际环境中,除了衰减,声波还会发生反射、折射、衍射和吸收,这些现象统称为房间声学(Room Acoustics) 效应,是语音识别系统在真实场景中面临的主要挑战之一——混响(Reverberation)。
语音产生:人类发声的物理模型
语音的产生是一个涉及肺部、喉部、咽腔、口腔和鼻腔的复杂生理过程。声学上,最经典的模型是声管模型(Acoustic Tube Model),它将声道简化为一系列截面积不同的无缝圆柱管。根据一维波动方程,声道可以视为一个声学谐振腔,其共振频率由声道的形状和长度决定,这些共振频率在声学上称为共振峰(Formants),是区分不同元音的关键声学特征。
1. 声源-滤波器模型(Source-Filter Model)
该模型由Gunnar Fant提出,将语音产生过程解耦为两个独立部分:
- **声源(Source)**:提供激励信号。对于清音(如/s/, /f/),声源是气流通过狭窄通道产生的湍流噪声;对于浊音(如元音、/z/, /v/),声源是声带周期性振动产生的准周期脉冲序列,其基频(Pitch)决定音高。
- **滤波器(Filter)**:即声道,对声源信号进行整形,其频率响应由声道形状决定,表现为一系列共振峰。滤波器的传递函数可以近似为全极点模型:$H(z) = G \prod_{k=1}^{N} \frac{1}{(1 - e^{j\omega_k}z^{-1})}$,其中$G$为增益,$\omega_k$为第$k$个共振峰的频率。
```mermaid graph LR A[肺部气流] --> B{声门闭合?}; B -- 是 --> C[声带振动<br/>产生浊音激励]; B -- 否 --> D[湍流噪声<br/>产生清音激励]; C --> E[声道滤波<br/>形成共振峰]; D --> E; E --> F[嘴唇辐射<br/>高频提升]; F --> G[辐射声波]; ```
2. 关键声学参数
- **基频(F0)**:声带振动的基频,男性平均约120Hz,女性约210Hz。基频的微小变化承载着语调(Prosody)信息。
- **共振峰(Formants F1, F2, F3...)**:声道共振频率。例如,英语元音/i/(如“see”)的F1约300Hz,F2约2300Hz;元音/a/(如“father”)的F1约700Hz,F2约1100Hz。这些频率值构成了语音的“声学指纹”。
- **谱倾斜(Spectral Tilt)**:浊音谱通常比清音谱有更陡峭的下降趋势,源于声门脉冲的激励特性。
从模拟到数字:语音信号的采样与量化
原始声波是连续的时间-压力函数。为了用计算机处理,必须进行模数转换(ADC),包含两个步骤:采样(Sampling) 和量化(Quantization)。
1. 采样定理
根据奈奎斯特-香农采样定理,为了无失真地重建一个带宽为$B$ Hz的带限信号,采样频率$f_s$必须大于$2B$。语音信号带宽通常取4kHz(窄带)或8kHz(宽带),因此标准采样率有8kHz(电话质量)、16kHz(主流语音识别)、44.1kHz(CD音质)和48kHz。采样率过低会导致混叠(Aliasing),即高频分量被错误映射到低频区域。
2. 量化
采样后得到的幅度值是连续的,需要映射到离散的数值。量化位数(Bit Depth) 决定了动态范围和信噪比。16位量化(CD标准)提供约96dB的理论信噪比,对于语音处理通常足够。量化过程引入的误差称为量化噪声。
经过采样和量化后,连续的声波变为离散时间序列$x[n]$,其中$n$为整数样本索引。此时,信号已准备好进行数字信号处理(DSP)。
时域分析:波形的直观洞察
时域分析直接观察信号幅度随时间的变化,是最直观的分析方式。
1. 预加重(Pre-emphasis)
语音信号的功率谱通常随频率升高而下降(约-6dB/倍频程),这不利于高频共振峰的提取。预加重是一个一阶高通滤波器,旨在提升高频能量,平衡频谱。其传递函数为:$H(z) = 1 - \alpha z^{-1}$,典型$\alpha$值为0.97或0.95。时域实现为:$y[n] = x[n] - \alpha x[n-1]$。这一步在MFCC等特征提取流程中至关重要。
2. 分帧与加窗(Framing & Windowing)
语音信号具有“短时平稳”特性,即在10-30ms的短时间内,其统计特性近似不变。因此,处理时将连续语音切割为短时段(帧,Frame),典型帧长20-40ms(如320个样本@16kHz),帧移(帧之间重叠)通常为帧长的1/2或1/3(如10ms),以保证帧间平滑过渡并避免信息丢失。
直接截断帧边缘会导致频谱泄漏(Spectral Leakage),因为矩形窗的频谱主瓣宽、旁瓣高。为减少泄漏,需对每帧乘以一个窗函数(Window Function),使帧边缘平滑过渡到零。常用窗函数包括:
- **汉明窗(Hamming Window)**:$w[n] = 0.54 - 0.46 \cos(\frac{2\pi n}{N-1})$,旁瓣衰减约41dB,是最常用的选择。
- **汉宁窗(Hann Window)**:$w[n] = 0.5 (1 - \cos(\frac{2\pi n}{N-1}))$,旁瓣衰减约31dB。
- **布莱克曼窗(Blackman Window)**:旁瓣衰减更高,但主瓣更宽,频率分辨率降低。
窗函数的选择是时间分辨率与频率分辨率之间的权衡:窗越长,频率分辨率越高,但时间分辨率越低(无法捕捉快速变化);窗越短,时间分辨率高,但频率分辨率低。
频域分析:傅里叶变换与频谱表示
时域波形难以直接观察语音的频域特性,如共振峰位置。傅里叶变换(Fourier Transform) 是将信号从时域映射到频域的数学工具。
1. 离散傅里叶变换(DFT)
对于长度为$N$的离散序列$x[n]$,其$N$点DFT定义为:$X[k] = \sum_{n=0}^{N-1} x[n] e^{-j 2\pi kn/N}$,其中$k=0,1,...,N-1$。$X[k]$是复数,其幅度$|X[k]|$表示频率$f_k = k f_s / N$处的频谱幅度,角度$\angle X[k]$表示相位。快速傅里叶变换(FFT)是计算DFT的高效算法。
2. 频谱图(Spectrogram)
语音是时变的,因此需要观察频谱如何随时间变化。短时傅里叶变换(STFT) 先对每帧加窗,再对每帧计算DFT,得到时频表示。将每帧的幅度谱(通常取对数)按时间顺序堆叠,便得到频谱图。频谱图横轴为时间,纵轴为频率,颜色深浅(或亮度)表示能量大小。它是语音分析中最核心的可视化工具,能清晰显示元音的共振峰条纹、清音的宽频噪声带、浊音的谐波结构以及音节的边界。
```python
使用Librosa生成频谱图的简化示例
import librosa import librosa.display import matplotlib.pyplot as plt
加载音频文件(假设为16kHz单声道)
y, sr = librosa.load('speech.wav', sr=16000)
计算梅尔频谱图(后续详述)
S = librosa.feature.melspectrogram(y=y, sr=sr, n_mels=128, fmax=8000)
转换为对数刻度(分贝)
log_S = librosa.power_to_db(S, ref=np.max)
绘制
plt.figure(figsize=(10, 4)) librosa.display.specshow(log_S, sr=sr, x_axis='time', y_axis='mel') plt.colorbar(format='%+02.0f dB') plt.title('Mel-frequency spectrogram') plt.tight_layout() plt.show() ```
3. 相位信息的重要性
虽然许多语音处理任务(如MFCC)只使用幅度谱,但相位信息并非无用。研究表明,相位谱中包含了关于语音激励源(如清音/浊音)和共振峰结构的重要线索。在语音合成和增强任务中,相位重建是关键挑战。复数STFT保留了相位信息,而功率谱(Power Spectrum) 仅使用幅度平方$|X[k]|^2$。
梅尔刻度与感知频率分析
人耳对频率的感知是对数关系,且在低频区更敏感。梅尔频率分析正是基于这一听觉特性,将线性频率轴转换为近似人耳感知的梅尔刻度轴。
1. 梅尔滤波器组(Mel Filterbank)
梅尔滤波器组是一系列三角滤波器,在梅尔刻度上均匀分布,但在线性频率轴上分布不均匀——低频区域滤波器密集,高频区域稀疏。每个滤波器覆盖一个频带,其输出是该频带内能量的加权和。滤波器数量通常为20-40个(如26或40)。将滤波器组应用于功率谱,得到梅尔频率功率谱(Mel Power Spectrum),它模拟了人耳基底膜的频率分析特性。
滤波器中心频率$f_c$(Hz)与梅尔值$m$的转换:$m = \text{mel}(f_c) = 2595 \log_{10}(1 + f_c/700)$。给定$M$个滤波器,第$m$个滤波器的中心梅尔值为$m \cdot \text{mel}(f_{max}) / (M+1)$,再转换回Hz得到$f_c$。滤波器边界点$f$在梅尔刻度上等距,转换后在线性频率轴上呈非线性。
2. 为什么需要梅尔尺度?
语音的许多关键特征(如共振峰)在梅尔尺度上更易区分。例如,前两个共振峰F1和F2在梅尔尺度上的距离比在线性频率上更稳定,不受说话人性别(导致基频和整体频谱缩放)的影响。因此,在梅尔尺度上进行特征提取,能获得对说话人变化更鲁棒的特征表示。
特征提取核心:MFCC与FBank流程
梅尔频率倒谱系数(MFCC) 是语音识别领域统治了数十年的经典特征。其提取流程是一个精心设计的信号处理管道,旨在模拟人类听觉系统并提取对语音内容判别性强的参数。
完整流程分解
假设输入为预加重后的语音信号,采样率$f_s$,帧长$N$,帧移$S$,梅尔滤波器数$M$,倒谱阶数$L$(通常12-13)。
1. 分帧加窗:将语音分割为重叠帧,每帧乘以汉明窗。 2. FFT:对每帧计算$N$点FFT(通常$N$为256或512,大于帧长以补零),得到复数频谱$X[k]$。 3. 功率谱计算:计算幅度平方$|X[k]|^2$,得到功率谱$P[k] = |X[k]|^2$。通常只取前$[0, N/2]$部分(正频率)。 4. 梅尔滤波器组应用:将$P[k]$通过$M$个三角梅尔滤波器,每个滤波器输出为该滤波器覆盖频带内$P[k]$的加权和。得到$M$维向量$\mathbf{m} = [m_1, m_2, ..., m_M]$,其中$m_j = \sum_{k} P[k] \cdot H_j[k]$,$H_j[k]$为第$j$个滤波器的频率响应。 5. 对数压缩:取对数,$\log \mathbf{m}$。人耳对声音强度的感知是对数的(韦伯-费希纳定律),对数压缩能压缩动态范围并近似听觉响度感知。 6. 离散余弦变换(DCT):对$\log \mathbf{m}$进行DCT,得到倒谱系数。DCT-II是最常用的:$c[i] = \sum_{j=1}^{M} \log m_j \cdot \cos(\frac{\pi i (j - 0.5)}{M})$,$i=0,1,...,L-1$。 7. 系数选择:通常取前12-13个DCT系数($c_1$到$c_{12}$,$c_0$为直流分量,有时丢弃)。这些系数称为MFCC。 8. 动态特征扩展(可选但常用):为捕捉语音的时变特性,通常在一阶MFCC($\Delta$)和二阶MFCC($\Delta\Delta$)上拼接,形成39维(13+13+13)特征向量。
MFCC的“倒谱”含义
“倒谱(Cepstrum)”一词是“频谱(Spectrum)”的字母 Rearrangement,暗示对频谱取对数后再进行逆傅里叶变换(或DCT)的操作。MFCC本质上是功率谱的对数频谱的倒谱域表示。在倒谱域,声源激励(基频) 和声道响应(共振峰) 被解耦:前者主要影响倒谱的低周期部分,后者影响倒谱的低阶系数。因此,取较低的倒谱系数(如12阶)能有效描述声道形状,而对基频变化相对不敏感,这有利于说话人无关的语音内容识别。
FBank:MFCC的“近亲”
滤波器组能量(Filterbank Energy, FBank) 特征是MFCC流程中DCT步骤之前的输出,即$\log \mathbf{m}$向量(通常26或40维)。在深度学习时代,FBank特征因其保留了更完整的频谱信息(未经过DCT的线性变换)而越来越受欢迎。许多现代语音识别模型(如基于CNN或Transformer的模型)直接以FBank或甚至对数功率谱作为输入,认为端到端模型能自动学习最优的频域变换,DCT的固定线性变换可能成为约束。
MFCC vs. FBank:一个对比
| 特性 | MFCC | FBank (Log-Mel) | | :--- | :--- | :--- | | 处理步骤 | 包含DCT | 无DCT,止于对数梅尔滤波器组输出 | | 信息保留 | 去相关,能量集中在低阶系数 | 保留原始梅尔频带能量分布 | | 维度 | 通常13阶(一阶) | 通常26-40维 | | 与听觉相似性 | 更抽象,模拟倒谱感知 | 更接近耳蜗输出的对数能量 | | 深度学习适用性 | 传统GMM-HMM系统的标配 | 现代端到端模型的首选输入 | | 计算开销 | 略高(多一个DCT) | 略低 |
在实践中,对于基于深度学习的系统,FBank特征往往能提供与MFCC相当甚至更优的性能,因为它避免了DCT可能造成的信息损失,允许神经网络从更丰富的频谱表示中自主学习。
动手实践:使用Librosa提取并可视化语音特征
理论需要实践来巩固。下面是一个完整的Python示例,展示如何使用`librosa`库加载音频、提取MFCC和FBank特征,并可视化关键中间结果。此代码可在Jupyter Notebook中运行。
```python import librosa import librosa.display import numpy as np import matplotlib.pyplot as plt
1. 加载音频
确保文件存在,或使用librosa示例音频
y: 音频时间序列, sr: 采样率
y, sr = librosa.load(librosa.ex('trumpet'), duration=3.0) # 使用小号示例,时长3秒
2. 预加重
alpha = 0.97 y_preemph = np.append(y[0], y[1:] - alpha * y[:-1])
3. 分帧加窗参数
frame_length = int(0.025 * sr) # 25ms帧长 frame_shift = int(0.010 * sr) # 10ms帧移 n_fft = 512 # FFT点数,通常>=帧长
4. 提取MFCC (默认20个梅尔滤波器,13个MFCC系数)
mfccs = librosa.feature.mfcc(y=y_preemph, sr=sr, n_mfcc=13, n_fft=n_fft, hop_length=frame_shift, win_length=frame_length, window='hamming')
5. 提取FBank (对数梅尔滤波器组能量)
fbank = librosa.feature.melspectrogram(y=y_preemph, sr=sr, n_mels=40, n_fft=n_fft, hop_length=frame_sh