本质上,声学模型充当着一座桥梁。音频波形会被转换为一系列特征向量,例如MFCC。每个向量都提供了声音特征在极短时间(通常为10到25毫秒)内的数字快照。主要目的是将这些数字转换成语言的基本声音单位,即音素。声学模型的主要任务是判断每个特征向量最可能的音素。然而,这并非简单的点对点查找。一个人在单词“top”中发出/t/音的方式,在声学上可能与“water”或“stop”中的/t/不同。口音、语速甚至说话者的情绪都可能改变声音。因此,声学模型需要考虑概率。模型不会做出明确的决定,而是为语言中每个可能的音素计算一个似然分数。对于单帧音频特征,它会询问:这些特征对应音素/k/的概率是多少?它们对应/æ/的概率是多少?它们对应/t/的概率是多少?以此类推,对所有音素进行计算。这个过程为每个时间步生成一个概率分布。结果不是单一的音素,而是一系列可能性,每个都带有一个分数。这种关系通常以数学形式表示为似然 $P(\text{特征} | \text{音素})$。这个公式的含义是“在特定音素被说出时,观察到一组特定音频特征的概率。”模型会为每个音素计算这个值,从而评估每个音素与观察到的音频数据吻合的程度。下图描绘了单个时间帧的这种映射关系。MFCC特征向量被输入到声学模型中,模型再输出每个候选音素的概率集合。digraph G { rankdir=TB; splines=ortho; node [shape=record, style="rounded,filled", fontname="Arial", fillcolor="#e9ecef", color="#868e96"]; model [label="声学模型", shape=box, style="rounded,filled", fontname="Arial", fillcolor="#a5d8ff", color="#339af0", width=2]; subgraph cluster_input { label = "t时刻的输入"; style=dashed; color="#adb5bd"; fontname="Arial"; input_features [label="{MFCC特征向量 | {f₁, f₂, f₃, ..., fₙ}}"]; } subgraph cluster_output { label = "输出似然值"; style=dashed; color="#adb5bd"; fontname="Arial"; output_probs [label="{音素 | 似然值} | {/k/ | 0.85} | {/g/ | 0.10} | {/t/ | 0.03} | { ... | ... }"]; } input_features -> model [len=1.5]; model -> output_probs [len=1.5]; }声学模型根据特定时间帧的音频特征计算每个音素的概率。这种概率输出具有重要意义。如果两个音素听起来非常相似,例如/p/和/b/,模型可能会为两者都分配较高的概率。例如,对于特定声音,它可能会给出 $P(\text{特征} | \text{/p/}) = 0.45$ 和 $P(\text{特征} | \text{/b/}) = 0.40$。声学模型本身不必做出最终选择。它只提供这些分数。通过处理音频片段中整个特征向量序列,声学模型会生成一个相应的概率分布序列。这种丰富的、时间对齐的语音信息成为ASR流程后续阶段的主要输入。系统随后会使用语言模型和解码器来权衡这些可能性,考虑周围的上下文,并最终决定说话者说的是“big”还是“pig”。在接下来的章节中,我们将了解如何构建这种模型,从传统的统计方法开始,逐步转向现代神经网络方法。