首先,恭喜RDK X5终于有了社区版自己的语音方案啦~~
这篇帖子的主要目的是为了带领所有拥有一台RDK X5和一条3.5mm的圆孔麦克风耳机的小伙伴,快速实现自己的地瓜数字人语音小助手啦。
1、技术方案总览
目前RDK X5的快捷语音方案的总体介绍如下。
1、支持用户使用关键词hey snips _[_heɪ snɪps] 进行语音唤醒
2、支持用户进行中文语音转文字
3、支持将转出的文字输入给大模型获得反馈
其中,
语音唤醒使用的本地深度学习模型,该模型来自于百度飞浆PaddlePaddle的语音唤醒KWS算法(MDTC),该算法集成于百度飞浆的官方paddlespeech仓库。具体介绍可以参考该网页: https://github.com/PaddlePaddle/PaddleSpeech/tree/develop/examples/hey_snips。
语音转文字(语音识别)同样使用的本地深度学习模型,该模型来自于Huggingface的Wav2vec2大模型,该模型体量为约0.5B,具体介绍可以参考:https://huggingface.co/docs/transformers/en/model_doc/wav2vec2。
大模型使用的火山引擎云端模型,具体而言,为豆包128k pro模型,详情可查看:https://console.volcengine.com/。因为是云端模型,因此,在使用前请各位小伙伴务必先将自己的RDK X5板联网哦。
唤醒后,小伙伴们的问题最终将以文字的形式输出在终端。
具体技术路线可参考该流程图:
2、使用手册
目前,整体方案已经上传至Nodehub,大家可以通过网页(https://developer.d-robotics.cc/nodehubdetail/1888945037768945666)进行访问。
2.1 硬件准备
用户需要自己准备一台RDK X5和3.5mm的耳机麦克风。将3.5mm的耳机麦克风插入到RDK X5的耳机孔中(如下图所示),则可以使用语音与RDK X5进行交互,用于音频的输入与输出。关于更多语音与硬件相关的信息,大家也可以访问地瓜官网(3.2.3 RDK X5 系列音频使用指南 | RDK DOC)
2.2 软件准备
用户需前往火山引擎大模型网关官网(https://www.volcengine.com/docs/6893/1263410),跟着步骤完成账号注册,且在`创建网关访问秘钥`这一步,勾选`Doubao-pro-128k`(如下图所示)。
完成步骤1,即可获得网关访问秘钥,这个秘钥会在后续的ROS节点的api_key参数中使用。
2.3 使用步骤
大家首先自行准备一张完成烧录的SD卡插入至RDK X5中,关于系统烧录,可以参考社区官网(https://developer.d-robotics.cc/rdk_doc/Quick_start/install_os/rdk_x5)。随后将RDK X5上电,将3.5mm耳机插入到RDK X5的耳机孔中。通过MobaXTerm登录。将无线网络(WIFI)与RDK X5相互连接,可以参考社区官网(https://developer.d-robotics.cc/rdk_doc/System_configuration/network_blueteeth)
RDK X5有了网络后,就可以开始进行readme中的步骤了。
本项目包含两个节点,一个发布节点(publisher),以及一个订阅节点(subscriber):
1. 发布节点(publisher):发布节点会开启一个音频流,将唤醒词、需要语音识别句子的音频发送给订阅节点
2. 订阅节点(subscriber):订阅节点负责接收唤醒词、需要语音识别句子的音频,并将这些音频发送给对应的模型进行推理
2.3.1 环境准备
安装ros依赖:
sudo apt updatesudo apt install python3-colcon-ros
激活ros环境(注:每次新开一个terminal(终端),都建议重新激活一下环境,即执行以下代码)
对于RDK OS V3.0版本,执行如下命令:
source /opt/tros/humble/setup.bash
对于RDK OS V2.1版本,执行如下命令:
source /opt/tros/setup.bash
在RDK开发板上新建一个工作空间目录,并构建src子目录:
mkdir -p colcon_ws/srccd colcon_ws/src
使用git clone命令,将本项目克隆至src目录下。
git clone https://github.com/frank05080/rdk_qa.git
进入项目,拉取kws和asr的对应模型,安装pip依赖。
cd rdk_qawget https://archive.d-robotics.cc/downloads/rdk_model_zoo/rdk_x5/kws.binwget https://archive.d-robotics.cc/downloads/rdk_model_zoo/rdk_x5/wav2vec2_output_30000.binpip3 install -r requirements.txtcd ..
注:该项目与RDK Model Zoo依赖保持一致,均需要bpu_infer_lib,如尚未安装bpu_infer_lib,请参考网站(https://github.com/D-Robotics/rdk_model_zoo)链接进行安装
回到工作空间目录(colcon_ws),构建项目
cd ..colcon build
激活项目环境(注:在完成环境构建后,每次新开一个terminal(终端),都建议重新激活一下环境,即执行以下代码)
对于RDK OS V3.0版本,执行如下命令:
source ./install/setup.sh
对于RDK OS V2.1版本,执行如下命令:
source ./install/setup.bash
2.3.2 发布节点
我们首先在MobaXTerm或者VsCode中打开一个终端,启动一个发布节点。
ros2 run rdk_qa pub
执行后,会弹出一系列和ALSA有关的警告,如Invalid card等,无视即可。
执行的结果如下图所示:
以上相关的警告全部无视即可,到这一步则说明发布节点(pub)已经成功启动。
2.3.3 订阅节点
随后,使用MobaXTerm或VsCode打开另一个终端,启动一个订阅节点。
注意(这一步中的ROS参数必须进行实际情况替换,如果直接复制粘贴如下命令,程序会直接退出):
1. 这里需要填入bin模型的地址做为参数,请根据实际情况填入kws.bin以及wav2vec2_outpu_30000.bin文件路径
2. 这里需要填入的llm_api_key为`环境准备`步骤中申请的api_key,将其复制到这里即可
3. 这里需要填入的vocab_path为github克隆时自带的`vocab.json`文件,请根据实际情况填写其路径,建议填写绝对路径
ros2 run rdk_qa sub --ros-args -p llm_api_key:=None -p kws_bin_path:=None -p asr_bin_path:=None -p vocab_path:=None
启动订阅节点后(这里隐藏了作者个人的llm_api_key,请同学们实际使用的时候,根据自己的申请的api_key进行填入),我们看到`[audio_sub]: FINISHED LOADING MODEL, START AWAKEN..`的回显,则表示所有本地模型已经完成加载,此刻可以进行唤醒。
目前唤醒词固定为:hey, snips
这里唤醒词的发音可以参考B站视频中的发音方式。
我们将唤醒词的正确发音对准耳机的麦克风进行发音,即可让模型正确唤醒。当模型唤醒后,我们会在订阅节点的终端中看到`唤醒`二字。
此时当发布节点的终端会出现回显:
[audio_pub]: Please start speaking:
时,即可对耳机麦克风进行说话。
注意:由于X5语音识别模型为静态模型,输入音频的长度有限,在本案例中,输入音频的长度限制为2s,即期待用户以较快的语速进行一些简短问题的提问。如希望有较长的音频输入,请联系地瓜工程师。或使用火山引擎提供的云端ASR模型。
完成2s的语音输入后,看到回显
[INFO] [1739192185.705863110] [audio_pub]: Speaking ends now..
则表示语音成功输入。
稍等片刻,在订阅节点的终端中会出现回显
[INFO] [1739192189.928730583] [audio_sub]: clean_text: 你在哪
这里文字即使语音转文字(ASR)的本地模型推理结果。
随后,订阅节点会将语音转文字(ASR)的识别结果喂入云端豆包大模型,豆包大模型会根据您问的问题给出对应的答案。
这边的操作回显可以参考如下图片:
发布节点:
订阅节点:







