廖春蓝
(广州番禺职业技术学院,广东广州 511400)
2021年12 月,工业和信息化部、国家发展和改革委员会、科学技术部等十五个部门联合发布了《“十四五”机器人产业发展规划》,指出机器人的研发、制造和应用是衡量一个国家科技创新的重要标志。党中央、国务院高度重视机器人产业的发展,将机器人纳入国家科技创新重点领域,大力推动机器人研发创新和产业化应用[1]。无论是迎宾机器人、教育机器人,还是养老助残机器人、家务机器人,这些服务机器人要服务人类完成某项工作,就必须具备与人交流的能力,即“听”和“说”的能力。因此,语音交互是服务机器人必不可少的一项功能。
机器人操作系统(Robot Operating System,ROS)是一个面向机器人的开源元操作系统,遵守BSD开源许可协议。ROS属于建立在传统操作系统上的次级操作系统,并为其提供一个结构化的通信层。它提供了一系列类似传统操作系统的功能,例如硬件抽象、设备驱动、库函数、可视化、消息传递和软件包管理等,以帮助软件开发者创建机器人的应用软件[2]。ROS强大的功能使得开发者能够比较容易地进行语音交互工程部署,实现迎宾机器人跟人类的交流并按照人类的命令完成某项任务。ROS具有点对点设计、多语言支持、架构精简、集成度高、工具包丰富、免费开源等特点。
传统的人机交互一般通过图形的方式进行强视觉弱逻辑的交互,也被称为GUI(Graphic User Interface)。而语音交互(Voice User Interface,VUI)则是通过语音的方式进行人机交互,强逻辑而无视觉(或者弱视觉)。VUI通过语音传递所有足够的信息,承载认知、逻辑、情绪等等一切元素,这才是智能语音交互的核心所在[3]。
语音交互系统是迎宾机器人的核心模块之一,它使得机器人具有像人一样“能听会说、有问必答”的交互能力,是实现迎宾机器人跟人类交流的关键环节。首先,迎宾机器人身上装载的语音输入设备(例如麦克风阵列模块)采集用户的语音,完成音频的录入、采样及编码。语音识别环节完成语音信息到机器可识别的文本信息的转化。语言处理环节根据语音识别转换后的文本字符或命令进行逻辑判断后完成相应的操作处理。最后,语音合成环节完成文本信息到声音信息的转换,并将语音信号输出反馈给人类。语音交互系统框图如图1所示。
图1 语音交互系统框图
在迎宾机器人工作过程中,当人类对机器人下达语音命令时,迎宾机器人首先会“听懂”人的语音,在进行语音信号的识别和处理之后,机器人会“回答”人类的提问,并按照人类的指令完成某项任务,这就是语音交互控制系统的功能所在。
迎宾机器人的语音交互系统主要由硬件和软件两部分构成。硬件部分主要由麦克风阵列模块、扬声器和相关接口电路组成,软件部分主要是基于ROS的程序控制。
迎宾机器人选用科大讯飞的麦克风阵列模块实现语音采集,它是语音交互系统的核心硬件。
麦克风阵列模块又被称为麦克风阵列语音板,它采用平面环形分布结构。麦克风阵列模块是一种包含一定数量的声学传感器(一般为麦克风),能对声场的空间特性进行采样并处理的系统。在机器人上装载麦克风阵列模块,迎宾机器人就能“听见”人类的语音指令。
如图2所示,麦克风阵列模块在电路板外围平均安置了6个麦克风,按照图示的顺时针顺序从0~5进行编号,可以实现360°等效拾音。麦克风阵列模块的语音唤醒分辨率为1°,并且具备抑制背景噪声和混响、信号提取与分离等功能。
图2 科大讯飞麦克风阵列模块
科大讯飞麦克风阵列模块利用多个麦克风在不同位置点对声源进行测量,由于声音信号到达不同麦克风的时间有不同程度的延迟,利用TDOA(Time Difference of Arrival)算法对测量得到的声音信号进行处理,由此获得声源点相对于麦克风的到达方向和距离等信息,因而具备声源定位的功能[4]。在环形分布的麦克风内侧安置的一圈共12个均匀分布的LED灯就是用于实时显示声源方向的。此外,麦克风阵列语音板上配置了一个参考信号接口,可以读取回声并进行处理,实现回声消除功能。
基于科大讯飞的软件开发工具包SDK,迎宾机器人的语音交互系统开发了ROS语音功能包,该功能包放置在工程文件夹中。ROS语音功能包含交互相关的多个功能包,主要包含以下三个:离线语音识别包、离线语音合成包和在线语音合成包[5]。
离线语音识别包(xf_mic_asr_offline)可以让迎宾机器人通过配置文件而具有良好的语音识别能力。该功能包作为与麦克风阵列模块相关的所有接口的服务端,提供包括唤醒角度、降噪音频、灯光控制、离线命令词识别等功能。其提供与麦克风相关的多个接口,其文件目录如图3所示。
图3 离线语音识别包目录
离线语音合成包(xf_mic_tts_offline)能够实现离线的语音合成,让迎宾机器人能够说出中文。离线语音合成包合成的引擎在SDK中,可以在无网络的情况下使用,功能包目录如图4所示。
图4 离线语音合成包目录
迎宾机器人的语音交互控制思路如下:在5 m范围内,当宾客用“小威小威”这个唤醒词呼喊迎宾机器人时,迎宾机器人内部程序进入回调函数,调用相应的服务来获取等待识别的语句。若识别成功,迎宾机器人会“回答”一句“在呢”。当宾客继续说出“你是谁”“你来自哪里”等语句时,机器人会根据关键词进行相应的回答。当宾客说出“向前走”“向后走”等语句时,迎宾机器人会以一定的速度移动。若识别失败则不做任何操作,等待下一次的唤醒操作。
在装载有麦克风阵列模块的迎宾机器人上通过编写Python程序,实现了对迎宾机器人的语音交互与控制,具体流程如下:
(1)安装音频播放库。
利用如下指令为迎宾机器人安装音频播放库:
$sudo apt-get install sox
$sudo apt-get install mplayer
(2)启动语音合成。
新建一个终端,利用指令roslaunch启动语音合成节点:
$ roslaunch xf_mic_asr_offline xf_mic_tts_offline.launch
(3)启动语音识别。
新建一个终端,利用指令roslaunch启动语音识别节点:
$ roslaunch xf_mic_tts_offline xf_mic_asr_offline.launch
语音识别节点正常启动后,迎宾机器人会说一句:“语音模块启动成功,请唤醒。”在这里,可以通过指令rosservice list和rostopic list查看当前所有活跃的服务和话题。
(4)运行语音交互节点。
在Python程序所在目录下新建一个终端,输入python yuyin.py,运行语音交互节点。当终端显示语音交互节点成功连接语音合成和语音识别服务器后,宾客就可以跟机器人对话了。
(5)获取语音识别结果和任务控制。
新建一个终端,输入下面的命令,获取语音识别结果和任务控制:
$roslaunchxf_mic_asr_offlineget_asr_result.launch
(6)启动机器人基础功能包。
新建一个终端,输入下面的命令,启动迎宾机器人的基础功能包,可以通过它控制迎宾机器人移动:
$roslaunch vkbot_bringup minimal.launch
(7)发布机器人移动的速度信息。
新建一个终端,输入下面的命令,获取语音识别结果的节点将会发布机器人速度信息:
$rostopic info/cmd_vel_mux/input/teleop
在正常启动语音模块后,迎宾机器人播报“语音模块启动成功,请唤醒”。机器人在听到宾客呼喊唤醒词“小威小威”时,会回答一句“在呢”。宾客问:“你是谁?”迎宾机器人会回答:“我是迎宾机器人小威。”
当宾客在唤醒词后继续说“向前走”时,迎宾机器人会以一定的速度前进。程序成功运行后,终端显示信息如图5所示。终端输出的“前”,表示迎宾机器人识别到宾客说话的关键词是“前”。终端输出的“0.300000 0.000000”是机器人X方向和Y方向的速度值,即机器人以0.3 m/s的速度向前走。
图5 终端显示
本文设计的基于ROS的迎宾机器人具有较好的语音交互功能,能够顺畅地与宾客进行语音交流,并且能够按照宾客的语音指令完成相应的工作任务。利用ROS可以方便快捷地进行服务机器人的语音交互工程部署,这种设计方法具有典型性和实用性,可以推广到服务机器人的其他复杂项目开发中,具有一定的参考价值和广阔的应用前景。