跳转至

讲解稿 · 第 09 章 第 01 节 · 语音基础与特征

口播时长:约 18 分钟|建议语速:中速,公式处停两拍|目标字数:3000—4500 字

承 Ch08 计算机视觉中的“原始像素 → 特征”思路 → Ch09 §01 语音基础与特征 → Ch09 §02 自动语音识别


导语(约 80 秒)

地铁刚进站,广播、风声和人声挤在一起。你对 Siri 或讯飞语音助手说:“导航到西直门。”不到一秒,屏幕上出现了正确文字。手机收到的却不是汉字,也不是音素,而是一串随时间起伏的电压值。

两秒语音若按 16 kHz 采样,就是 32000 个样本。语音模型直接面对这串数,会遇到三个问题:哪段是声音,哪些振动对应音高与音色,同一个音又为什么会随时间改变?在 Whisper 一类系统进入 Transformer 之前,前端通常先把波形变成对数梅尔频谱图。换句话说,模型先把“听录音”改写成“读一张时频表”。

好,先抓住这条主线:空气压力波 → 麦克风电信号 → 采样序列 → 短时频谱 → 感知特征。任何一步处理错了,后面的 ASR 再大也补不回已经丢失的信息。


复习昨日 & 今日路线(约 45 秒)

上一章处理图像:相机把连续光场采成二维像素,卷积网络再从像素中找边缘与纹理。音频也从连续物理量开始,只是它先表现为一维时间序列;我们需要把“什么时候发生”和“包含哪些频率”同时保留下来。

这节沿四站前进:波形三要素;采样、量化与混叠;分帧、加窗与短时傅立叶变换;对数梅尔与 MFCC。走完后,下一节就能把这些特征交给声学模型,讨论它怎样从几百帧特征中解出几个字。


核心概念一 · 从压力波到波形(约 2.5 分钟)

直觉。 声带振动会交替压缩、拉疏周围空气,麦克风振膜跟着前后运动,再把运动变成电压。波形图横轴是时间,纵轴是相对压力或电压。图上“起伏多高”与振幅有关,“起伏多快”与频率有关,“从周期的哪个位置开始”与相位有关。

定义。 最简单的纯音写成

\[ x(t)=A\sin(2\pi f t+\phi). \]

这里,\(x(t)\) 是时刻 \(t\) 的信号值;\(A\) 是振幅,与 \(x(t)\) 同单位;\(f\) 是频率,单位 Hz;\(\phi\) 是相位,单位 rad。周期为 \(T=1/f\),单位 s。例如 \(f=440\ \text{Hz}\) 时,\(T=1/440\ \text{s}\approx2.2727\ \text{ms}\)。真实语音不是单条正弦波,而是基频、谐波和噪声成分的叠加;声道对不同频率的增强形成共振峰,帮助区分元音。

声压跨度很大,常用声压级

\[ L_p=20\log_{10}\!\left(\frac{p_{\mathrm{rms}}}{p_0}\right)\ \mathrm{dB}, \]

其中 \(p_{\mathrm{rms}}\) 是均方根声压,\(p_0=20\ \mu\text{Pa}\) 是空气声的参考声压。若声压比翻倍,变化量是 \(20\log_{10}2\approx6.0206\ \text{dB}\);在介质与阻抗不变时,功率比变为四倍。

例子。 假设一段合成浊音的基频是 120 Hz,那么 240 Hz、360 Hz 可以是第二、第三谐波。改变这些谐波的相对强弱,基频仍是 120 Hz,听感中的音色却会变化。黑板上画两条周期相同、振幅分别为 1 和 2 的正弦曲线,再标出同样的周期:音高线索没变,幅度与功率变了。

反例。 把“振幅更大”说成“频率更高”不成立。\(\sin(2\pi440t)\) 与 \(2\sin(2\pi440t)\) 都是 440 Hz;后者振幅翻倍,但频率没有变化。也不能把 dB 当成线性幅度:增加 6.0206 dB 对应声压约翻倍,不是只增加 6.0206 个普通单位。

一句话总结。 波形用振幅描述强弱、用频率描述周期快慢、用相位描述周期位置;复杂语音是许多成分随时间变化的叠加。

学生常问:ASR 经常丢掉相位,相位是不是没用?答:相位对精确波形重建、空间定位和波束形成很重要,只是在不少识别任务中,幅度谱已提供主要的音素线索。


核心概念二 · 采样、量化与混叠(约 3 分钟)

直觉。 连续波形像一条不断延伸的曲线,计算机只能按固定间隔取点。取点太稀,就像电影帧率跟不上车轮转动,快速变化会伪装成较慢变化;每个点存得太粗,又会产生舍入误差。

定义。 采样后的序列写成

\[ x[n]=x\!\left(\frac{n}{f_s}\right), \]

其中 \(n\) 是整数样本编号,\(f_s\) 是采样率,单位 Hz,采样间隔为 \(1/f_s\) s。对最高频率为 \(f_{\max}\) 的理想带限信号,采样定理常写作 \(f_s\ge 2f_{\max}\);工程上会让有效频带严格低于 \(f_s/2\),给抗混叠滤波器留下过渡带。\(f_s/2\) 叫奈奎斯特频率。

