16.3 ASR 的编码器—解码器架构
要介绍的第一种 ASR 架构是编码器—解码器架构,即第 13 章为机器翻译介绍的同一种架构。图 16.5 概略展示了这种架构,它称为基于注意力的编码器—解码器(attention-based encoder decoder,AED),也称为 Listen Attend and Spell(LAS),名称来自最早将其应用于语音的两篇论文(Chorowski et al., 2014;Chan et al., 2016)。
该架构的输入 是长度为 的声学特征向量序列 ,每个 10 ms 帧对应一个向量。通常从上一节描述的对数 Mel 频谱特征开始,但也可以从原始波形文件开始。输出序列 可以是字母或词元(BPE 或 sentencepiece);为简化说明,假定输出是字母。因此,输出序列为
,其中使用特殊的序列开始和序列结束词元 sos、eos,每个 是一个字符。对于英语,可以选择如下集合:

图 16.5 编码器—解码器语音识别器的架构示意图。
OpenAI 的 Whisper 模型也使用这种架构(Radford et al., 2023)。图 16.6 展示了 Whisper 架构的一部分(Whisper 还执行语音翻译和语音活动检测等其他语音任务,下一章将讨论)。Whisper 模型和推理代码已经公开发布,但训练代码和训练数据没有公开。不过,也有采用 Whisper 风格架构的开源项目,例如 Open Whisper-style Speech Model(OWSM,开放 Whisper 风格语音模型);它复现了 Whisper 风格的训练,同时提供完全开源的工具包和公开数据(Peng et al., 2023)。

图 16.6 Radford et al.(2023)给出的 Whisper 架构示意图。由于 Whisper 是一个还执行翻译任务的多任务系统,Whisper 的转写格式包含“转写开始”(Start of Transcript,SOT)词元、语言标签,以及一个指示执行转写还是翻译的指令词元。
16.3.1 输入与卷积层¶
当输入和输出序列的长度差异很大时,编码器—解码器架构尤其适用;语音正是这种情况:很长的声学特征序列映射到短得多的字母或词序列。例如,英语单词平均包含 5 个字母或 1.3 个 BPE 词元(Bostrom and Durrett, 2020);在自然会话中,平均每个词持续约 250 毫秒(Yuan et al., 2006),也就是 25 个 10 ms 帧。因此,语音信号每 10 ms 的帧数比文本信号中的词数或词元数长约 5 倍(25/5)到 19 倍(25/1.3)。
由于语音中的长度差异如此极端,语音编码器—解码器架构通常在编码器阶段之前加入压缩阶段,以缩短声学特征序列。(我们还可以使用专门处理压缩的损失函数,例如后面将介绍的 CTC 损失函数。)
下采样的目标是产生较短的序列 ,将其作为 Transformer 编码器的输入。一个非常简单的基线算法有时称为低帧率方法(Pundak and Sainath, 2016):对时间 ,把声学特征向量 与前面两个向量 和 拼接,得到一个长度为原来三倍的新向量,然后删除 和 。于是,原来每 10 ms 一个(例如 40 维)的声学特征向量,变成每 30 ms 一个更长(例如 120 维)的向量,序列长度也变为 。
但创建较短输入序列最常见的方式,是使用上一节介绍的卷积层。当卷积层步长大于 1 时,输出序列会比输入序列短。下面看看两个常用 ASR 系统中的例子。
Whisper 系统(Radford et al., 2023)的音频上下文窗口为 30 秒。它以 25 ms 窗口和 10 ms 步长,为每帧提取 128 通道的对数 Mel 特征,然后将这些特征归一化为均值 0、范围 -1 到 1。10 ms 的步长(每秒 100 帧)意味着 30 秒上下文窗口中有 3,000 个输入帧。这些帧经过两个卷积层,每层之后都接一个非线性函数(Whisper 使用 GELU,即 Gaussian Error Linear Unit,高斯误差线性单元,是 ReLU 的平滑版本)。第一个卷积层有 128 个输入通道,步长为 1,输出通道数为模型维度,窗口长度为 3,000。第二个卷积层的输入和输出通道数都是模型维度,步长为 2。第二个卷积层的步长为 2,使输出序列长度减半,窗口长度降为 1,500,并每 20 ms 产生一个音频词元。在这个前端的输出传给 Transformer 编码器之前,会为音频编码加入正弦位置嵌入。
HuBERT(Hsu et al., 2021)使用另一种前端架构,其中卷积层完全取代了频谱计算。输入是以 16 kHz 采样的原始音频,经过 7 个 512 通道的卷积层,步长为 [5,2,2,2,2,2,2],卷积核宽度为 [10,3,3,3,3,2,2]。这些卷积层同时学习提取频谱信息,并将输入序列缩短 320 倍:从 16 kHz(每 0.0625 ms 一个表示)缩短到 20 ms 的帧率。随后向输入加入位置编码,再应用 GELU 和层归一化,最后把输出传给 Transformer 编码器。
16.3.2 推理¶
经过卷积阶段后,语音编码器—解码器使用与机器翻译相同的架构,即带交叉注意力的 Transformer。
回忆第 13 章介绍的编码器—解码器架构。它使用两个 Transformer:编码器与第 7 章的基本 Transformer 相同;解码器则增加了一个名为交叉注意力层的新层。编码器接收声学输入 ,并通过一堆编码器块,把它们映射为输出表示 。
解码器本质上是一个条件语言模型,关注编码器表示并逐个生成目标文本(字母或词元);每个时间步都以编码器提供的音频表示和前面生成的文本为条件,生成一个新的字母或词元。
解码器中的 Transformer 块多了一层特殊注意力,即交叉注意力。交叉注意力的形式与普通 Transformer 块中的多头注意力相同,不同的是:查询照常来自解码器的前一层,而键和值来自编码器的输出。
具体来说,在标准多头注意力中,每个注意力层的输入是 ;在交叉注意力中,输入是编码器最终输出 。 的形状为 ,每一行表示一个声学输入词元。为了把编码器的键和值与解码器前一层的查询连接起来,我们把编码器输出 分别乘以交叉注意力层的键权重 和值权重 。查询来自前一解码器层的输出 ,并乘以交叉注意力层的查询权重 。

