如何使用词汇映射自定义 Riva ASR 词汇表和发音#

本笔记本将引导您完成自定义 Riva ASR 词汇表和词典的过程,以提高 Riva 词汇覆盖率和对难词(如首字母缩略词)的识别。

概述#

Flashlight 解码器是 Riva 中默认部署的解码器,它是一个基于词典的解码器,仅输出词典文件中存在的词语。这意味着,词典文件中不存在的不常见和新词,例如特定领域的术语,将无法生成。

另一方面,贪婪解码器(在 riva-build 过程中使用标志 --decoder_type=greedy 可选)不是基于词典的,因此实际上可以生成任何单词或字符序列。

先决条件#

本笔记本假定用户熟悉使用 Riva ServiceMaker 工具、riva-buildriva-deploy 命令手动部署 Riva ASR 管道。请参阅 Riva 文档

术语#

  • 词汇表文件:词汇表文件是一个纯文本文件,其中包含词汇表词语列表,每个词语各占一行。例如

the
i
to
and
a
you
of
that
...

此文件由 riva-build 进程用于生成词典文件。

  • 词典文件:词典文件是一个纯文本文件,其中包含每个词汇表词语到其标记化形式的映射,例如,sentencepiece 标记,用 tab 分隔。以下是一个示例

with    ▁with
not     ▁not
this    ▁this
just    ▁just
my      ▁my
as      ▁as
don't   ▁don ' t

注意:最终,Riva 解码器在运行时仅直接使用词典文件(而不是词汇表文件)。

Riva ServiceMaker 自动标记化词汇表文件中的词语以生成词典文件。它使用正确的标记化模型,该模型与声学模型一起打包在 .riva 文件中。默认情况下,Riva 为词汇表文件中的每个词语生成 1 个标记化形式。

可以自定义什么?#

词汇表文件和词典文件都可以自定义。

  • 扩展词汇表丰富了 Riva 默认词汇表,为词汇表外词语、术语和缩写提供了额外的覆盖范围。

  • 自定义词典文件可以通过以标记化序列的形式提供一个或多个显式发音来进一步丰富 Riva 知识库。

扩展词汇表#

扩展词汇表必须在 Riva 构建时完成。

构建 Riva ASR 管道时,将 扩展词汇表文件 传递给 build 命令的 --decoding_vocab=<vocabulary_file> 参数。例如,Citrinet 模型的 build 命令

    riva-build speech_recognition \
   <rmir_filename>:<key> <riva_filename>:<key> \
   --name=citrinet-1024-english-asr-streaming \
   --decoding_language_model_binary=<lm_binary> \
   --decoding_vocab=<vocabulary_file> \
   --language_code=en-US \
   <other_parameters>...

有关支持模型的 build 命令,请参阅 Riva 文档

如何修改词汇表文件#

您可以提供自己的词汇表文件,也可以扩展 Riva 的默认词汇表文件。

  • 自带词汇表文件:提供一个纯文本文件,其中包含词汇表词语列表,每个词语各占一行。请注意,此文件不仅必须包含一小部分“难词”,还必须包含您希望 ASR 管道能够生成的所有词语,即包括所有常用词。

  • 修改现有词汇表文件:这是推荐的方法。Riva 支持的语言的开箱即用词汇表文件可以在以下位置找到:

    • 在 NGC 上,例如,对于英语,名为 flashlight_decoder_vocab.txt 的词汇表文件可以在此链接中找到。

    • 或者在本地 Riva 部署中:Riva 资产的实际物理位置取决于 Riva 快速入门文件夹下 config.sh 文件中 riva_model_loc 变量的值。词汇表文件与 Flashlight 解码器捆绑在一起。

      • 默认情况下,riva_model_loc 设置为 riva-model-repo,这是一个 docker 卷。您可以检查此 docker 卷,并使用如下命令将词汇表文件从 docker 卷内复制到主机文件系统:

      # Inspect the Riva model docker volume
      docker inspect riva-model-repo
      
      # Inspect the content of the Riva model docker volume
      docker run --rm -v riva-model-repo:/riva-model-repo alpine ls /riva-model-repo
      
      # Copy the vocabulary file from the docker volume to the current directory
      docker run --rm -v $PWD:/dest -v riva-model-repo:/riva-model-repo alpine cp  /riva-model-repo/models/citrinet-1024-en-US-asr-offline-ctc-decoder-cpu-offline/1/dict_vocab.txt /dest
      
      • 如果您将 riva_model_loc 修改为指向文件夹的绝对路径,则将使用本地文件系统中的指定文件夹来存储 Riva 资产。假设 <RIVA_REPO_DIR> 是存储 Riva 资产的目录,则词汇表文件同样可以在例如 <RIVA_REPO_DIR>/models/citrinet-1024-en-US-asr-offline-ctc-decoder-cpu-offline/1/dict_vocab.txt 下找到。

您可以复制一份,然后使用感兴趣的词语扩展此默认词汇表文件。

修改完成后,您必须使用 riva-build 重新部署 Riva ASR 管道,同时传递标志 --decoding_vocab=<modified_vocabulary_file>

使用词汇映射自定义发音#

