今天小编介绍一个开发者项目:
背景知识
探索 Riva:借助 NVIDIA 技术赋能语音应用
在尖端语音处理领域,Riva 是一款由 NVIDIA 开发的强大平台,使开发人员能够创建强大的语音应用。该平台提供了一系列复杂的语音处理能力,包括自动语音识别(ASR)、文本转语音(TTS)、自然语言处理(NLP)、神经机器翻译(NMT)和语音合成。Riva 的一个关键优势在于其利用了 NVIDIA 的 GPU 加速技术,确保在处理高负载时仍能保持最佳性能。通过用户友好的 API 接口和 SDK 工具,Riva 简化了开发人员构建语音应用的过程。此外,Riva 还在 NVIDIA NGC™ 存储库中提供了预训练的语音模型,这些模型可以在自定义数据集上使用 NVIDIA NeMo 进行进一步优化,从而将专业模型的开发加速了 10 倍。
了解 Riva 的 ASR(自动语音识别)
Riva 的 ASR 是 NVIDIA 开发的一项先进技术,它使用先进的深度学习模型和算法,将口语转换为书面文本。其准确性和效率使其成为实时转录、语音命令和其他语音转文本应用的首选解决方案。
深入 Riva 的 TTS(文本转语音)
Riva 的 TTS 技术是一项令人瞩目的成就,它可以将书面文本转换为具有卓越质量的自然音色的语音。通过利用深度学习技术的能力,这项技术生成的语音非常接近人类语音,具有准确的发音和细致的表达。开发人员甚至可以调整参数以实现所需的语音特征。Riva 的 TTS 在虚拟助手、有声读物和辅助性解决方案等多个领域都有应用。
揭示 OpenAI API
OpenAI API 为开发人员提供了将先进的自然语言处理能力无缝集成到其应用程序中的机会。这个接口提供了强大的语言模型,可以基于提示生成非常接近人类语言的文本。开发人员可以向 API 发送请求,获得生成的文本作为输出,适用于从文本生成到翻译等各种任务。
项目介绍
方案架构:
来自麦克风的语音输入通过 Riva 的自动语音识别(ASR)库转换为文本,然后传递给 OpenAI API。当 OpenAI API 返回结果时,文本会通过 Riva 的文本转语音(TTS)库转换为语音,并通过麦克风输出。
部署解决方案:
上述解决方案的部署将在Jetson Orin NX 16GB 系统上构建。这款智能边缘设备融合了强大性能和紧凑设计,可在边缘提供高达 100 TOPS 的现代 AI 性能。与 Jetson Xavier NX 和 Jetson AGX Xavier 等前身相比,Orin NX 的性能分别提升了 5 倍和 3 倍。这种提升得益于将 NVIDIA Ampere™ GPU 架构与 64 位操作能力相结合,集成了先进的多功能视频和图像处理以及 NVIDIA 深度学习加速器。
部署 Riva 服务器
步骤 1:刷 JetPack
首先,给Jetson产品刷机。
步骤 2:寻找适配的 Riva 版本
sudo nvpmodel -m 0 (Jetson Orin AGX, mode MAXN)sudo nvpmodel -m 0 (Jetson Xavier AGX, mode MAXN)sudo nvpmodel -m 2 (Jetson Xavier NX, mode MODE_15W_6CORE)
4. 您已通过在 /etc/docker/daemon.json 文件中添加以下行,将 Jetson 平台上的默认运行时设置为 nvidia。编辑文件后使用 sudo systemctl restart docker 重新启动 Docker 服务
"default-:runtime": "nvidia"
步骤3:安装CLI tools
打开一个终端,输入
wget --content-disposition https://ngc.nvidia.com/downloads/ngccli_arm64.zip && unzip ngccli_arm64.zip && chmod u+x ngc-cli/ngc
检查二进制文件的 md5 哈希值以确保文件在下载过程中没有损坏:
find ngc-cli/ -type f -exec md5sum {} + | LC_ALL=C sort | md5sum -c ngc-cli.md5
将当前目录添加到路径:
Add your current directory to path:echo "export PATH=\"\$PATH:$(pwd)/ngc-cli\"" >> ~/.bash_profile && source ~/.bash_profile
或者创建一个符号链接:
ln -s $(pwd)/ngc-cli/ngc [destination_path]/ngc
您必须配置 NGC CLI 供您使用,以便可以运行命令。输入以下命令,并在出现提示时输入您的 API 密钥:
ngc config set
步骤 4 使用快速启动脚本进行本地部署
使用NGC CLI工具从命令行下载
ngc registry resource download-version nvidia/riva/riva_quickstart_arm64:2.11.0
初始化并启动 Riva。初始化步骤下载并准备 Docker 映像和模型。启动脚本启动服务器。
使用以下配置修改快速启动目录中的 config.sh 文件:
在下面的示例中,TTS 和 ASR 为 true,这会启用 text2speech 和 ASR 服务。NMT 和 NLP 服务为 false,从而禁用这些服务。
# Enable or Disable Riva Servicesservice_enabled_tts=trueservice_enabled_asr=trueservice_enabled_nmt=falseservice_enabled_nlp=false
如果在 config.sh 中取消注释模型并启用相应的服务,则安装和配置模型。
配置完成后,输入以下命令:
cd riva_quickstart_arm64_v2.11.0
初始化并启动 Riva:
bash riva_init.shbash riva_start.sh
如何运行Riva的ASR?
设置输入设备和采样率(默认为16000),您可以使用以下命令检查输入设备:
python3 transcribe_mic.py --list-devices
然后运行脚本/asr/transcribe_mic.py
python3 transcribe_mic.py --input-device <device_number> --sample-rate-hz <sample_rate>
现在,当您对着麦克风讲话时,语音将转换为文本并显示在终端上。
如何运行Riva的TTS?
设置输出设备和采样率(默认为44100),您可以使用以下命令检查输入设备:
python3 talk.py --list-devices
然后运行脚本/tts/talk.py
.sh python3 talk.py --output-device <device_number> --sample-rate-hz <sample_rate>
现在,当您在终端上输入文本时,它将转换为语音并通过扬声器读出
如何使用OpenAI API?
首先,登录您的 OpenAI 帐户,然后访问此页面创建 API 密钥
首先,安装OpenAI API,在终端中使用以下命令:
pip3 install openai
之后,我们调用 openai.ChatCompletion.create()
此代码是使用 OpenAI API 聊天功能的示例
创建一个新的python脚本(这里我们使用vscode,您可以参考这里了解更多详细信息)并运行以下代码:
import openai
openai.api_key = "openai-api-key"#using you openai key heremodel_engine = "gpt-3.5-turbo"ans = openai.ChatCompletion.create( model=model_engine, messages=[{"role": "user", "content": "you question"}, {"role": "assistant", "content": "The answer to the previous question "}]#use "assistant" to maintain context)
print(ans.choices[0].message)
主要输入是 messages 参数。消息必须是消息对象的数组,其中每个对象都有一个角色(“系统”、“用户”或“助手”)和内容(消息的内容)。对话可以短至 1 条消息,也可以占很多页。
Assistant -assistant:消息帮助存储以前的回复。这是为了维持对话并为对话提供上下文。
具体信息可以参考:https://platform.openai.com/docs/api-reference/chat
关键代码概述
本节展示语音转文本、文本转语音和唤醒设置的关键代码。完整代码请参见文档末尾。
如何获取麦克风返回的信息?
将麦克风流作为迭代打开,然后迭代 asr_service.streaming_response_generator() 中的每个响应。使用is_final判断是否结束一句话
with riva.client.audio_io.MicrophoneStream( args.sample_rate_hz, args.file_streaming_chunk, device=args.input_device, ) as stream: for response in asr_service.streaming_response_generator( audio_chunks=stream, streaming_config=config, ): for result in response.results: if result.is_final: transcripts = result.alternatives[0].transcript # print(output) output = transcripts
我们如何将文本转换为语音输出?
设置参数(sample_rate_hz 和 output_device)
args1 = argparse.Namespace()args1.language_code = 'en-US'args1.sample_rate_hz = 48000 ##You can check the sample-rate of your own device to replace itargs1.stream = True #this shoule be trueargs1.output_device = 24 #You can check the port number of your own device to replace itservice = riva.client.SpeechSynthesisService(auth)#This code is request the Riva server to synthesize the languagenchannels = 1sampwidth = 2sound_stream = None
我们调用 riva.client.audio_io.SoundCallBack() 函数来创建声音流,然后调用 service.synthesize_online() 来合成语音。
try: if args1.output_device is not None: #For playing audio during synthesis you will need to pass audio chunks to riv a.client.audio_io.SoundCallBack as they arrive. sound_stream = riva.client.audio_io.SoundCallBack( args1.output_device, nchannels=nchannels, sampwidth=sampwidth, framerate=args1.sample_rate_hz ) if args1.stream: #responses1 is the speech returned after synthesis,returning as an iterator responses1 = service.synthesize_online( answer, None, args1.language_code, sample_rate_hz=args1.sample_rate_hz ) #Playing speech iteratively for resp in responses1: if sound_stream is not None: sound_stream(resp.audio)finally: if sound_stream is not None: sound_stream.close()
如何设置唤醒词和睡眠词?
可以修改这部分代码来设置自己的唤醒词
if output == "hello ":#You can specify your wake-up word here,and remember to add a space after it is_wakeup = True anSwer('here', auth) output = ""if output == "stop " and is_wakeup == True: #You can specify your pause word here,and remember to add a space after it is_wakeup = False anSwer('Bye! Have a great day!', auth) output = ""
运行代码
input-device和sample-rate-hz参数应该替换为你自己的
python3 <yourfilename.py> --input-device 24 --sample-rate-hz 48000
完整的代码:
本文系外文翻译,前往查看
如有侵权,请联系 cloudcommunity@tencent.com 删除。
本文系外文翻译,前往查看
如有侵权,请联系 cloudcommunity@tencent.com 删除。