如何使用 Riva ASR API 和开箱即用模型?#

本教程将引导您了解 Riva Speech Skills ASR 服务的基础知识,特别是介绍如何将 Riva ASR API 与开箱即用模型结合使用。

NVIDIA Riva 概述#

NVIDIA Riva 是一个 GPU 加速的 SDK,用于构建针对您的用例定制并提供实时性能的语音 AI 应用程序。
Riva 提供丰富的语音和自然语言理解服务,例如

  • 自动语音识别 (ASR)

  • 文本到语音合成 (TTS)

  • 一系列自然语言处理 (NLP) 服务,例如命名实体识别 (NER)、标点符号、意图分类。

在本教程中,我们将与自动语音识别 (ASR) API 进行交互。

有关 Riva 的更多信息,请参阅 Riva 开发者文档

使用 Riva ASR API 进行转录#

ASR 接受音频流或音频缓冲区作为输入,并返回一个或多个文本转录,以及其他可选元数据。Riva 中的语音识别是一个 GPU 加速的计算管道,具有优化的性能和准确性。
Riva 为多种语言(如英语、西班牙语、德语、俄语和普通话)提供最先进的 OOTB(开箱即用)模型和管道,这些模型和管道可以通过 Riva 快速入门脚本轻松部署。Riva 还支持以各种方式轻松自定义 ASR 管道,以满足您的特定需求。
有关更多信息,请参阅 Riva ASR 文档

现在,让我们使用 Riva API 为一些示例音频剪辑生成转录,使用 OOTB 管道,从英语开始。

要求和设置#

  1. 启动 Riva Speech Skills 服务器。
    按照 Riva 快速入门指南 中的说明,在本教程运行之前,在 Riva Speech Skills 服务器上部署 OOTB ASR 模型。默认情况下,仅部署英语模型。

  2. 安装 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)

英语离线识别#

您可以在流模式或离线模式下使用 Riva ASR。在流模式下,连续的音频流被捕获和识别,生成转录文本流。在离线模式下,一段设定长度的音频剪辑被转录为文本。
让我们看一个示例,展示英语离线 ASR API 的用法

向 Riva Speech API 服务器发出 gRPC 请求#

Riva ASR API 支持脉冲编码调制 (PCM) 格式的 .wav 文件;包括单通道的 .alaw.mulaw.flac 格式。

现在,让我们向 Riva Speech 服务器发出 gRPC 请求,以使用示例 .wav 文件在离线模式下进行 ASR。首先加载音频。

# This example uses a .wav file with LINEAR_PCM encoding.
# read in an audio file from local disk
path = "./audio_samples/en-US_sample.wav"
with io.open(path, 'rb') as fh:
    content = fh.read()
ipd.Audio(path)

接下来,创建一个音频 RecognizeRequest 对象,根据需要设置配置参数。

# Set up an offline/batch recognition request
config = riva.client.RecognitionConfig()
#req.config.encoding = ra.AudioEncoding.LINEAR_PCM    # Audio encoding can be detected from wav
#req.config.sample_rate_hertz = 0                     # Sample rate can be detected from wav and resampled if needed
config.language_code = "en-US"                    # Language code of the audio clip
config.max_alternatives = 1                       # How many top-N hypotheses to return
config.enable_automatic_punctuation = True        # Add punctuation when end of VAD detected
config.audio_channel_count = 1                    # Mono channel

最后,将请求提交到服务器。

response = riva_asr.offline_recognize(content, config)
asr_best_transcript = response.results[0].alternatives[0].transcript
print("ASR Transcript:", asr_best_transcript)

print("\n\nFull Response Message:")
print(response)

了解 ASR API 参数#

Riva ASR 在向 gRPC 端点发出转录请求时支持许多选项,如上一节所示。让我们详细了解这些参数

  • encoding - 输入音频文件的音频编码类型。支持 (LINEAR_PCM, FLAC, MULAWALAW)。可以从音频文件检测到

  • sample_rate_hertz - 输入音频的采样率,单位为 Hz。请注意,可以从音频 .wav 文件自动检测采样率,并在需要时重新采样,使此参数成为可选参数。

  • language_code - 输入音频的语言。“en-US”代表英语(美国)。其他选项包括 (es-US, de-DE, ru-RU, zh-CN)。我们将在下一节中探讨非英语语言的 ASR。

  • max_alternatives - 确定要返回的顶部备选转录的数量

  • enable_automatic_punctuation - 在 VAD(语音活动检测)结束时添加标点符号。

  • audio_channel_count - 音频通道数。典型的麦克风有 1 个音频通道。

