談?wù)?科大訊飛持續(xù)的語音監(jiān)聽

最近要做與機(jī)器的對話app,包括命中詞,喚醒啥的,持續(xù)監(jiān)聽語音輸入,做語義解析,播報(bào)解析結(jié)果,但科大訊飛只提供單次的點(diǎn)擊式語音監(jiān)聽解析,所以需要手動實(shí)現(xiàn),解放雙手,話不多說,開干?。?!

1、首先在科大官網(wǎng)去申請秘鑰,然后在控制臺找到創(chuàng)建的應(yīng)用,點(diǎn)擊下載demo 集成


WX20201125-173127@2x.png

2、集成完畢看兩個(gè)回調(diào)函數(shù):

 private RecognizerListener mRecognizerListener = new RecognizerListener() {
    @Override
    public void onBeginOfSpeech() {
    }

    @Override
    public void onError(SpeechError error) {
        Log.d(TAG, "======onError=======" + error.getErrorCode());
        // Tips:
        // 錯誤碼:10118(您沒有說話),可能是錄音機(jī)權(quán)限被禁,需要提示用戶打開應(yīng)用的錄音權(quán)限。
        //            if (mTranslateEnable && error.getErrorCode() == 14002) {
        //                showTip(error.getPlainDescription(true) + "\n請確認(rèn)是否已開通翻譯功能");
        //            } else {
        //                if (error.getErrorCode() == 20006) {
        //                    LogUtil.d("xiaopeng", "捕獲到開啟錄音失敗的bug");
        //                }
        //                showTip(error.getPlainDescription(true));
        //            }
    }

    @Override
    public void onEndOfSpeech() {
        //  這里是 訊飛 自己停止之后的回調(diào)
        //  設(shè)置語音前端點(diǎn):靜音超時(shí)時(shí)間,即用戶多長時(shí)間不說話則當(dāng)做超時(shí)處理  我這里設(shè)置的3秒
      // mIat.setParameter(SpeechConstant.VAD_BOS, SpUtils.getInstance().getString(SpUtils.iatVadbos, "3000"));
        IatStart(); // 這里實(shí)現(xiàn)自己斷掉之后再開啟監(jiān)聽
    }

    @Override
    public void onResult(RecognizerResult results, boolean isLast) {
        if (results != null) {
            // 這里是你斷斷續(xù)續(xù)的語音輸入,是不連續(xù)的語音輸入
          }
        if(isLast){
            // 此處是 手動點(diǎn)擊識別語音完畢之后的回調(diào),這里會將你斷斷續(xù)續(xù)的說話拼接成一個(gè)完成句子;
            //  就是你從 Down 事件,到Up事件 所說的一條句子
        }

    }

    @Override
    public void onVolumeChanged(int volume, byte[] data) {
    }

    @Override
    public void onEvent(int eventType, int arg1, int arg2, Bundle obj) {
    }
};

說明:要實(shí)現(xiàn)持續(xù)監(jiān)聽做到2點(diǎn):
1、 在訊飛自己檢測到停止的回調(diào)中再次開啟;

   @Override
   public void onEndOfSpeech() {
        // 此回調(diào)表示:檢測到了語音的尾端點(diǎn),已經(jīng)進(jìn)入識別過程,不再接受語音輸入
              IatStart();
     }

2、在語音解析回來的回調(diào)中,先 IatStop() 停止監(jiān)聽,送后端做語義解析,解析完成之后再手動開啟 IatStart()

@Override
 public void onResult(RecognizerResult results, boolean isLast) {
        if (results != null) {
            // 這里是你斷斷續(xù)續(xù)的語音輸入,是不連續(xù)的語音輸入
          }
        if(isLast){
            // 此處是 手動點(diǎn)擊識別語音完畢之后的回調(diào),這里會將你斷斷續(xù)續(xù)的說話拼接成一個(gè)完成句子;
            //  就是你從 Down 事件,到Up事件 所說的一條句子
        }

 }

這樣就能持續(xù)的監(jiān)聽了,就不需要手動識別語音了!附上 start 和 stop 的方法!

  /**
 * 開始錄音監(jiān)聽
 *
 * @return
 */
public void IatStart() {
    mIatResults.clear();
    int ret = mIat.startListening(mRecognizerListener);
    if (ret != ErrorCode.SUCCESS) {
        showTip("聽寫錯誤,錯誤碼:" + ret);
    }
}

  /**
 * 停止錄音監(jiān)聽
 */
public void IatStop() {
    mIat.stopListening();
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容