如何提高特定词语的识别率
目录

如何提高特定词语的识别率#
在本教程中,让我们探讨可以提高 Riva 中特定词语识别率的自定义技术,例如
专有名词:人名、产品和品牌名称、地址中的街道名称……
狭窄领域术语
缩写
当开箱即用的 Riva 模型在处理训练数据中不太可能出现的具有挑战性的场景时,各种自定义技术可以提供帮助。
Riva 自定义技术概述#
以下流程图显示了 Riva 语音识别管道以及可能的自定义项。
原始时域音频信号首先通过特征提取块,该块将数据分段为块(例如,每个 80 毫秒),然后将块从时域转换为频域 (MFCC)。然后将此数据馈送到声学模型中,该模型在每个时间步输出文本标记的概率。解码器将此概率矩阵转换为文本标记序列,然后将其去标记化
为实际的句子(或字符序列)。高级解码器还可以执行波束搜索,并结合语言模型对多个可能的假设(即句子)进行评分。解码器输出不带标点符号和大小写,这是标点符号和大小写模型的工作。最后,应用逆文本规范化 (ITN) 规则将口头格式的文本转换为所需的书面格式。
要提高特定词语的识别率,请使用以下自定义项。这些自定义项按难度和工作量递增的顺序列出
技术 |
难度 |
作用 |
何时使用 |
如何使用 |
---|---|---|---|---|
1. 词语增强 |
快速且简单 |
临时扩展词汇表,同时增加识别所提供词语列表的机会。 |
当您知道某些词语或短语很重要时。 |
|
2. 自定义词汇表 |
简单 |
永久扩展默认词汇表以涵盖感兴趣的新词。 |
当默认模型词汇表不足以涵盖感兴趣的领域时。 |
|
3. 自定义发音 (词典映射) |
简单 |
显式指导解码器将一个或多个发音(标记序列)映射到特定词语。 |
当您知道一个词可以有多种发音时。 |
|
4. 重新训练语言模型 |
中等 |
为应用领域训练新的语言模型,以提高领域特定术语的识别率。 |
当领域文本数据可用时。 |
训练教程即将推出 |
5. 微调现有声学模型 |
中等偏难 |
使用少量领域数据微调现有声学模型,以更好地适应领域。 |
当转录的领域音频数据可用(10 小时-100 小时),并且其他更简单的方法都失败时。 |
Conformer-CTC - 微调教程, ZH_Conformer-CTC - 微调教程, Conformer-CTC - 部署教程 |
在下一节中,我们将更详细地讨论每种技术。有关分步操作指南,请查阅表中链接的笔记本。
1. 词语增强#
在所有适配技术中,词语增强是最容易和最快实现的。词语增强允许您通过在解码声学模型的输出时给感兴趣的特定词语更高的分数,从而使 ASR 引擎偏向于识别这些词语。您只需将重要词语的列表以及权重作为额外的上下文传递给 API 调用,如下例所示。
# Word Boosting
boosted_lm_words = ["BMW", "Ashgard"]
boosted_lm_score = 20.0
speech_context = rasr.SpeechContext()
speech_context.phrases.extend(boosted_lm_words)
speech_context.boost = boosted_lm_score
config.speech_contexts.append(speech_context)
# Creating StreamingRecognitionConfig instance with config
streaming_config = rasr.StreamingRecognitionConfig(config=config, interim_results=True)
词语增强为模型提供了快速、临时的现场适配,以应对新的场景,例如识别专有名词和产品或领域特定术语。词语增强还支持词汇表外 (OOV) 词语,在这种情况下,它会临时扩展词汇表并为新词语提供增强。
您必须在每个请求中显式指定增强词语的列表。其他适配方法(例如自定义词汇表和词典映射)提供了更永久的解决方案,这将影响每个后续请求。
在实施词语增强时,请注意以下事项
词语增强可以提高识别所需词语的机会,但同时也会增加误报。因此,请从小的正权重开始,逐渐增加,直到看到积极效果。作为一般指南,从 20 的增强分数开始,如果需要,最多增加到 100。
词语增强最适合作为新情况的临时修复。但是,如果您希望将其用作永久适配,您可以尝试对增强权重进行二分搜索,同时监控测试集上的准确性指标。准确性指标应包括词错误率 (WER) 和/或一种侧重于感兴趣术语的术语错误率 (TER)。
词语增强仅在 flashlight 解码器中受支持。
2. 自定义词汇表#
Riva 中支持两种解码器。
贪婪解码器(在 riva-build 过程中通过标志
--decoder_type=greedy
可用)是一个简单的解码器,它仅输出每个时间步具有最大概率的标记。它不是基于词汇表的,因此可以生成任何字符序列或词语。Flashlight 解码器是 Riva 中默认部署的更高级的解码器,它可以执行波束搜索。它是一个基于词典的解码器,仅发出词汇表文件中存在的词语。这意味着,词汇表文件中不存在的领域特定词语将没有机会生成。
对于默认的 Flashlight 解码器,有两种方法可以扩展解码器词汇表
在 Riva 构建时:构建自定义模型时。将扩展的词汇表文件传递给
riva-build
命令的--decoding_vocab=<vocabulary_file>
参数。Riva 语言的开箱即用词汇表文件可以在 NGC 上找到,例如,对于英语,名为flashlight_decoder_vocab.txt
的词汇表文件可以在此链接中找到。部署后:对于生产 Riva 系统,可以修改、扩展词典文件,并在服务器重启后生效。请参阅下一节。
3. 自定义发音 (词典映射)#
当使用 Flashlight 解码器时,词典文件提供了词汇表词典词语及其发音之间的映射,对于许多 Riva 模型来说,发音是句子片段标记。
修改词典文件有两个目的
扩展词汇表。
为特定词语提供一个或多个显式自定义发音。
有关分步说明和案例研究,请参阅词典映射教程。
4. 重新训练语言模型#
语言模型 (LM) 估计在其训练的文本语料库中观察到文本序列的可能性。将新的语言模型引入到现有的 ASR 管道是提高小众设置准确性的另一种方法。Riva 支持从 NVIDIA NeMo 或 KenLM 训练和导出的 n-gram 语言模型。有关更多信息,请参阅Riva 文档。
n-gram 语言模型估计 n 个或更少连续词语组的概率分布。通过更改或偏置训练语言模型的数据,以及它正在估计的分布,它可以用于预测不同的转录结果更有可能,从而在不更改声学模型的情况下更改预测结果。语言模型必须与高级解码器(如 Flashlight)结合使用,后者会检查多个假设,并将语言模型分数与声学模型分数结合使用来权衡这些假设。
请注意,NeMo 目前不支持微调 LM,尽管预计未来会添加此功能。因此,您应确保有大量的领域文本可用于训练。此外,当文本属于狭窄的小众领域时,可能会对识别通用领域语言的整体 ASR 管道产生影响,这是一种权衡。因此,您应该尝试将领域文本与通用文本混合,以获得更平衡的表示。
如果使用抓取的文本,则应限制词汇表大小。许多在线资源包含错别字或辅助代词和不常见的词语。删除这些可以改进语言模型。
5. 微调声学模型#
当其他更简单的方法未能解决由显着的声学因素(例如不同的口音、嘈杂的环境或音频质量)带来的挑战性情况下的准确性问题时,应尝试微调声学模型。
我们建议使用大约 100 小时或更多的语音数据来微调 ASR 模型,如此研究论文所示。
低资源领域适配#
对于较小的数据集(例如约 10 小时),应采取适当的预防措施,以避免过度拟合领域,从而牺牲通用领域中的显着准确性,即“灾难性遗忘”。在迁移学习中,持续学习是一个子问题,其中使用新领域数据训练的模型仍应在原始源领域中保持良好的性能。
如果在小型数据集上完成微调,请将其与其他更大的数据集(“基础”)混合。例如,对于英语,NeMo 有一个公共数据集列表,可以与它混合使用。
如果使用 NeMo 微调 ASR 模型,请参阅此教程。
数据质量和增强#
如果可能,请使用无损音频格式。使用有损编解码器(如 MP3)可能会降低质量。作为一种常见的做法,如果可能,请使用至少 16 kHz 的采样率。
使用噪声增强训练数据可以提高模型应对嘈杂环境的能力。向音频训练数据添加背景噪声最初可能会降低准确性,但会提高鲁棒性。
从头开始训练模型#
ASR 模型的端到端训练需要大型数据集和大量的计算资源。世界各地有 5,000 多种语言,但只有极少数语言拥有足够大的数据集来训练高质量的 ASR 模型。
因此,我们仅建议在有数千小时的转录语音数据可用的情况下从头开始训练模型。
结论#
Riva 提供了一组丰富的自定义技术,您可以使用这些技术来帮助提高开箱即用性能,以应对训练数据中尚未涵盖的新颖且具有挑战性的情况。