Whisper
Contents
项目地址:https://github.com/openai/whisper
论文地址:https://arxiv.org/pdf/2212.04356
方法
数据预处理
- 数据来源是互联网上的音频及其对应的文本
- 由于许多文本质量较低,或者本身就是现有的语音识别系统生成的 ,论文使用了一些启发式方法来过滤掉这些低质量语音及文本
- 语音-文本检测器
- 检测器本身通过微调一个原型模型得到
- 如果语音和文本的语种不对应,则排除掉对应语音及文本
- 例外:保留英文翻译,即保留 的语音和文本
- 语音被切分为 30s 的片段,文本也按相应的时间切分
- 即使某个片段中没有说话的声音,仍然将它加入训练,用于语音活跃检测
- 初始模型训练完成后,把那些有高错误率的数据提取出来进行人工分析,剔除了一批低质量数据
- 在文本层面进行了去重
模型
- 使用 encoder-decoder 模型结构
- 音频输入都进行标准化
- 16000 Hz 重采样,80 通道 log-maganitude Mel Spectrogram(梅尔频谱),25ms window,10ms stride(音频编码参数,不太了解细节)
- 所有输入被缩放到 -1,1 区间,保持均值大约为 0
- Encoder
- 2 x Conv1D + GELU
- Sinusoidal positional encoding
- Transformer blocks (pre-activation residual blocks)
- Layer norm
- Decoder
- Learned positional encoding
- 宽度、block 数量和 encoder 一致
- Next token prediction
- Tokenizer 使用 byte-level BPE
- 英语模型直接复用 GPT-2 的
- 多语言模型在 GPT-2 BPE 的基础上重新适配词汇表(但是保持词表大小一致)
多任务格式
语音识别系统可能有很多不同的下游任务,例如文本识别、翻译、语音活动检测、语种识别等,我们希望有一个统一的接口。因此在 decoder 处,在 token 层面标识出不同的任务,让模型给出不同的预测,这样就能完成各种不同类型的任务。此外,还在 decoder 处添加了之前输出的历史,希望 decoder 能借助这一上下文来理解有歧义的音频。多任务的 token 构成:
- PREV:特殊 token,历史的开始
- 历史 tokens
- SOT:start of transcript,片段的开始
- 模型给出预测其中一个:
- NOSPEECH:没有语音,用于语音活动检测
- LANGUAGE TAG:表明当前识别的语种
- 人为插入其中一个:
- TRANSCRIBE:转写,语音转文字
- TRANSLATE:翻译,任意语音翻译到英文
- 人为插入 NO TIMESTAMP (也可以不插入)
- 如果不插入,后续的文本 tokens 预测时会模型以 20ms 分段,插入时间戳 token
- EOT:end of transcript,片段的结束
效果评估
Zero-shot Evaluation
使用多个县有的数据集进行测试,但是不使用其中任何的训练数据,评估时也是 zero-shot 评估。
评测指标
一般使用的评测指标是 WER(word error rate)。但是 WER 是基于编辑距离计算的,一些格式区别会导致特别大的 WER,即使两份文本实际上是一致的。这一问题在 zero-shot 评测时尤为显著。因此在计算 WER 之前,需要先进行文本标准化,以去掉一些无害的区别。
评测指标就不一一复述了,挑一些文章中有意思的点出来。
文中提出一个观点:尽管有的模型在测试时表现很好,甚至比人类更好,但是一旦面对训练数据集以外的数据,表现就会明显下降。这是因为他们人类是 out-of-distribution 在执行任务,但是之前的模型评测是 in-distribution。
- 英文语音识别:对比模型是 2019 年的 SOTA wav2vec,对比数据集有很多。尽管在 LibriSpeech Clean 上,Whisper 和 wav2vec 表现差不多,但是在其它的数据集上,Whisper 表现明显更好。这表明了 Whisper 模型具有很好的泛化性。
- 多语言识别:某语种的语音识别 WER 和训练数据集中对应的音频长度有非常强的 log-log 线性相关。
- 翻译:尽管翻译的表现和训练数据的音频长度有相关性,但是相关性明显弱于语音识别任务。
- 噪声:随着信噪比降低,Whisper 的效果会好于其余模型。
- 长语音识别:Whisper 是使用 30s 的片段训练的,在识别长语音时,需要一些策略去辅助
- Decoding 时使用 beam search
- Sample temperature 参数随着 log probabilities 下降或输出 text gzip 压缩比上升而上升
- 只使用 NOSPEED token 不足以判断当前没有语音,还需结合 no-speech 的概率,配合阈值
- Decoder 处加上之前的文本
- 限制第一个 timestamp token 在 0.0 和 1.0 秒之间,避免识别不到开头的几个词