解码器的主要作用是找出与输入音频特征 ($O$) 最匹配的单个词语序列 ($W$)。这不仅仅是找出听起来正确的内容,更是要找出听起来正确且在语言上有意义的内容。解码器通过结合声学模型和语言模型各自的优势来达成此目的。此过程通过语音识别的基本公式得到很好的体现:$$ \hat{W} = \underset{W}{\mathrm{argmax}} , P(O|W) \times P(W) $$我们来具体说明这意味着什么。平衡两种依据来源想象一下,ASR 系统正在听一段听起来像“wreck a nice beach”的语音。声学模型的贡献 ($P(O|W)$):声学模型听取音频特征 ($O$),并计算这些声音由候选句子 ($W$) 中的词语产生的概率。对于短语“wreck a nice beach”,声学模型可能会返回高概率。声音与词语匹配良好。然而,对于短语“recognize speech”,声学模型也可能返回高概率,因为这两个短语在声学上非常相似(同音异义词)。声学模型单独工作时容易混淆。语言模型的贡献 ($P(W)$):语言模型不了解音频内容。它的作用是确定词语序列 ($W$) 在语言中出现的概率。它通过大量文本训练,知道短语“recognize speech”很常见,而“wreck a nice beach”则没有意义且极其罕见。因此,它会给“recognize speech”分配高概率,给“wreck a nice beach”分配接近零的概率。解码器的作用是生成这些可能的句子,称为假设,然后扮演判断者,权衡来自两个模型的依据以做出最终决定。结合得分以得出最终判断解码器将每个假设的声学模型得分与语言模型得分相乘。综合得分最高的假设获胜。假设 1:“wreck a nice beach”声学得分:高(例如,0.9)语言模型得分:非常低(例如,0.0001)综合得分:$0.9 \times 0.0001 = 0.00009$假设 2:“recognize speech”声学得分:高(例如,0.88)语言模型得分:高(例如,0.1)综合得分:$0.88 \times 0.1 = 0.088$即使声学得分非常接近,语言模型也扮演了强大的决胜者角色,使“recognize speech”成为明显的胜出者。使用对数概率在实际系统中,将许多小概率相乘可能导致一个称为数值下溢的问题,即结果变得如此之小,以至于计算机将其视为零。为避免此问题,系统会使用对数概率。通过取概率的对数,乘法变为加法,这在计算上更快、更稳定。公式因此变为:$$ \hat{W} = \underset{W}{\mathrm{argmax}} , (\log P(O|W) + \log P(W)) $$目标不变:找出得分最高的假设。由于概率(一个介于 0 和 1 之间的数字)的对数总是负数,这等同于找出最接近零的得分。下图说明了解码器如何使用来自两个模型的得分来解决歧义。digraph G { rankdir=TB; splines=ortho; graph [fontname="Arial", fontsize=12]; node [shape=box, style="rounded,filled", fontname="Arial", fontsize=10]; edge [fontname="Arial", fontsize=9]; subgraph cluster_input { label="输入音频"; style="rounded,filled"; bgcolor="#f8f9fa"; audio [label="听起来像\n\"recognize speech\"的音频", shape=note, fillcolor="#a5d8ff"]; } subgraph cluster_models { label="概率模型"; style="rounded,filled"; bgcolor="#f8f9fa"; am [label="声学模型", fillcolor="#b2f2bb", shape=cylinder]; lm [label="语言模型", fillcolor="#d8f5a2", shape=cylinder]; } subgraph cluster_hypotheses { label="候选假设与得分"; style="rounded,filled"; bgcolor="#f8f9fa"; hyp1 [label="<B>假设 1:</B>\n\"wreck a nice beach\"", fillcolor="#ffc9c9"]; hyp2 [label="<B>假设 2:</B>\n\"recognize speech\"", fillcolor="#c0eb75"]; } subgraph cluster_decoder { label="解码器"; style="rounded,filled"; bgcolor="#f8f9fa"; decoder [label="结合得分\n&\n选择最佳假设", shape=cds, fillcolor="#bac8ff"]; } audio -> am [style=dashed]; am -> hyp1 [label=" 声学对数得分 = -0.1\n(听起来很可能)"]; am -> hyp2 [label=" 声学对数得分 = -0.13\n(听起来很可能)"]; lm -> hyp1 [label=" 语言模型对数得分 = -9.2\n(没有意义)"]; lm -> hyp2 [label=" 语言模型对数得分 = -2.3\n(很有意义)"]; hyp1 -> decoder [label=" 综合得分:\n-0.1 + (-9.2) = -9.3"]; hyp2 -> decoder [label=" 综合得分:\n-0.13 + (-2.3) = -2.43"]; decoder -> final [penwidth=2, color="#1c7ed6"]; final [label="<B>选择的转录:</B>\n\"recognize speech\"", shape=box, style="rounded,filled", fillcolor="#74c0fc", penwidth=2, color="#1c7ed6"]; }解码过程示意图。解码器接收两个声学上合理的假设。语言模型为无意义的短语分配了非常低的得分,使解码器能够选择综合得分更高的正确转录。归根结底,解码器面临的难题是可能的词语序列数量可能极其庞大。它不能简单地测试英语中的每一个可能句子。相反,它必须使用高效的搜索算法来在这个空间中前行并找出最佳路径。我们将在下一节中查看它是如何做到这一点的。