目錄
因爲最近項目需要,需要集成語音識別的功能,這裏記錄下科大訊飛語音識別的集成和使用,也方便其它小夥伴參考,如果哪裏有問題,可以提出來以便改正。
一、準備工作
1、註冊一個訊飛開放平臺賬號,官網https://www.xfyun.cn/
2、登陸賬號之後,在首頁進入“控制檯”。
3、 進入控制檯後,選擇“創建新應用”,填寫相關信息後,提交。
4、應用創建成功之後,去下載你的應用需要的SDK,因爲此項目是語音識別的,所以就選擇“語音聽寫”這個SDK。
5、語音識別Android SDK下載完成之後,解壓出來如圖所示。因爲本案例只使用沒有UI的識別,所以,我們只需要libs目錄下的文件。
6、找到你剛剛創建的應用,保存下APP ID,這個到後面項目代碼中會用到。
二、項目集成
1、新建一個工程項目,將下載下來的SDK包中,libs目錄下的Msc.jar包複製到項目的libs目錄下,並添加爲項目的依賴。
2、項目src/main/目錄下,新建 jniLibs文件夾。
3、將SDK包中,libs目錄下的arm64-v8a、armeabi-v7a兩個文件夾,複製到項目的jniLibs目錄下。
三、項目實戰
1、添加用戶權限(官方文檔提供的權限,實際應用中根據實際項目需要進行刪減)
注意:Android 6.0以後,一些危險權限需要動態申請。
<!--連接網絡權限,用於執行雲端語音能力 --> <uses-permission android:name="android.permission.INTERNET"/> <!--獲取手機錄音機使用權限,聽寫、識別、語義理解需要用到此權限 --> <uses-permission android:name="android.permission.RECORD_AUDIO"/> <!--讀取網絡信息狀態 --> <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/> <!--獲取當前wifi狀態 --> <uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/> <!--允許程序改變網絡連接狀態 --> <uses-permission android:name="android.permission.CHANGE_NETWORK_STATE"/> <!--讀取手機信息權限 --> <uses-permission android:name="android.permission.READ_PHONE_STATE"/> <!--讀取聯繫人權限,上傳聯繫人需要用到此權限 --> <uses-permission android:name="android.permission.READ_CONTACTS"/> <!--外存儲寫權限,構建語法需要用到此權限 --> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/> <!--外存儲讀權限,構建語法需要用到此權限 --> <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/> <!--配置權限,用來記錄應用配置信息 --> <uses-permission android:name="android.permission.WRITE_SETTINGS"/> <!--手機定位信息,用來爲語義等功能提供定位,提供更精準的服務--> <!--定位信息是敏感信息,可通過Setting.setLocationEnable(false)關閉定位請求 --> <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/> <!--如需使用人臉識別,還要添加:攝相頭權限,拍照需要用到 --> <uses-permission android:name="android.permission.CAMERA" />
2、初始化即創建語音配置對象,只有初始化後纔可以使用MSC的各項服務。建議將初始化放在程序入口處(如Application、Activity的onCreate方法)。此處將初始化工作放在新建的BaseApplication.java 中,並且在AndroidManifest.xml文件中使用該BaseApplication。
public class BaseApplication extends Application { @Override public void onCreate() { // 將“12345678”替換成您申請的APPID,申請地址:http://www.xfyun.cn // 請勿在“=”與appid之間添加任何空字符或者轉義符 SpeechUtility.createUtility(this, SpeechConstant.APPID +"=12345678"); super.onCreate(); } }
3、 初始化語音識別對象SpeechRecognizer,並初始化InitListener監聽,獲取初始化狀態。
此處的setParameter()是根據自己需求加的,如果你需要添加其它參數,可以查看SDK 文檔。
/** * 初始化語音識別對象 */ private void initVoiceRecognize() { //獲取系統默認語言 if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) { locale = LocaleList.getDefault().get(0); } else { locale = Locale.getDefault(); } language = locale.getLanguage() + "-" + locale.getCountry(); Log.d(TAG, "系統默認language:"+language); // 初始化識別無UI識別對象 //使用SpeechRecognizer對象,可根據回調消息自定義界面; speechRecognizer = SpeechRecognizer.createRecognizer(MainActivity.this, initListener); if(speechRecognizer != null) { //設置返回結果格式,目前支持json,xml以及plain 三種格式,其中plain爲純聽寫文本內容 speechRecognizer.setParameter(SpeechConstant.RESULT_TYPE, "plain"); // 設置語音前端點:靜音超時時間,單位ms,即用戶多長時間不說話則當做超時處理 //取值範圍{1000~10000} speechRecognizer.setParameter(SpeechConstant.VAD_BOS, "4000"); //設置語音後端點:後端點靜音檢測時間,單位ms,即用戶停止說話多長時間內即認爲不再輸入, //自動停止錄音,範圍{0~10000} speechRecognizer.setParameter(SpeechConstant.VAD_EOS, "1000"); //設置語音輸入語言,zh_cn爲簡體中文,en_us爲美式英文 if (language.equalsIgnoreCase("zh-CN")) { // 設置語言 speechRecognizer.setParameter(SpeechConstant.LANGUAGE, "zh_cn"); } else { // 設置語言 speechRecognizer.setParameter(SpeechConstant.LANGUAGE, "en_us"); } Log.d(TAG, "語音識別對象完成初始化"); }else{ Log.d(TAG, "語音識別對象 == null"); } }
//初始化對象時,通過此回調接口,獲取初始化狀態。 private InitListener initListener = new InitListener() { @Override public void onInit(int i) { Log.d(TAG, "SpeechRecognizer initListener() code = " + i); if (i != ErrorCode.SUCCESS) { Log.e(TAG, "語音識別初始化失敗,錯誤碼:" + i); }else{ Log.w(TAG, "語音識別初始化成功,錯誤碼:" + i); } } };
4、初始化識別監聽RecognizerListener,用於startListening()開啓監聽。
//設置識別監聽器,開始監聽 speechRecognizer.startListening(recognizerListener);
//初始化識別監聽器 private RecognizerListener recognizerListener = new RecognizerListener() { @Override public void onVolumeChanged(int i, byte[] bytes) { //音量變化 } @Override public void onBeginOfSpeech() { //開始說話 } @Override public void onEndOfSpeech() { //結束說話 //繼續識別,並設置監聽器 speechRecognizer.startListening(recognizerListener); } @Override public void onResult(RecognizerResult recognizerResult, boolean b) { //返回結果 返回的結果可能爲null,請增加判斷處理。 if(recognizerResult == null){ Log.d(TAG, "識別出來 onResult:" + b + " recognizerResult == null"); }else { Log.d(TAG, "識別出來 onResult:" + b + " content:" + recognizerResult.getResultString()); tvRecognizeResult.setText(recognizerResult.getResultString()); } } @Override public void onError(SpeechError speechError) { //錯誤回調 if(isRecognizing) { Log.e(TAG, "語音識別出錯 onError()"); } } @Override public void onEvent(int i, int i1, int i2, Bundle bundle) { //擴展接口 } };
四、項目演練
注意:因爲是在線語音識別,所以項目需要在真機,且有網絡的情況下運行,demo代碼中沒有對網絡狀態進行判斷,小夥伴們可以自行添加。
五、參考文檔
語音聽寫 Android SDK 文檔 https://www.xfyun.cn/doc/asr/voicedictation/Android-SDK.html
MSC Android API 文檔:http://mscdoc.xfyun.cn/android/api/
六、案例源碼
碼雲:https://gitee.com/lilium_foliage/XFVoiceRecognize
csdn:https://download.csdn.net/download/qq_38950819/12005144