#MINI2440實現語音識別# (一)整體概述和實現流程記錄

原文地址: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方式實現功能 —->

  使用訊飛庫的過程中比較惱火,因爲默認不提供ARM架構的libmsc庫,導致很多問題;另外,BAT都不提供C語言下的SDK,最多提供C++下的SDK,這樣就無法充分BAT的AI平臺,所以下一步決定採用REST API的方式來實現功能。
(截至2018.3.18,已經完成基於REST API的方式訪問訊飛語音識別功能,並加入了基於WebRTC VAD的語音端點檢測機制。爲防止該篇文章過長,所以這階段的概述和流程記錄參照另一篇文章:#MINI2440實現語音識別# (三)REST API訪問和VAD端點檢測

第四階段(2018.3.18完成)

4. 源碼路徑

github:ASR-LINUX-MINI2440
github:CBB-LINUX

5. 後續思考

  就我現在對智能音箱的理解,我認爲自己後面還可以優化和學習的有:
1、遠場拾音技術,因爲在MINI2440上,我要湊近麥克風錄製聲音才能識別出結果,距離大概5釐米左右(尷尬又不失禮貌的微笑)
留坑,瞭解遠場拾音技術
2、WSN,終端麥克風多點分佈,無線數據傳輸,網關彙總分析,結果返回。
3、語音識別模型和算法(知其所以然嘛)

6. 參考文獻和參考工程

留坑

7. 聯繫方式

  歡迎各位大佬來指導、交流和討論。Email:[email protected]

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章