如何在运行时通过词语提升来提升特定词语?
目录

如何在运行时通过词语提升来提升特定词语?#
本教程将引导您了解在运行时使用词语提升自定义 Riva Speech Skills ASR 服务的一些高级功能。
NVIDIA Riva 概述#
NVIDIA Riva 是一个 GPU 加速的 SDK,用于构建针对您的用例定制并提供实时性能的 Speech AI 应用程序。
Riva 提供了一系列丰富的语音和自然语言理解服务,例如
自动语音识别 (ASR)
文本到语音合成 (TTS)
自然语言处理 (NLP) 服务集合,例如命名实体识别 (NER)、标点符号、意图分类。
在本教程中,我们将自定义 Riva ASR 以在运行时通过词语提升来提升特定词语。
要了解 Riva ASR API 的基础知识,请参阅 Python 中的 Riva ASR 入门。
有关 Riva 的更多信息,请参阅 Riva 开发者文档。
使用 Riva ASR API 进行词语提升#
词语提升是 Riva 提供的自定义功能之一。它允许您通过在解码声学模型的输出时给予特定感兴趣的词语更高的分数,从而使 ASR 引擎偏向于识别这些词语。
现在,让我们将词语提升与 Riva API 一起用于一些带有 OOTB(开箱即用)英语管道的示例音频剪辑。
要求和设置#
启动 Riva Speech Skills 服务器。
按照 Riva Skills 快速入门指南 中的说明,在本教程运行之前,在 Riva Speech Skills 服务器上部署 OOTB ASR 模型。默认情况下,仅部署英语模型。安装 Riva 客户端库。
按照 Riva 客户端的要求和设置 中的步骤安装 Riva 客户端库。
导入 Riva 客户端库#
让我们导入一些必需的库,包括 Riva 客户端库。
import io
import IPython.display as ipd
import grpc
import riva.client
创建 Riva 客户端并连接到 Riva Speech API 服务器#
以下 URI 假定 Riva Speech API 服务器的本地部署在默认端口上。如果服务器部署在不同的主机上或通过 Kubernetes 上的 Helm chart 进行,请使用适当的 URI。
auth = riva.client.Auth(uri='localhost:50051')
riva_asr = riva.client.ASRService(auth)
不使用词语提升的 ASR 推理#
首先,让我们在不进行词语提升的情况下,在我们的示例音频剪辑上运行 ASR。
# Load a sample audio file from local disk
# This example uses a .wav file with LINEAR_PCM encoding.
path = "audio_samples/en-US_wordboosting_sample1.wav"
with io.open(path, 'rb') as fh:
content = fh.read()
ipd.Audio(path)
# Creating RecognitionConfig
config = riva.client.RecognitionConfig(
language_code="en-US",
max_alternatives=1,
enable_automatic_punctuation=True,
audio_channel_count = 1
)
# ASR Inference call with Recognize
response = riva_asr.offline_recognize(content, config)
asr_best_transcript = response.results[0].alternatives[0].transcript
print("ASR Transcript without Word Boosting:", asr_best_transcript)
如您所见,ASR 很难识别像 AntiBERTa
和 ABlooper
这样的领域特定术语。
现在,让我们使用词语提升来尝试改进这些领域特定术语的 ASR。
使用词语提升的 ASR 推理#
让我们看看如何使用 SpeechContext
将提升的词语添加到 RecognitionConfig
中。(有关 SpeechContext
的更多信息,请参阅此处的文档 here)。添加词语提升的最简单方法是使用函数 riva.client.add_word_boosting_to_config()。
# Creating SpeechContext for word boosting
boosted_lm_words = ["AntiBERTa", "ABlooper"]
boosted_lm_score = 20.0
riva.client.add_word_boosting_to_config(config, boosted_lm_words, boosted_lm_score)
# ASR Inference call with Recognize
response = riva_asr.offline_recognize(content, config)
asr_best_transcript = response.results[0].alternatives[0].transcript
print("ASR Transcript with Word Boosting:", asr_best_transcript)
如您所见,通过词语提升,ASR 能够正确转录领域特定术语 AntiBERTa
和 ABlooper
。
提升分数:建议的提升分数范围为 20 到 100。提升分数越高,ASR 引擎就越偏向于该词语。
OOV 词语提升:OOV 词语也可以进行词语提升;与上述词汇表内词语的方式完全相同。
在不同级别提升不同的词语#
使用 Riva ASR,我们还可以为不同的词语设置不同的提升值。例如,这里 AntiBERTa 提升 10,ABlooper 提升 20
# Load a sample audio file from local disk
# This example uses a .wav file with LINEAR_PCM encoding.
path = "audio_samples/en-US_wordboosting_sample1.wav"
with io.open(path, 'rb') as fh:
content = fh.read()
ipd.Audio(path)
# Creating RecognitionConfig
config = riva.client.RecognitionConfig(
language_code="en-US",
max_alternatives=1,
enable_automatic_punctuation=True,
audio_channel_count = 1
)
riva.client.add_word_boosting_to_config(config, ["AntiBERTa"], 10.)
riva.client.add_word_boosting_to_config(config, ["ABlooper"], 20.)
# ASR Inference call with Recognize
response = riva_asr.offline_recognize(content, config)
asr_best_transcript = response.results[0].alternatives[0].transcript
print("ASR Transcript with Word Boosting:", asr_best_transcript)
对不需要的词语进行负向词语提升#
我们甚至可以使用词语提升来阻止预测某些词语,方法是使用负向提升分数。
让我们加载一个示例音频文件,并在没有任何词语提升的情况下从中获取转录结果
# Load a sample audio file from local disk
# This example uses a .wav file with LINEAR_PCM encoding.
path = "audio_samples/en-US_wordboosting_sample3.wav"
with io.open(path, 'rb') as fh:
content = fh.read()
ipd.Audio(path)
# Creating RecognitionConfig
config = riva.client.RecognitionConfig(
language_code="en-US",
max_alternatives=1,
enable_automatic_punctuation=True,
audio_channel_count = 1
)
# ASR Inference call with Recognize
response = riva_asr.offline_recognize(content, config)
asr_best_transcript = response.results[0].alternatives[0].transcript
print("ASR Transcript without Word Boosting:", asr_best_transcript)
现在,让我们获取对词语 been
进行负向词语提升的转录结果。
# Creating RecognitionConfig
config = riva.client.RecognitionConfig(
language_code="en-US",
max_alternatives=1,
enable_automatic_punctuation=True,
audio_channel_count = 1
)
riva.client.add_word_boosting_to_config(config, ["been"], -100.)
# ASR Inference call with Recognize
response = riva_asr.offline_recognize(content, config)
asr_best_transcript = response.results[0].alternatives[0].transcript
print("ASR Transcript with Negative Word Boosting:", asr_best_transcript)
如您所见,这次没有预测到词语 been
。另请注意,在这种情况下,预测的是 be
来代替它。在某些情况下,可能不会预测到任何词语。
现在让我们看看如何组合负向和正向词语提升
让我们将上述示例中的负向词语提升与正向词语提升结合起来,以预测词语 middle
而不是 little
。我们对词语 middle
执行正向词语提升,就像在之前的示例中所做的那样。请注意,我们使用的是在上述示例中为 little
的负向词语提升创建的同一 config
实例。因此,它已经具有用于 little
的 SpeechContext
实例。因此,现在,我们只需要为 middle
的正向词语提升添加一个 SpeechContext
实例。
现在让我们看看如何组合负向和正向词语提升
让我们将上述示例中的负向词语提升与正向词语提升结合起来,以预测词语 bin
而不是 been
。我们通过向 RecognitionConfig
实例 config
添加一个新的用于 bin
的 SpeechContext
实例来执行正向词语提升,就像在之前的示例中所做的那样。请注意,我们使用的是在上述示例中为 been
的负向词语提升创建的同一 config
实例。因此,它已经具有用于 been
的 SpeechContext
实例。现在,我们只需要为 bin
的正向词语提升添加一个 SpeechContext
实例。
# Creating SpeechContext for Word Boosting
positive_boosted_lm_word = "bin"
positive_boosted_lm_score = 200.0
riva.client.add_word_boosting_to_config(config, [positive_boosted_lm_word], positive_boosted_lm_score)
# ASR Inference call with Recognize
response = riva_asr.offline_recognize(content, config)
asr_best_transcript = response.results[0].alternatives[0].transcript
print("ASR Transcript with Negative and Positive Word Boosting:", asr_best_transcript)
如您所见,在本示例中,通过组合负向和正向词语提升,我们能够生成带有 bin
而不是 been
的转录。
注意
可以提升的词语数量没有限制。您应该不会看到所有请求的延迟受到影响,即使对于约 100 个提升的词语也是如此,除了第一个请求,这是预期的。
短语或词语组合的提升尚未完全支持(但确实有效)。我们将在即将发布的版本中重新审视最终确定此支持。
默认情况下,服务器端不提升任何词语。仅提升客户端传递的词语。
有关词语提升的信息也可以在文档 here 中找到。