1.科大讯飞六麦克环形阵列板快速上手
0x00 六麦克环形阵列板简介
麦克风阵列是由一定数目的声学传感器(一般为麦克风)组成,对声场的空间特性进行采样并处理的系统。其主要作用有声源定位,抑制背景噪声、干扰、混响、回声,信号提取与分离。声源定位是指利用麦克风阵列计算声源距离阵列的角度和距离,基于TDOA(Time Difference Of Arrival,到达时间差)实现对目标声源的跟踪;信号的提取与分离是指在期望方向上有效地形成一个波束,仅拾取波束内的信号,从而达到同时提取声源和抑制噪声的目的;此外利用麦克风阵列提供的信息基于深度神经网络可实现有效的混响去除,从而极大程度上提升了真实应用场景中语音交互的效果。
本麦克风阵列采用平面式分布结构,包含6个麦克风,可实现360度等效拾音,唤醒定位分辨率为1度。
0x01 配套SDK介绍
本麦克风阵列板载系统为Linux系统,用户可以使用任一搭载Linux系统的主机进行通信,主机与麦克风阵列之间的通信方式为基于USB的自定义通信协议。基于这些协议用户可以在主机端进行诸如麦克风板开机、获取音频、设置主麦方向、获取唤醒角度等操作。为便于用户使用,本麦克风阵列配备SDK供使用,主要是对一些协议进行API的封装,以便于用户使用,除此,还提供了三个案例,供用户学习如何操作麦克风阵列以及利用麦克风阵列进行离线命令词识别和人机交互。用户也可以参照这几个案例进行其他自定义功能的编写。
- audio:用于存放录制的音频文件,音频文件的命名是自定义的,以sample文件夹中给出的mic_demo_sample为例,其程序中定义的降噪后音频文件的命名为mic_demo_vvui_deno.pcm,原始音频文件命名为mic_demo_vvui_ori.pcm。
- bin:用于存放可执行文件,call.bnf为自定义的离线命令词识别语法,可根据自己实际场景进行更改。
- include:包含麦克风阵列启动、给定案例中需要的头文件。
- libs:包含麦克风阵列启动、给定案例中需要的动态库文件,为了兼容不同的平台,给定了兼容Jetson Nano的ARM版动态库,以及兼容x64系统、x86系统的动态库。
- sample:包含给出的三个演示案例,分别是:
1)mic_demo_sample:麦克风基本功能测试用例,熟悉麦克风开机、录音、设置主麦方向、获取唤醒角度等基础功能演示demo;
2)offline_command_sample:离线命令词识别用例,通过离线命令词识别进行控制机器人运动,使用技术为讯飞离线命令词识别功能;
3)aiui_sample:在线交互用例,通过在线AIUI进行实时交互,可提供查询、闲聊等能力,该功能基于讯飞AIUI平台。
注:在每一个案例中都包含了该案例实现的源码文件,以及编译用的Makefile文件,用户可直接执行相应主机系统的.sh文件进行编译和链接以生产可执行文件。
- tmp:包含文件麦克风阵列板所需的资源文件,常态下为隐藏文件,用户可忽略。
0x02 SDK集成方式
首先进入主机(搭载linux系统的PC或ARM板),将SDK拷贝到自定义的目录中。切换到该目录中,执行如下命令解压:
$ tar xvf vvui.tar.gz
然后安装必要的声卡库:
$ sudo apt-get install libasound
完成之后,将麦克风阵列通过usb口插到主机上,然后在主机上打开终端,运行如下命令,查看是否检测到设备
$ lsusb
若检测到VID:PID为10d6:b003的设备,则设备读取成功。可以运行案例以熟悉麦克风阵列的使用过程。
0x03 基础测试用例
本案例用于帮助用户熟悉麦克风阵列的操作过程、通信协议及API。使用过程如下:
1)首先切换到mic_demo_sample所在的目录:
cd mic_demo_sample
2)依照自己的运行平台进行编译脚本文件的选择,若运行平台为Jetson Nano,则运行如下指令可生成可执行文件:
$ sh ./armv8_make.sh
若平台为linux64位操作系统,则运行如下指令:
$ sh ./64bit_make.sh
执行完如下命令后,会在bin目录中看到可执行文件.
3)动态库配置,可选方式有多种,推荐如下两种方式,任意一种均可:
方式一
首先切换到libs目录下,若主机是ARM操作系统,则执行如下命令:
$ cd ARM && sudo cp lib* /usr/lib
若主机是X64操作系统,则执行如下命令:
$ cd x64 && sudo cp lib* /usr/lib
方式二
将libs下的动态库路径添加到用户Nano或PC上的/etc/ld.so.conf。
若为Jetson Nano,则执行如下命令:
$ sudo echo "~/vvui/libs/ARM/" >>/etc/ld.so.conf /*"~/vvui/libs"务必修改为实际使用时的绝对地址*/
若为x64位PC,则执行如下命令:
$ sudo echo "~/vvui/libs/x64/" >>/etc/ld.so.conf /*"~/vvui/libs"务必修改为实际使用时的绝对地址*/
执行如下命令,使配置生效:
$ sudo /sbin/ldconfig
4)切换到bin目录下,可以执行生成的可执行文件。
$ cd ../../bin
$ sudo ./mic_demo_sample
若报错如下,可执行如下命令来查看是否有依赖的动态库未查找到,若有,则检测步骤3)是否配置成功。
$ ldd mic_demo_sample
5)测试如图所示,运行完成后,会提示1-9的命令,其中:
- 1命令是麦克风阵列开机操作,注意,在将麦克风阵列插入到Jetson Nano上时,麦克风阵列并未开机和运行。当系统检测到麦克风阵列新插入到Nano上,会进行诸如资源等一系列开机动作,在终端描述为“系统开机中”。若不出现拔插麦克风操作,仅重新启动这个节点,则不再需要开机动作,在终端描述为“系统开机正常”。
- 2命令是录制麦克风降噪音频的操作,在次之前请务必用唤醒词“小V小V”进行唤醒,否则是无法获取音频的,唤醒成功后,按下2,则开始进行录音,且在audio文件夹中会看到录制的降噪后音频mic_demo_vvui_deno.pcm。
- 3命令是停止录制麦克风降噪音频,按下3,则停止录制降噪后音频。
- 4命令是录制麦克风原始音频的操作,若在此之前麦克风阵列未被唤醒过,仍然需要再唤醒后进行操作,按下4,则开始正常录音,且在audio文件夹中会看到录制的降噪后音频mic_demo_vvui_ori.pcm。
- 5命令是停止录制麦克风原始音频,按下5即停止。
- 6是同时开启原始音频和降噪音频的录制。
- 7是同时停止原始音频和降噪音频的录制。
- 8是设置麦克风的主麦方向,可设置6个麦克风中的任意一个为主麦。
0x04 离线命令词识别用例
本案例(offline_command_sample)为离线命令词识别用例,用户可使用自定义的离线命令词的关键字进行离线下的命令下发。使用过程如下:
1)切换到offline_command_sample所在的目录:
$ cd offline_command_sample
2)依照自己的运行平台进行编译脚本文件的选择,若运行平台为Jetson Nano,则运行如下指令可生成可执行文件:
$ sh ./armv8_make.sh
若平台为linux64位操作系统,则运行如下指令:
$ sh ./64bit_make.sh
执行完如下命令后,会在bin目录中看到可执行文件.
3)动态库配置,可选方式有多种,推荐如下两种方式,任意一种均可:
方式一:
首先切换到libs目录下,若主机是ARM操作系统,则执行如下命令:
$ cd ARM && sudo cp lib* /usr/lib
若主机是X64操作系统,则执行如下命令:
$ cd x64 && sudo cp lib* /usr/lib
方式二:
将libs下的动态库路径添加到用户Nano或PC上的/etc/ld.so.conf。
若为Jetson Nano,则执行如下命令:
$ sudo echo "~/vvui/libs/ARM/" >>/etc/ld.so.conf /*"~/vvui/libs"务必修改为实际使用时的绝对地址*/
若为x64位PC,则执行如下命令:
$ sudo echo "~/vvui/libs/x64/" >>/etc/ld.so.conf /*"~/vvui/libs"务必修改为实际使用时的绝对地址*/
执行如下命令,使配置生效:
$ sudo /sbin/ldconfig
4)切换到bin目录下,可以执行生成的可执行文件。
$ cd ../../bin
$ sudo ./offline_command_sample
若报错如下,可执行命令来查看是否有依赖的动态库未查找到,若有,则检测步骤3)是否配置成功。
$ ldd offline_command_sample
5)测试
测试过程如图所示,与mic_demo_sample不同的是,本案例不再是分步操作,而是连续地自动操作,即首先检测麦克风阵列是否开机,若未开机就等待其开机,开机完成后则进入待唤醒状态。此时会提醒用户进行唤醒,若检测到唤醒成功则自动开启录音,此时说出离线命令词即可进行识别。
离线命令词为自定义的应用场景所创建的,在本例中是为控制机器人运动,其命令词包含:【你】【往、向】【前、后、左、右】【走、转】,用户说出这四组关键字中任一组合均可识别,如“往前走”、“向后走”、“向左转”、“左转”等。若要对关键字进行修改,可修改bin目录中的call。bnf文件,其格式如下:
离线命令词识别本例中给出的离线命令词是需要输入录制音频文件后进行识别,即给定4秒中的时间进行录音,命令,然后进行命令词识别。用户可参照本例和讯飞开放平台中离线命令词识别SDK进行更改,以实现不保存录音文件,直接对用户语音进行处理,根据VAD来判断语音的开头和结尾。
0x05 注意事项
【1】当购买六麦克环形阵列板后,会赠送配套的SDK代码。
【2】该麦克风阵列板使用usb连接与主机进行通信,因此只要可以插usb的linux主机基本上都可以使用。
0x06 问题反馈
大家对文章中内容有任何问题,可以直接在文章末尾给我留言,或者关注ROS小课堂的官方微信公众号,在公众号中给我发消息反馈问题也行。我基本上每天都会处理公众号中的留言!当然如果你要是顺便给ROS小课堂打个赏,我也会感激不尽的,打赏30块还会被邀请进ROS小课堂的微信群,与更多志同道合的小伙伴一起学习和交流!