一、ROS2离线语音交互模块-快速上手
0x00 语音交互模块简介
最近一直在研究做一款双足机器人,在添加语音交互功能时,尝试了很多方案都不是很满意。总结下来的几个问题主要是硬件成本高,如果使用本地合成方案的话,延时太高,使用网络调用在线API方式的话,还得额外花钱购买调用次数。要不然就是软件开发太花时间,与ROS2系统集成还得调试很多时间,反正都不是很爽。
所以根据我自己的实际开发需要,决定设计一款使用简单,成本较低的ROS2离线语音交互开发板,最终基本上实现了最初设想,所以有以下需要的小伙伴也可以关注下我设计的这款语音模块:
- 硬件成本控制在一百以内,要求除了购买硬件需要花钱外,其他都免费,没有二次收费陷阱;
- 要求语音识别距离不小于5米,最大10米,具备一定的抗噪音能力;
- 要求可以自由修改唤醒词,而且可以设置的自定义唤醒词至少为5个;
- 离线语音识别的命令词至少为300条,语音识别内容可以自由定义修改;
- 要求TTS支持多种发音人(不少于50种),中英文都支持;(这里注意:TTS不是实时在本地生成,而是编译语音代码时生成好,需要时直接调用播放,减少本地硬件资源消耗)
- 要求人机语音交互过程中,语音模块不需要联网,而且语音处理延时小于100ms;
- 用户不需要再开发ROS2语音交互代码,直接通过订阅话题得知语音唤醒、语音识别的结果;
下面是语音开发板的整体效果图,现在可能难看了点,后续板子再升级,现在是先实现功能为主:
0x01 使用方式介绍
在使用之前先介绍一下语音板的尺寸和接口,总体来说板子虽小,五脏俱全,具体如下图所示:
使用前需要先讲麦克风和喇叭都接好,连接口使用的是MX1.25-2P插座,这个接口比较小,为了节约板子上空间,为以后得扩展做准备,在以后升级语音板时候,外部的尺寸争取不再变化,只是板子上内部元器件布局、选型上改变,这样方便后续的无缝替换升级。
这款语音板使用方便的地方在于,不需要用户再编写ROS2的语音代码,包括语音唤醒、语音识别、语音合成这些处理的代码,因为这部分代码我已经开发好,我们只需要在自己安装有ROS2的主系统上使用如下命令即可启动:
ros2 run micro_ros_agent micro_ros_agent serial --dev /dev/voiceModule
通过该命令可以得知,其实我们是通过micro_ros_agent包来与语音板模块进行通信的,这里使用serial串口方式通信,设备路径为/dev/voiceModule,这里我使用了rules规则文件将ttyACM*设备映射为固定的设备名voiceModule,当然该设备名也是可以自己修改的,在后面文章中会详细介绍micro_ros_agent的安装和rules规则文件如何编写的。当使用上述命令启动语音模块后,即可与语音模块建立连接,输出信息如下图所示:
在与ROS2系统建立连接后,就可以查看到语音模块输出的话题列表了,根据需要可以订阅对应的话题即可,具体如下图所示:
0x02 语音程序修改
对于语音模块的语音相关的程序,我们可以自由修改。这里修改代码也非常简单,使用的是模块化编程,直接拖拉代码模块,类似于米思齐那种软件,不需要我们真正的去写代码,而且整个语音程序框架已经都做好了,用户只需要修改唤醒词、TTS发音词、离线识别的命令词等,后续文章中会详细介绍这部分代码,而且到时候把语音源码放出来给大家修改,这里只是给大家看看代码什么样的,具体如下图所示:
上图中这部分代码是我们可以自由修改的,还有一部分语音代码是不能随便修改的,因为这部分代码是与ROS2代码通信的代码,用户只需要了解即可,具体代码如下图所示:
0x03 实际运行效果展示
简单介绍完ROS2离线语音模块基本知识点后,现在就来看下实际的使用效果,在后续的教程中会详细的介绍使用方式,视频如下所示: