在 Hugging Face Transformers 中使用 n-grams 增强 Wav2Vec2
Hugging Face 已将 pyctcdecode 库集成到 🤗 Transformers 库中,允许将 Wav2Vec2 语音识别模型与 n-gram 语言模型 (LMs) 相结合。这种集成显著减少了拼写错误并降低了词错率 (WER),特别是对于在有限数据上训练的模型。
使用 n-gram LM 提高转录准确度
将 Wav2Vec2 与 n-gram 语言模型结合可以纠正常见的仅基于声学的转录错误,即单词听起来正确但拼写错误的情况。虽然 Wav2Vec2 由于其 transformer 架构和 Connectionist Temporal Classification (CTC) 微调,在没有外部 LM 的情况下也能产生可接受的转录,但 LM 提供了必要的语言学上下文,可以防止模型预测不存在的单词。
在 facebook/wav2vec2-base-100h 的演示中,添加 4-gram 语言模型纠正了诸如 "christmaus" 到 "christmas" 以及 "simalyis" 到 "similes" 之类的错误。然而,如果错误的转录是一个有效的英文单词(例如,用 "rose" 代替 "roast"),某些错误可能会持续存在,因为 n-gram 模型仍可能为其分配一个不可忽视的概率。
LM 增强解码的技术实现
使用语言模型进行解码与标准解码在处理模型输出的方式上有所不同。Wav2Vec2ProcessorWithLM 不再使用 logits 的 argmax 来寻找最可能的字符,而是利用每个时间步所有可能输出字符的完整概率分布 (logits)。
此过程通过概率矩阵应用束搜索 (beam search),利用 n-gram 语言模型根据语言模式来加权下一个字母的可能性。这需要 pyctcdecode 和 kenlm 库来实现高效解码和模型存储。
构建自定义 n-gram 语言模型
要为特定领域或语言创建 n-gram LM,可以使用以下工作流程:
1. 数据收集与预处理
有效的 LM 需要与语音识别系统的目标转录文本相匹配的文本数据。对于基于 facebook/wav2vec2-xls-r-300m 的瑞典语模型,使用了 europarl_bilingual 数据集,因为其干净、朗读式的特性与口语音频非常契合。预处理包括:
- 提取目标语言的文本。
- 将文本转换为小写。
- 移除特定字符(例如标点符号)以匹配微调后的声学模型的字母表。
2. 使用 KenLM 构建模型
由于 KenLM 与基于 Transformer 的 LM 相比计算成本较低,因此使用 KenLM 来构建 n-gram 模型。虽然 Transformer LMs 可以产生更好的结果,但 n-grams 在没有 LM 的情况下提供了显著的性能提升,且检索速度更快(本质上是查找表查询)。
KenLM 流水线中的关键步骤包括:
- 使用
lmplz命令构建 n-gram(例如 5-gram)。 - 手动将句末 (
</s>) 标记添加到.arpa文件中,以确保与 🤗 Transformers 的兼容性。 - 使用
build_binary将.arpa文件转换为二进制.bin格式,以减小文件大小并提高加载速度。
集成与性能提升
要集成 n-gram 模型,需要创建一个 Wav2Vec2ProcessorWithLM 对象,该对象结合了声学模型的特征提取器、分词器以及使用 KenLM 二进制模型初始化的 pyctcdecode 束搜索解码器。
性能影响
根据官方 Wav2Vec2 论文,n-gram LMs 显著降低了词错率 (WER),特别是对于在极小数据集(例如 10 分钟音频)上训练的模型,在这种情况下,n-gram 可以比没有 LM 的情况降低约 80% 的 WER。在瑞典语 xls-r-300m-sv 示例中,使用 5-gram LM 增强的解码器在 Common Voice 7 测试集上实现了 18.85% 的 WER,实现了约 30% 的相对性能提升。
Sources
相关
- Dispatch
- Dispatch
- Dispatch
- Dispatch
- Dispatch