4. 特征提取实战
说到语音识别,GMM-HMM 是绕不开的基石。我入行那会儿,这玩意儿就是业界标配。直到现在,理解它仍然是理解更先进声学模型的前提。说白了,GMM-HMM 就是一套用数学方法描述「声音是怎么从嘴里蹦出来的」的框架。
4.1 混合高斯模型(GMM)—— 拟合声音的分布
我们先从 GMM 说起。声音特征(比如 MFCC)在高维空间里不是均匀分布的。你想想看,同一个音素 /a/,不同人、不同语境下录出来,特征点会聚成一团。但这一团往往不是规则的球形,可能是椭球,甚至是不规则形状。
一个高斯分布只能拟合一个椭球。那多个椭球叠在一起呢?就能拟合任意复杂的形状了。这就是 GMM 的核心思想。
一个包含 M 个分量的 GMM 表示为:
p(x) = Σᵢ₌₁ᴹ wᵢ · 𝒩(x | μᵢ, Σᵢ)
其中 wᵢ 是第 i 个分量的权重,满足 Σwᵢ = 1。𝒩(x | μᵢ, Σᵢ) 是均值为 μᵢ、协方差为 Σᵢ 的高斯分布。
我在项目中遇到过一个问题:GMM 的分量数 M 怎么选?选少了欠拟合,选多了过拟合。我的经验是,对于音素级别的建模,16~32 个分量通常够用。但如果是三音素(triphone),分量数可以适当减少,因为上下文已经把区分度做上去了。
4.2 隐马尔可夫模型(HMM)—— 刻画时序变化
GMM 只能描述静态分布。但语音是动态的,有起承转合。这时候 HMM 就派上用场了。
HMM 假设语音信号背后有一个「隐状态」序列在驱动。每个隐状态对应一个稳定的发音阶段(比如音素的起始、稳定段、结束)。我们观测到的声学特征,是由这些隐状态按照一定的概率「发射」出来的。
- 初始概率 π: 模型开始时处于哪个状态的概率
- 转移概率 A: 从状态 i 跳到状态 j 的概率
- 发射概率 B: 在状态 j 下观测到某个特征的概率(这里由 GMM 给出)
嗯,这里要注意。语音 HMM 通常采用「从左到右」的拓扑结构。什么意思?就是状态只能往后跳,不能往前跳。这符合语音的时序特性——你不可能说着说着又回到前一个音素去。
4.3 GMM-HMM 的联合架构
把 GMM 和 HMM 拼在一起,就是经典的 GMM-HMM 模型。每个 HMM 状态对应一个 GMM,用来计算该状态下观测特征的似然度。
我画了一张图,帮你理清这个结构:
从图上你能看到:HMM 状态沿着时间轴从左向右转移,每个状态都绑定了一个 GMM 来计算发射概率。这就是 GMM-HMM 的完整工作流。
4.4 维特比解码 —— 寻找最优路径
模型建好了,怎么用?给定一段语音特征序列,我们要找出最可能的状态序列。这就是解码问题。
维特比算法是解决这个问题的经典方法。它用动态规划的思想,在状态网格里找出一条最优路径。
δₜ(j) = maxᵢ [ δₜ₋₁(i) · aᵢⱼ ] · bⱼ(oₜ)
其中 δₜ(j) 表示在时刻 t 到达状态 j 的所有路径中,最大概率值。aᵢⱼ 是转移概率,bⱼ(oₜ) 是发射概率。
我曾经在嵌入式设备上实现过维特比解码。当时踩过一个坑:概率值连乘会导致下溢。解决办法是用对数域计算,把乘法变成加法。这样既避免了浮点下溢,计算速度还更快。
log(δₜ(j)) = maxᵢ [ log(δₜ₋₁(i)) + log(aᵢⱼ) ] + log(bⱼ(oₜ))
所有概率提前取对数,运行时只做加法和比较。这是工程上的标准做法。
4.5 从 GMM 到 DNN 的演进
GMM-HMM 统治了语音识别将近二十年。但它有个硬伤:GMM 对高维特征的建模能力有限。你想想看,当特征维度超过 40 维时,GMM 需要指数级增长的分量数才能拟合好分布。这在实际中很难做到。
DNN 的出现改变了这一切。DNN 可以学习高维特征中的复杂非线性映射。2011 年左右,业界开始用 DNN 替换 GMM 来计算 HMM 的发射概率。这就是 DNN-HMM 混合模型。
| 对比维度 | GMM-HMM | DNN-HMM |
|---|---|---|
| 建模能力 | 有限,依赖分量数 | 强,可学习复杂映射 |
| 特征利用 | 需要手工特征 | 可学习高层特征 |
| 训练数据需求 | 较少 | 需要大量数据 |
| 计算复杂度 | 低 | 高(需 GPU) |
| 识别准确率 | 基线水平 | 显著提升 |
不过,GMM-HMM 并没有完全消失。在数据量少的场景下,它仍然是一个可靠的选择。我记得有个项目只有几百小时的标注数据,用 DNN 反而过拟合了,最后换回 GMM-HMM 效果更好。
我曾经在迁移学习时犯过一个错误:直接用 DNN 的输出概率作为 HMM 的发射概率,但没有做「先验平滑」。结果导致解码时某些状态的概率分布过于尖锐,识别结果反而不如 GMM。后来加了 log-likelihood ratio 归一化才解决问题。
4.6 本章小结
GMM-HMM 是语音识别的经典框架。GMM 负责拟合声学特征的静态分布,HMM 负责刻画时序动态变化,维特比算法负责在状态空间中寻找最优路径。虽然现在 DNN 已经取代了 GMM 的角色,但这个框架的思想——状态转移 + 发射概率 + 动态规划解码——仍然深深影响着现代语音识别系统。
理解 GMM-HMM,你就拿到了理解整个语音识别技术栈的钥匙。后面讲 CTC、Attention 模型时,你会发现很多概念都是从这儿演变过来的。