周 君,刘 璟
(东南大学 仪器科学与工程学院,南京 210096)
移动互联网、云计算以及人工智能的飞速发展为酒店智能化服务提供了软硬件基础支持,酒店服务机器人的发展和应用为传统酒店服务行业实现转型提供了契机[1]。服务型机器人按照用途可分为娱乐服务机器人、家庭服务机器人和专业服务机器人[2]。专业服务机器人主要用于特定场所,代替人完成特殊任务,酒店服务机器人属于其中一种。目前针对酒店服务机器人的研究相对较少,与其它服务机器人相比,酒店服务机器人应用前景广阔,同样具备实际应用开发与研究价值[3]。目前市场上酒店服务机器人与用户之间的交互,仍然通过键盘—界面的方式,或者只是简单地将语音输出,并没有真正解放用户、实现智能化交互。本文设计的面向酒店服务机器人的智能语音交互系统,可以通过语音输入命令,结果可通过语音输出或由机器人直接执行相应动作,且创新性地在语音交互之前添加了人脸检测功能。系统只有检测到人脸才进行语音交互,减少了周围噪声的影响,提高了语音识别率,可给客人提供良好的语音交互体验。
硬件平台使用广州友善之臂Tiny4412,采用基于三星Cortex-A9架构的Exynos 4412四核处理器,内部集成了图像处理器GPU,使用两级缓存机制。板子上集成载有1GB的DDR3内存、4GB的高速eMMC闪存、TTL串口、LCD接口、SD卡座等[4]。S702是友善的7吋电容屏,通过LCD排线与开发板LCD接口连接。友善之臂的CAM500A摄像头模块通过FPC排线与开发板的DVP CAMERA摄像头接口连接。友善之臂的YS6010无线模块主要采用AP6210无线模组,内部集成 SDIO 接口的 WiFi 芯片和 UART 接口的低功耗蓝牙4.0,直接与底板WiFi&Bluetooth插座连接。整个硬件框架如图1所示。
图1 系统硬件框架
在开发板tiny4412上烧入Android5.0.2系统,在电脑端进行软件开发环境搭建工作:安装JDK、 Android studio及SDK包。系统最后以语音交互的应用程序实现,打开APP即处于人脸检测中。一旦检测到人脸就进入语音交互Acitivity,首先打开语义理解接口,让服务机器人能够听懂客人的话语。从科大讯飞的AIUI开放平台上返回结果后,打开语音合成接口,将结果以语音形式反馈给客人。系统处于语义理解和语音合成循环中,一旦语义理解的返回结果为 “语法识别”或者在点击界面上的语法识别按钮后即开始语法识别,根据构建的语法文件开始识别客人的命令。如果构建的语法中有相应规则,则可得到识别结果并执行相应动作。如果没有得到相应结果,则再次回到语义理解,与客户重新交流。整个系统软件流程如图2所示。
图2 系统软件流程
本文利用OpenCV库中的AdaBoost算法API实现 Android 平台中的人脸检测。AdaBoost人脸检测算法由 P Viola等[5]提出,作为一种迭代算法,其核心思想是:从人脸图像中抽取大量简单特征,有些特征具有一定的人脸和非人脸区分能力,随后通过从众多特征中选出分类能力较强的特征作为弱分类器,并将弱分类器进行有效组合从而构成强分类器[6]。
从OpenCV的官网下载最新的OpenCV-3-4-0android-sdk,其包含了OpenCV库函数和训练好的模型等。OpenCV库提供了两种已经训练好的 AdaBoost人脸分类器,一种是Haar级联分类器,保存于haarcascade_frontalface_alt2.xml 描述文件中;另一种是LBP级联分类器,保存于 lbpcascade_frontalface.xml描述文件中。与Haar级联分类器分类器相比,局部二值模式(Local Binary Patterns,LBP)级联分类器处理的是整型值,而不是双精度值,因此检测速率更快[7]。为了达到较好的实时性,让酒店客户有更好的服务体验,本文选用基于LBP 特征的人脸分类器进行人脸检测。人脸检测流程如图3所示。
图3 人脸检测流程
本文利用讯飞开放平台实现Android 平台语音交互。讯飞开放平台以“云+端”的形式向开发者提供语音合成、语音识别、语音唤醒、语义理解、人脸识别、个性化彩铃和移动应用分析等多项服务[8-9]。
首先,在科大讯飞官网申请讯飞开发账号,创建一个名为 “酒店服务机器人语音交互-Android”的应用,开通在线语音合成、在线命令词识别、语音听写和AIUI平台的服务,下载相应服务组合的Android版SDK[10-11]。在Android项目中导入SDK中的 libms.cso、libaiui.cso[12-13],再添加用户权限,新建一个Application类,在其中初始化语音配置对象,写入在官网申请的APPID,然后即可在Activity中使用语音功能函数,实现所需的功能。整个语音界面如图4所示,用EditText显示语义理解和语法识别的返回结果,用户可以直接点击下栏4个按钮。
图4 语音交互界面
2.2.1 语音合成
语音合成,又称文语转换技术,能将任意文字信息实时转化为标准流畅的自然语音并朗读出来[14]。系统检测到人脸后,进入语音交互Activity,以语音形式欢迎客人入住酒店,首先必须调用语音合成接口,还需设置发音种类、发音人、语速、音量等,一般已经有默认值,客人也可点击菜单栏设置和发音人按钮重新选择。参数设置和发音人选择界面如图5、图6所示。
图5 语音合成参数设置
图6 发音人选择设置
整个语音合成流程如图7所示。
图7 语音合成流程
2.2.2 语义理解
语义理解主要是把自然语言内容转换为有一定结构的文本数据,使应用能够抓取其中重点数据,理解用户使用意图。本文通过在科大讯飞官网上自定义的语义理解库,在本文Android项目中调用科大讯飞的AIUI接口实现语义理解。AIUIAgent是与AIUI交互的桥梁,提供有创建AIUIAgent实例接口,发送AIUIMessage控制AIUI运行接口、销毁AIUIAgent实例接口以及监听AIUI服务抛出AIUIEvent的监听器AIUIListener。AIUI内部具有3种工作状态:STATE_IDLE(空闲)、STATE_READY(就绪)和STATE_WORKING(工作),AIUI只有在工作状态时才能进行录音交互。整个语义理解AIUI流程如图8所示。
图8 AIUI流程
AIUI进入工作状态后,通过监听器AIUIListener监听各种 AIUIEvent。该系统主要对结果事件AIUIConstant.EVENT_RESULT和服务状态事件AIUIConstant.EVENT_STATE进行处理。
AIUI进入工作状态后,默认的交互模式为持续交互模式,即“一次唤醒,多次交互”,但长时间没有交互将再次进入空闲状态,抛出AIUIConstant.EVENT_STATE事件。若检测到进入空闲状态,表示AIUI服务没有停止,但已经长时间不需要AIUI服务,将关闭AIUI服务,重新回到人脸检测Activity中,检测客人是否还在。
结果事件AIUIConstant.EVENT_RESULT主要针对科大讯飞AIUI开放平台返回的数据进行处理。在AIUI开放平台上可以自定义问答,添加开放问答和开放技能。定义一个语法识别的自定义问答,问题是要进行语法识别和命令词识别的不同说法,回答只有语法识别。当解析的结果为“语法识别”时,将关闭AIUI服务,开始语法识别。对于其它解析结果,都将调用语音合成接口,以语音形式回答客户的问题。
2.2.3 语法识别
语法识别是基于语法规则,将与语法一致的自然语言音频转换为文本输出的技术[15-17]。语法识别的结果值域只在语法文件列出的规则里有很好的匹配率,多用于要求结果更准确且说法有限的语音控制中,本文将语法识别用于下位机机器人的运动控制模块。
ABNF范式,即扩展的增强型巴克斯范式,主要用于文本编码,具有合理的表达能力、简单明了的编写规范和高效的压缩效率[18]。本文采取ABNF格式构建云端语法文件,代码如下:
String mCloudGrammar = "JHJABNF 1.0 UTF-8; " +
" language zh-CN; " +
" mode voice; " +
" root MYMmain; " +
" MYMmain =[我] [想] [MYMgo] ( MYMopera1 | MYMlocation) ; " +
" MYMgo = 去 | 要 | 到 | 向 ; " +
" MYMopera1 = 前进 | 后退 | 原地左转 | 原地右转 |前进左转 |前进右转; " +
" MYMlocation = 电梯 |会议室 | 图书馆 |东南大学;";
文法等同于正则表达式,定义了一个句子集合。用root指定规则,可选部分用中括号[ ]标记,几个输入路径里选择一个时并用 | 分隔[19]。当表示“去电梯”时:“想去电梯”、“去电梯”、“我想去电梯”等说法都可被系统匹配。
整个语法识别流程如图9所示。
图9 语法识别流程
语法识别开始后,语法识别监听器开始监听“开始说话”、“结束说话”、“音量变化”、“返回结果”等事件。在结果事件中,主要解析和处理语法识别的结果。对于无法匹配语法规则的语音都返回“没有匹配结果”字符串,并停止语法识别,重新开始语义理解。对于匹配语法规则的语音则返回相应结果,并进入结果处理函数。在结果处理函数中,提取语音命令的主要部分,即MYMopera1 或MYMlocation 中的字,使多种表达对应同一意思的命令得到统一处理。
对前进、后退、原地左转、原地右转、前进左转、前进右转6个命令除了前期命令的处理外,还可向下位机发送不同的串口数据,控制下位机运动。串口通信协议统一规定波特率为9 600bps,8位数据位,1位停止位,无奇偶校验位[20]。整个串口的数据格式为。
<数据起始头部><指令类型><数据值><校验部分><数据终止尾部>
数据起始头部:7E;数据终止尾部:0D 0A。指令类型长度为一个字节,数据值长度为4个字节,校验部分为1个字节[21]。数据值表明相应距离和角度,指令与指令类型如表1所示。在Android项目中,通过加载友善之臂提供的函数库libfriendlyarm-hardware.so文件直接操作串口发送数据。
表1 发送指令与指令类型对应结果
在开发板Tiny4412上安装“语音交互”应用程序,对应用程序进行测试,结果如表2所示。
表2 应用程序测试结果
本文设计的酒店服务机器人智能语音交互系统,融合了视觉、语音、智能人机交互和网络等核心技术,良好地处理了人脸检测、语音合成、语义理解与语法识别间的逻辑关系。测试结果表明,系统人脸检测和语音合成十分完好,语义理解准确,语法识别率较高,做到了听懂客人问题、正确回答客人问题和响应语音命令,能够直接运用于实际。