量化再把连续幅值映到有限电平。\(B\) 位量化共有 \(2^B\) 个电平;这里 \(B\) 是每个样本的位深,单位 bit/sample。例如 16 bit PCM 有 \(2^{16}=65536\) 个可表示电平。量化步长越小,舍入误差通常越小,但存储量也越大。

例子。 \(f_s=16000\ \text{Hz}\) 时,每两个样本相隔 \(1/16000\ \text{s}=62.5\ \mu\text{s}\),奈奎斯特频率为 8000 Hz。一秒单声道波形有 16000 个样本。若采样前混入 15 kHz 纯音,它在 16 kHz 采样后会与 1 kHz 成分产生相同的离散点模式,只差符号或相位,因此听起来会落到约 1 kHz。黑板上把 15 kHz 曲线和对应的 1 kHz 慢曲线画在同一组采样点上,两条曲线都穿过这些点。

反例。 把 8 kHz 录音重采样成 16 kHz,不会凭空恢复 4—8 kHz 频带。插值只能在旧样本之间补点,原采样时已经滤掉或混叠的内容仍然不存在。同理,混叠发生后再做数字低通,也无法判断某个 1 kHz 分量原本就是 1 kHz,还是由 15 kHz 折回来的。

一句话总结。 采样率决定可无歧义表示的最高频率,位深决定幅值刻画的细度;抗混叠必须发生在模数转换之前。

学生常问:为什么 CD 用 44.1 kHz?答:其奈奎斯特频率是 22.05 kHz,可覆盖约 20 kHz 的听觉上限,并给模拟滤波器留出过渡区;语音识别常用 16 kHz,是精度、带宽与计算量之间的取舍。


核心概念三 · 分帧、加窗与 STFT(约 3.5 分钟)

直觉。 对整句“打开空调”只做一次傅立叶变换,你能知道整句含有哪些频率,却不知道某个频率出现在“打”还是“调”。语音又不是静止信号:嘴形、声带周期和摩擦噪声都在变。解决办法是把长录音切成几十毫秒的小片段,假设每片内部近似稳定,再逐片看频谱。

定义。 短时傅立叶变换(STFT)可写成

\[ S[m,k]=\sum_{n=0}^{N-1}x[n+mH]w[n]e^{-j2\pi kn/N_{\mathrm{FFT}}}. \]

\(S[m,k]\) 是第 \(m\) 帧、第 \(k\) 个频率格的复数系数;\(N\) 是帧长,单位 sample;\(H\) 是帧移,单位 sample;\(w[n]\) 是窗函数;\(N_{\mathrm{FFT}}\) 是 FFT 点数;\(j^2=-1\)。频率格对应 \(k f_s/N_{\mathrm{FFT}}\) Hz。离散傅立叶变换定义要算什么,FFT 则是把朴素 \(O(N_{\mathrm{FFT}}^2)\) 计算加速到 \(O(N_{\mathrm{FFT}}\log N_{\mathrm{FFT}})\) 的算法,两者不能混称。

切帧会在人为边界处造成跳变,能量向邻近频率扩散,这叫频谱泄漏。常用 Hann 窗

\[ w[n]=0.5-0.5\cos\!\left(\frac{2\pi n}{N-1}\right) \]

把两端平滑压到零。代价是主瓣变宽,所以泄漏抑制与分开相邻频率之间存在取舍。

例子。 对 16 kHz 语音取 25 ms 帧长、10 ms 帧移:\(N=0.025\times16000=400\) samples,\(H=0.010\times16000=160\) samples。若做 512 点 FFT,非负频率共有 \(512/2+1=257\) 格,频率网格间隔为 \(16000/512=31.25\ \text{Hz}\)。一秒、16000 个样本的信号在不补边界时得到 \(\lfloor(16000-400)/160\rfloor+1=98\) 帧。黑板上先把一条波形切成重叠小窗,再把每窗的谱竖着排成矩阵:横轴时间,纵轴频率,颜色表示幅度或功率。

反例。 把 400 个真实样本补零到 4096 点,频率网格会更密,但真实分辨能力不会因此提高。补零只是在由 400 个有效样本决定的频谱上做更密的频率采样;能否分开两个相近频率,主要仍由有效窗长和窗函数决定。

一句话总结。 STFT 用短窗换取时间定位,用每帧频谱保留频率结构,频谱图就是这些短时频谱按时间排列后的二维表示。

学生常问:帧重叠是不是重复计算?答:是有重复,但它减少边界遗漏,让特征随时间变化更平滑,也为后续叠加重建提供条件。


核心概念四 · 对数梅尔与 MFCC(约 3 分钟)

直觉。 人耳对频率的分辨并不均匀:低频处的小变化较容易察觉,高频处更关注比例变化。线性 FFT 把每个 Hz 一视同仁,梅尔滤波器组则在低频排得密、高频排得疏,把机器的频率网格改造成更接近听觉分辨方式的表示。

