对话式人工智能

使用 NVIDIA NIM 微服务实现语音和翻译功能,快速赋予应用语音能力

NVIDIA NIM NVIDIA AI Enterprise 的一部分,为自行托管的 GPU 加速推理微服务提供容器,用于跨云、数据中心和工作站的预训练和自定义 AI 模型。NIM 微服务现已支持 语音和翻译

新的语音和翻译微服务利用 NVIDIA Riva ,提供 自动语音识别(ASR) 神经网络机器翻译(NMT) 文本转语音(TTS) 服务。

通过 NVIDIA 语音和翻译 NIM 微服务,将多语种语音功能集成到您的应用中,不仅能提供先进的自动语音识别(ASR)、神经机器翻译(NMT)和文本转语音(TTS),还可增强全球用户体验和可访问性。无论您是构建客户服务机器人、交互式语音助手,还是构建多语种内容平台,这些 NIM 微服务都针对大规模高性能 AI 推理进行了优化,并提供准确性和灵活性,以尽可能减少开发工作量为您的应用提供语音支持。

在本文中,您将学习如何使用 NVIDIA API Catalog 中的交互式语音和翻译模型接口,直接通过浏览器执行基本推理任务(例如转录语音、翻译文本和生成合成语音)。您还将学习如何在基础设施上运行这些灵活的微服务,通过 API 访问这些服务,以及如何将它们无缝集成到您的应用中。

借助语音和翻译 NIM 进行快速推理 

API Catalog 中提供了语音 NIM 微服务,您可以在其中使用交互式浏览器 UI 轻松执行推理任务。只需单击按钮,即可转录英语语音,在 30 多种语言之间翻译文本,或将文本转换为自然发音的语音。API Catalog 为探索语音和翻译 NIM 微服务的基本功能提供了便捷的起点。

这些工具的真正强大之处在于,它们能够灵活地部署在数据驻留的任何位置。您可以在任何兼容的 NVIDIA GPU 上运行这些微服务,通过 API 访问这些微服务,并将其无缝集成到您的应用中。这种通用性使您能够在本地工作站、云和数据中心基础设施等环境中部署语音 NIM 微服务,并提供根据您的需求量身定制的可扩展选项。

使用 NVIDIA Riva Python 客户端运行语音和翻译 NIM 微服务

本节将指导您克隆 NVIDIA-riva/python-clients GitHub 库,并使用提供的脚本在位于 grpc.nvcf.nvidia.com:443 的 NVIDIA API Catalog Riva 端点上运行简单的推理任务。

要快速测试语音 NIM 微服务,请导航至 API Catalog 中的 NIM 登陆页面,然后单击“Try API”选项卡。请注意,要使用这些命令,您需要 NVIDIA API 密钥。如果您没有 NVIDIA API 密钥,只需单击“Try API”选项卡右上角的“Get API Key”按钮即可。继续阅读,了解您可以执行的操作的一些示例。

在流式传输模式下转录音频 

运行以下命令以实时转录音频文件。

python python-clients/scripts/asr/transcribe_file.py \
    --server grpc.nvcf.nvidia.com:443 --use-ssl \
    --metadata function-id "1598d209-5e27-4d3c-8079-4751568b1081" \
    --metadata "authorization" "Bearer 
$API_KEY_REQUIRED_IF_EXECUTING_OUTSIDE_NGC" \
    --language-code en-US \
    --input-file <path_to_audio_file>

将文本从英语翻译为德语 

以下命令将英文句子“This is an example text for Riva text translation”(这是 Riva 文本翻译的示例文本)翻译成德语,即“Dies ist ein Beispieltext für Riva Textübersetzung”。

python python-clients/scripts/nmt/nmt.py \
    --server grpc.nvcf.nvidia.com:443 --use-ssl \
    --metadata function-id "647147c1-9c23-496c-8304-2e29e7574510" \
    --metadata "authorization" "Bearer 
$API_KEY_REQUIRED_IF_EXECUTING_OUTSIDE_NGC" \
    --text "This is an example text for Riva text translation" \
    --source-language-code en \
    --target-language-code de

生成合成语音 

以下命令可将文本“This audio is generated from NVIDIA 的文本转语音模型”转换为语音,并将音频输出另存为 audio.wav。如果您在远程系统的终端上工作,且音频输出无法轻松路由到本地麦克风,此命令尤为有用。

python python-clients/scripts/tts/talk.py \
    --server grpc.nvcf.nvidia.com:443 --use-ssl \
    --metadata function-id "0149dedb-2be8-4195-b9a0-e57e0e14f972"  \
    --metadata authorization "Bearer 
$API_KEY_REQUIRED_IF_EXECUTING_OUTSIDE_NGC" \
    --text "this audio is generated from nvidia's text-to-speech model" \
    --voice "English-US.Female-1" \
    --output audio.wav

使用 Docker 在本地运行语音 NIM 

如果您可以使用 高级 NVIDIA 数据中心 GPU ,则可以按照 ASR NMT TTS NIM 登陆页面的 Docker 选项卡下提供的说明在本地运行语音 NIM 微服务。或者,您可以参阅 ASR、NMT 和 TTS 的更详细入门文档,其中解释了每个 docker run 参数并指导您完成设置流程。

从 NVIDIA 容器注册表 (nvcr.io) 拉取 NIM 微服务并在您自己的系统上运行这些服务需要 NGC API 密钥。您在上一节中生成的 NVIDIA API 密钥应该可以用于此目的。或者,导航至 ASR NMT TTS NIM 登陆页面,选择 Docker 选项卡,然后单击获取 API 密钥。

将语音 NIM 微服务与 RAG 管道集成

本节介绍如何在您的系统上启动 ASR 和 TTS NIM 微服务,并将其连接到 NVIDIA 生成式 AI 示例 GitHub 库中的 基本检索增强生成 (RAG) 工作流 。通过此设置,您可以将文档上传至知识库,口头提出相关问题,并以合成的自然声音获取答案。

设置环境 

启动 NIM 微服务之前,请直接在终端或通过环境源文件,以 NGC_API_KEY 格式将 NGC API 密钥导出到系统。

接下来,登录 NVIDIA Docker 容器注册表:

echo "$NGC_API_KEY" | docker login nvcr.io --username '$oauthtoken' 
--password-stdin

然后,创建一个 LOCAL_NIM_CACHE 目录:

export LOCAL_NIM_CACHE=<path/to/nim_cache>
mkdir -p "$LOCAL_NIM_CACHE"
chmod 777 $LOCAL_NIM_CACHE

您将模型存储在此目录中,并将其安装到 NIM 容器中。请确保不要跳过 chmod 777 命令。否则,NIM Docker 容器将无权将模型文件下载到 LOCAL_NIM_CACHE 目录中。

默认情况下,语音 NIM 微服务会将模型文件下载到只能在正在运行的容器内访问的位置。如果您打算一次仅运行其中一个 Riva 服务,您应该要么不指定 LOCAL_NIM_CACHE,要么在停止一个 NIM 容器并启动另一个容器之前清除 LOCAL_NIM_CACHE 目录,要么为每个语音 NIM 指定不同的 LOCAL_NIM_CACHE 目录。这里,相同的 LOCAL_NIM_CACHE 用于 ASR 和 TTS,以便同时运行这两种服务。

启动 ASR NIM 

使用以下脚本启动 ASR NIM:

export CONTAINER_NAME=parakeet-ctc-1.1b-asr

docker run -it --rm --name=$CONTAINER_NAME \
  --runtime=nvidia \
  --gpus '"device=0"' \
  --shm-size=8GB \
  -e NGC_API_KEY=$NGC_API_KEY \
  -e NIM_MANIFEST_PROFILE=9136dd64-4777-11ef-9f27-37cfd56fa6ee \
  -e NIM_HTTP_API_PORT=9000 \
  -e NIM_GRPC_API_PORT=50051 \
  -p 9000:9000 \
  -p 50051:50051 \
  -v "$LOCAL_NIM_CACHE:/home/nvs/.cache/nim" \
  nvcr.io/nim/nvidia/parakeet-ctc-1.1b-asr:1.0.0

如果 LOCAL_NIM_CACHE 目录为空(例如第一次执行此命令),可能需要 20-30 分钟才能完成。在此期间,NIM 将下载声学(离线、针对延迟优化的流式传输和针对吞吐量优化的流式传输)和标点模型作为 .tar.gz 文件,然后在容器内解压缩。

您可能需要根据 GPU 类型更改 NIM_MANIFEST_PROFILE 参数。默认情况下,NIM 容器会下载 ONNX 格式的模型文件,这些文件可在任何足够高级的 NVIDIA GPU 上运行。然而,如果您在启动 ASR 或 TTS NIM 时适当更改此参数,则会改为下载已针对 NVIDIA H100、A100 或 L40 GPU 优化的 NVIDIA TensorRT 格式的模型文件。这样一来,可在其中一个受支持的 GPU 上加快推理速度。我们即将推出针对其他 GPU 类型的优化 NIM 支持。

表 1 显示了 Parakeet CTC Riva 1.1B En-US 模型的 ASR NIM 支持的 NIM_MANIFEST_PROFILE 值:

GPU NIM_MANIFEST_Profile
通用 9136dd64-4777-11ef-9f27-37cfd56fa6ee
NVIDIA H100 7f0287aa-35d0-11ef-9bba-57fc54315ba3
NVIDIA A100 32397eba-43f4-11ef-b63c-1b565d7d9a02
NVIDIA L40 40d7e326-43f4-11ef-87a2-239b5c506ca7
表 1. Parakeet CTC Riva 1.1B En-US 模型的 ASR NIM 支持的 NIM_MANIFEST_PROFILE

您还可以在 ASR NIM 文档的“入门”页面的“ 受支持的模型 ”部分中找到此表格。请注意,模型名称与容器名称略有不同。与其他 NIM 微服务不同,语音和翻译 NIM 微服务不支持 list-model-profiles 实用程序,这意味着您无法通过 docker CLI 访问有效的 NIM_MANIFEST_PROFILE 值列表。

启动 TTS NIM 

在同一终端使用 Ctrl+C 或在不同终端使用 docker stopdocker container stop 停止 ASR NIM 后,启动 TTS NIM:

export CONTAINER_NAME=fastpitch-hifigan-tts

docker run -it --rm --name=$CONTAINER_NAME \
  --runtime=nvidia \
  --gpus '"device=0"' \
  --shm-size=8GB \
  -e NGC_API_KEY=$NGC_API_KEY \
  -e NIM_MANIFEST_PROFILE=3c8ee3ee-477f-11ef-aa12-1b4e6406fad5 \
  -e NIM_HTTP_API_PORT=9000 \
  -e NIM_GRPC_API_PORT=50051 \
  -p 9000:9000 \
  -p 50051:50051 \
  -v "$LOCAL_NIM_CACHE:/home/nvs/.cache/nim" \
  nvcr.io/nim/nvidia/fastpitch-hifigan-tts:1.0.0

从表 2 中,为 FastPitch HifiGAN Riva En-US 模型选择合适的 NIM_MANIFEST_PROFILE 值:

GPU NIM_MANIFEST_Profile
通用 3c8ee3ee-477f-11ef-aa12-1b4e6406fad5
NVIDIA H100 bbce2a3a-4337-11ef-84fe-e7f5af9cc9af
NVIDIA A100 5ae1da8e-43f3-11ef-9505-e752a24fdc67
NVIDIA L40 713858f8-43f3-11ef-86ee-4f6374fce1aa
表 2. FastPitch HifiGAN Riva En-US 模型中 TTS NIM 支持的 NIM_MANIFEST_PROFILE 值

您还可以在 TTS NIM 文档的“入门”页面的“ 受支持的模型 ”部分中找到此表。请注意模型名称与容器名称之间的细微差别。

启动 TTS NIM 的速度应该比启动 ASR NIM 快得多,因为组成模型占用的空间总计少得多。然而,由于我们对 ASR 和 TTS NIM 使用相同的 LOCAL_NIM_CACHE 目录,TTS NIM 将同时启动 ASR 和 TTS 模型。

将语音 NIM 微服务连接到 RAG 管道

RAG Web 应用是 NVIDIA 生成式 AI 示例 GitHub 库的一部分。克隆库后,您主要需要编辑 RAG/examples/basic_rag/langchain/docker-compose.yaml 。将 rag-playground 服务的 PLAYGROUND_MODE 设置为 speech,并向该服务添加以下 environment 变量:

services:
  ...
  rag-playground:
    ...
    environment: 
      ...
      RIVA_API_URI: <riva-ip-address>:50051
      TTS_SAMPLE_RATE: 48000

如果您想在 docker-compose 文件 (如下所示格式) 中设置 RIVA_API_URI 并使用可覆盖的默认值,请勿在默认值周围加上引号。如果您这样做,Python os 模块将在定义 Riva URI 的字符串中包含这些引号,这将引起问题。

RIVA_API_URI: ${RIVA_API_URI:-<riva-ip-address>:50051}

即使您在同一台机器上运行 RAG 示例和语音 NIM 微服务,也需要指定 IP 地址或永久主机名;在此处,localhost 不起作用。

请参阅生成式 AI 示例库,详细了解如何 将 ASR 和 TTS 功能添加到 RAG 工作流

编辑好 docker-compose 文件后,在同一目录中运行以下命令以启动容器网络。

docker compose up -d --build

还要验证网络中的每个容器是否正在运行

docker ps --format "table {{.ID}}\t{{.Names}}\t{{.Status}}"

测试语音 NIM 和 RAG 集成 

要测试您的设置,请在浏览器中导航至 localhost:8090。如果您在没有端口转发的远程系统上运行 RAG 应用,请改为使用 <remote-IP-address>:8090。借助界面(图 1 和图 2),您可以通过文本或语音查询 大语言模型(LLM),并接收语音回复。如果模型可用,您可以使用菜单选项更改 ASR 和 TTS 语言。

对于基于文档的查询,请单击页面右上角附近的“知识库”选项卡。在此处,您可以上传 PDF、纯文本或 Markdown 文件。这些内容以多维向量形式嵌入,并在向量数据库中进行索引,因此 LLM 能够根据这些新信息回答问题。

例如,上传 PDF 版本的近期新闻稿“ NVIDIA Blackwell 平台来助力计算新时代 ”。尽管发布时间已超过五个月,但此示例 Web 应用的默认 LLM 并未对此信息进行预训练。

接下来,返回“Converse”选项卡,单击麦克风按钮,然后询问应用程序,“NVIDIA Blackwell GPU 包含多少个晶体管?”如果没有知识库,LLM 无法提供正确答案(图 1)。

Screenshot showing the testing of the speech NIM and RAG pipeline without an knowledge base.
图 1. 在没有知识库的情况下测试 NIM 和 RAG 工作流。

现在,在知识库处于活动状态时,再次提出相同的问题。这次,利用完整的 RAG 工作流,LLM 会根据新嵌入的信息正确回答问题(图 2)。

Screenshot showing the testing of the speech NIM and RAG pipeline using an active knowledge base.
图 2. 使用活跃的知识库测试 NIM 和 RAG 工作流程

开始为您的应用添加多语种语音 AI

在本文中,您已学习设置 NVIDIA 语音和翻译 NIM 微服务,并使用交互式语音和翻译模型接口直接通过浏览器进行测试。您已深入了解部署 NIM 语音和翻译微服务的灵活性,并将其集成到 RAG 工作流中,以便通过合成语音应答进行基于文档的知识检索。

准备好将功能强大的多语种语音 AI 添加到您自己的应用了吗?试用 语音 NIM 微服务 ,轻松地将自动语音识别(ASR)、神经机器翻译(NMT)和文本到语音(TTS)集成到您的工作流中。探索 API,了解这些 NIM 微服务如何将您的应用转变为面向全球用户的可扩展的实时语音服务。

 

 

Tags