Flashlight 解码器使用的词典文件可以在 Riva 资产目录中找到,由 Riva 快速入门文件夹下 config.sh 文件中 riva_model_loc 变量的值指定(见上文)。

  • 如果 riva_model_loc 指向 docker 卷(默认情况下),您可以使用以下命令查找和复制词典文件:

        # Copy the lexicon file from the docker volume to the current directory
        docker run --rm -v $PWD:/dest -v riva-model-repo:/riva-model-repo alpine cp  /riva-model-repo/models/citrinet-1024-en-US-asr-offline-ctc-decoder-cpu-offline/1/lexicon.txt /dest
  • 如果您将 riva_model_loc 修改为指向文件夹的绝对路径,则将使用本地文件系统中的指定文件夹来存储 Riva 资产。假设 <RIVA_REPO_DIR> 是存储 Riva 资产的目录,则词汇表文件同样可以在例如 <RIVA_REPO_DIR>/models/citrinet-1024-en-US-asr-offline-ctc-decoder-cpu-offline/1/lexicon.txt 下找到。

如何修改词典文件#

首先,找到并复制词典文件。例如

cp <RIVA_REPO_DIR>/models/citrinet-1024-en-US-asr-offline-ctc-decoder-cpu-offline/1/lexicon.txt modified_lexicon.txt

接下来,修改它以添加感兴趣词语的 sentencepiece 标记化。例如,可以添加

manu ▁ma n u
manu ▁man n n ew
manu ▁man n ew

这是单词 manu 的 3 种不同的发音/标记化。如果声学模型预测到这些标记,它们将被解码为 manu

最后,完成后,通过将 --decoding_lexicon=modified_lexicon.txt 传递给 riva-build 而不是 --decoding_vocab=decoding_vocab.txt,来使用新的解码词典标记化重新生成模型库。

如何生成正确的标记化形式#

修改词典文件时,请确保:

  • 新行遵循与文件其余部分相同的缩进/空格模式,并且使用的标记是标记化模型的一部分。

  • 标记是有效标记,由标记化模型(与 Riva 声学模型一起打包)确定。

后者确保您仅使用声学模型已训练过的标记。为此,您需要标记化模型和 sentencepiece Python 包(pip install sentencepiece)。您可以从模型库 ctc-decoder-... 目录中获取已部署管道的标记化模型,该目录适用于您的模型。它将被命名为 <hash>_tokenizer.model。例如

<RIVA_REPO_DIR>/models/citrinet-1024-en-US-asr-offline-ctc-decoder-cpu-offline/1/498056ba420d4bb3831ad557fba06032_tokenizer.model

当使用 docker 卷存储 Riva 资产(默认情况下)时,您可以使用如下命令将标记化模型复制到本地目录:

        # Copy the tokenizer model file from the docker volume to the current directory
        docker run --rm -v $PWD:/dest -v riva-model-repo:/riva-model-repo alpine cp  /riva-model-repo/models/citrinet-1024-en-US-asr-offline-ctc-decoder-cpu-offline/1/498056ba420d4bb3831ad557fba06032_tokenizer.model /dest
!pip install sentencepiece

然后,您可以生成新的词典条目,例如

TOKEN="BRAF"
PRONUNCIATION="b raf"

import sentencepiece as spm
s = spm.SentencePieceProcessor(model_file='tokenizer.model')
for n in range(5):
    print(TOKEN + '\t' + ' '.join(s.encode(PRONUNCIATION, out_type=str, enable_sampling=True, alpha=0.1, nbest_size=-1)))
BRAF	▁b ▁ra f
BRAF	▁b ▁ r a f
BRAF	▁b ▁ra f
BRAF	▁b ▁ra f
BRAF	▁ b ▁ra f

注意:TOKEN 表示单词的所需书写形式,而 PRONUNCIATION 是单词应有的发音。

其他示例

TOKEN="WhatsApp"
PRONUNCIATION="what's app"

import sentencepiece as spm
s = spm.SentencePieceProcessor(model_file='tokenizer.model')
for n in range(5):
    print(TOKEN + '\t' + ' '.join(s.encode(PRONUNCIATION, out_type=str, enable_sampling=True, alpha=0.1, nbest_size=-1)))
WhatsApp	▁what ' s ▁app
WhatsApp	▁w h at ' s ▁app
WhatsApp	▁w h at ' s ▁app
WhatsApp	▁what ' s ▁a pp
WhatsApp	▁ w ha t ' s ▁app
TOKEN="Cya"
PRONUNCIATION="See ya"

import sentencepiece as spm
s = spm.SentencePieceProcessor(model_file='tokenizer.model')
for n in range(5):
    print(TOKEN + '\t' + ' '.join(s.encode(PRONUNCIATION, out_type=str, enable_sampling=True, alpha=0.1, nbest_size=-1)))
Cya	▁ S e e ▁y a
Cya	▁ S e e ▁y a
Cya	▁ S e e ▁y a
Cya	▁ S e e ▁y a
Cya	▁ S e e ▁ y a

深入了解 Riva 功能#

其他 Riva 教程#

查看更多 Riva 教程此处,了解如何使用 Riva ASR 的一些高级功能,包括根据您的特定需求自定义 ASR。

示例应用程序#

Riva 附带各种示例应用程序。它们演示了如何使用 API 构建各种应用程序。有关更多信息,请参阅 Riva 示例应用程序

其他资源#

有关每个 Riva API 及其功能的更多信息,请参阅文档