#MINI2440實現語音識別# (三)REST API訪問和VAD端點檢測

原文地址:http://blog.csdn.net/sinat_26551021/article/details/79602843

1.前言

  本文主要是接#MINI2440實現語音識別# (一)整體概述和實現流程記錄這篇文章繼續講。首先簡單介紹下背景。前面三個階段分別完成了嵌入式Linux最小系統移植、驅動UDA1341聲卡、跑通訊飛Demo庫,可以實現語音轉文字,但是存在幾點問題:
1、訊飛demo庫是採用動態庫的方式提供API接口,看不到內部實現方法,而且通常只提供X86、X64架構下的庫,在交叉編譯環境下需要額外申請動態庫,太麻煩;
2、其它公司BAT提供的DEMO沒有C語言實現的,這樣對我來說就等於免費資源放在那,但我就是用不上,所以決定採用REST API的方式來實現,靈活性增加;
3、前面錄音方式採用的是ALSA提供的arecord、aplay命令,存在無法錄製定長音頻、錄製音頻只能保存在文件中等缺點,靈活性很差,必須自己使用API實現;
4、前面都是先錄音成音頻文件,然後再執行程序,上傳音頻文件,最後輸出識別結果,方式太傻。所以,要加入語音活動檢測VAD,自動判斷是否有聲音,有的話則上傳音頻文件進行識別,否則不做處理。

2. 實現流程記錄

前三階段參照:
#MINI2440實現語音識別# (一)整體概述和實現流程記錄
#MINI2440實現語音識別# (二)驅動聲卡UDA1341遇到的問題和解決辦法

第四階段:採用REST API的方式調用訊飛語音識別接口 —->

1、搭建自己的工程
2、同步板上時間—> BusyBox v1.26.0中已經實現ntpd命令,所以可以使用ntpd -p cn.pool.ntp.org -qNn去同步時間
3、date -R更改時區,拷貝PC端下的/etc/localtime至板上的/etc/localtime即可。
4、弄清楚LINUX下怎麼用C實現HTTP請求,以及JSON結果解析?—–>用libcurl提供的API實現時,可以打開以下兩個選項,用於輸出更多信息方便調試。

curl_easy_setopt(curl, CURLOPT_HEADER, 1);
curl_easy_setopt(curl, CURLOPT_VERBOSE, 1);

5、HTTP HEADER格式是”X-Appid:xxxxx”,JSON格式都採用英文字符,如 : ,
6、用LINUX SHELL下md5sum命令計算MD5時,結果與Python hashlib不一致 —> 計算MD5時,LINUX內的md5sum會自動加上\n計算,而Python hashlib不會。
shell裏的md5sum生成的結果爲什麼與程序生成的不一樣
7、出錯:一直提示”無效的CheckSum”,打印:{“code”:”10004”,”desc”:”無效的CheckSum”,”data”:null,”sid”:”rwaa905617a@ched8b0e003d30000100”} —>原因:在計算CheckSum時,body部分有前綴“data=”,而在POST時,卻沒有前綴“data=”,導致校驗一直失敗。—> 調試手段:1、可以使用LINUX下面的curl命令進行HTTP POST請求,看這樣是否能成功,其中-v可用於調試

http://blog.csdn.net/fengshuiyue/article/details/39530093/
curl -X POST https://api.xfyun.cn/v1/aiui/v1/iat -H “X-Appid:xxxxxx” -H “X-CurTime:1520759784” -H “X-CheckSum:2476bc9a9dedd3b3977786cf54d1c5fd” -H “X-Param:eyJhdWYiOiAiMTZrIiwgImF1ZSI6ICJyYXciLCAic2NlbmUiOiAibWFpbiJ9” -d “MTIz” -v

8、通過WebAPI的方式調用訊飛語音識別功能,發現識別速度要比訊飛提供的SDK快。

<—- 第四階段完成

第五階段:自動喚醒識別 —->

背景:前幾階段都是先錄製好音頻文件,再手動執行程序,上傳文件識別,爲了真正滿足應用,開始加入語音喚醒功能。

1、通過WebRTC實現語音活動監測VAD
2、WebRTC包含許多功能,而且提供的源碼裏沒有提供./configure make&make install的第三方庫文件生成方式,所以把其中的VAD相關文件提出單獨編譯。
3、前階段都是採用ALSA提供的arecord命令進行錄音,不夠靈活,下面開始採用API的方式實現錄音。—> 可參照ALSA官網提供的入門文檔:《A Tutorial on Using the ALSA Audio API》
4、聲卡名字 hw:0,0
5、函數體內的字符串常量存在棧還是初始化變量區?—> 存在初始化變量區
6、調用sal_thread_create創建線程時,到snd_pcm_open時會出現段錯誤 —> 改變線程創建時的棧大小,發現段錯誤出現的位置在變化。因此推斷是由於指定的棧空間太小,導致線程出現段錯誤。使用ulimit -s命令查看線程默認棧大小
7、二進制模式和文本模式的區別?LINUX是隻有一種文件類型的系統,帶b和不帶b字母的模式相同。

C語言提供了文本模式和二進制模式,是爲了適應不同操作系統對某些符號的不同處理。當選擇不帶b的模式時,上層應用程序與操作系統之間進行數據交互時,操作系統會對內容進行一層預處理(或者說轉義),比如Windows將回車符”\r\n”解釋成”\n”。
對於相同的文件ABC(回車)D,在windows下進行處理時,不帶b的模式讀出來是ABC\nD,帶b讀出來是ABC\r\nD。
對於相同的文件ABC(回車)D,在LINUX下進行處理時,不帶b的模式讀出來是ABC\nD,帶b讀出來是ABC\nD。

8、tar.gz tar.bz的區別 —> tar zcvf .tar.gz \ tar jxvf .tar.bz2 , gz(兼顧壓縮時間和壓縮比)
Linux下常用壓縮 解壓命令和壓縮比率對比
9、fprintf和fwrite的區別?
10、如何進行端點監測?—> 持續一段時間。
python的webrtc庫實現語音端點檢測
11、 前面是在PC端的LINUX虛擬機上實現的,移植到MINI2440之後,設置channel爲1的時候出錯 —> 查找datasheet發現UDA1341只支持立體聲。
12、由於訊飛語音識別接口對音頻格式有具體要求,其中就必須要是單聲道,所以要將雙聲道轉單聲道。
【C語言】PCM音頻數據處理—左右聲道分離
13、出錯:snd_pcm_readi 返回錯誤:Broken pipe —> 通過time(0)打印時間差,發現是降噪太耗時間,導致超時,去掉降噪就可以了。
PCM音頻處理——使用WebRTC音頻降噪模塊與其他方式的對比

<—- 第五階段完成

3.源碼路徑

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

4.聯繫方式

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

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