使用 Transformers 中的 Wav2Vec2 对大文件进行自动语音识别

Hugging Face 推出了一种方法,通过利用 Wav2Vec2 中 Connectionist Temporal Classification (CTC) 架构的特性,在任意长度的音频文件和实时推理过程中执行高质量的自动语音识别 (ASR)。

Transformers 中的序列长度挑战

Wav2Vec2 是由 Meta AI Research 发布的一种流行的语音识别预训练模型,它基于 Transformer 架构。Transformer 的一个根本局限性是其有限的序列长度能力,这主要是由于注意力机制相对于序列长度的 $O(n^2)$ 复杂度导致的。

尝试在不进行分块的情况下对非常长的音频文件(例如,长达一小时的录音)运行 Wav2Vec2,会导致内存耗尽并导致程序崩溃,即使是在像 NVIDIA A100 GPU 这样的高端硬件上也是如此。

简单的分块及其局限性

简单的分块涉及将音频文件划分为较短的、固定长度的样本(例如,每个 10 秒),对每个样本进行推理,然后重建最终文本。虽然计算效率很高,但这种方法通常会产生次优的结果,因为模型在分块边界处缺乏必要的上下文,导致在音频分割处出现较差的推理质量。

常见的缓解措施——例如仅在静音期间进行分块或使用单独的语音活动检测模型——并不完全稳健,因为音频中可能包含连续的语音或长时间的噪声。

带步长的分块 (Chunking with Stride)

Wav2Vec2 利用 CTC 算法,其中音频的每一帧都被映射到单个字母预测 (logit)。Hugging Face 利用这一特性来实现“带步长的分块”,从而在长文件上实现稳健的 ASR:

  1. 重叠分块:推理是在重叠的分块上进行的。这确保了模型在每个分块的中心位置拥有足够的上下文。
  2. 丢弃 Logit:分块边缘的 logits(通常是推理质量最低的地方)会被丢弃。
  3. ** Logit 链式连接:剩余的中心 logits 被链式连接在一起,以重建一个与在全长音频上运行模型的结果非常接近的转录结果。

transformers pipeline 中,可以通过添加 chunk_length_s 参数来启用此功能。用户可以使用 stride_length_s 进一步自定义重叠,该参数接受一个用于左侧和右侧步长的元组(默认情况下,每侧的步长为分块长度的 1/6)。

与语言模型 (LM) 增强的兼容性

支持为 Wav2Vec2 添加语言模型 (LM) 以在无需额外微调的情况下提高词错误率 (WER),这种方法也与此步长技术兼容。由于 LM 直接作用于 logits,因此分块和步长过程可以应用于 LM 增强型模型,而无需修改。

实时推理能力

由于 Wav2Vec2 是单次通过的 CTC 模型,它非常高效,特别是在 GPU 上。这种效率使得通过在数据到达时将其喂入 pipeline 中进行实时推理成为可能。通过对连续的分块(例如,带有 1 秒步长的 10 秒分块)应用步长,模型可以随着用户的说话过程提供实时转录,从而消除了在显示文本之前等待完整分块处理完毕的必要性。

Sources

相关

  • Dispatch
  • Dispatch
  • Dispatch
  • Dispatch
  • Dispatch