语音信号处理基础
语音信号处理基础
语音作为人类最自然、最便捷的交流方式,承载着丰富的语言信息和副语言信息。要让机器能够理解和生成人类语音,首先必须深入理解语音信号的物理本质和数学表示方法。语音信号处理是连接声学现象与数字计算的桥梁,它为后续的语音识别、说话人识别、语音合成等任务提供了理论基础和技术工具。本章将系统介绍语音信号的产生机制、声学特性和数字表示方法,为读者构建完整的语音信号处理知识体系。
1.1 语音的产生机理
1.1.1 语音器官的解剖结构
人类语音的产生是一个复杂的流体动力学和声学过程,涉及多个器官的协同工作。理解这些器官的结构和功能,对于把握语音信号的物理本质至关重要。
人类语音生成系统主要由三部分组成:声门(Glottis)、声道(Vocal Tract) 和 口鼻辐射(Radiation)。声门位于喉部,由声带及其周围的软骨和肌肉构成,是语音产生的激励源。声道是从声门到嘴唇和鼻腔开口的声道管,包括喉部、咽腔、口腔和鼻腔,其中口腔可以通过舌、唇、软腭等器官的运动改变形状,形成不同的共鸣特性。口鼻辐射则指声音能量从口鼻向外部空间的传播过程。
从声学角度来看,声道可以近似为一个非均匀的声学管,其截面积随位置变化,范围从声门处的约0.5平方厘米到嘴唇处的约20平方厘米不等。声道的总长度约为17厘米(成年男性)或14厘米(成年女性)。声道的长度、形状及其变化决定了语音的共振特性,这是理解不同音素声学特征的关键。
1.1.2 语音的产生过程
根据发声方式的不同,语音可以分为三大类:浊音(Voiced Sound)、清音(Unvoiced Sound) 和 爆破音(Plosive Sound)。这三类声音的产生机理各有不同,但都遵循相同的声学原理。
浊音的产生采用声带振动激励机制。当气流从肺部呼出通过声门时,如果声带处于适当紧张状态,气流会使声带产生周期性振动。这种振动产生的准周期脉冲气流是浊音的激励源,其基频范围约为60-400Hz,对应于语音的基音频率(Pitch)。声带振动的频率决定了语音的音高,而振动幅度则影响语音的响度。
清音的产生则采用湍流激励机制。当声道某处形成狭窄通道时,高速气流通过该通道会产生湍流和噪声。这种随机噪声激励产生的声音即为清音,如/s/、/ʃ/、/f/等辅音。清音的频谱较为平坦,类似于白噪声,但经过声道的滤波作用后,其频谱形状会发生变化。
爆破音的产生具有独特的闭塞-释放过程。发音时,声道某处完全闭塞,阻隔气流,然后在极短时间内突然释放,产生短暂的能量爆发。根据闭塞位置的不同和声带是否振动,爆破音可分为/p/、/b/、/t/、/d/、/k/、/g/等。
1.1.3 声道共鸣与语音共振峰
声道作为一个复杂的声学腔体,具有多个共振峰(Formant)。共振峰是声道对不同频率成分的选择性放大或衰减效果,是语音音色形成的关键因素。
声道可以近似为一个声学管,其共振频率由管的长度、截面积分布和边界条件决定。对于一个均匀闭管,其谐振频率为:
$$f_n = \frac{n \cdot c}{2L}, \quad n = 1, 2, 3, \ldots$$
其中 $c$ 为声速(约340 m/s),$L$ 为声道长度。然而,实际声道并非均匀管,而是截面积随位置变化的复杂形状,因此其共振频率需要通过更精确的声学分析方法来计算。
对于成年男性,语音的前几个共振峰通常位于:F1 ≈ 300-800 Hz,F2 ≈ 800-2500 Hz,F3 ≈ 2500-3500 Hz。共振峰的位置和带宽与元音的识别密切相关——不同元音对应不同的共振峰模式。例如,高元音/i/和/u/的F1较低(200-400 Hz),而低元音/a/的F1较高(600-1000 Hz)。共振峰信息是语音识别系统中最重要的声学特征之一。
```mermaid graph TB A[肺部气流] --> B[声门激励] B --> C{声带状态} C -->|振动| D[浊音激励<br/>周期性脉冲] C -->|不振动| E[清音激励<br/>随机噪声] D --> F[声道共鸣] E --> F F --> G[口鼻辐射] G --> H[语音输出]
D -.->|基频60-400Hz| I[基音周期] F -.->|选择放大| J[共振峰F1-F5] ```
1.2 语音信号的声学特性
1.2.1 语音信号的时域特性
语音信号在时域上呈现显著的非平稳特性,这是由于语音产生过程中声道形状的连续变化所致。然而,在短时间窗口内(通常为10-30毫秒),语音信号可以近似为平稳随机过程,这是进行短时分析的理论基础。
语音信号的时域波形蕴含丰富的信息。振幅反映了语音的响度变化,周期结构(对于浊音)反映了声带振动的基音周期,而波形形状则包含了声道滤波效应的信息。不同类型的语音信号在时域上呈现出截然不同的特征:
浊音信号呈现明显的准周期性波形,其周期等于基音周期。这种周期性结构在时域上表现为规则的峰值模式,通过自相关分析可以准确地估计基音周期。浊音信号的短时能量较高,过零率相对较低。
清音信号呈现类似噪声的无规则波形,缺乏明显的周期结构。其频谱分布较为均匀,时域上表现为振幅的随机波动。清音信号的短时能量通常低于浊音,但过零率较高。
爆破音在时域上表现为短暂的静默期后跟随着能量爆发。闭塞阶段几乎没有信号输出,释放阶段的波形则包含快速的压力变化。
1.2.2 语音信号的频域特性
语音信号的频域特性揭示了语音能量在不同频率上的分布规律,是理解语音感知和设计特征提取算法的重要依据。
浊音的频谱呈现周期性的谐波结构。激励信号的频谱本身较为平坦(假设为理想脉冲序列),但声道共振会在特定频率上产生峰值,形成共振峰。基频处的能量通常不是最大的,能量主要分布在2-5次谐波上,并随着频率升高而逐渐衰减。浊音频谱的包络形状由共振峰决定,不同元音具有不同的共振峰模式。
清音的频谱近似白噪声的平坦分布,但由于声道的滤波作用,实际清音频谱会呈现一定的起伏。对于某些清辅音(如/s/),其频谱在高频段(4-8 kHz)具有显著能量;而对于另一些清辅音(如/sh/),能量则集中在中高频段。
语音信号的频谱包络可以通过线性预测(LPC)分析或倒谱分析来提取。这些技术能够分离激励频谱和声道频谱,为语音识别和合成提供有用的特征表示。
1.2.3 语音信号的统计特性
语音信号可以建模为短时平稳随机过程,其统计特性在语音处理算法设计中具有重要意义。
在帧级别上,语音信号的幅度分布通常接近拉普拉斯分布或高斯分布。研究表明,清音帧更接近高斯分布,而浊音帧的幅度分布更为稀疏。语音信号幅度的这种统计特性直接影响着特征参数的分布,是设计非线性变换和概率模型的重要考量。
语音信号的频谱特性可以用多种统计量来描述。频谱质心(Spectral Centroid)反映了频谱能量的中心位置,与感知亮度相关;频谱平坦度(Spectral Flatness)区分了周期信号(平坦度低)和噪声信号(平坦度高);频谱熵(Spectral Entropy)则度量了频谱分布的有序程度。
1.3 语音信号的数字化
1.3.1 采样与量化
要将连续的语音模拟信号转换为计算机可处理的数字信号,需要经过采样和量化两个过程。
采样是根据奈奎斯特-香农采样定理,以不低于信号最高频率两倍的速率对连续信号进行离散化。对于语音信号,其频率范围约为20 Hz至20 kHz,考虑到实际应用中保留足够的谐波信息,采样率通常设置为8 kHz(电话质量)、16 kHz(宽带语音)或44.1 kHz(CD质量)。例如,16 kHz采样率可以无失真地重建最高8 kHz的频率成分,这对于语音识别等应用已经足够。
量化是将连续的幅度值映射为有限数量的离散表示。量化位数直接影响语音信号的信噪比:
$$\text{SNR} \approx 6.02 \times B + 1.76 \text{ (dB)}$$
其中 $B$ 为量化位数。对于高质量语音处理,通常采用16位量化(65536个量化级别),理论信噪比约为98 dB。实际中还会考虑均匀量化和非均匀量化(如μ-law或A-law压缩)等多种方案。
```python import numpy as np
def simulate_sampling(signal, sampling_rate, target_rate): """ 模拟下采样过程 参数: signal: 输入信号 sampling_rate: 原始采样率 target_rate: 目标采样率 返回: downsampled_signal: 下采样后的信号 """ decimation_factor = int(sampling_rate // target_rate)
抗混叠滤波
from scipy.signal import butter, filtfilt nyquist = sampling_rate / 2 cutoff = target_rate / 2 / nyquist b, a = butter(8, cutoff, btype='low') filtered = filtfilt(b, a, signal)
下采样
downsampled = filtered[::decimation_factor] return downsampled ```
1.3.2 预加重与分帧
语音信号处理中,预加重(Pre-emphasis)是一种常用的预处理技术,用于补偿高频衰减。在语音产生过程中,嘴唇辐射效应会导致高频成分衰减(约6 dB/倍频程),同时声道滤波效应也会造成低频能量高于高频。预加重通过高通滤波器来平坦化频谱,提高高频分辨率。
预加重滤波器的传递函数为:
$$H(z) = 1 - \alpha z^{-1}$$
其中 $\alpha$ 通常取0.97-0.98。预加重不仅改善了频谱平坦性,还能突出高频共振峰,对于区分某些辅音(如/s/与/sh/)特别重要。
分帧(Framing)是将连续语音信号划分为短时分析窗口的过程。帧长选择需要在时间分辨率和频率分辨率之间取得平衡:较短的帧(10-20 ms)能够更好地跟踪语音变化,但频率分辨率较低;较长的帧(30-50 ms)提供更高的频率分辨率,但可能混合不同音素的特征。
典型的分帧参数为:帧长25 ms,帧移10 ms。相邻帧之间保持50%的重叠有助于保持信号变化的连续性,避免帧边界处的不连续性。
1.3.3 窗函数
在分帧处理中,窗函数用于对每帧信号进行加权,以减少帧边界处的不连续性。窗函数的选择直接影响频谱分析的精度和旁瓣泄漏。
汉明窗(Hamming Window)是最常用的窗函数之一:
$$w[n] = 0.54 - 0.46 \cos\left(\frac{2\pi n}{N-1}\right), \quad n = 0, 1, \ldots, N-1$$
汉明窗的第一旁瓣衰减约为43 dB,主瓣宽度适中,能够较好地平衡频率分辨率和频谱泄漏。
汉宁窗(Hanning Window)的公式为:
$$w[n] = 0.5\left[1 - \cos\left(\frac{2\pi n}{N-1}\right)\right]$$
汉宁窗的第一旁瓣衰减约为31 dB,但主瓣更窄,适用于需要更高频率分辨率的场景。
布莱克曼窗(Blackman Window)提供更好的旁瓣抑制(约74 dB),但主瓣宽度较大,频率分辨率最低。
对于语音处理,汉明窗是默认选择,因为它在语音主要频率范围(0-4 kHz)内具有良好的特性。对于需要更高频谱精度的分析,可以考虑使用多窗谱估计等更先进的技术。
```python import numpy as np
def apply_window(signal, frame_length, window_type='hamming'): """ 对信号帧应用窗函数
参数: signal: 输入信号 frame_length: 帧长度 window_type: 窗函数类型 ('hamming', 'hanning', 'blackman')
返回: windowed_frame: 加窗后的信号帧 """ if window_type == 'hamming': window = np.hamming(frame_length) elif window_type == 'hanning': window = np.hanning(frame_length) elif window_type == 'blackman': window = np.blackman(frame_length) else: window = np.ones(frame_length) # 矩形窗
确保信号长度与窗函数长度匹配
if len(signal) < frame_length: signal = np.pad(signal, (0, frame_length - len(signal)))
return signal[:frame_length] * window ```
1.4 时域分析方法
1.4.1 短时能量
短时能量(Short-time Energy)是语音信号最基本的时域特征之一,反映了语音信号的幅度随时间的变化规律。对于离散信号 $x[n]$,短时能量的定义为:
$$E_n = \sum_{m=-\infty}^{\infty} [x[m] \cdot w[n-m]]^2 = \sum_{m=-\infty}^{\infty} x^2[m] \cdot h[n-m]$$
其中 $w[n]$ 为分析窗,$h[n] = w^2[n]$ 为能量窗。等价的实现形式为:
$$E_n = \sum_{m=0}^{N-1} x_n^2[m]$$
其中 $x_n[m]$ 表示以 $n$ 为中心的第 $n$ 帧信号。
短时能量在语音处理中有广泛的应用:区分浊音和清音(浊音能量通常较高)、检测语音的起止点(Voice Activity Detection, VAD)、估算语音的响度变化等。实际应用中,需要根据信噪比环境调整能量阈值,以获得可靠的语音检测性能。
1.4.2 短时过零率
短时过零率(Zero Crossing Rate, ZCR)定义为信号在单位时间内穿过零点的次数:
$$\text{ZCR}_n = \frac{1}{2N} \sum_{m=0}^{N-1} |\text{sgn}[x_n[m]] - \text{sgn}[x_n[m-1]]|$$
其中 $\text{sgn}[\cdot]$ 为符号函数。短时过零率反映了信号的频率特性:高频率信号的过零率较高,低频率信号的过零率较低。
在语音处理中,短时过零率常用于:区分浊音和清音(清音过零率通常高于浊音)、检测浊音向清音的过渡、辅助语音端点检测等。然而,由于过零率对噪声敏感,实际系统通常将其与其他特征(如能量)结合使用。
1.4.3 自相关函数与基音周期估计
自相关函数(Autocorrelation Function, ACF)是分析信号周期性的有力工具。对于离散信号 $x[n]$,自相关函数的定义为:
$$R_n[k] = \sum_{m=0}^{N-1-k} x_n[m] \cdot x_n[m+k]$$
其中 $k$ 为滞后(lag),$N$ 为帧长。自相关函数在 $k=0$ 处取得最大值(信号与自身的相关性),对于周期信号,在滞后等于基音周期的整数倍处会出现峰值。
基音周期估计是语音处理中的核心问题之一。准确估计基音周期对于语音识别、说话人识别和语音合成都具有重要意义。常用的基音检测方法包括:
自相关法(ACF)通过寻找自相关函数的第一个峰值位置来估计基音周期。该方法对浊音效果好,但对清音不适用(清音无周期性)。
倒相关法(CEP)基于倒谱分析,在倒谱中分离激励和声道分量,提取基音周期。该方法计算量较大,但对声道变化具有一定鲁棒性。
平均幅度差函数法(AMDF)定义为:
$$\text{AMDF}[k] = \frac{1}{N-k} \sum_{m=0}^{N-1-k} |x[m] - x[m+k]|$$
周期信号在基音周期的整数倍处,AMDF值较小。该方法计算简单,但对噪声敏感。
实际系统中的基音检测需要综合多种线索,包括能量、过零率、自相关峰等,并采用动态规划或统计模型来提高检测准确率。
```python import numpy as np from scipy.signal import find_peaks
def estimate_pitch_autocorr(signal, sample_rate, min_freq=60, max_freq=400): """ 使用自相关法估计基音周期
参数: signal: 输入信号(单帧) sample_rate: 采样率 min_freq: 最低基频 (Hz) max_freq: 最高基频 (Hz)
返回: pitch: 估计的基频 (Hz) lag: 估计的基音周期 (样本数) """
计算自相关
autocorr = np.correlate(signal, signal, mode='full') autocorr = autocorr[len(autocorr)//2:] # 取正滞后部分 autocorr = autocorr / autocorr[0] # 归一化
转换为频率范围
min_lag = i