多语言 自动语音识别 ( ASR
)模型因其能够以多种语言转录语音而获得了极大的兴趣。
这是由不断增长的多语言社区以及减少复杂性的需求所推动的。
您只需要一个模型来处理多种语言。
这篇文章解释了如何使用 NGC 目录中的 预训练多语言 NeMo ASR 模型 。我们还分享了创建自己的多语言数据集和训练自己的模型的最佳实践。
ASR 模型在高级别上将语音转换为文本。在推断时,它们使用音频文件作为输入,并生成文本标记或字符作为输出(图 1 )。更准确地说,在每个音频采样时间步,该模型输出总共
num_classes
标记中每一个的对数概率。
图 1 :音频输入到各个令牌的时间切片
在培训时,您提供文本记录以及音频文件作为输入。
当模型训练时,它使用成绩单来计算训练损失。
它逐渐减少了这种损失,并提高了其权重,使其输出成绩单尽可能接近原始。
多语言环境为这幅图增添了几个方面。在推断过程中,您通常不知道音频中包含的语言。但是,如果模型知道在音频中遇到的语言 ID( LID ),则输出它可能很有用。
这可以用于将 ASR 模型下游的特定于语言的处理管道组合在一起。同样,您可能需要在培训期间提供每个样本中的 LID 值。
代码转换指的是在对话过程中不同语言之间的转换。这种模型必须预测每个样本可能包含多个 LID 值,并需要相应地进行训练。
创建多语言模型有两种基本方法。
在第一种方法中,您可以在很大程度上忽略数据集中存在多种语言这一事实,并按原样对转录本进行排序,让模型来解决所有问题。如果模型使用文本标记化,则只需确保标记化器词汇表的大小足以覆盖所有语言。你将不同语言的成绩单结合起来,训练标记器。
在第二种方法中,您使用适当的 LID 标记转录本中的每个文本样本。如果模型使用标记器,您可以在每种语言上单独训练它们,然后使用 NeMo 聚合标记器功能来组合它们。
每种语言都获得一个指定的令牌 ID 范围,模型学习生成它们。在解码过程中,要确定特定令牌的 LID ,请查看其 ID 范围(图 2 )。
图 2:使用聚合标记器进行推断
在培训期间,您使用适当的单语标记器标记输入文本。然后移动令牌 ID 以确保没有重叠,每种语言都有自己的数字范围(图 3 )。
图 3:标记输入文本而不重叠
除了数据集准备之外,代码切换并不构成挑战。根据我们的经验,为了擅长代码转换,模型必须专门针对由多种语言组成的样本进行训练。我们将在后续章节中返回到这个主题。
预训练的多语言 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 )。
图 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 ,因此您也可以使用以下代码: