对话式人工智能

基于 NVIDIA NeMo 的多语言和代码切换自动语音识别

多语言 自动语音识别 ( ASR )模型因其能够以多种语言转录语音而获得了极大的兴趣。这是由不断增长的多语言社区以及减少复杂性的需求所推动的。您只需要一个模型来处理多种语言。

这篇文章解释了如何使用 NGC 目录中的 预训练多语言 NeMo ASR 模型 。我们还分享了创建自己的多语言数据集和训练自己的模型的最佳实践。

多语言 ASR 模型的工作原理

ASR 模型在高级别上将语音转换为文本。在推断时,它们使用音频文件作为输入,并生成文本标记或字符作为输出(图 1 )。更准确地说,在每个音频采样时间步,该模型输出总共num_classes 标记中每一个的对数概率。

Diagram showing how ASR models split input audio into time slices and learn to generate a specific token or character for each time slice. The tokens or characters are then combined to form words.
图 1 。音频输入到各个令牌的时间切片

在培训时,您提供文本记录以及音频文件作为输入。当模型训练时,它使用成绩单来计算训练损失。它逐渐减少了这种损失,并提高了其权重,使其输出成绩单尽可能接近原始。

多语言环境为这幅图增添了几个方面。在推断过程中,您通常不知道音频中包含的语言。但是,如果模型知道在音频中遇到的语言 ID ( LID ),则输出它可能很有用。

这可以用于将 ASR 模型下游的特定于语言的处理管道组合在一起。同样,您可能需要在培训期间提供每个样本中的 LID 值。

代码转换指的是在对话过程中不同语言之间的转换。这种模型必须预测每个样本可能包含多个 LID 值,并需要相应地进行训练。

更深的潜水

创建多语言模型有两种基本方法。

在第一种方法中,您可以在很大程度上忽略数据集中存在多种语言这一事实,并按原样对转录本进行排序,让模型来解决所有问题。如果模型使用文本标记化,则只需确保标记化器词汇表的大小足以覆盖所有语言。你将不同语言的成绩单结合起来,训练标记器。

在第二种方法中,您使用适当的 LID 标记转录本中的每个文本样本。如果模型使用标记器,您可以在每种语言上单独训练它们,然后使用 NeMo 聚合标记器功能来组合它们。

每种语言都获得一个指定的令牌 ID 范围,模型学习生成它们。在解码过程中,要确定特定令牌的 LID ,请查看其 ID 范围(图 2 )。

During inference, the aggregate tokenizer routes tokens to the appropriate tokenizer based on the numerical range of the token ID.
图 2 :使用聚合标记器进行推断

在培训期间,您使用适当的单语标记器标记输入文本。然后移动令牌 ID 以确保没有重叠,每种语言都有自己的数字范围(图 3 )。

During training, the aggregate tokenizer assigns a numerical token range for each language, tokenizes the text, and shifts token IDs per the token range for the appropriate language.
图 3 。标记输入文本而不重叠

除了数据集准备之外,代码切换并不构成挑战。根据我们的经验,为了擅长代码转换,模型必须专门针对由多种语言组成的样本进行训练。我们将在后续章节中返回到这个主题。

NeMo 多语言 ASR 模型的推理

预训练的多语言 NeMo 模型可以以与单语模型几乎相同的方式使用。首先从 NGC 初始化一个预训练的检查点。

该模型具有enes前缀,表示它接受了两种语言的训练:

asr_model = nemo_asr.models.EncDecRNNTBPEModel.from_pretrained(model_name="stt_enes_contextnet_large")

编译输入音频文件列表:

en_files = ["./datasets/mini/LibriSpeech/dev-clean-2-processed/7976-110523-0000.wav", "./datasets/mini/LibriSpeech/dev-clean-2-processed/7976-110523-0001.wav"]

转录它们:

transcripts = asr_model.transcribe(paths2audio_files = en_files) [0]

要输出 LID ,对模型的解码策略做一个小改动:

decoding_cfg = OmegaConf.create({})
with open_dict(decoding_cfg):
decoding_cfg.compute_langs = True
asr_model.change_decoding_strategy(decoding_cfg)

现在可以执行推断:

hyp, _ = asr_model.transcribe(paths2audio_files = es_files, return_hypotheses=True)

Hyp[0].langs变量包含批次(es) c中样本0的 LID 的最佳估计值。hyp[0].langs_chars变量包含以下各项的 LID :

[{'char': 'a', 'lang': 'es'}]

代码交换检查点的工作方式相同。它们在 NGC 模型检查点名称中用codesw字符串标记。有关详细信息,请参见 Multilingual ASR models with Subword Tokenization in NeMo

如何培养多语言模型?

正如我们已经提到的,构建多语言模型的最简单方法是直接混合单语数据集,并在混合数据集上训练模型。这种方法不保留 LID 信息,但它工作得很好,产生了高度精确的模型。

如果需要代码切换功能,理想的场景将涉及使用真正的代码切换训练集。如果没有,则创建一个合成的(图 4 )。

Flowchart shows the construction of code-switched samples, from initializing the synthetic sample and adding the starting silence to performing audio amplitude normalization and scaling and adding the ending silence.
图 4 :将单语言样本组合起来,以创建给定最大长度的代码切换样本

在本例中,您随机组合来自不同语言的单语样本,调整静音,按音量标准化音频,并引入随机暂停。您只需不超过合成样本的特定最大音频长度,通常设置为 20 秒。

这也不是完美的,因为样本之间的上下文丢失了。但是,模型可以在样本中的语言之间切换。

如果保留 LID 很重要,可以使用 NeMo 清单中的样本宽 lang 字段:

{"audio_filepath": "data1.wav", "duration": 7.04, "text": "by the time we had placed the cold fresh-smelling little tree in a corner of the sitting room it was already Christmas eve", "lang": "en"}

代码切换数据集每个样本有多个 LID ,因此您也可以使用以下代码:

{"audio_filepath": "/data2.wav", "duration": 17.32425, "text": [{"lang": "en", "str": "the mentality is that of a slave-owning community with a mutilated multitude of men tied to its commercial and political treadmill "}, {"lang": "es", "str": "y este "}]}

接下来,使用由单语标记器组成的聚合标记器训练模型。在模型配置文件中,它看起来像以下代码示例:

tokenizer:
type:agg
langs:
en:
type: bpe
dir: english_tokenizer_dir
es:
type: bpe
dir: spanish_tokenizer_dir

在本例中,我们使用了英语(LID en)和西班牙语(LID es)。预训练的标记器被放置在它们各自的目录中,我们引用了这些目录。

关于模型训练的几点注意事项:

  • 理想情况下,在创建柏油或桶状数据集之前,数据集必须充分混合。
  • 数据集必须平衡。例如,它们在每种语言中应该包含大约相同的小时数。如果其中一个单语数据集明显大于另一个,那么对较小的数据集进行过采样可能是一个好主意,以防止模型优先学习较大的语言。
  • 可以从单语检查点之一开始训练模型。这通常会加快收敛速度。然而,在这种情况下,对增量语言进行过采样是一个好主意。

总结

在这篇文章中,我们介绍了多语言 NeMo ASR 模型的使用:

  • 如何使用它们进行推断
  • 如何训练他们
  • 常见的多语言模型和代码转换模型之间的区别
  • 如何保存和输出 LID 信息

我们正在努力为我们的模型添加更多的语言,并将很快分享这些结果。

本文中引用的所有代码都可以在 NeMo GitHub repo 中公开获得,模型可以在 NGC 中获得:

 

标签