一句「开灯」,
如何变成文字?
先让 GMM 听懂一小帧,再让 HMM 把声音连成一条路。
放慢过程,亲手看见一次语音识别。
声音很长,模型一次只看一小帧。
25 ms 的窗口,每次向前移动 10 ms。
相邻帧重叠,保留发音变化。
把密密麻麻的频谱,汇总成更接近听觉频带的能量。
这 12 个数描述一帧的谱形状。它们既不是文字,也不是音素标签。
“灯”的发音持续许多帧。每帧只包含一点局部证据,要把证据沿时间连起来。
这一帧,落在哪一团声音里?
每个状态都有自己的高斯混合分布。
分数高,表示该状态更容易产生当前特征。
拖动帧:橙色观测点和六个分数一起变化,训练好的分布保持不变。不是每帧重新训练,也不是六个状态共用一个 GMM。
每张图的椭圆来自该状态自己的模型;绿色 / 金色表示其两个高斯分量。六图使用相同、逐帧固定的坐标尺度。这里只画 C₁、C₂ 的二维投影,分数使用全部 12 维;浅色小点是这段语音的其他帧。
条形越长,分数越高。橙色标记当前帧的局部赢家;它不一定是 HMM 最终选择的状态。点选一张图或任意行,查看该状态内各分量怎样相加。
不是只选最近的高斯,而是把该状态内各分量的加权密度加起来。换帧时移动的是 xₜ;换状态时换的是 μₛₖ、Σₛₖ 和 wₛₖ。
不同音色、发音方式与发音阶段,会让相似的声音散落在不同区域。多个高斯能描述更复杂的分布。
分数要高,顺序也要合理。
HMM 限定状态之间怎样转移。
Viterbi 保存每条路径的最佳前驱。
第 1 帧 · 状态 1
先比较上一帧的路径,再加上当前帧的声学分数。
局部赢家可能来回跳动。HMM–GMM 寻找一整段语音中,声学分数与转移分数合起来最好的合法路径。
哪一句,最能解释这段声音?
给每个候选建立完整的状态路径。
比较路径分数,再加上上下文偏好。
这是实际计算得到的识别结果。
分数来自实际 GMM 密度与 HMM 路径计算;并非“准确率”。仅在相同输入、相同设置下比较三个候选。
这里用指令先验演示语言信息;真实大词表系统通常还需要发音词典、语言模型和搜索图。
先换掉 GMM 声学打分器,保留 HMM 状态、转移与 Viterbi 搜索。进入 DNN–HMM 对照页:看同一帧走两条路线 →
把“理解”变成一次小实验。
带着问题,进入端到端。
- GMM 的分量,是几个音素吗?
不是。一个状态内有多个高斯分量;它们描述该状态的声学分布。
- 为什么“隐藏”?为什么要自循环?
观测是声学特征,状态需要推断。自循环允许同一发音阶段占据不同数量的帧。
- Viterbi 和前向算法一样吗?
Viterbi 取最佳路径;前向算法累加所有路径。本演示用最佳路径近似候选语音似然。
这份演示如何计算?模型简化与参考资料
本页从预设语音波形提取 MFCC,实际执行对角协方差 GMM 密度计算和对数域 Viterbi 解码。模型用 4 种系统普通话音色、3 种语速、3 个指令,共 36 条合成语音训练;内置演示语音使用另一个语速。只支持预设示例,没有录音或上传入口;不是通用语音识别器。
每个双字指令使用 6 个从左到右的声学状态,三个状态对应一个字的声学阶段,采用 Viterbi 分段对齐及状态内 GMM EM 估计参数。阶段边界由模型学习,并非人工音素边界;大型传统系统通常采用音素或上下文相关音素状态、更多特征与大量真实训练语音。
GMM 显示的是条件概率密度 p(x | s),不是 P(s | x),密度也不必小于 1。图中二维椭圆只是投影;打分使用 12 维 MFCC(C₁—C₁₂,不含 C₀),使用训练集全局均值与标准差归一化。噪声加入实际波形后重新提取特征,播放的是同一段加噪语音。打乱实验只改变特征顺序,波形与播放保持原顺序;所有推断在浏览器本地运行。