1. 程式人生 > >【QT分享】基於QT+科大迅飛的連續語音識別

【QT分享】基於QT+科大迅飛的連續語音識別

【QT分享】基於QT的連續語音識別 [複製連結]
電梯直達
跳轉到指定樓層
21189
樓主| TShadow 發表於 2017-3-13 19:56:21
1#
本帖最後由 TShadow 於 2017-3-13 19:56 編輯


作業系統:windows 10 x64
測試版本:Qt 5.8 mingw

本貼提供一個基於QT的連續語音識別Demo,通過音量大小判斷音訊錄入的開始和結束,在附件的程式碼裡,實時音量跟蹤和錄音都被封裝成了獨立的類,大家可以在記的程式碼裡匯入這些類並直接使用,即可實現連續語音識別了。

  1. MicAudio類
    提供兩個可呼叫的函式,很簡單。

    1. void startListen() : 開始監聽音量
    2. void stopListen():停止監聽音量
      重新整理時間可以在函式內部自行修改,當捕獲到音量時會自動發出一個signal,在主函式中connect一下並在slot裡操作即可。
  2. WaveRecorder類
    主要用到的就是void set_FileName(QString des_path),void Start(),void Stop(),void Reset()

    1. void set_FileName: 設定錄音檔案
    2. void Start: 開始錄音
    3. void Stop: 停止錄音
    4. void Reset: 重置引數
      這個類很簡單,但是呼叫的是win底層api,QT在使用之前需要先在pro檔案里加載libwinmm.a,這個我已經在demo配置好了,libwinmm.a就在目錄下。
  3. iFlyVoice類
    這個類相對於之前的版本(http://bbs.xfyun.cn/forum.php?mo … id=24654&extra=)做了修改,繼承了QThread,程式中是以新的執行緒執行的,為什麼這麼做後面會說。主要用到以下函式:

    1. bool login(const char* login_param):登入操作,返回登入是否成功。記得填好自己的appid
    2. bool logout():退出操作,很簡單。
    3. void speech2Text(const char* audioFileName, int iaccent, char *grammarId):主要就是語音轉文字,具體介紹可以看code裡面的說明,這個函式會通過繼承QThread的run函式在新的執行緒裡面執行,以start函式自動呼叫run。

主函式的整體思路:
由MicAudio類實時監聽音量變化,當超過一定數值就開始由WaveRecorder類錄音,為什麼不用Qt自帶的錄音,一是避免實時監聽和錄音的衝突,二是底層API的效率會高一些,可以有效避免衝突。當音量低於一定數值時,自動停止錄音,然後呼叫iFlyVoice類開闢新的執行緒並進行翻譯,然後顯示出結果。其實,我也試過用QAudioRecorder錄音,但是效果總是不好,於是拋棄了。

提示:程式碼中的appid已經刪除,請填寫自己的,msc.dll也使用自己的吧,如果遇見未啟動就crash,基本上是msc.dll沒放好的原因。其他的操作也可以看參考之前的帖子,就是寫的有點亂。http://bbs.xfyun.cn/forum.php?mo … id=24654&extra=