最近要做與機(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();
}