图 16.7 编码器和解码器的 Transformer 块,展示残差流视图。编码器最终输出 是解码器使用的上下文。解码器是标准 Transformer,只增加了一个交叉注意力层;该层接收编码器输出 ,并用它形成 K 和 V 输入。
因此,交叉注意力允许解码器关注投影到编码器最终输出表示中的声学输入。每个解码器块中的另一个注意力层,即多头注意力层,使用第 7 章介绍的因果(从左到右)注意力。但编码器中的多头注意力可以查看整个源音频、向前看,因此不使用掩码。
在推理时,输出字符串 的概率分解为:
可以通过贪心解码生成输出中的每个字母:
Whisper 或 OWSM 等编码器—解码器也可以使用下一节描述的束搜索。当加入语言模型时,这一点尤其相关。
加入语言模型 由于编码器—解码器模型本质上是条件语言模型,编码器—解码器会从训练数据中隐式学习一个面向输出字母的语言模型。然而,训练数据(与文本转写配对的语音)可能没有足够的文本,无法训练出好的语言模型。毕竟,找到大量纯文本训练数据比找到与语音配对的文本容易得多。因此,加入一个非常大的语言模型,通常至少能略微改善模型。
最简单的方法是使用束搜索,得到一个假设句子的最终束;这个束有时称为 n-best 列表。然后使用语言模型对束中的每个假设重新评分。评分时,把语言模型赋予的分数与生成该束时使用的编码器—解码器分数插值,权重 在留出集上调节。此外,由于大多数模型偏好较短句子,ASR 系统通常还会加入某种长度因子。一种方法是按假设中字符数量 对概率进行归一化。Listen, Attend, and Spell(Chan et al., 2016)的评分函数如下:
16.3.3 学习¶
语音编码器—解码器使用条件语言模型通常采用的交叉熵损失进行训练。在解码的第 个时间步,损失是正确词元(字母) 的对数概率:
整个句子的损失是这些损失之和:
随后将该损失通过整个端到端模型反向传播,训练完整的编码器—解码器。
正如第 13 章所述,我们通常使用教师强制,让解码器历史使用正确的金标准 ,而不是预测的 。也可以混合使用金标准输出和解码器输出,例如 90% 的时间使用金标准输出,但以 0.1 的概率使用解码器输出:
现代数据集规模很大。例如,Whisper-v2 在 680,000 小时语音上训练,其中主要是英语,但也包含来自其他 96 种语言的 118,000 小时语音。数据质量很重要,因此从网页抓取训练数据的系统会实施方法,从训练语料库中删除由 ASR 生成的转写,例如过滤全部大写或全部小写的数据。开源 OWSM 系统在 180,000 小时语音上训练,主要使用人工转写的公开数据,包括 LibriSpeech、Multilingual LibriSpeech、Common Voice、FLEURS、Switchboard、AMI 等数据集;详情见 Peng et al.(2023)。