【睿尔曼-RealMan】睿尔曼复合机器人配产品配件-语音模块实训手册
Ron 2024-04-18
前言
本文主要介绍了M240线性麦克风阵列的ROS语音功能包使用教程及环境配置,ROS 功能包被分为了依赖小车和非依赖小车的两个版本,依赖小车的版本为完整版,其中包含了导航、视觉和底盘运动等功能;非依赖小车只保留了语音识别的框架,只有识别和反馈播报功能。
1、麦克风阵列硬件简介
1.1麦克风阵列硬件
麦克风阵列采用 4 核高性能边缘计算处理器。内部集成特定的语音算法,利用麦克风阵列的空域滤波特性,通过唤醒人的角度定位,形成定向拾音波束,并对波束以外的噪声进行抑制,提升远场拾音质量。同时针对人机交互一体终端,集成高性能回声消除算法,降低语音、 语义识别难度,防止自言自语的情况发生。
1.2语音模块
1.2.1主控板
R818降噪板的接口如图所示。
- 图1 接口介绍
编号
|
接口名称 | 说明 |
---|---|---|
1 | 串口接口 | 串口通信接口 |
2 | UAC接口 | 音频输出接口 |
3 | TypeC数据口 | 上位机通信接口 (可做供电) |
4 | 独立电源接口 | 单独电源接口 (可选) |
5 | 麦克风接口 | 麦克风阵列接口 |
6 | 参考信号接口 | 功放、回声消除参考信号输入 |
表1 语音模块接口说明
线性麦克风阵列为M240,M240线性4麦可以拾取5m以内距离的声源,此值为实验室测试值,具体情况还需根据实际使用为准。声源定位角度为0~180°,不分前后,唤醒角度分辨率为5°。M240线性4麦麦克风如图所示。
图2 M240线性4麦麦克风
线性麦克风阵列拾音是通过固定波束拾取指定角度范围内的声源,并抑制其它角度声源的影响。固定波束指的是模块通过阵列麦克风的不同拾音差异,通过算法滤波输出的某个特定方向音频,波束指向方向仅为拾音方向, 并不会影响和改变唤醒时的角度等任何信息。
图3 固定波束示意图
1.3硬件接线
麦克风阵列、扬声器、上位机、电源(可选)和R818降噪主控板连接如图所示。
图4 接线示意图
图5 接线实物图
1.4复合产品介绍
在单臂复合机器人、双臂复合机器人、双臂升降机器人躯干内部安装了语音模块,可对外部音频采集,内部喇叭信号采集;内置语音唤醒、降噪算法及离线命令,可用于拾取用户语音指令,播放应答信息,通过 USB 接口与主控模块实现通讯。
图6 单臂复合机器人
图7 双臂复合机器人
图8 双臂升降机器人
1.5 windows上位机工具
1.5.1串口调试工具
电脑接上语音模块,打开串口工具界面。首先先选择串口,然后点击打开串口按钮,提示串口通信正常即可正常使用,如果串口号的显示变回默认串口其实是不影响使用的。功能包括可以切换线性麦克风阵列的类型、查看版本的信息和更改唤醒词。
图9 串口调试工具界面
1.5.2唤醒词更改
更改唤醒词可以在命令行界面输入以下指令
{
"type": "wakeup_keywords",
"content": {
"keyword": "ni2 hao3 xiao3 rui1", // 唤醒词
"threshold": "900"// 阈值 }
}
输入完指令后需要点击 Send Raw 按钮,显示 keyword changed 就表明唤醒词设定成功,之后便可以使用新的唤醒词。
图10 唤醒词更改
2、ROS语音环境配置
2.1 串口规则配置
把录音设备接入 linux 主机,在终端输入 ll /dev 可以查看到 ttyACM0
查找到ttyACM0后就可以为录音进行规则配置,进入配置Linux环境文件/配置串口/serial_driver/Linux目录下找到ch9012_udev.sh文件,打开文件,把KERNEL=="ttyCH343USB*" 修改成'KERNEL=="ttyACM*",修改保存,然后运行即可配置好规则。若ch9012_udev.sh运行不了,可在终端输入指令sudo chmod+x ch9012_udev.sh赋予权限。
图11 ch9102_udev.sh配置
图12 运行ch9102_udev.sh
插拔一下设备,再输入指令ll /dev可以看到规则已经配置好,设备名为wheeltec_mic,如图所示。
图13 串口规则配置成功
2.2 cjson安装
将cJSON文件夹复制到home目录下,进入文件夹输入指令mkdir build创建文件夹并进入此目录,输入指令‘cmake’,结果如图所示。
图14 安装cjson
然后按顺序接着输入make和sudo make install,头文件就安装好了,还需要将/usr/local/lib目录添加到/etc/ld.so.conf文件中,然后执行/sbin/ldconfig。如图所示。
在cjson/build目录下的终端输入:
sudo nano /etc/ld.so.conf
打开文件输入:
include /etc/ld.so.conf.d/*.conf
/usr/local/lib
图15 配置cjson文件
3、ROS语音功能操作
3.1创建工作空间
打开终端运行以下命令
mkdir -p 自定义空间名称/src
将xf_mic_asr_offline_line文件夹放入工作空间的src目录下,然后进行编译
cd 自定义空间名称
3.2 so库配置
配置so库需要根据不同的主控框架进行配置,如果是在Jetson-Nano或者树莓派等微控制器主控可以配置arm文件夹的so库文件,如果使用的是Linux笔记本或者装有虚拟机的主机,那么配置的so库可以选择x64文件夹。配置so库到/usr/lib目录下,而且编译CMakeLists.txt文件内的库依赖也需要同步进行更新。具体如图所示。
图16 配置so库
图17 CMakeLists.txt配置
3.3 ROS功能包介绍
该功能包作为麦克风相关的所有接口服务端提供了包括唤醒角度,降噪音频、灯光控制、离线命令词识别等功能,提供了与麦克风相关的多个接口。其功能包结构如图所示。
图18 离线语音ROS功能包结构
3.3.1 include文件夹
存放所有头文件,在这其中,用户只需关注user_interface.h文件即可,该头文件为用户接口,用户可以对其中的参数进行修改,进行调试。除此之外,在用户的头文件中还有一些路径,这些路径将在启动文件launch后变为绝对路径,方便用户在不同路径下启动,故不建议修改。
3.3.2 lib文件夹
此文件夹存放所有动态链接库文件,用户根据自己预使用的linux平台进行动态库的选择,现在支持ARM64(Nvidia TX1 TX2 NX NANO等系列)以及X64。
3.3.3 config文件夹
存放配置文件,其中msc文件夹是离线命令词识别引擎所需要的资源文件,若更新了appid,需要更换该文件夹的res/asr下的common.jet文件。在config文件夹下,存放了appid_params.yaml文件,若更换appid后,需要在此文件修改为用户自己的appid。
call.bnf为用户自定义的离线命令词语法文件,在里面用户需要根据规则来定义关键语料,离线识别的词语是开发者自己定义的,命令词最大长度为16个汉字,需要先构建语法,然后指定使用的语法。
3.3.4 launch文件夹
此文件夹包换了麦克风接口功能包的启动文件。
3.3.5 src文件夹
此文件夹包含了麦克风接口的C++源代码。
3.3.6 msg文件夹
此文件夹包含了用户自定义话题类型。
3.3.7 srv文件夹
此文件夹包含了用户自定义服务类型。
3.3.8 audio文件夹
此文件夹存放录音文件。
3.3.9 tmp文件夹
包含麦克风通信相关的资源文件,仅在版本升级时更换。
3.3.10 CMakeLists.txt
此文件为cmake编译规则,这个文件直接规定了这个package要依赖哪些package,要编译生成哪些目标,如何编译等等流程。
3.4 用户参数配置
用户参数文件放置在功能包的config文件夹中,可以根据备注说明修改参数,修改后不需要编辑即可直接运行launch文件启动,具体参数如图所示。
图19 appid_params.yaml配置
图20 recognition_params.yaml配置
ROS 语音功能包需要运行两个指令 base.launch 和 mic_init.launch,
在catkin_ws工作空间下打开终端分别运行以下两条指令:
roslaunch xf_mic_asr_offline_line base.launch
roslaunch xf_mic_asr_offline_line mic_init.launch
若运行mic_init.launch时出现11212报错,则表明离线资源已经过期,需要进行更换离线资源,以下为更换的整个流程。
3.5注册科大讯飞账号
打开科大讯飞开放平台网页,网址:https://www.xfyun.cn/services/voicedictation,注册账号。
3.6创建应用
选择控制台→我的应用→创建新应用→填好对应资料后提交,可以看到自己的APPID。创建新应用会生成一个 APPID,与 SDK 中离线语音资源文件匹配。创建新 应用试用期 90 天,若不购买服务,可以再次创建新应用重新替换 APPID 和离线 语音资源文件获得新的 90 天试用,每个实名制用户可以免费申请 5 个应用。
图21 科大讯飞官网
点击离线命令识别→下载Linux版本的SDK
图22 科大讯飞SDK
3.7替换common.jet
将下载的SDK解压,将解压后文件夹中bin/msc/res/asr下的common.jet文件拷贝到自己ROS工作空间下的/home/user/catkin_ws/src/xf_mic_asr_offline_line/config/msc/res/asr,替换掉原来的common.jet。
图23 common.jet文件路径
3.8替换APPID
打开/home/zjj/catkin_ws/src/xf_mic_asr_offline_line/config路径下的appid_params.yaml文件(更换自己的路径),将appid更改成自己的APPID,保存退出,改完之后需要重新编译功能包。
图24 appid_params.yaml配置
若再次运行base.launch 和 mic_init.launch指令出现11210错误,说明APPID与SDK不匹配。
在/home/user/catkin_ws/src/xf_mic_asr_offline_line/src路径下的voice_control.cpp文件中需要更改为自己的APPID
图25 APPID配置
再次运行base.launch 和 mic_init.launch,程序可以正常运行,base.launch运行后,终端会显示用户界面并打印出命令日志,具体如图所示。
图26 base.launch命令日志界面
mic_init.launch 运行的终端打印的日志主要是输出线性麦克风状态与识别结果,输出的信息主要有唤醒后的声源角度、识别结果的置信度和识别到的文本,具体如所示。
图27 mic_init.launch命令界面
4、ROS语音功能包
4.1 ROS功能包集
本功能包涵盖了交互相关的多个功能包,包括集成了唤醒角度获取,音频获取,离线命令词识别的麦克风功能包。所有功能都以接口的形式给出,且均以话题或者服务形式,用户可根据科大讯飞的协议来发送请求即可获取结果。
功能包集提供的功能 | 支持平台 | 操作系统 |
---|---|---|
麦克风录音开与关 降噪或原始音频获取 唤醒角度获取 主麦克风获取 设置主麦克风 灯光点亮与关闭 自定义唤醒词设置 获取离线命令词识别结果 |
X64:通用PC平台 |
Linux Windows |
表2 ROS功能包
4.2语音唤醒
语音唤醒功能是在主控板的固件上跑的,一旦开机上电它就开始运行,每当识别到唤醒词后会输出声源角度。同时如果要更改唤醒词需要到上位机的串口软件进行更改
4.2.1语音声源定位
根据M240线性麦克风阵列的固有特性输出声源角度只能在0°~180°,而且输出的唤醒角度是无法对声源进行360°任意方向定位,因此本程序默认选定小车前方0°~180°,为声源定位有效区域。虽然在小车后面也是可以成功唤醒定位,但是屏蔽了后方角度声源定位是不准确的,如图所示,无效区域是指在线性麦克风中心线往后语音控制小车时无法正确寻找声源。识别指令和输出唤醒角度还是有效的。
图28 小车识别区域
4.3语音识别
语音识别目前是根据Linux_SDK的边录边识别框架进行适配的,相比于原版固定音频识别,自适应录音时长会使得交互体验得到提升,对于小车互动的实时性也更好。为了提高识别效果,可以选择在终端刷“正在录音”日志时进行语音输入或者适当调整识别置信度。
实现自适应录音时长的功能主要采用了VAD(音频端点检测),默认的vad_cos为0.9s,但尾部静音时长超过这个值则判定音频输入结束进行下一识别循环,如果认为此值太短导致录音不完整,可以对参数进行修改,具体可以去查看Linux_SDK中边录边识别源码,修改后并生成liboffline_record_lib.so库然后进行替换、配置。
4.4语音互交控制
语音互交主要由语音唤醒、语音识别、语义理解、语音合成等规划层的节点组成。运行语音模块的base.launch 和 mic_init.launch文件,按照命令词提示,用户通过麦克风输入语音,进行语音唤醒,首先科大讯飞的离线中文识别对用户的语音进行识别,若语音识别的阈值大于设定的值,即此次语音识别有效,并转成字符串输出,同时调用录制好的语音进行回复。语音互交流程图如图所示。
图29 语音互交流程图
附录:语音模块常见问题及解决方案
问题1:系统检测不到麦克风设备。
解决办法:重新插拔,若使用的是虚拟机,确保语音模块连接在虚拟机上,而不是Windows下,且虚拟机的串口设置的是USB3.0。
问题2:启动后出现红色报错或者segment fault字样。
解决办法:未设置麦克风 udev。尝试使用sudo启动或者设置udev。检查一下是否配置过本麦克风的udev规则,通过执行如下指令进行配置:
然后执行以下指令重启udev服务:
再次重启设备或者插拔一下麦克风设备即可。
问题3:在启动后出现libcjson.so.1不存在。
解决办法:需要安装cjson,且需要将/usr/local/lib中的libcjson.so.1移动到/usr/lib下。
问题4:出现“23300”或者“bnf_recognise_error”报错。
解决办法:离线命令词识别时语法bnf错误,请检查标点符号,槽定义等是否有误,可参考bnf编写说明。
问题5:出现“10407”或者“unfit_appid_and_lib_error”报错。
解决办法:appid与动态库libmsc.so不匹配,可参考4.6进行配置,在修改后一定要进行编译后再运行。
问题6:出现“10102”或者“build_grammer_error”报错。
解决办法:离线命令词识别过程中,common.jet资源文件路径有误,为避免出错,建议修改为绝对路径。
问题7:出现“11212”或者“low_confidence error or 11212_license_eexpired_error”报错。
解决办法:离线命令词识别过程中,离线授权体验期过期,需重新注册科大讯飞开放平台获取新的appid和SDK,具体步骤参考4.4。
问题8:出现“11210”报错。
解决办法:appid与离线资源common.jet不匹配,具体步骤参考4.6。
问题9:出现“11201”报错。
解决办法:在线业务超次数或离线资源装机量超限。如离线命令词识别中,一个试用版的appid和资源超过10台机器上使用。可重新注册账号,使用新的appid。
问题10:“文件无法打开”。
解决办法:在执行案例中,若在录音时出现文件无法打开的问题,需要确认音频文件是否有读写权限,可删除该录音文件后再运行,或者使用超级用户权限。
问题11:“在启动例程时一直显示麦克风未启动”。
解决办法:检查是否有开启录音后,未停止录音的操作。若有,则需要手动停止录音或者断开与麦克风的连接来结束通讯。
若需要对语音模块进行二次开发,请参考科大讯飞官网文档或附件
撰写评论