Contents

Whisper

项目地址: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,片段的结束

/images/whisper_multi_task_format.png

效果评估

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 秒之间,避免识别不到开头的几个词