语音识别训练集往往只告诉我们一段录音对应什么文字,并不标注每个字从第几帧开始。若强行把文本平均切到音频上,语速、停顿和连读都会制造错误监督。连接时序分类,也就是 CTC,换了一个问题:不要求先选定唯一对齐,而是允许模型在每个时间步输出字符或特殊空白,再把所有能够映射为目标文本的路径概率加起来。对齐因此成为训练过程中被边缘化的隐藏变量。
先做一次折叠,才能理解路径空间
CTC 路径长度与编码器输出时间步相同。路径转换成文本时,先合并相邻重复符号,再删除空白。例如,同一个字符可以持续若干帧而只留下一个输出;静音或尚未确定的区域可以由空白占据。相邻两个相同字符则必须被空白隔开,否则折叠后会只剩一个。这个规则同时解决了“某些帧没有字符”与“同一字符跨多帧”两个问题。
- 输入必须保持单调顺序,后面的字符不能先于前面的字符出现。
- 一个输出字符可以吸收多个输入时间步,但单个时间步不能生成多个字符。
- 编码器输出长度需要覆盖标签长度以及重复字符所需的间隔。
- 不同帧级路径可以折叠到相同文本,它们的概率都应计入目标。
如果训练只选择当前最可能的一条路径,早期随机预测会把错误边界固化。把合法路径全部求和,模型可以逐步把概率质量移动到更合理的对齐区域,而无需人工提供时间戳。

扩展标签把规则变成有限状态图
实现时,可在目标字符前后及字符之间插入空白,得到一个扩展序列。动态规划状态表示“当前时间步位于扩展序列的哪个位置”。从上一时间步出发,路径可以停在原位置、前进一步,或者在当前符号不是空白且不与前两个位置相同时跨过中间空白。第三种跳转受到限制,正是为了防止相同相邻字符被错误合并。
CTC 不枚举完整路径列表。它只保存到达每个状态的累计概率,把拥有相同后缀状态的历史合并起来。
图中每条从起点到终点的路线对应一种对齐。开头空白可以省略,结尾空白也可以省略,所以通常存在两个合法起始状态与两个合法结束状态。边的方向始终沿时间前进,这也是动态规划能够复用子问题的原因。
前向量将指数枚举压缩为表格递推
设前向量的一个单元表示在时间 t 已经走到扩展标签位置 s 的总概率。计算它时,把上一时间步所有允许到达 s 的前驱概率相加,再乘模型当前帧输出该位置符号的概率。逐帧填完表格后,最后一个时间步的末尾两个可结束状态之和,就是目标文本在该音频条件下的概率。训练损失取其负对数,自动求导即可把梯度传回声学编码器。
| 递推动作 | 成立条件 | 对应含义 |
|---|---|---|
| 留在当前状态 | 该状态已经可达 | 字符或空白再持续一帧 |
| 移动一个位置 | 前一状态可达 | 在字符与空白间顺序前进 |
| 跨越一个空白 | 非空白且不形成错误重复 | 直接进入下一个不同字符 |
| 汇总末端 | 走完全部时间步 | 合并带尾空白与不带尾空白路径 |
后向量从末端反向计算“从当前状态完成目标还剩多少概率”。前向量与后向量结合,可以得到某一帧处于某个标签状态的后验质量。它不仅用于推导梯度,也能帮助检查模型对齐是否异常,例如空白占比是否过高、字符峰值是否集中在合理区域。

长序列必须放进对数域
路径概率是许多小数的连乘,音频稍长就会低于浮点数可表示范围。工程实现通常保存对数概率,并使用 log-sum-exp 完成“先相加、再取对数”的稳定运算。批处理时还要传入每条样本的真实输入长度与标签长度,确保补齐帧不参与递推。若前端卷积或下采样让时间步过短,应在进入损失函数前直接报告数据错误,而不是让无穷损失污染整个批次。
- 确认接口接收的是 logits、概率还是对数概率,避免重复 softmax。
- 按输出长度分桶,减少大量补齐带来的显存浪费。
- 统计相邻重复标签数量,计算该样本所需的最短时间步。
- 对异常损失保留样本标识、输入长度、标签长度和预测空白率。
- 使用混合精度时,优先保留损失递推的高精度累加路径。
一个极小例子比整套训练更能发现实现错误
可以构造只有两三个时间步、两个输出符号的小矩阵,手工列出全部路径并求和,再与程序结果比较。随后加入重复标签、首尾空白、不同有效长度和极低概率,逐项覆盖跳转规则与数值稳定。对自定义算子做有限差分梯度检查,也比直接在大型语音集上观察“损失是否下降”更可靠,因为许多错误仍可能产生一条下降曲线。
训练求和与推理解码不是同一件事
训练时已知目标文本,任务是累加所有映射到它的路径;推理时目标未知,需要在所有文本中寻找高概率候选。逐帧取最大符号再折叠称为贪心解码,速度快,却可能漏掉由多条次优路径共同支持的文本。前缀束搜索会分别维护以空白和非空白结束的前缀概率,让映射到同一文本的路径重新汇总,并可融合语言模型。
- 先报告贪心结果,观察声学模型自身能力。
- 再逐步扩大束宽,测量错误率与解码耗时的变化。
- 若加入语言模型,单独说明权重、词插入项和调参集合。
- 检查贪心与束搜索差异最大的样本,定位重复字和语言歧义。
它适合单调对齐,却不负责所有序列关系
CTC 假设输出顺序与输入时间顺序一致,适合语音、在线手写和某些帧级识别;需要任意重排的翻译任务并不符合这个约束。给定编码器表示后,各时间步输出还以条件独立形式组合,字符间语言依赖主要依靠强编码器或解码阶段补充。理解这些边界后,CTC 的角色会很清楚:它不是完整识别系统,而是一种精确处理未知单调对齐的训练目标。把折叠、状态转移、长度检查和稳定递推全部验证好,才有资格讨论更大的模型是否有效。
本文《声音帧没有字符时间戳,CTC 如何仍然学会转写》由 xkmchenmu 发布于 xkmchenmu Blog。 转载请保留原文链接并注明出处。
支付宝扫一扫