状态对齐是连接 GMM-HMM 和 DNN-HMM 的核心桥梁
先明确两个前提:
- 语音是连续的时序信号,会被切分成一帧一帧的特征(比如每 20ms 一帧,对应一个 MFCC 向量)。
- HMM 的状态**对应音素的 "发音阶段"------ 比如音素 /a/ 可以拆成 3 个状态:起始→稳态→结束,每个状态对应几帧语音特征。
例子:识别单词 "apple"(简化为音素序列 /æ/ → /p/ → /l/)
假设我们已经提取了 "apple" 的语音特征,共 15 帧(每帧对应一个 MFCC 向量)。
1. 没有状态对齐时的问题
DNN 需要知道 "哪几帧对应哪个音素的哪个状态",才能学习 "特征→状态后验概率" 的映射。但直接看 15 帧特征,我们完全不知道:
- 第 1-5 帧是
/æ/的起始 / 稳态 / 结束? - 第 6-8 帧是
/p/的哪个状态?
这时候 DNN 就是 "无的放矢",没法训练。
2. GMM-HMM 做状态对齐的过程
GMM-HMM 的核心能力,就是通过 EM 算法训练,给每帧特征分配一个明确的 HMM 状态标签 ,这个过程就是状态对齐。
步骤拆解:
① 先定义 HMM 结构:每个音素设 3 个状态,单词 "apple" 的音素序列对应 3×3=93\times3=93×3=9 个 HMM 状态,再加上 "开始" 和 "结束" 状态,共 11 个状态。
② 用 GMM-HMM 模型对 15 帧特征进行解码 ,计算 "每帧特征属于每个 HMM 状态的概率"。
③ 找到概率最大的状态路径,完成对齐,最终得到这样的结果:
| 帧序号 | 1-3 | 4-5 | 6-7 | 8-9 | 10-12 | 13-15 |
|---|---|---|---|---|---|---|
| 对齐的 HMM 状态 | /æ/ 起始 | /æ/ 稳态 | /æ/ 结束 | /p/ 起始 | /p/ 稳态 | /l/ 全状态 |
3. 对齐结果就是 DNN 的训练标签!
- DNN 的输入:15 帧 MFCC 特征(每帧一个向量)。
- DNN 的输出目标:每帧对应的 HMM 状态(比如第 1 帧的目标是 "/æ/ 起始状态")。
- DNN 训练的目标:学习 "输入特征→输出对应状态后验概率" 的映射关系。
GMM-HMM 状态对齐,就是给连续的语音帧 "贴标签"------ 告诉 DNN "这几帧对应哪个音素的哪个发音阶段",没有这个标签,DNN 就不知道该学什么;有了这个标签,DNN 才能精准训练,最终替代 GMM 完成更优的概率建模。
4. 后验概率和HMM 状态是 "预测结果" 和 "预测目标" 的对应关系
- 对齐标签(目标):GMM-HMM 给第 1 帧贴的标签是 "/æ/ 起始状态"
- DNN 的输入:第 1 帧的 MFCC 特征向量。
- DNN 的输出:一个概率向量,向量长度 = 所有 HMM 状态的总数(比如例子里的 11 个状态),每个位置对应一个 HMM 状态的后验概率。
- 理想情况下,DNN 输出的概率向量应该是:[1,0,0,0,0,0,0,0,0,0,0][1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0][1,0,0,0,0,0,0,0,0,0,0](第 1 个位置对应 "/æ/ 起始状态",概率为 1;其他状态概率为 0)
- 实际训练中,输出是近似值,比如:[0.92,0.03,0.01,...,0.001][0.92, 0.03, 0.01, ..., 0.001][0.92,0.03,0.01,...,0.001]("/æ/ 起始状态" 的后验概率最高,其他状态概率极低)
- 训练时:后验概率是 "预测值",HMM 状态是 "真实标签"
- DNN 的任务是最小化预测概率和真实标签的差距(比如用交叉熵损失)。
- 对每帧特征,只有对齐的那个 HMM 状态是 "正样本",DNN 要让它的后验概率尽可能接近 1;其他所有 HMM 状态都是 "负样本",后验概率尽可能接近 0。
- 解码时:后验概率是 "HMM 状态的置信度"
- 训练好的 DNN,输入任意一帧语音特征,都会输出所有 HMM 状态的后验概率。
- HMM 会根据这些概率值,结合状态转移概率,选择置信度最高的状态路径------ 这就是最终的语音识别结果。