使用🤗 Transformers中的Wav2Vec2使自动语音识别在大文件上运行
使用🤗 Transformers的Wav2Vec2在大文件上运行自动语音识别
Tl;dr:本文介绍了如何利用连接主义时间分类(CTC)架构的特性,实现在任意长的文件或实时推理过程中实现非常好的质量的自动语音识别(ASR)。
Wav2Vec2是一种流行的用于语音识别的预训练模型。这种新颖的架构由Meta AI Research于2020年9月发布,为语音识别的自监督预训练进展提供了推动,例如 G. Ng等人,2021年,Chen等人,2021年,Hsu等人,2021年和Babu等人,2021年。在Hugging Face Hub上,Wav2Vec2目前最受欢迎的预训练检查点每月下载量超过250,000次。
Wav2Vec2的核心是一个transformers模型,而transformers的一个注意事项是它通常具有有限的序列长度。这要么是因为它使用了位置编码(本例中不适用),要么只是因为transformers中的注意力成本实际上是O(n²),这意味着使用非常大的序列长度会导致复杂性/内存的爆炸。因此,即使使用有限的硬件(例如像A100这样非常大的GPU),也不能简单地在一个小时长的文件上运行Wav2Vec2,否则您的程序将崩溃。让我们试试看!
pip install transformers
from transformers import pipeline
# 这将适用于https://huggingface.co/models?pipeline_tag=automatic-speech-recognition上的数千种模型之一
pipe = pipeline(model="facebook/wav2vec2-base-960h")
# 用于测试的公共领域LibriVox文件
#!wget https://ia902600.us.archive.org/8/items/thecantervilleghostversion_2_1501_librivox/thecantervilleghostversion2_01_wilde_128kb.mp3 -o very_long_file.mp3
pipe("very_long_file.mp3")
# 内存溢出!
pipe("very_long_file.mp3", chunk_length_s=10)
# 这样可以工作并打印出非常长的字符串!
# 整个博文将解释如何使事情正常工作
简单分块
实现对非常长的文件的推理的最简单方法是将初始音频分成较短的样本,例如每个样本10秒钟,对这些样本进行推理,最终得到一个最终的重构。这在计算上是高效的,但通常会导致次优的结果,原因是为了进行良好的推理,模型需要一些上下文,因此在分块边界附近,推理往往质量较差。
请看下面的图表:
有一些方法可以尝试以一种通用的方式解决这个问题,但它们从来都不是完全健壮的。您可以尝试仅在遇到静音时进行分块,但是您可能会有长时间的非静音音频(歌曲或嘈杂的咖啡厅音频)。您还可以尝试仅在没有声音时切割,但这需要另一个模型,这个问题并没有完全解决。您还可能会有连续的声音持续很长时间。
事实证明,Wav2Vec2使用的CTC结构可以被利用,以在非常长的文件上实现非常稳健的语音识别,而不会陷入这些陷阱。
带有步幅的分块
Wav2Vec2使用CTC算法,这意味着每个音频帧都被映射到一个单独的字母预测(对数概率)。
这就是我们要使用的主要特性,以添加一个步幅
。这个链接在图像上下文中解释了它,但对于音频来说是相同的概念。由于这个特性,我们可以:
- 从重叠的块开始进行推理,以使模型在中心具有适当的上下文。
- 丢弃侧面的推理结果。
- 将没有丢弃侧面的对数概率连接起来,以恢复出非常接近于模型在完整长度音频上的预测结果。
从技术上讲,这与在整个文件上运行模型并不完全相同,因此默认情况下并未启用,但正如您在前面的示例中看到的,您只需添加 chunk_length_s
到您的 pipeline
中即可使其工作。
实际上,我们观察到大多数错误推理都保留在步幅中,在推理之前被丢弃,从而导致完整文本的正确推理。
请注意您可以选择此技术的每个参数:
from transformers import pipeline
pipe = pipeline(model="facebook/wav2vec2-base-960h")
# stride_length_s 是左侧和右侧步幅长度的元组。
# 只有一个数字时,两侧都采用相同的步幅,默认情况下
# 一侧的步幅长度是 chunk_length_s 的六分之一
output = pipe("very_long_file.mp3", chunk_length_s=10, stride_length_s=(4, 2))
使用步幅在 LM 增强模型上进行分块
在 transformers 中,我们还添加了对向 Wav2Vec2 添加 LM 的支持,以提高模型的 WER 性能,而无需进行微调。请参阅这篇出色的博客文章,详细解释了其工作原理。
事实证明,LM 直接在逻辑回归上工作,因此我们实际上可以应用与之前完全相同的技术,而无需进行任何修改!因此,在这些经过 LM 增强的模型上对大文件进行分块仍然可以正常工作。
实时推理
使用类似 Wav2vec2 的 CTC 模型的一个非常好处是它是一个单通道模型,所以它非常快。特别是在 GPU 上。我们可以利用这一点来进行实时推理。
原理与常规步幅完全相同,但这次我们可以将流水线数据实时输入,并且仅使用长度为 10s 的完整分块进行步幅操作,例如以 1s 的步幅获得适当的上下文。
这需要运行比简单文件分块更多的推理步骤,但可以使实时体验更好,因为模型可以在您说话时即刻显示结果,而无需等待 X 秒钟才能看到显示。