定义。 一种常用的 Hz 到 mel 换算是

\[ \operatorname{mel}(f)=2595\log_{10}\!\left(1+\frac{f}{700}\right). \]

\(f\) 的单位是 Hz,mel 是感知刻度值;例如 \(f=1000\ \text{Hz}\) 时约为 1000 mel。梅尔滤波器组通常用 40—80 个重叠三角带通滤波器,把线性功率谱汇总成较少的梅尔频带。再对每带能量比取对数,就得到对数梅尔特征。

这里要把单位说清:若记录 \(\ln(E/E_{\mathrm{ref}})\),它是采用自然对数约定的无量纲能量比;若记录 \(10\log_{10}(E/E_{\mathrm{ref}})\),单位是 dB。它不是信息熵,不能标成 bit 或 nat。MFCC 则在对数梅尔特征上再做离散余弦变换(DCT),常保留前 13 个系数,用较少数字描述谱包络;若再拼接 13 个一阶差分和 13 个二阶差分,就得到 39 维特征。

例子。 延续上一组参数:每帧 257 个非负频率格,经 80 个梅尔滤波器后变成 80 个对数能量值。两秒语音在不补边界时有 \(\lfloor(32000-400)/160\rfloor+1=198\) 帧,因此对数梅尔矩阵形状是 \(80\times198\),共有 15840 个特征值;若压成 13 维 MFCC,则是 \(13\times198=2574\) 个系数。黑板上画 80 个相互重叠的三角形,再把“257 → 80 → 13”写成三次形状变化。

反例。 把 MFCC 的第 5 个系数当成第 5 个频带不成立。DCT 已把所有梅尔频带混合到各个倒谱系数中,系数编号不再对应某个单独 Hz 区间。也不能指望只靠对数梅尔或 MFCC 精确还原原波形,因为相位和部分细谱信息已经丢失。

一句话总结。 对数梅尔保留可供神经网络学习的时频结构,MFCC 再用 DCT 做去相关与压缩;现代 ASR 多用前者,经典小模型常用后者。

学生常问:梅尔频谱和频谱图是同一张图吗?答:不是;普通频谱图使用线性频率格,梅尔频谱先用滤波器组汇总频带,纵轴和数值都发生了变化。


一个走完全程的例子 · “打开空调”怎样变成特征(约 2.5 分钟)

现在把四个概念串起来。用户对电话客服说两秒钟的“打开空调”,麦克风先把空气压力变化转成模拟电压。模拟低通滤波器先压制 8 kHz 附近及以上的成分,再由模数转换器按 16 kHz、16 bit/sample 采集,得到 32000 个 PCM 样本;这一阶段解决“连续世界怎样进入计算机”。

第二步,把波形切成 25 ms 帧,每帧 400 samples,帧移 10 ms,也就是 160 samples。不补边界时得到 198 帧。每帧乘 Hann 窗,再做 512 点 FFT,取 257 个非负频率格的功率。此时我们已有一张 \(257\times198\) 的时频表;“打”的爆破瞬态会集中在少数时间帧,元音的谐波与共振峰则在相邻多帧中延续。

第三步,让每帧功率谱通过 80 个梅尔滤波器,并对相对参考能量取对数,得到 \(80\times198\) 的特征矩阵。传统 MFCC 流程还可在此前选用预加重 \(y[n]=x[n]-\alpha_{\mathrm{pre}}x[n-1]\);\(\alpha_{\mathrm{pre}}\) 明确表示预加重系数,是无量纲量,例如取 0.97。类 Whisper 前端通常直接使用对数梅尔,具体是否补边界、是否预加重以及归一化方式由实现规定,不能把教学参数冒充所有系统的固定配置。

到这里,前端仍然没有输出“打开空调”四个字。它只把 32000 个按时间排列的样本,改写成 198 个时间步、每步 80 维的感知频谱特征。下一节的编码器、CTC、RNN-T 或注意力解码器,才负责从这些连续帧中识别离散文字。


易错点回头看(约 80 秒)

  1. 很多人以为 16 kHz 采样能记录到 16 kHz 的声音,其实是有效最高频率必须低于 8 kHz,因为奈奎斯特频率等于采样率的一半,工程滤波还需要过渡带。
  2. 很多人以为 一次 FFT 就能告诉我们某个音何时出现,其实是整段 FFT 只给总体频率组成,因为它没有保留局部时间位置,语音要靠分帧后的 STFT。
  3. 很多人以为 对数梅尔、MFCC 和波形可以随意互换,其实是三者保留的信息不同,因为梅尔汇总频带、DCT 压缩谱包络,而且常见特征还丢掉了相位。

与下节的钩子(约 30 秒)

两秒“打开空调”已经变成 198 帧特征,可答案只有四个汉字:模型不知道哪一帧该对齐哪个字,停顿又该算空白还是字符。下一节进入自动语音识别,沿着 GMM-HMM、CTC、RNN-T 和 Whisper 看清一个核心问题:长度不相等的连续声音与离散文字,究竟怎样完成对齐并被解码出来?