ASR 系统需要平衡声学证据与语言合理性。声学模型为字符或音素提供一系列概率,但搜索这些字符的所有可能组合以形成句子在计算上是不可能的。搜索空间实在太大。为了使这项搜索变得可行,语言知识(词典和语言模型)预先编译成一个高度优化的结构,称为解码图。解码图是一个有限状态网络,代表我们解码器的全部有效搜索空间。可以将其视为一张地图,其中从起始节点到结束节点的每条可能路径都对应着一条符合我们语言规则的允许句。通过将搜索限制在该图中的路径,我们大幅减少了需要考量的假设数量。搜索图的构成要素该图通过结合多种信息源构建而成。尽管正式过程涉及构建加权有限状态转换器 (WFST),但我们可以将其理解为叠加不同的限制。词典 (L): 这是系统的词典。它将单词映射到它们的组成单元,对于现代端到端模型,这些单元通常是字符。例如,词典规定“speech”一词由序列 s-p-e-e-c-h 组成。它是一项基本限制,确保解码器只能形成有效单词。语言模型 (G): 这是我们在章节引言中讨论过的单词序列的语法或统计模型。例如,一个 N-gram 语言模型提供给定其前置词时某个词的概率。此信息被编码为图中词状态之间的加权转换。从“recognize”到“speech”的转换将具有更高的概率(从而更优的权重),而从“recognize”到“beach”的转换则会较低。通过结合词典 (L) 和语言模型 (G),我们创建一个新的、更复杂的图。在这个结合后的图中,一条路径不只代表一个词序列,它代表形成这些有效词序列的底层字符序列。解码过程中遍历图最终的解码图包含大量路径,每条都代表一个可能的转录。解码器的任务是在声学模型的输出引导下,找到这条图中唯一的最佳路径。下面是该过程的总体工作方式:搜索算法从图的初始节点开始。对于输入音频的每个时间步,声学模型会输出所有可能字符(例如,'a', 'b', 'c', ...)的概率分布。解码器使用这些声学概率来扩展图中最有前景的路径。例如,如果声学模型对当前时间步的字符“s”非常有信心,那么在“s”边上转换的路径将被优先考虑。任何给定路径的总得分是两者的结合:来自模型预测的累积声学得分,以及嵌入在图的边的权重中的语言模型得分。这种结构巧妙地整合了我们所有的知识。图本身强制执行词典和语言模型规则,而声学模型得分则实时引导搜索。这避免了解码器搜索无意义的字符序列或语法怪异的句子,使得寻找最佳转录的过程高效且有效。下图展示了解码图的简化部分。节点代表词语,边代表语言模型允许的转换。解码器会从左到右遍历此图,找到一条如“recognize speech”这样在声学和语言上都具有高可能性的路径。替代路径“wreck a nice beach”,虽然声学上相似,但由于其在训练良好的语言模型中词间转换的低概率而受到惩罚。digraph G { rankdir=LR; node [shape=circle, style=filled, fontname="Arial", fontsize=12]; edge [fontname="Arial", fontsize=10]; start [label="开始", shape=diamond, style=filled, fillcolor="#ced4da"]; end [label="结束", shape=doublecircle, style=filled, fillcolor="#ced4da"]; subgraph cluster_path1 { label = "高概率路径"; style="dashed"; color="#adb5bd"; node [fillcolor="#96f2d7"]; recognize [label="recognize"]; speech [label="speech"]; } subgraph cluster_path2 { label = "低概率路径"; style="dashed"; color="#adb5bd"; node [fillcolor="#ffc9c9"]; wreck [label="wreck"]; a [label="a"]; nice [label="nice"]; beach [label="beach"]; } start -> recognize [label=" P(rec|<s>)", color="#37b24d", penwidth=2.5]; recognize -> speech [label="P(speech|rec)", color="#37b24d", penwidth=2.5]; speech -> end [label="P(</s>|speech)", color="#37b24d", penwidth=2.5]; start -> wreck [label=" P(wreck|<s>)", color="#f03e3e", penwidth=1.0]; wreck -> a [label=" P(a|wreck)", color="#f03e3e", penwidth=1.0]; a -> nice [label=" P(nice|a)", color="#f03e3e", penwidth=1.0]; nice -> beach [label=" P(beach|nice)", color="#f03e3e", penwidth=1.0]; beach -> end [label=" P(</s>|beach)", color="#f03e3e", penwidth=1.0]; start -> a [color="#adb5bd", style=dotted]; recognize -> a [color="#adb5bd", style=dotted]; }解码搜索图的简化视图。较粗的绿色线条表示语言模型偏爱的高概率路径。较细的红色线条显示了一个可能性较低的替代方案。解码器搜索最佳平衡这些语言模型概率与声学模型输出的路径。这个预编译图是解码算法赖以运作的根本。在接下来的章节中,我们将考察两种这样的算法:贪婪搜索和集束搜索,以了解它们如何遍历此结构来生成最终转录。