2.讯飞六麦环形阵列基本功能测试
0x00 linux SDK介绍
为了方便大家更容易的上手使用该阵列板,本次课程通过三个示例演示程序,指导大家如何操作麦克风阵列以及利用阵列进行离线命令词识别和人机交互。下面是三个示例程序简单介绍:
若是第一次使用麦克风阵列未配置过udev规则,那需要按照如下命令进行配置。若已经配置过,就不必再配置了,配置udev规则只需要一次即可。在SDK的根目录下可以找到xf_mic.rules文件,该文件内容如下:
ATTRS{idVendor}=="10d6", ATTRS{idProduct}=="b003", MODE="0666"
配置命令如下,首先需要将该rules文件复制到/etc/udev/rules.d/目录下,然后重启udev服务即可,这两步操作命令分别是:
sudo cp xf_mic.rules /etc/udev/rules.d/
sudo service udev restart
执行完这两条命令,需要重新插拔一下麦克风阵列板就可以了,这样就可以保证该rules规则生效了。我们可以通过lsusb命令来检查该阵列板有没有被系统正确识别:
如果执行完lsusb命令,发现可以找到相同的vid,pid号,那么就说明麦克风阵列板已经做好准备了,可以开始接下来的使用了。
0x01 示例代码介绍
首先来查看下linux原始SDK的目录结构,如下图所示:
call.bnf 为用户自定义的离线命令词语法文件,可根据自己实际场景进行更改.在语法文件里面用户需要根据规则来定义关键语料.离线识别的命令词是开发者自己定义, 命令词最大长度为 16 个汉字, 需要先构建语法, 然后指定使用的语法。 语法文件开发文档请参考 bnf 语法规则编写指南,建议用户在编写 bnf 前,先将准备对机器人说的命令罗列下来,然后一条一条添加到 call.bnf 中,加一条测一条,这样可避免出现语法错误.简单示例:例如, 开发一个简单的语音拨号应用, 可定义如下语法:
. . . . . .
:(找一下|打电话给) ;
: 张三|李四;
. . . . . . .
该语法使识别引擎可以支持以下说法: 找一下张三 、 打电话给张三 、 找一下李四 、 打电话给李四。凡是用户说出这个范围中的任意一句话, 均可以被识别系统识别。 如果用户说的话不在上述范围中, 识别系统可能拒绝识别。
在我们开始进行编译示例代码前,还需要确保已经安装好了示例代码运行所需的一些基础软件,可以通过下面命令来安装这些软件:
sudo apt install libasound2-dev sox libsox-fmt-all mplayer
0x02 基础功能测试示例
下面可以来麦克风阵列的最基础功能,编译运行mic_demo_sample代码。由于语音库版本分为arm64、arm32、X64、X86版本,我们现在只在X64平台上给大家做演示,其他平台上操作步骤是一样的。下面以x64做演示,首先配置动态库,将其复制到/usr/lib目录下。然后就可以进入到mic_demo_sample目录下来编译该示例代码:
当编译完成后,下面开始执行该程序,测试下麦克风阵列的基本功能:
对于该示例程序中的其他功能,做如下说明:
1 命令是麦克风阵列开机操作.在将麦克风阵列插入到设备上时, 麦克风阵列并未开机和运行。 当系统检测到麦克风阵列新插入到设备上,会进行诸如资源下发等一系列开机动作,在终端描述为"系统开机中”,且麦克风有一个灯光为常亮状态, 开机时间大约在 10s.之后常亮灯灭掉, 且再次输入”1”命令, 终端描述为"系统开机正常”.在此之后,若不出现拔插麦克风操作,仅重新启动这个节点,则不再需要开机动作,输入”1”命令时终端描述为"系统开机正常”。
2 命令是录制麦克风降噪音频的操作, 在此之前请务必用唤醒词"小 V 小 V”进行唤醒, 否则是无法获取音频的, 唤醒成功后, 按下 2, 则开始进行录音, 且在 audio 文件夹中会看到录制的降噪后音频mic_demo_vvui_deno.pcm。
3 命令是停止录制麦克风降噪音频, 按下 3, 则停止录制降噪后音频。
4 命令是录制麦克风原始音频的操作, 若在此之前麦克风阵列未被唤醒过, 仍然需要再唤醒后进行操作, 按下 4, 则开始正常录音, 且在 audio 文件夹中会看到录制的降噪后音频 mic_demo_vvui_ori.pcm。目前暂不建议长时间录制原始音频.
5 命令是停止录制麦克风原始音频, 按下 5 即停止。
6 是设置麦克风的主麦, 可设置 0-5 中的任意一个为主麦
7 获取主麦克风 id,在终端会打印出来.打印结果为以 0-5 表示的麦克风 id.
下面可以通过视频来查看一下测试过程,这样会对整个过程更加了解,测试视频如下:
0x03 离线命令词识别
这个示例代码演示的是,用户可以使用自定义的离线命令词为关键字来进行识别检测。在执行本示例代码前,仍然需要配置动态库,就是将自己平台所需的语音库复制到/usr/lib目录下。如果在上一个示例程序中已经做过配置语音库的操作,这里就不必再操作一遍了。
在编译代码之前,我们需要配置一下用户接口头文件user_interface.h。该头文件主要用来设置相关参数,包括语法识别资源路径、音频文件保存路径、置信度和每一次命令识别时长等参数。只有配置好这些参数,才能开始编译程序测试。下面来查看下该头文件的代码:
下面来对头文件中的重要参数做下解释说明:
- confidence:为识别的置信度阈值,若离线识别引擎识别到的关键词的置信度大于该阈值,则认为其识别的命令词是可信的。否则是不可信的,用户可根据实际测试效果,来调节该参数,如多次出现误识别,则可调大该参数等。
- time_per_order:每次交互的时候,麦克风允许有 time_per_order 时间(单位为秒)来说出命令词,用户可根据自己实际需求,增大或减小该值。
- awake_count:本案例可实现连续离线命令词交互,每唤醒一次,可交互 awake_count 次,每交互awake_count 次,麦克风即进入休眠模式,需要二次唤醒才可进行交互。用户可根据自己实际需求增大或减小该值。
- LEX_NAME:表示语法规则的名字,离线命令词需要用户创建 bnf 语法文件,LEX_NAME 实际为 bnf 中的规则槽名称。
- APPID:用户在科大讯飞开放平台上注册账号,并创建应用后会得到一个 appid,该appid 标识一个应用,在该应用中用户可添加离线命令词识别、语音听写、语音合成等引擎。在使用离线命令词识别时,appid与离线命令词识别引擎绑定。若在使用离线命令词识别时出现11212等错误时,可能原因我appid与引擎不匹配或者 appid 过期。
- ASR_RES_PATH:离线命令词识别引擎资源路径,为 config/msc/res/asr/中的 common.jet.若在程序执行时出现”11012”错误时,表示该路径有误,你可改修改为绝对路径。
- GRM_BUILD_PATH:离线命令词识别引擎在构建离线识别网络时,生成的数据可保存的路径。
- GRM_FILE:这个是用户自定义的语法文件存放的地址.一般在 config 中。
- DENOISE_SOUND_PATH:降噪音频保存的地方,一般保存在 audio 文件夹中。
- SYSTEM_PATH:与麦克风通信相关的资源包的路径。
- SYSTEM_CONFIG_PATH:上述资源包的配置文件的路径。
在对该用户接口头文件中的各参数了解清楚,根据自己的环境配置完成后就可以来编译该测试用例了,如下图所示:
下面可以通过视频来查看下完整的编译和测试唤醒命令词识别效果,如下视频所示:
0x04 人机交互AIUI示例
什么是AIUI?AIUI是科大讯飞2015年推出的自然语言理解为核心的全链路人机交互语音解决方案,可快速让你的应用和设备能听会说,能理解会思考。AIUI语义信息透明开放,可云端接入,支持业务自由定制;接入了 AIUI 的应用和设备,可轻松实现查询天气、播放音视频资源、设置闹钟以及控制智能家居等语音交互能力。
我们这里提供一个简单的测试用例,来给大家演示六麦阵列板使用AIUI的交互效果。在编译代码前,我们仍然是需要根据自己平台来修改一下编译文件CMakeLists.txt,如下图所示:
接下来我们就可以来进行编译了,这里需要进入build目录。这里需要注意的是每次编译前,都需要把上次编译生成的文件给清除掉重新编译才可以。这里准备了一个清除脚本,方便大家来执行清除操作,直接运行clean_make.sh即可。如果提示删除的是被保护文件,直接输入’y'即可删除。整个操作过程,如下图所示:
下面我们可以通过视频演示来体验一下aiui的交互效果,视频如下:
这里如果想要修改唤醒后的交互方式,是一次唤醒一次回答,还是一次唤醒多次回答。我们可以修改aiui.cfg配置文件中的"interact_mode"参数,如果配置为"oneshot"那就是一次唤醒一次回答,若配置为"continuous",那就是一次唤醒多次交互了。值得注意的是服务端保存用户交互历史的时间最长为 120s,即如果用户说"明天天气怎么样", 接下来说"后天呢?", 会默认回答后天天气状况, 多轮对话最长时间为 120s。
0x05 注意事项
[1].在使用过程中,可能会出现不能交互且报错代码为11201的情况,其原因是本案例绑定的appid单日的交互次数已达上限,用户可以替换为自己已开通 aiui 引擎的 appid。
[2].修改appid方法是修改 AIUITester.cpp 文件中的 AIUITester::createAgent 函数里面的字符串 appid 以及 key为用户自己的。在开放平台上开通常用的语料和技能进行使用,在后续使用中若再次遇到报错代码为 11201的情况, 用户可前往控制台检查对应 appid 次数是否超过限制次数, 超过可在官网产品页面领取免费包或者购买套餐包, 未超过可提交技术工单。
[3].离线服务接口报错其他常见错误可见 https://www.xfyun.cn/document/error-code/。
0x06 问题反馈
大家在文章中有发现有任何问题,可以直接在文章末尾给我留言,或者关注ROS小课堂的官方微信公众号,在公众号中给我发消息反馈问题也行。我基本上每天都会处理公众号中的留言!当然如果你要是顺便给ROS小课堂打个赏,我也会感激不尽的,打赏30块还会被邀请进ROS小课堂的微信群,与更多志同道合的小伙伴一起学习和交流!