虚拟助手 (与 Rasa)#

此虚拟助手(与 Rasa)示例应用程序演示了 Rasa 和 Riva 语音服务以天气聊天机器人 Web 应用程序形式的集成。此示例提供两种选项

选项 1: Riva ASR + Riva TTS + Riva NLP + Rasa 对话管理器

选项 2: Riva ASR + Riva TTS + Rasa NLU + Rasa 对话管理器

要了解有关 Rasa 的更多信息,请访问此链接

演示视频#

要查看 Riva 天气聊天机器人服务的工作原理,可以在此处找到演示视频。

实施#

从高层次来看,集成利用了 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

      • 最多两个实例

        1. Rasa 服务器

        2. Rasa Action (如果适用)

      • 不需要 GPU,但可以部署在 GPU 上以提高性能

    • Weatherbot 客户端

      • 包括已安装的 Riva Python 库

      • 分别通过 gRPC 和 REST API 端点与 Riva AI 服务和 Rasa 通信

      • 管道化 ASR、NLP、TTS 和对话管理器功能

      • 不需要 GPU

架构#

Riva ASR + Riva TTS + Riva NLP + Rasa dialog manager Riva ASR + Riva TTS + Rasa NLU + Rasa dialog manager

代码结构#

本节显示 Weatherbot 客户端的高级代码结构(在 rasa-riva-weatherbot-webapp/riva 文件夹中)。

  • asr.py

    • 此文件包含使用 Riva Python 客户端库对 Riva ASR 进行 gRPC 调用的功能,使用音频片段,并返回文本转录。

    • ASR 以流模式使用

  • rasa.py

    • 此文件包含对 Rasa 进行 API 调用的功能,使用用户输入和发送者 ID,并返回通过处理 Rasa 响应对象获得的文本响应。

  • tts.pytts_stream.py

    • 这些文件包含使用 Riva Python 客户端库对 Riva TTS 进行 gRPC 调用的功能,使用文本片段,并返回相应的语音。

    • TTS 可以以 BatchStreaming 模式使用,具体取决于使用的是 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 客户端之前,请确保满足以下要求

  1. 您有权访问 NVIDIA NGC 并已登录。有关分步说明,请参阅NGC 入门指南

  2. Python 3.8(未来版本将添加对其他 Python 版本的支持)。

设置:#

  1. 克隆 Riva 示例应用程序存储库

	git clone https://github.com/nvidia-riva/sample-apps.git
  1. 进入 Riva 和 Rasa 虚拟助手目录

	cd sample-apps/virtual-assistant-rasa
  1. 为我们将用于此示例的所有 Python 虚拟环境创建父目录

	mkdir pythonenvs
  1. 为基于 Rasa 文本的聊天机器人创建 Python 虚拟环境,并安装必要的库

    1. 为基于 Rasa 文本的聊天机器人创建并激活 Python 虚拟环境

    	python3 -m venv pythonenvs/rasa
    	. pythonenvs/rasa/bin/activate
    
    1. 升级 pip 并安装 Rasa 依赖项。requirements_rasa.txt 捕获了基于 Rasa 文本的聊天机器人所需的所有 Python 依赖项

    	pip3 install -U pip
    	pip3 install -r requirements_rasa.txt
    
    1. 停用 Rasa Python 虚拟环境

    	deactivate
    
  2. 为 Weatherbot Web 应用程序创建 Python 虚拟环境,该应用程序使用 Riva 客户端,并安装必要的库

    1. 为 Weatherbot Web 应用程序创建并激活 Python 虚拟环境

    	python3 -m venv pythonenvs/client
    	. pythonenvs/client/bin/activate
    
    1. 升级 pip

    	pip3 install -U pip
    
    1. 安装 Riva 客户端库

      1. 下载 Riva 快速入门脚本(如果尚未完成)。x.y.z 是 Riva Speech Skills 版本号 - 最新的 Riva 版本号可以在Riva 快速入门指南使用快速入门脚本进行本地部署部分中找到

      	ngc registry resource download-version "nvidia/riva/riva_quickstart:x.y.z"
      
      1. 安装 Riva 客户端库。

      	cd riva_quickstart_v<x.y.z>
      	pip install riva_api-<x.y.z>-py3-none-any.whl
      
    2. 安装 weatherbot Web 应用程序依赖项。requirements_client.txt 捕获了 weatherbot Web 应用程序所需的所有其他 Python 依赖项

    	pip3 install -r requirements_client.txt # For Python 3.8
    
    1. 停用 Weatherbot Web 应用程序的 Python 虚拟环境

    	deactivate
    

运行演示#

  1. 启动 Riva Speech Server(如果尚未启动)。按照Riva 快速入门指南中的步骤操作。

  2. 导航到您在设置部分的步骤 1 中克隆的 Riva 示例应用程序 github 存储库中的 Riva 和 Rasa 虚拟助手目录。

	cd sample-apps/virtual-assistant-rasa
  1. 修改 API 端点设置。代码库中有两个位置必须配置用于服务间通信

    1. 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"
    
    1. 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",
    	...
    }
    
  2. 启动 Rasa Action 服务器。

    1. 打开 config.py 脚本。在 riva_config 变量右侧的字典中,使用您的 Weatherstack API 密钥更新 WEATHERSTACK_ACCESS_KEY 字段。可以在此处获取新的 Weatherstack API 密钥。

    2. 激活基于 Rasa 文本的聊天机器人的 Python 虚拟环境。

    	. pythonenvs/rasa/bin/activate
    
    1. 导航到 rasa-weatherbot 目录。

    	cd rasa-weatherbot
    
    1. 运行 Rasa Action 服务器。

    	rasa run actions --actions actions
    
  3. 在不同的终端中启动 Rasa 服务器。

    1. 激活基于 Rasa 文本的聊天机器人的 Python 虚拟环境。

    	. pythonenvs/rasa/bin/activate
    
    1. 导航到 rasa-weatherbot 目录。

    	cd rasa-weatherbot
    
    1. 运行 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
      
    2. 运行 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
      
  4. 启动 Riva 聊天机器人服务器。

    1. 激活 weather Web 应用程序的 Python 虚拟环境。

    	. pythonenvs/client/bin/activate
    
    1. 导航到 rasa-riva-weatherbot-webapp 目录。

    	cd rasa-riva-weatherbot-webapp
    
    1. 启动 Chatbot 客户端服务器。

    	python3 main.py
    
    1. 在 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 容器、下载模型或使用此处的示例应用程序,您接受这些许可证的条款和条件。
本项目使用 RasaRasa-SDK,其许可信息可在下方找到:Rasa: 在 Apache License 2.0 版本下获得许可。版权所有 2020 Rasa Technologies GmbH。许可证副本可以在此处找到。Rasa-SDK: 在 Apache License 2.0 版本下获得许可。版权所有 2020 Rasa Technologies GmbH。许可证副本可以在此处找到。