type
status
password
date
slug
summary
category
URL
tags
icon
OpenAI 收集了 68 万小时的有标签的语音数据,通过多任务、多语言的方式训练了一 seq2seq (语音到文本)的 Transformer 模型,自动语音识别(ASR)能力达到商用水准。本文为李沐老师论文精读的学习笔记。
摘要
本文通过扩大语音识别弱监督数据的规模,达到 68 万小时,并在大规模数据上进行多语言、多任务的训练。得到了一个泛化性能很好的模型。该模型在常见语音识别数据集上,不需要微调,直接以zero-shot 的方式进行测试,结果与在这些数据集上训练过的语音识别模型性能相当。
1. 引言
最近的语音识别方面的进展是使用无标签的数据进行自监督预训练。如 Wav2Vec,收集了大量无标签的语音数据,通过对比学习的方式预训练语音编码器。在编码器预训练完成之后,再在标准的语音识别数据集上微调,得到的结果优于只在语音识别训练集训练的模型。自监督预训练使用到的无标签语音数据规模最多已经达到 100 万小时。
在语音识别领域,自监督预训练的方式可以训练一个不错的编码器,但是预训练阶段没有标签,无法训练解码器。因此在实际用于语音识别之前,还需要在有标签数据上进行微调,比较麻烦,并且容易造成过拟合。一个理想的语音识别系统,应当不需要根据不同的场景进行微调,即应该实现开箱即用。
所以语音识别领域需要人工标注数据,但遗憾的是,目前人工标注的语音识别数据集规模都比较小,七个数据集加起来也只有 5000 小时左右。一个自然的思路是,在数据的质量和数量之间进行权衡。既然高质量的人工标注成本较高,得到的数据集规模较小,那么是否可以放宽对标注质量的要求,使用电影-字幕,歌曲-歌词等自然带标注的语音识别数据,从而扩大数据规模呢?本文的思路就是这样。
本文收集了 68 万小时的语音识别数据,除了数据的规模大幅上升之外,数据的多样性也更加丰富。在这 68 万小时的语音数据中,有 11.7 万小时涵盖了除英语外的其他 96 中语言,有 12.5 万小时是其他语言到英语的翻译数据。
2. 方法
2.1 数据处理
在本文收集的语音数据中,包含了不同环境、不同语言、不同说话人等多样的数据,这有助于训练出文件的语音识别系统。然而,数据中也包含大量的噪声。为了解决这个问题,本文使用了几种自动过滤方法,来提高文本标签的质量。
- 首先,收集自互联网的语音识别数据,很有可能文本标签就是来自现有的语音识别系统的识别结果。之前有研究工作表明,在训练数据中混有机器生成的标签数据会损害模型的性能。为此,本文根据机器识别结果的一些特点,过滤掉了这些数据。
- 另外,本文对数据中语音所属语言和文本所属语言进行检测。如果文本是非英语的其他语言,则要求语音也必须是同种语言;如果文本是英语,则语音可以是任何语言(因为本文方法中有一个其他语言到英语的翻译任务)。
- 本文用一个语音识别模型在收集的数据上进行测试,发现在一些错误率极高的数据中,存在音频信息不完整、字幕声音不匹配等低质量数据,这些数据同样会被过滤掉。
2.2 声音信号处理
Whisper 的输入是声音信号,声音信号的预处理是将音频文件重采样到 16000 Hz,并计算出 80 通道的梅尔频谱,计算时窗口大小为 25ms,步长为 10ms。然后将数值归一化到 -1 到 1 之间,作为输入数据。可以认为是对于每一个时间点,提取了一个 80 维的特征。之前数据处理部分提到每个音频样本为 30s 的片段,这里步长为 10,所以每 30 秒有 3000 个时间点。综上,对于一个 30 秒的音频数据,我们提取到形状为 3000x80 的特征。对应到 NLP 中,可以理解为句子长度为 3000,每个词的词嵌入维度为 80。
2.2.1 采样率
常说一个信号是多少多少赫兹的,指的是 这个信号 每秒有多少个取值点。16000 Hz的声音就是 这个声音每秒有16000个取值。
2.2.2 傅里叶变换
每个信号都可以看成不同频率的sine或者cosine的信号单元合成, 通过快速傅里叶变换(Fast Fourier Transform)可以分解一个信号到不同频率的信号单元:

2.2.3 频谱
由于人类会对低频低音高的片段更感兴趣,所以会对通过FFT变换得到的Amplitude 和Frequency 信息进行log运算, 压缩高频和高音高的部分:


