虚拟助手 (与 Rasa)
目录

虚拟助手 (与 Rasa)#
此虚拟助手(与 Rasa)示例应用程序演示了 Rasa 和 Riva 语音服务以天气聊天机器人 Web 应用程序形式的集成。此示例提供两种选项
选项 1: Riva ASR + Riva TTS + Riva NLP + Rasa 对话管理器
选项 2: Riva ASR + Riva TTS + Rasa NLU + Rasa 对话管理器
要了解有关 Rasa 的更多信息,请访问此链接。
实施#
从高层次来看,集成利用了 Rasa 的原生 API 支持和 Riva 的 gRPC 支持。Weatherbot 客户端协调 Riva 服务和 Rasa 的工作流程,然后通过 Web UI 与最终用户交互。
容器 1:Riva AI 服务
通过 gRPC 端点公开语音服务 (ASR/NLP/TTS)
需要 GPU
容器 2:Riva 示例的 Riva-Rasa 聊天机器人
功能
通过 API 端点公开 Rasa 功能。负责与 Rasa 的对话管理以及与 Riva 的 NLP 或与 Rasa 的 NLU
包含 Weatherbot 客户端应用程序(Web UI 和 Web 服务)
Rasa
最多两个实例
Rasa 服务器
Rasa Action (如果适用)
不需要 GPU,但可以部署在 GPU 上以提高性能
Weatherbot 客户端
包括已安装的 Riva Python 库
分别通过 gRPC 和 REST API 端点与 Riva AI 服务和 Rasa 通信
管道化 ASR、NLP、TTS 和对话管理器功能
不需要 GPU
架构#
代码结构#
本节显示 Weatherbot 客户端的高级代码结构(在 rasa-riva-weatherbot-webapp/riva
文件夹中)。
asr.py
此文件包含使用 Riva Python 客户端库对 Riva ASR 进行 gRPC 调用的功能,使用音频片段,并返回文本转录。
ASR 以流模式使用
rasa.py
此文件包含对 Rasa 进行 API 调用的功能,使用用户输入和发送者 ID,并返回通过处理 Rasa 响应对象获得的文本响应。
tts.py
和tts_stream.py
这些文件包含使用 Riva Python 客户端库对 Riva TTS 进行 gRPC 调用的功能,使用文本片段,并返回相应的语音。
TTS 可以以
Batch
或Streaming
模式使用,具体取决于使用的是tts.py
还是tts\_stream.py
。这可以通过更改virtual-assistant-rasa/rasa-riva-weatherbot-webapp/riva/chatbot/chatbot.py
中第 12 行和第 13 行的导入语句来设置。
chatbot.py
此文件包含
Chatbot
类,该类负责管道化所有 ASR、TTS 和 Rasa 操作。每次对话创建一个
Chatbot
类的实例。管道如下
ASR 以
Streaming
模式使用,因此,它是后台操作。默认情况下,我们正在监听对着麦克风讲话的用户的音频。当用户停止讲话时(当启用
AutoSubmit
标志时)或点击提交按钮时,ASR 会自动使用转录的文本调用 Rasa。调用后,Rasa 在内部使用转录的文本调用 Riva NLP 或 Rasa NLU,以获取意图和槽位,然后 Rasa 对话管理器使用这些意图和槽位来获取最终的响应文本。返回响应文本。
如果
System Speech
未静音,则会自动使用 Rasa 的响应文本调用 TTS。TTS 获取音频片段并将其播放回扬声器上的用户。
要求和设置#
要求:#
在尝试运行 Riva 客户端之前,请确保满足以下要求
您有权访问 NVIDIA NGC 并已登录。有关分步说明,请参阅NGC 入门指南。
Python 3.8(未来版本将添加对其他 Python 版本的支持)。
设置:#
git clone https://github.com/nvidia-riva/sample-apps.git
进入 Riva 和 Rasa 虚拟助手目录
cd sample-apps/virtual-assistant-rasa
为我们将用于此示例的所有 Python 虚拟环境创建父目录
mkdir pythonenvs
为基于 Rasa 文本的聊天机器人创建 Python 虚拟环境,并安装必要的库
为基于 Rasa 文本的聊天机器人创建并激活 Python 虚拟环境
python3 -m venv pythonenvs/rasa . pythonenvs/rasa/bin/activate
升级
pip
并安装 Rasa 依赖项。requirements_rasa.txt
捕获了基于 Rasa 文本的聊天机器人所需的所有 Python 依赖项
pip3 install -U pip pip3 install -r requirements_rasa.txt
停用 Rasa Python 虚拟环境
deactivate
为 Weatherbot Web 应用程序创建 Python 虚拟环境,该应用程序使用 Riva 客户端,并安装必要的库
为 Weatherbot Web 应用程序创建并激活 Python 虚拟环境
python3 -m venv pythonenvs/client . pythonenvs/client/bin/activate
升级
pip
pip3 install -U pip
安装 Riva 客户端库
下载 Riva 快速入门脚本(如果尚未完成)。
x.y.z
是 Riva Speech Skills 版本号 - 最新的 Riva 版本号可以在Riva 快速入门指南的使用快速入门脚本进行本地部署部分中找到
ngc registry resource download-version "nvidia/riva/riva_quickstart:x.y.z"
安装 Riva 客户端库。
cd riva_quickstart_v<x.y.z> pip install riva_api-<x.y.z>-py3-none-any.whl
安装 weatherbot Web 应用程序依赖项。
requirements_client.txt
捕获了 weatherbot Web 应用程序所需的所有其他 Python 依赖项
pip3 install -r requirements_client.txt # For Python 3.8
停用 Weatherbot Web 应用程序的 Python 虚拟环境
deactivate
运行演示#
启动 Riva Speech Server(如果尚未启动)。按照Riva 快速入门指南中的步骤操作。
导航到您在设置部分的步骤 1 中克隆的 Riva 示例应用程序 github 存储库中的 Riva 和 Rasa 虚拟助手目录。
cd sample-apps/virtual-assistant-rasa
修改 API 端点设置。代码库中有两个位置必须配置用于服务间通信
rasa-weatherbot/endpoints.yml
用于运行 Rasa Action 服务器端点的机器的 IP 地址
# uncomment and populate the section below action_endpoint: url: "http://[rasa server host IP]:5055/webhook"
例如
# uncomment and populate the section below action_endpoint: url: "http://10.20.30.40:5055/webhook"
config.py
用于运行 Riva Speech Skills 服务器的机器的 IP 地址和运行 Rasa 聊天机器人服务器的机器的 IP 地址
# uncomment and populate the section below riva_config = { ... "RIVA_SPEECH_API_URL": "[riva speech service host IP]:50051", ... } # uncomment and populate the section below rasa_config = { ... "RASA_API_URL": "[rasa server host IP]:5005", ... }
例如:如果 Riva Speech Skills 服务和 Rasa 聊天机器人服务器都在同一台机器上运行,则为
# uncomment and populate the section below riva_config = { ... "RIVA_SPEECH_API_URL": "10.20.30.40:50051", ... } # uncomment and populate the section below rasa_config = { ... "RASA_API_URL": "10.20.30.40:5005", ... }
如果 Riva Speech Skills 服务和 Rasa 聊天机器人服务器在不同的机器上运行,则为
# uncomment and populate the section below riva_config = { ... "RIVA_SPEECH_API_URL": "10.20.30.40:50051", ... } # uncomment and populate the section below rasa_config = { ... "RASA_API_URL": "20.30.40.50:5005", ... }
启动 Rasa Action 服务器。
打开
config.py
脚本。在riva_config
变量右侧的字典中,使用您的 Weatherstack API 密钥更新WEATHERSTACK_ACCESS_KEY
字段。可以在此处获取新的 Weatherstack API 密钥。激活基于 Rasa 文本的聊天机器人的 Python 虚拟环境。
. pythonenvs/rasa/bin/activate
导航到
rasa-weatherbot
目录。
cd rasa-weatherbot
运行 Rasa Action 服务器。
rasa run actions --actions actions
在不同的终端中启动 Rasa 服务器。
激活基于 Rasa 文本的聊天机器人的 Python 虚拟环境。
. pythonenvs/rasa/bin/activate
导航到
rasa-weatherbot
目录。
cd rasa-weatherbot
运行 Rasa 训练。
对于 Riva NLP:训练 Rasa Core 模型。
rasa train -c config/config_rivanlp.yml -d domain/domain_rivanlp.yml --out models/models_rivanlp/ --data data/nlu_rivanlp.yml data/rules_rivanlp.yml data/stories_rivanlp.yml
对于 Rasa NLU:训练 Rasa NLU 和 Rasa Core 模型。
rasa train -c config/config_rasanlp.yml -d domain/domain_rasanlp.yml --out models/models_rasanlp/ --data data/nlu_rasanlp.yml data/rules_rasanlp.yml data/stories_rasanlp.yml
运行 Rasa 服务器。
对于 Riva NLP。
rasa run -m models/models_rivanlp/ --enable-api --log-file out.log --endpoints endpoints.yml
对于 Rasa NLU。
rasa run -m models/models_rasanlp/ --enable-api --log-file out.log --endpoints endpoints.yml
启动 Riva 聊天机器人服务器。
激活 weather Web 应用程序的 Python 虚拟环境。
. pythonenvs/client/bin/activate
导航到
rasa-riva-weatherbot-webapp
目录。
cd rasa-riva-weatherbot-webapp
启动 Chatbot 客户端服务器。
python3 main.py
在 Web 浏览器上打开 Web UI。
https://[riva chatbot server host IP]:5555/rivaWeather
例如
[https://0.0.0.0:5555/rivaWeather](https://0.0.0.0:5555/rivaWeather)
示例对话#
Rasa NLU:示例 1#
虚拟助手: 您好,欢迎使用 RIVA 天气服务。有什么可以帮您?
用户: 天气怎么样?
虚拟助手: 哪个地点?
用户: 在西雅图。
虚拟助手: 目前西雅图的天气是雾霾、烟雾。温度为 31 度,湿度为 30%,风速为每小时 20 英里。
Rasa NLU:示例 2#
虚拟助手: 您好,欢迎使用 RIVA 天气服务。有什么可以帮您?
用户: 巴黎天气怎么样?
虚拟助手: 目前巴黎的天气晴朗。温度为 20 度,湿度为 73%,风速为每小时 9 英里。
Rasa NLU:示例 3#
虚拟助手: 您好,欢迎使用 RIVA 天气服务。有什么可以帮您?
用户: 你好
虚拟助手: 嘿!你好吗?
用户: 你是谁?
虚拟助手: 我是一个机器人,由 Rasa 提供支持。
Rasa NLU:示例 4#
虚拟助手: 您好,欢迎使用 RIVA 天气服务。有什么可以帮您?
用户: 早上好
虚拟助手: 嘿!你好吗?
用户: 我很好
虚拟助手: 太好了,继续吧!
用户: 再见
虚拟助手: 再见
Riva NLP:示例 1#
虚拟助手: 您好,欢迎使用 RIVA 天气服务。有什么可以帮您?
用户: 天气怎么样?
虚拟助手: 哪个地点?
用户: 在西雅图。
虚拟助手: 目前西雅图的天气是雾霾、烟雾。温度为 31 度,湿度为 30%,风速为每小时 20 英里。
Riva NLP:示例 2#
虚拟助手: 您好,欢迎使用 RIVA 天气服务。有什么可以帮您?
用户: 巴黎天气怎么样?
虚拟助手: 目前巴黎的天气晴朗。温度为 20 度,湿度为 73%,风速为每小时 9 英里。
Riva NLP:示例 3#
虚拟助手: 您好,欢迎使用 RIVA 天气服务。有什么可以帮您?
用户: 奥斯汀在下雨吗?
虚拟助手: 目前奥斯汀的降水量为 0.4 英寸。
用户: 今天多伦多的温度是多少?
虚拟助手: 目前多伦多的温度为 4 摄氏度。
局限性#
提供的示例不是完整的虚拟助手,而是旨在作为如何使用 Riva 构建基本的面向任务的聊天机器人的简单示例。因此,意图分类器和槽位填充模型是使用少量数据训练的,预计不会非常准确。
Rasa 虚拟助手示例支持天气、温度、雨、湿度、晴天、多云和降雪检查的意图。它不支持通用对话查询或其他领域。
Riva NLP 和 Rasa NLU 示例都仅支持 1 个城市槽位。两者都没有考虑到与查询相关的日期。
尽管 Rasa 服务器和聊天机器人服务器可以托管在不同的机器上,但提供的代码不支持服务器的独立扩展。
这些示例最多支持四个并发用户。此限制不是因为 Riva,而是因为正在使用的 Web 框架(Flask 和 Flask-ScoketIO)。用于将音频流式传输到用户 (TTS) 和从用户 (ASR) 流式传输音频的套接字连接无法维持超过四个并发套接字连接。
对于多个并发用户的情况,Rasa 虚拟助手未针对低延迟进行优化。
在 Firefox 浏览器上的 Rasa 示例中观察到一些不稳定的问题。最常见的问题是 TTS 输出被 ASR 视为某些麦克风增益值的输入。
许可证#
NVIDIA Riva 许可协议包含在产品中。许可证也与模型应用程序 zip 文件一起提供。通过拉取和使用 Riva SDK 容器、下载模型或使用此处的示例应用程序,您接受这些许可证的条款和条件。
本项目使用 Rasa 和 Rasa-SDK,其许可信息可在下方找到:Rasa: 在 Apache License 2.0 版本下获得许可。版权所有 2020 Rasa Technologies GmbH。许可证副本可以在此处找到。Rasa-SDK: 在 Apache License 2.0 版本下获得许可。版权所有 2020 Rasa Technologies GmbH。许可证副本可以在此处找到。