項目中集成科大訊飛語音識別以及隨着語音分貝的大小,聲紋波動動畫的效果,整個效果圖如下:
以下爲項目中加入語音識別模塊的流程及需要注意的問題:
1.根據科大訊飛平臺的文檔介紹,將科大訊飛語音接入項目,文檔鏈接如下:
http://www.xfyun.cn/doccenter/awd
2.項目中只需要用到語音識別,這部分有兩個類:
RecognizerDialog:識別語音功能,該類啓動之後具有科大訊飛提供的UI,RecognizerDialogListener爲其監聽類
recognizerDialog.setListener(mRecognizerDialogListener);
recognizerDialog.show();
上段代碼用於設置其監聽類,返回語音識別結果SpeechRecognizer:識別語音,該類與RecognizerDialog區別在於,不提供UI界面,RecognizerListener爲其監聽類
int ret=speechRecognizer.startListening(mRecognizerListener);
if (ret!=ErrorCode.SUCCESS){//此時聽寫失敗
showTip("聽寫失敗,錯誤碼:"+ret);
}
ret爲返回碼,判斷監聽狀態
兩個類中,只需要用到其中一個即可,若兩個同時用到,則SpeechRecognizer會被覆蓋,在其監聽類中回調接口中,結果不完全。
3.使用語音識別時,點擊按鈕啓動相關類之後,直接說話即可,不需要長按按鈕;但是用到的一般都是類似微信語音的模式,長按發送語音,因此Demo中仿照微信語音的模式,具體代碼如下:
//按住說話
btn_start_voice.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View view, MotionEvent motionEvent) {
switch (motionEvent.getAction()) {
case MotionEvent.ACTION_DOWN:
Log.i(TAG,"ACTION_DOWN");
mIatResults.clear();
setSpeechParam();
int ret=speechRecognizer.startListening(mRecognizerListener);
if (ret!=ErrorCode.SUCCESS){//此時聽寫失敗
showTip("聽寫失敗,錯誤碼:"+ret);
}
break;
case MotionEvent.ACTION_UP:
Log.i(TAG,"ACTION_UP");
speechRecognizer.stopListening();
break;
}
return true;
}
});
上述代碼即可實現長按識別語音,在鬆開按鈕時,調用speechRecognizer.stopListening();即可,若調用speechRecognizer.cancel();則在其監聽類中無回調結果;
4.聲紋波動動畫,在Android Studio項目中的buidle.gradle文件中,配置compile 'com.carlos.voiceline:mylibrary:1.0.6'即可使用該控件,xml文件如下:
<com.carlos.voiceline.mylibrary.VoiceLineView
android:id="@+id/voicLine"
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="1.5"
android:background="@android:color/white"
voiceView:maxVolume="60"
voiceView:middleLine="@android:color/black"
voiceView:middleLineHeight="1dp"
voiceView:fineness="three"
voiceView:rectSpace="2dp"
voiceView:rectWidth="5dp"
voiceView:sensibility="four"
voiceView:viewMode="line"
voiceView:lineSpeed="90"
voiceView:voiceLine="@android:color/holo_green_dark" />
maxVolume爲最大波動值,源碼中根據該值與輸入的語音分貝大小計算波動幅度;sensibility爲聲音敏感度的檢測,“five”爲最高,(1-5 設置時均爲對應的英文設置)
5.聲紋波動設置:voicLine.setVolume();此句設置聲紋波動;開始使用MediaRecorder類來獲取錄入語音的分貝值大小,但是在部分手機上會由於MediaRecorder佔用了錄音資源而導致科大訊飛啓動錄音失敗。
具體Demo代碼在已上傳到資源,下載後將在科大訊飛平臺申請的APPID,在Application裏面替代即可。