10

杨二凯 · 1月16日

基于EAIDK-310和SoundAI Azero的语音交互系统

一、概述

语音交互技术的发展,给我们的生活带来了很大的改变,智能音箱就是其典型的应用产品,比如现在常见的小爱、小度、天猫精灵等智能音箱。我们通过与智能音箱对话,就可以实现听歌、听书、听新闻等等功能。

今天,我们就介绍下以EAIDK-310开发套件为核心,“制作”一款智能音箱,通过语音交互,让它给我们唱歌、读书、讲段子。

二、产品介绍

EAIDK(Embedded Artificial Intelligence Development Kit)- 嵌入式人工智能开发套件,是全球首个采用Arm架构的人工智能开发平台,是OPEN AI LAB专为 AI 开发者精心打造,面向边缘计算的人工智能开发套件。硬件平台具备语音、视觉等传感器数据采集能力,及适用于多场景的运动控制接口;智能软件平台支持视觉处理与分析、语音识别、语义分析、SLAM等应用的基础平台和主流开源算法,满足端侧AI教育、算法应用开发、产品原型开发验证等需求。

EAIDK-310作为EAIDK产品系列中的一款套件,该套件硬件平台使用的是含有4核A53 CPU的高性能Arm SoC(瑞芯微rk3228H),通过搭载OPEN AI LAB开发的嵌入式深度学习框架Tengine,为AI应用提供简洁、高效、统一的API接口,加速终端AI产品的场景化应用落地实现。同时,使用自建的源服务器,便于用户快速上手使用。

EAIDK平台,配置专有更新源文档内容服务,该源服务器支持Tengine/Blade CV以及其他标准第三方软件安装和更新。
image.png

EAIDK-310 硬件规格
image.png

EAIDK-310 软件规格
image.png

实现本案例除了需要一块EAIDK-310核心板,我们还需要一个usb麦克风阵列和一个usb音箱 。麦克风阵列用于音频采集,usb音箱用于音频播放。

本案例中我们使用的是4mic麦克风线型阵列SoundPi linear麦克风模组,可点击此处购买。

三、操作步骤

3.1 环境配置

软件运行需要依赖VLC库,按照下方步骤安装VLC

sudo dnf install https://download1.rpmfusion.org/free/fedora/rpmfusion-free-release-$(rpm -E %fedora).noarch.rpm
sudo dnf install https://download1.rpmfusion.org/nonfree/fedora/rpmfusion-nonfree-release-$(rpm -E %fedora).noarch.rpm
sudo dnf install vlc

EAIDK支持耳机和HDMI接口输出音频,需要使用命令进行切换,切换后需要重启。
操作步骤如下:

  1. 点击左下角LXTernimal(左下角第三个,黑色)打开Terminal窗口。
  2. 输入命令wget ftp://ftp.eaidk.net/Tools/switch_card.sh 下载音频切换脚本。
  3. 使用chmod +x switch_card.sh命令,对脚本赋予执行权限
  4. 使用HDMI进行播放需要输入如下命令并重启板卡:
./switch_card.sh hdmi

使用耳机进行播放需要输入如下命令并重启板卡:

./switch_card.sh headphone

音频播放工具需要安装sox工具,安装方法:

sudo dnf install sox-devel

下载测试音频

wget ftp://ftp.eaidk.net/EAIDK310_Source/SoundAI/WestCoastMassive.mp3

播放音频命令:

play WestCoastMassive.mp3

3.2 下载源码

首先我们从下面链接中下载源码包Azero_SDK_for_Linux.tar.gz
ftp://ftp.eaidk.net/EAIDK310_Source/SoundAI/

把下载好的源码包拷贝到U盘,把U盘插入EAIDK310设备usb口,将源码包拷贝到板子目录下

cp /run/media/openailab/Azero_SDK_for_Linux.tar.gz ~

解压源码包Azero_SDK_for_Linux.tar.gz,然后进入Azero_SDK_for_Linux目录

tar -xzvf Azero_SDK_for_Linux.tar.gz 
cd Azero_SDK_for_Linux/

可以看到,SDK工程结构如下

|-- sai_config : 配置文件、唤醒模型目录
|-- include : Azero SDK的.h文件
|-- link-libs : 编译示例代码所需的依赖库,目录中分版本放置。
     |-- lib : Azero SDK库
     |-- libvlc : SDK依赖的播放器库,默认支持的播放器为VLC
     |-- 其它 : 其它类型的播放器,视版本而定
|-- src : 示例代码
     |-- main.cpp
|-- toolchain-cmake : cmake交叉编译配置文件

3.3 修改文件参数

下载源码后,我们需要根据我们设备实际情况修改某些文件参数,如麦克风节点、比特率等。

首先将麦克风通过USB接口连接到EAIDK-310开发套件
image.png

此时可以在开发套件上用命令可查询到麦克风线性阵列的设备节点,结果如下:

arecord -l

image.png

