智能語音識別技術-音頻實時輸入並實現人機對話

**

語音識別技術:

**
主要應用了兩個模塊的技術:
H5裏面監聽聲音分貝的大小來判斷有無人說話。
Recorder插件來實現有關音頻的輸入和輸出,將音頻以文件的形式傳輸和後端

技術背景:實現人機對話功能,其中主要是通過電腦音頻輸入,然後給出一個音頻處理後的反饋的過程。

具體實現邏輯:
第一、首先思考這幾個問題

1.如何實時監控音頻?
2.以什麼作爲起止條件?
3.結果反饋如果也是語音播放的話如何規避音頻再次發送請求?也就是說如何實現語音播放時候暫時切斷原有前後端交互。
4.如何實現與後端交互,文件傳輸怎麼實現?

二、那麼就按照這個思路我們開始整智能語音識別

首先實時監控,這個我們可以採用前端定時器setsetInterval來作爲頁面實時監控的點
其次就是有關起止條件,我們實時監聽從什麼時候開始,又從什麼時候結束呢?在這個裏面我用了H5方式來實現的,其中通過點擊按鈕的方式來觸發函數,然後實時獲取到電腦輸入音頻的實時分貝值,這些值都是實時變化的(MediaStreamRecorder.js),具體實現效果和測試地址如下:
https://codepen.io/huooo/pen/LBKPZp

可以實時獲取您音量的輸入。
那麼起止條件,這個就不是問題啦,比如說我們可以通過設置定時器,去不斷的監聽語音,只要語音的分貝值高於40你就可以默認有人說話,這個時候就可以執行錄音操作了,那麼我們還可以約定一個結束的條件,比如實時監聽的分貝值小於20且持續了3秒,那麼我們就默認結束音頻的錄入了,這樣的話就可以有效的獲取前端音頻輸入的文件。給後端處理也能做到實時性。

如何讓返回音頻播放不影響自身播放,這邊做的處理是在發送ajax請求的時候就清了原先的定時器,然後獲取返回音頻的時長,根據時長設置一個延時再重新開啓音頻可輸入的函數定時器,這樣的話就可以在一定程度上進行了規避。

具體初步效果如下:

然後文件怎麼實現傳輸呢?這個主要就是看有關這個音頻數據如何用文件的方式進行傳輸,(其實網上還有就是一種流的方式來實現的),這次着重介紹文件傳輸,衆所周知input有個file類型是可以直接上傳文件的,
但是我們這個又沒有輸入框的地方,所有的交互全靠嘴遁,那麼廢話不多說直接上代碼吧:

let file2 = new File([o.blob], name, { type: 'audio/wav' });
let formData = new FormData()
formData.append('voiceFile', file2);

這個時候就不禁有朋友問這個變量都是怎麼來的啊,尤其是o.blob怎麼來的,那麼請看上文:

這個裏面的id是一個隨機數,然後針對這個進行blob賦值.

到了這裏我們的前端就告一段落了。後面就是通過接口請求後端進行TTS和ASR來進行識別,也就是文本轉語音和語音轉文本,其中先是語音轉文字,然後將文字作爲提問傳遞給機器學習作爲訓練條件,然後得到一段訓練後的文字,最後將這個結果文本轉成音頻通過創建ftp連接存在服務中,將URL返回給前端即可播放,但是ftp建立連接可能存在問題,個人推薦sftp來做(踩過坑的教訓)。最後就是前端播放的時候將原先的定時器清除後就可以啦。

然後通過獲取音頻時長作爲延時開啓條件,避免自身播放語音干擾。
上文說到的TTS和ASR都是依賴百度的語音識別技術,存在的缺陷就是語音轉文字的過程耗時較長,相對體驗較差些。有人說科大訊飛不錯,這個沒試過有待商榷。

那麼就到這裏了,大家對語音識別有什麼問題歡迎隨時留言,一起探討一起進步。

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