四、频域分析:短时傅里叶变换、频谱图、语谱图与频域特征提取
语音信号是非平稳的时变信号,其统计特性随时间快速变化。若直接对整段语音做傅里叶变换,得到的频谱只是所有时刻频率成分的“平均”,无法反映语音的动态发音过程。因此,语音频域分析的核心思路是“短时”:在足够短的时间窗内(通常10~30ms),将语音近似视为平稳信号,逐帧进行傅里叶变换,从而获得频率成分随时间演变的二维表示。本章将系统讲解短时傅里叶变换(STFT)的原理、频谱图与语谱图的构建与解读,以及基频(F0)和共振峰(Formant)这两类关键频域特征的提取方法,并结合TTS声学建模的实际需求进行案例拆解。
上图展示了语音频域分析从原始波形到特征输出的完整链路。原始语音经过预加重、分帧、加窗后,逐帧执行FFT得到STFT复数谱;对幅度谱取对数并映射为灰度或彩色,即得到语谱图;对频谱包络进行峰值检测可提取共振峰;对频谱或时域信号进行自相关/倒谱分析可提取基频。这些特征共同构成TTS声学模型(如FastSpeech、VITS等)的输入或训练目标。
4.1 短时傅里叶变换(STFT)的核心原理
STFT的数学定义为:对第m帧信号x_m(n)=x(n+mH)·w(n),计算离散傅里叶变换:
X(m,k) = Σ_{n=0}^{N-1} x(n+mH)·w(n)·e^{-j2πkn/N}, k=0,1,...,N-1
其中,w(n)为窗函数(常用汉明窗),H为帧移(hop size),N为FFT点数。STFT将一维时域信号映射为二维时频矩阵,每一列代表一帧的频谱,每一行代表某个频率分量随时间的变化轨迹。
窗函数的选择直接影响频谱质量。矩形窗主瓣窄但旁瓣泄漏严重(第一旁瓣约-13dB);汉明窗旁瓣衰减至-43dB,是语音分析最常用的折中选择;布莱克曼窗旁瓣更低(-58dB)但主瓣更宽,适用于需要高动态范围的场景。窗长N决定频率分辨率Δf=f_s/N,而帧移H决定时间分辨率。例如16kHz采样、N=512时Δf=31.25Hz,H=160时每秒100帧,时间分辨率10ms。
4.2 频谱图与语谱图的构建与判读
频谱图(Spectrum)是单帧信号的幅度-频率曲线,反映某一瞬间(或某一短时窗内)语音的能量分布。语谱图(Spectrogram)则是将连续多帧的频谱按时间顺序堆叠而成的二维图像:横轴为时间,纵轴为频率,颜色深浅表示能量强度(通常用dB刻度)。
| 对比维度 | 频谱图 | 语谱图 |
|---|---|---|
| 数据维度 | 一维(频率-幅度) | 二维(时间-频率-幅度) |
| 时间信息 | 无(仅代表某一帧) | 完整保留时间演化 |
| 典型用途 | 共振峰测量、谐波分析 | 音素边界判断、韵律分析、TTS声学特征可视化 |
| 生成方式 | 单帧FFT取幅度 | 多帧STFT拼接,取20·log10(|X|) |
语谱图中有两类典型模式:宽频带语谱图(窗长3~5ms)时间分辨率高,能清晰看到声门脉冲的垂直条纹,适合观察基频周期;窄频带语谱图(窗长20~30ms)频率分辨率高,谐波呈水平细线,适合观察共振峰走向。TTS分析中常用窄频带语谱图来检查合成语音的自然度——若共振峰过渡生硬或谐波断裂,说明声学模型预测的频谱参数不够平滑。
4.3 基频(F0)提取方法
基频是声带振动的基本频率,决定语音的声调高低和韵律变化。F0提取的难点在于:语音信号并非严格周期,且受共振峰调制影响,容易产生“半频错误”或“倍频错误”。常用方法包括:
- 自相关法(ACF):在时域计算短时自相关函数,寻找第一个显著峰值对应的延迟τ,则F0=fs/τ。该方法简单稳健,但对共振峰干扰敏感,需先进行中心削波或低通滤波预处理。
- 倒谱法(Cepstrum):对功率谱取对数后再做逆傅里叶变换,得到倒谱。基频对应的“倒谱峰”出现在倒频率(quefrency)等于基频周期处。该方法能有效分离声源激励与声道滤波,但计算量较大。
- RAPT算法(Robust Algorithm for Pitch Tracking):结合归一化互相关与动态规划,在候选F0路径中寻找全局最优,是Praat和ESPS工具的标准算法,对噪声和浊音/清音判别有较好鲁棒性。
# 自相关法F0提取核心步骤(Python伪代码)
def extract_f0(frame, fs, f0_min=80, f0_max=400):
# 1. 预滤波:去除300Hz以下和1000Hz以上成分
filtered = bandpass(frame, 300, 1000, fs)
# 2. 计算自相关
acf = np.correlate(filtered, filtered, mode='full')[len(filtered)-1:]
# 3. 在f0_min~f0_max对应延迟范围内搜索峰值
lag_min = int(fs / f0_max)
lag_max = int(fs / f0_min)
peak_lag = lag_min + np.argmax(acf[lag_min:lag_max])
f0 = fs / peak_lag
return f0
4.4 共振峰(Formant)提取
共振峰是声道谐振产生的频谱峰值,通常用F1、F2、F3表示,它们与元音音色直接相关。例如/a/的F1约700Hz、F2约1200Hz,而/i/的F1约300Hz、F2约2300Hz。共振峰提取的经典方法有两种:
- 倒谱包络法:对STFT幅度谱取对数,做逆傅里叶变换得到倒谱,将倒谱中低倒频率部分(对应声道冲激响应)保留,高倒频率部分(对应声源激励)去除,再正变换回频域即得到平滑的频谱包络。包络上的局部最大值即为共振峰。
- 线性预测编码(LPC)法:用全极点模型逼近声道传输函数,阶数p通常取12~16(对应4~5个共振峰)。通过求解自相关方程得到LPC系数,再对模型频率响应求峰值。LPC法计算效率高,但对鼻化音和摩擦音建模误差较大。
实际工程中,共振峰提取还需考虑:预加重补偿高频衰减、动态范围限制(避免将谐波误判为共振峰)、以及共振峰轨迹平滑。TTS声学模型中,共振峰常作为辅助特征用于韵律控制或音色迁移。
4.5 案例拆解:基于STFT的TTS声学特征提取与质量诊断
背景与目标:某TTS团队在训练FastSpeech模型时,发现合成语音的元音部分“发闷”,辅音过渡不自然。需要定位问题根源——是声学特征提取环节出错,还是模型训练不足。
初始现象与数据:选取一段5秒的录音“今天天气很好”,采样率16kHz。使用25ms汉明窗、10ms帧移、512点FFT提取80维梅尔谱作为模型输入。训练200k步后,合成音频的语谱图显示:/i/和/u/的F2明显偏低(约低200Hz),且F2过渡段出现“台阶状”不连续。
分析判断过程:首先检查原始录音的语谱图,确认F2位置正常(约2300Hz)。随后检查特征提取代码,发现预加重系数设为0.97,但未对高频段进行适当补偿,导致高频共振峰能量被削弱,LPC包络峰值检测时漏检或偏移。进一步排查发现,梅尔滤波器组在2000~3000Hz区间的滤波器带宽过宽(约300Hz),导致F2和F3被合并为一个宽峰,模型无法区分。
实际操作步骤:
- 将预加重系数调整为0.95,并在STFT后增加一阶高通滤波补偿(+6dB/oct,截止频率2kHz)。
- 重新设计梅尔滤波器组:在1000~4000Hz区间增加滤波器数量(从12个增至18个),使F2/F3分辨率提升。
- 对提取的频谱包络进行中值滤波(窗口3帧),消除帧间抖动。
- 重新训练模型,保持其他超参数不变。
结果对比:调整后,合成语音的F2偏差从-200Hz缩小至-30Hz以内,语谱图共振峰过渡平滑,主观MOS分从3.2提升至4.1。训练收敛速度加快约15%(因输入特征更准确)。
风险与代价:增加滤波器数量使特征维度从80升至96,模型参数量增加约5%,推理时间增加3%。但换来的自然度提升明显,可接受。
复盘经验:频域特征提取的“小参数”往往对TTS质量有“大影响”。建议在特征提取后增加可视化检查环节——将提取的频谱包络与原始语谱图叠加显示,人工抽查10~20个音素边界,确保共振峰位置和走向合理。
4.6 常见误区与总结复盘
| 误区 | 后果 | 正确做法 |
|---|---|---|
| FFT点数过大(如2048) | 频率分辨率过高但时间模糊,语谱图“糊”成一片 | 根据采样率选择512或1024,保证Δf在20~50Hz |
| 忽略预加重 | 高频共振峰能量弱,提取不稳定 | 预加重系数0.95~0.97,或等效高频提升 |
| F0提取未做清浊判决 | 清音段产生随机F0,韵律异常 | 结合能量和过零率判决,或使用RAPT |
| 共振峰提取未限制搜索范围 | 将谐波误判为共振峰 | F1范围200~900Hz,F2范围500~2500Hz,F3范围1500~3500Hz |
| 语谱图显示动态范围过窄 | 弱音成分不可见,难以诊断 | 使用60~80dB动态范围,或自适应归一化 |
本章从STFT的数学原理出发,系统梳理了频谱图、语谱图的构建与解读方法,深入讲解了基频和共振峰提取的经典算法与工程要点。频域分析是连接语音信号与TTS声学模型的桥梁——无论是传统参数合成还是端到端神经TTS,高质量的频域特征都是合成语音自然度和可懂度的基石。建议读者在实操中建立“波形→STFT→语谱图→特征→模型”的完整可视化链路,每次调整特征提取参数后,务必通过语谱图对比验证效果,避免“盲调”参数。