#MINI2440實現語音識別# (三)REST API訪問和VAD端點檢測
1.前言
本文主要是接#MINI2440實現語音識別# (一)整體概述和實現流程記錄這篇文章繼續講。首先簡單介紹下背景。前面三個階段分別完成了嵌入式Linux最小系統移植、驅動UDA1341音效卡、跑通訊飛Demo庫,可以實現語音轉文字,但是存在幾點問題:
1、訊飛demo庫是採用動態庫的方式提供API介面,看不到內部實現方法,而且通常只提供X86、X64架構下的庫,在交叉編譯環境下需要額外申請動態庫,太麻煩;
2、其它公司BAT提供的DEMO沒有C語言實現的,這樣對我來說就等於免費資源放在那,但我就是用不上,所以決定採用REST API的方式來實現,靈活性增加;
3、前面錄音方式採用的是ALSA提供的arecord、aplay命令,存在無法錄製定長音訊、錄製音訊只能儲存在檔案中等缺點,靈活性很差,必須自己使用API實現;
4、前面都是先錄音成音訊檔案,然後再執行程式,上傳音訊檔案,最後輸出識別結果,方式太傻。所以,要加入語音活動檢測VAD,自動判斷是否有聲音,有的話則上傳音訊檔案進行識別,否則不做處理。
2. 實現流程記錄
第四階段:採用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”:”
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.原始碼路徑
4.聯絡方式
歡迎各位大佬來指導、交流和討論。Email:[email protected]
相關推薦
#MINI2440實現語音識別# (三)REST API訪問和VAD端點檢測
1.前言 本文主要是接#MINI2440實現語音識別# (一)整體概述和實現流程記錄這篇文章繼續講。首先簡單介紹下背景。前面三個階段分別完成了嵌入式Linux最小系統移植、驅動UDA1341音效卡、跑通訊飛Demo庫,可以實現語音轉文字,但是存在幾
小程式 語音識別(三)
在小程式語音識別(一)和小程式語音識別(二)中分別介紹了,小程式端的程式碼實現和java端的程式碼實現,下面說下其中遇到的問題: 1.語音轉換需要時間,注意在轉換完成在呼叫識別介面 2.注意識別完成後
Linux下實現視訊讀取(三)---Buffer的準備和資料讀取
前面主要介紹的是:V4L2 的一些設定介面,如亮度,飽和度,曝光時間,幀數,增益,白平衡等。今天看看V4L2 得到資料的幾個關鍵ioctl,Buffer的申請和資料的抓取。 1. 初始化 Memory Mapping 或 User Pointer I/O. int ioct
Linux與VxWorks主要區別(三):記憶體訪問和記憶體保護
Linux與VxWorks的主要區別 3、記憶體訪問和記憶體保護 Linux VxWorks 虛擬儲存 實儲存 VxWorks的核心採用實儲存管理方式,所有任務運行於同一實體地址空間,使用者程式直接操作實體地址,不能直接地提
MachineLearning— (KNN)k Nearest Neighbor實現手寫數字識別(三)
本篇博文主要結合前兩篇的knn演算法理論部分knn理論理解(一)和knn理論理解(二),做一個KNN的實現,主要是根據《機器學習實戰》這本書的內容,一個非常經典有趣的例子就是使用knn最近鄰演算法來實現對手寫數字的識別,下面將給出Python程式碼,儘量使用詳盡的解
tensorflow實現驗證碼生成及識別(三)
接上篇tensorflow實現驗證碼生成及識別(二)本篇我們將利用測試集進行預測。不好意思,來的有點晚,最近沉迷於GAN,今天才想起來驗證碼還沒完結,索性補上。測試程式碼和訓練程式碼比較類似,首先要將訓練集檔案改為測試集檔案TFRECORD_FILE = 'E:/SV
容器+AOP實現動態部署(三)
集合 tar details class 處理 tid ret con sta 上節咱們談到容器的基本特性,這次繼續說容器怎樣與AOP進行結合。增強咱們的對象。為對象加入額外的方法。 咱們下面方圖為說明 業務對象通過busi
語音識別(SR)的秘密
天上掉餡餅 mar 天上 的人 spa 谷歌 pos bottom 微軟 語音識別(SR)功能是當今國外操作系統的標準特征,而國產操作系統根本不具備這樣的特質,並且國家隊沒有相關的主觀動力。去開發實際可用的語音識別系統。與國外相比,國
Collection的實現——學生選課(三)
最大 es2017 語言 位置 一個數 超過 類型 img .cn 通過addAll方法往list對象添加課程: Course []course={new Course("3","離散數學"),new Course("4","匯編語言")};
手機對話中的語音處理(三)
高斯 color align hidden lan scss 並不是 ria data- 本系列文章由 @YhL_Leo 出品。轉載請註明出處。 文章鏈接:
ROS kinetic語音識別(轉)
line 目錄 路徑 inf AC ESS data html amd 1.安裝依賴 1.1安裝ros-kinetic-audio-common 1 sudo apt-get install ros-kinetic-audio-common
關於Unity實現AR功能(三)AR手機截圖
datetime replace ext adp screen tco 文件 unity directory 1 /************************************************* 2 * 項目名稱:AR截圖 3 * 腳本創建人
模式識別(三)非線性分類器
遇到像圖1中所示的樣本分類,線性方法是無法發揮作用的。因為塔是線性不可分的,這時候必須採用非線性方法。 1. 多層感知器網路 多層感知器包含一個以上隱層和一個輸出層,隱層將輸入對映到一個超立方體頂點,輸出層完成線性分類。通過隱層不斷對映,最終可以將樣本
智能語音計算器(三)
其中 edi tca n) 啟動 head number del += 這邊來說界面的實現,個人覺得該模塊實現有點亂,因為其中包括了錄音功能,還需要改進。 #ifndef CALCULATORUI_H #define CALCULATORUI_H #include &l
SpringCloud入門最佳實踐(三)Rest微服務構建案例工程模組
介紹 承接著我們的springmvc+mybatis+mysql初級高階課程,以Dept部門模組做一個微服務通用案例Consumer消費(Client)通過REST呼叫Provider提供者(Serv
語音識別(1)---語音識別(ASR)評估指標-WER(字錯誤率)和SER(句錯誤率)
語音識別(ASR)評估指標-WER(字錯誤率)和SER(句錯誤率) 前言 實際工作中,一般識別率的直接指標是“WER(詞錯誤率,Word Error Rate)” 定義 WER 字錯誤率句錯誤率 為了使識別出來的詞序列和標準的詞序列之間保持一致,需要進行替換、刪
windows下使用net-snmp實現agent擴充套件(三)
時間隔得太長了,我都快忘了什麼是snmp了,知識啊知識,很容易在不用的時候忘卻,也可能是自己腦袋不好使了吧?翻了翻程式碼,趕緊總結下,不然真不會了…… 在上篇部落格中,實現了get/set一個字串型變數,現在來實現對多個字串變數的get/set。假設要實現獲取CPU利用率、
動手實現 React-redux(三) Provider
react-redux.js: import React, { Component } from 'react' import PropTypes from 'prop-types' export
Spring Websocket+SockJS+STOMP 實現即時通訊(三)—— ChannelInterceptor與ExecutorChannelInterceptor
ChannelInterceptor: Message被髮送到執行緒池,在傳送動作執行前(後)攔截,發生在當前執行緒。 ExecutorChannelInterceptor: Message被髮送到執行緒池後,線上程池持有的新執行緒中,在Message
Java實現插入排序(三)
原理:每一步將一個待排序的記錄,插入到前面已經排好序的有序序列中去,直到插完所有元素為止。 思想:想必你肯定打過撲克牌吧,在一張一張揭牌的時候,是不是每次揭一張牌將其插入到其他已經有序的牌中的適當位置,如果你沒有這個經歷,趕緊約一波小夥伴,鬥一把。與選擇排序一樣,把要排序的