原文地址:http://blog.csdn.net/sinat_26551021/article/details/79476056
1. 前言
2017年,随着以深度学习为代表的的人工智能火热,智能音箱也跟着着实火了一把,各大厂都陆续都推出自己的产品。本着对新事物、新技术的好奇心,是时候祭出自己吃灰的老古董了 —> MINI2440开发板。(截止目前,(2018.3.6)已经成功在板上实现语音识别(语音转文字),为了防止自己遗忘,在该阶段对自己的思路进行梳理和记录,并进行相关知识点的总结)
2. 整体概述
既然智能音箱叫智能,那么肯定就要有和人之间的交互方式,所以上面肯定要有个麦克风,好像说了一段废话:)。查查MINI2440上的外设资源,好像有个叫UDA1341的声卡芯片,既然是声卡,那么肯定和声音有关系,好像又说了一段废话:),所以我们首要的任务就驱动这个声卡,完成声音的录制和播放。既然涉及到驱动,那肯定就涉及到内核了,那么顺便再来个内核移植好了,既然都玩内核移植了,那么要移植就移植一整套的,所以第一阶段任务 —> 完成嵌入式Linux最小系统移植,包括uboot、kernel、rootfs。
完成最小系统移植之后,就需要进行声音录制,这里涉及到Linux内核中的音频子系统相关知识,详细知识几十个这么长的篇幅都讲不完,这里就不进行展开,只要知道音频子系统有OSS和ALSA两大架构,其中OSS已经逐渐被淘汰了,ALSA是主流的音频架构,而ALSA提供的工具集中有arecord、aplay命令,可以用来录制和播放音频,初期我们暂时用这个进行测试,后续可以用ALSA提供的API实现。
此时我们应该已经能录制音频,下一步就该进行音频识别了。作为人工智能小白,不会深度学习怎么办,不会巴拉巴拉模型算法,怎么办?这个时候当然是选择抱大腿了啊,目前比较粗的大腿有:BAT大佬、讯飞 ,先去各位大佬官网瞧一瞧。四家了解之后,发现BAT这么厉害,当然是选择讯飞啦。其实主要原因是只有讯飞提供了C语言的SDK,作为只会C语言的战五渣,只能首选讯飞啦。
阿里AI平台:https://www.aliyun.com/
百度AI平台:https://ai.baidu.com/
腾讯AI平台:http://ai.qq.com/
讯飞AI平台:http://www.xfyun.cn/
3. 实现流程记录
到此,基本的路线和要实现的目标都已经订好了,可以开始我的作死之路了,这里都是仅对流程以及遇到的问题进行记录,详细的原因和总结将分多篇进行展开。
第一阶段:编译最小系统 —>
1、编译uboot2014,使用了4.7.3的交叉编译工具,编译成功,烧入板后无法启动.
2、编译uboot2012,使用了4.7.3的交叉编译工具,编译成功,烧入板后无法启动.
3、编译uboot2012,改用了4.4.3的交叉编译工具,编译成功,烧入板后正常启动.
4、编译kernel-4.0,编译成功,并成功烧入板中加载。
5、编译busybox-1.26.0,编译成功,成功烧入板中加载。
这部分的具体步骤可参照我的其它文章:
#嵌入式Linux最小系统移植# 对uboot移植和裁剪的一点点个人思考和总结
#嵌入式Linux最小系统移植# yaffs2根文件系统移植出错记录
#嵌入式Linux最小系统移植# busybox分析和移植记录
#嵌入式Linux最小系统移植# mini2440内核4.0.8移植记录
#嵌入式Linux最小系统移植# mini2440最小系统移植可用源码
<— 第一阶段完成
第二阶段:驱动声卡UDA1341 —>
1、配置kernel4.0支持sound card,成功识别出声卡。
2、使用ALSA工具arecord、aplay进行测试,报dma错误。
3、 前面一直鼓捣kernel4.0,一直搞不定,一怒之下改用kernel-3.6.5,编译成功并识别出声卡。
4、使用aplay播放音频时,提示找不到soundncard,查看/dev下没有生成节点。
解决办法:mdev详解
4、使用aplay正常播放音频,但是arecord就是无法录到声音。
5、阅读原理图后发现,板上UDA1341有两个输入端,要选择VIN2,更改后成功录制声音。
解决办法:#MINI2440实现语音识别# (二)驱动声卡UDA1341遇到的问题和解决办法
6、aplay播放音频时,发现声音会一直循环,更改dma.c后解决。
解决办法:#MINI2440实现语音识别# (二)驱动声卡UDA1341遇到的问题和解决办法
<— 第二阶段完成(可录制和播放音频)
第三阶段:尝试iFlytek-Demo程序 —>
1、在自制的rootfs上敲ifconfig时出错,原因是在/etc/init.d/rcS中没有mount -a 。
2、在/etc/init.d/rcS中export PS1没起作用,在/etc/profile中则可以。
3、讯飞提供的SDK中只有x86和x64的libmsc.so库,通过讯飞提供自动编译网站获得交叉编译下的libmsc.so库。
讯飞:Linux平台库文件交叉编译申请链接
4、使用tftp下载libmsc.so时发现,丢包率极高,tftp极易timeout,更改dm9000.c后解决。
主要原因是原始的DM9000驱动没有完全适配MINI2440,解决办法可参考以下链接:
Linux2.6.32移植到MINI2440(4)移植+分析DM9000网卡驱动
5、在板上下载asr_sample、libmsc.so后,可正常运行,但上传语法失败,应该是因为无法连通外网。
6、ping 8.8.8.8时,提示“network unreachable”,添加默认网关即可,route add default gw 192.168.0.1。
解决ARM板上无法ping域名的方法
7、ping www.baidu.com时提示“bad address”错误 。
解决办法:删除/etc/nsswitch.conf,在resolv.conf中添加nameserver 8.8.8.8
解决ARM板上无法ping域名的方法
8、跑asr_sample-Demo程序时,识别结果不对 —> 讯飞工程师说在线命令词产品已经下线,建议使用离线命令词识别。
9、生成的交叉编译库只支持在线服务,所以离线命令词无法使用。
讯飞:Linux平台库文件交叉编译申请链接
本页面为Linux平台应用提供ARM、MIPS架构语音SDK库文件的交叉编译服务。
针对32&64位x86架构和树莓派的库文件已经在默认SDK包中给出,无需再次提交申请。
库文件会包含已经添加的在线服务和已添加并购买成功的离线服务。
我们会在3个工作日内完成编译,并通过邮件发送编译好的库文件。
10、跑iat_sample-Demo程序,都采用PC端虚拟机下用arecord命令录制的音频文件,PC端和ARM端都可以识别出来。
11、在ARM上arecord的wav文件,通过aplay可正常播放,但是放到PC端播放就会出现卡顿,反过来(在PC端arecord)一样的。
12、11中的原因已经找到, kernel-dma.c中的audio_buffdone有BUG。
解决办法:#MINI2440实现语音识别# (二)驱动声卡UDA1341遇到的问题和解决办法
<— 第三阶段完成
第四阶段:采用REST API方式实现功能 —->
1、使用讯飞库的过程中比较恼火,因为默认不提供ARM架构的libmsc库,导致很多问题;另外,BAT都不提供C语言下的SDK,最多提供C++下的SDK,这样就无法充分BAT的AI平台,所以下一步决定采用REST API的方式来实现功能。
第四阶段(TO BE CONTINUE)
4. 源码路径
5. 后续思考
就我现在对智能音箱的理解,我认为自己后面还可以优化和学习的有:
1、远场拾音技术,因为在MINI2440上,我要凑近麦克风录制声音才能识别出结果,距离大概5厘米左右(尴尬又不失礼貌的微笑)
留坑,了解远场拾音技术
2、WSN,终端麦克风多点分布,无线数据传输,网关汇总分析,结果返回。
3、语音识别模型和算法(知其所以然嘛)
6. 参考文献和参考工程
7. 联系方式
欢迎各位大佬来指导、交流和讨论。Email:zengchao@cqu.edu.cn