非英语语言的离线识别 - 西班牙语示例#

在上一节中,我们介绍了 Riva API 的用法,并了解了 ASR API 的不同参数。现在,让我们看看如何在离线模式下将 ASR API 用于非英语语言,如西班牙语。

请注意,我们可以通过使用其对应的语言代码,类似地运行德语、俄语和普通话的 Riva ASR。我们将在本节末尾详细说明这一点。

西班牙语 ASR 的要求和设置:#

非英语 ASR(在本例中为西班牙语 ASR)的要求和设置步骤与英语 ASR 几乎相同。唯一的区别是在西班牙语音频上运行推理之前,我们需要首先在 Riva Speech Skills 服务器上部署西班牙语 ASR 管道。

注意:我们在上面 要求和设置部分 中为英语 ASR 遵循的 Riva Speech Skills 服务器 快速入门指南 解释了如何默认仅部署英语模型。

  1. 启动带有西班牙语 ASR 管道的 Riva Speech Skills 服务器。
    1.1. 导航到快速入门指南文件夹。您在上面的 要求和设置部分 中下载了此文件夹。

    1.2. 运行 bash riva_stop.sh 以关闭正在运行的 Riva Speech Skills 服务器。如果 Riva Speech Skills 服务器当前未运行,您可以跳过此步骤。

    1.3. [可选] 运行 bash riva_clean.sh 以清理之前的本地 Riva 安装。这将停止并删除所有与 Riva 相关的容器,并删除用于存储模型文件的 Docker 卷或目录。Docker 镜像也可以删除,但是,在删除之前,系统会要求您确认。

    1.4. 更新 config.sh 文件:更新 language_code=("en-US") 行,以包含西班牙语(语言代码 "es-US")模型,具体按照 config.sh 脚本中此行上方的说明进行操作。

    1.5. 重新运行 bash riva_init.sh 以下载并初始化西班牙语模型和管道。如果您在此步骤中看到任何错误,请从步骤 1.3 重新开始。

    1.6. 重新运行 bash riva_start.sh 以重新启动 Riva Speech Skills 服务器。

向 Riva Speech API 服务器发出 gRPC 请求#

让我们向 Riva Speech 服务器发出 gRPC 请求,以使用示例西班牙语 .wav 文件在离线模式下进行 ASR。

和以前一样,首先加载音频。

# This example uses a .wav file with LINEAR_PCM encoding.
# read in an audio file from local disk
path = "audio_samples/es-US_sample.wav" #Link to the Spanish sample audio file
with io.open(path, 'rb') as fh:
    content = fh.read()
ipd.Audio(path)

与英语一样,创建一个音频 RecognizeRequest 对象,根据需要设置配置参数。请注意,我们已将请求配置的 language_code 更新为西班牙语语言代码 ("es-US")。

# Set up an offline/batch recognition request
config = riva.client.RecognitionConfig()
#req.config.encoding = ra.AudioEncoding.LINEAR_PCM    # Audio encoding can be detected from wav
#req.config.sample_rate_hertz = 0                     # Sample rate can be detected from wav and resampled if needed
config.language_code = "es-US"                    # Language code of the audio clip. Set to Spanish
config.max_alternatives = 1                       # How many top-N hypotheses to return
config.enable_automatic_punctuation = True        # Add punctuation when end of VAD detected
config.audio_channel_count = 1                    # Mono channel

最后,将请求提交到服务器。

response = riva_asr.offline_recognize(content, config)
asr_best_transcript = response.results[0].alternatives[0].transcript
print("ASR Transcript:", asr_best_transcript)

print("\n\nFull Response Message:")
print(response)

我们可以通过在请求配置中设置其对应的语言代码 (de-DE, ru-RUzh-CN),类似地运行德语、俄语和普通话的 Riva ASR。确保这些管道已按照 西班牙语 ASR 的要求和设置 中的说明部署在 Riva Speech Skills 服务器上。

深入了解 Riva 功能#

现在您已经对 Riva ASR API 有了基本的了解,您可以尝试

其他 Riva 教程#

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

示例应用程序#

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

其他资源#

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