2.3 模型结构
3000x80 的输入数据首先通过两个 1D 卷积层(kernel size=3,其中第2个卷积的strip为2),得到 1500x80 的特征。后面的处理就是标准的 Transformer encoder-decoder结构了。将这个特征送入到 Transformer encoder 中,提取处的特征作为交叉注意力输入送给 decoder。decoder 每次预测下一个 token,其输入是对应多任务学习的一些预设 token 和 prompt。

CrossAttention的query为decoder的输入、kv为encoder的输出(seq_length,hidden_dim)。
2.4 多任务
语音识别系统除了识别出语音中的语言文本(转录)之外,还需要做一些其他的任务。比如是否有人在说话(voice activity detection, VAD)、谁在说话(speaker diarization),和反向文本归一化等。通常,在语音识别系统中,这些任务分别由不同的模型来处理,但在本文中,这通通由 Whisper 一个模型完成。多个语音任务由同一个模型完成,有利有弊。好处是 all-in-one 的模型听起来比较 fancy,比较符合我们对于语音识别系统的期待。坏处是多个任务中如果某几个性能相对较差,整个模型难以调试。而且,如果需求只是做某一个比较简单的任务,一般来说一个简单的模型就可以胜任,但是 Whisper 需要跑整个大模型。
Whisper 模型共处理四个任务,如图左上所示。一是给定英文语音,转录成英文文本;二是给定其他语言语音,转录并翻译成英文文本;三是给定其他语言语音,转录成该语言文本;四是给定只有背景音乐的音频,识别出无人说话。
所有这些任务都由解码器预测的 token 序列表示,从而使得一个模型能够处理多个任务。这几个任务及模型输出 token 的关系可以从图中下方的图示中的 token 序列看出:在 START OF TRANSCRIPT token 之后,如果当前无人说话,则识别为 NO SPEECH 。如果有人说话,则识别出当前语音所属的语言 LANGUAGE TAG 。然后有两种可能的任务 TRANSCRIBE 还是翻译任务 TRANSLATE ,这两种任务又分为两种形式:带时间戳的和不带时间戳的,分别穿插或不穿插时间戳 token ,预测出文本 token。最后到达 EOT token,整个流程结束。
2.5 模型细节

模型训练采用 AdamW 优化器,并使用梯度范数裁剪,学习率在前 2048 次更新中进行热身,之后线性衰减至零。batch_size为 256,模型对数据集进行 2-3 次遍历。由于训练轮次较少,过拟合不是主要问题,因此我们没有使用任何数据增强或正则化方法,而是依靠大规模数据集本身的多样性来促进模型的泛化能力和鲁棒性。
3. 实验结果
语音识别常用的评估指标是词错误率(Word Error Rate, WER)。即预测结果和目标结果的编辑距离除以句长。
由于不同的数据集有不同的标注格式,如大小写、括号、数字间的逗号等。为了保证公平的对比,在测试 Whisper 性能时会进行手动的 text normalizer,来对齐测试数据集。当然,这在实际使用中是不需要的。
注意 Whisper 是没有在人工标注的语音识别数据集上训练的,即 zero-shot 的设定。而对比的方法都是在这些数据集上训练过的,因此,要达到与它们持平的性能也是不容易的。
3.1 Zero-shot

- 横轴为Librispeech数据集测试集上的WER,Y轴为其他数据集上的WER
- 紫色线为Whisper,蓝色线为其他模型(只在LibriSpeech上训练过)
- 黄色线为人类基准,给出了95%置信度区间。
虽然现有的模型在LibriSpeech上训练,可以实现非常低的WER,但是在其他数据集上的WER却很高。Whipser虽然在LibriSpeech上的性能不如部分其他模型,但是,在其他数据集上的指标却很高。

Whisper(Zero shot)和Wav2vec2(2020年提出)在LibriSpeech的测试集上都WER都是2.7。但在其余13个数据集上Whisper的性能优于Wav2vec2模型性能 55.4%。说明Whipser 准确且鲁棒。
3.2 多语言语音识别
下表是各模型在多语言语音识别数据集上的性能。可以看到,在小数据集 MLS 上,Whisper 表现更好;而在更大的 VoxPopuli 上,在训练集上训练过的有监督方法性能更好。

下图是不同语言的语音识别错误率随训练数据量的变化。可以看到,整体上随着训练数据的增多, 错误率是会下降的。另外,观察到在相同训练数据量的情况下, ZH、KO,即中文、韩文等语言的错误率相对较高。这可能有两个原因,一是东亚语言与世界主流的英语、法语等差别较大,无法从多语言联合训练中受益,二是 Whisper 的 tokenizer 对于这类语言也不太友好。

3.2 多语言/多任务联合训练与仅英语训练对比
蓝线表示全部使用英语数据进行训练,橙线表示多语言、多任务联合训练的结果。可以看到,随着训练数据量的增加,多语言、多任务联合训练对英语本身的语音识别性能也是有帮助的。