从上图可知,card2就是我们的usb麦克风阵列,设备节点为2,0

修改代码Azero_SDK_for_Linux/src/main.cpp的麦克风数量mic_num和实际节点号*hw,此麦克风比特率默认16000。

void* load_plugin_basex() {  
    void *handle;  
    int mic_num = 4;  
    int board_num = 8;  
    int frame = 16*16;  
    const char *hw = "hw:2,0";   
    char chmap[16] = "0,1,2,3,4,5,6,7";  
    handle = SaiMicBaseX_Init(board_num, mic_num, frame, hw);  
  
    SaiMicBaseX_SetBit(handle,16);  
    SaiMicBaseX_SetSampleRate(handle,16000);  
    SaiMicBaseX_SetMicShiftBits(handle,16);  
    SaiMicBaseX_SetRefShiftBits(handle,16);  
    SaiMicBaseX_SetPeroidSize(handle,512);  
    SaiMicBaseX_SetBufferSize(handle,2048);  
注:在修改上述参数之前,我们可以先使用arecord进行录音测试,看是否能够正常获取音频数据,以此为依据来确认我们mic的具体参数
arecord -Dhw:2,0 -d 10 -f S16_LE -r 16000 -c 8 -t wav test.wav
参数解析
-D 指定了录音设备,2,0card 2 device 0的意思
-d 指定录音的时长,单位时秒
-f 指定录音格式
-r 指定了采样率,单位时Hz
-c 指定channel 个数
-t 指定生成的文件格式

拷贝资源及配置文件到/data目录

sudo mkdir -p /data
sudo chmod 777 /data
sudo cp sai_config/arm/* /data -rf

设置环境变量,指定动态链接库路径

export LD_LIBRARY_PATH=./link-libs/aarch64-linux-gnu/lib/

3.4 编译运行

根据麦克风实际情况修改完上述参数后,即可执行编译

./run.sh aarch64-gnu

编译成功的话会显示如下
image.png

执行如下命令来启动软件

./sai_client

启动软件之后,在联网的情况下,通过喊 “小艺小艺”来唤醒设备,然后即可进行语音交互。将 usb音箱接到EAIDK-310开发套件上,即可听到小艺的回应。

到这里,我们就可以与小艺进行对话了。除常见的聊天、新闻、广播、天气、音乐等功能外,还可以查百科、查路况、听相声、做算术等,有几十项实用、好玩的技能,内容还是比较丰富的,可以满足简单的娱乐需求。

3.4 补充

main.cpp软件初始化时有三个重要参数:clientIdproductId以及device_SN(Device Serial Number)。其中,clientIdproductId用以标识产品类别,device_SN用以标识个体设备。

//config customer info     
const char *client_ID = "xxxxxxxx"; //set to your own client     
const char *product_ID = "xxxxxxxx"; //set your owner product ID     
const char *device_SN = "xxxxxxxx"; //set the unique device SN.
azero_set_customer_info(client_ID,product_ID,device_SN);

此处软件已经配置了默认的ID ,所以上面我们跳过了这个步骤;如需使用自己创建的技能,可以参考https://github.com/sai-azero/Azero_SDK_for_Linux的《示例运行》,注册、填写自己的clientIdproductId以及device_SN等参数,重新编译运行即可。

关于麦克风阵列,此处使用的是声智科技的4mic线型阵列,另外也可以使用声智科技的6mic环型阵列,如下图
image.png

四、总结

此案例可以帮助大家在EAIDK-310开发套件上完成SoundAI Azero语音交互系统示例的部署和运行。

通过此案例,EAIDK-310摇身一变,成为了我们所熟知的智能音箱。智能语音助手是存在于智能音箱中的虚拟形象,当你无聊的时候,或者需要提神醒脑的时候,可以试着问它一些“有趣的问题”,或许能够得到一些“有趣的回答 ”。

如有疑问或想要了解更多关于EAIDK开发平台方面的内容,欢迎加入EAIDK开发者大本营,QQ群:625546458。
image.png

更多EAIDK相关阅读:

基于EAIDK的人脸算法应用(一)

基于EAIDK的人脸算法应用-源码解读(二)

基于EAIDK-310的传感器调试案例介绍(一)

基于EAIDK-310的传感器调试案例介绍(二)

推荐阅读
0 条评论
关注数
1271
内容数
53
EAIDK开发者社区和你分享入门和进阶教程、应用案例以及最新的功能解读;你还可以在社区随时提问,会有技术一对一解答;同时,工程师团队会定期在线直播分享答疑解惑。 所有开发者均可以发布自己的案例文章、图文教程等,社区会定期评选社区贡献奖项。
目录
极术微信服务号
关注极术微信号
实时接收点赞提醒和评论通知
Arm中国学堂公众号
关注Arm中国学堂
实时获取免费 Arm 教学资源信息
Arm中国招聘公众号
关注Arm中国招聘
实时获取 Arm 中国职位信息