目錄
在集成訊飛語音識別SDK過程中,遇到了“SpeechRecognizer.createRecognizer()獲取的SpeechRecognizer對象爲null”的問題,上網百度,有的說是權限沒給,還有的說是沒聯網等等,但都沒有解決問題,後來一番折騰搗鼓,找到了原因以及解決方案。
一、問題重現
1、下載完SDK解壓後,有如圖所示的文件。其中lIbs目錄下的.so庫和Jar包是我在項目中需要集成的,於是我直接將libs目錄下的文件拷貝到了項目的libs目錄下。
2、然後在運行獲取SpeechRecognizer對象時,卻是null的。初始化代碼以及log打印結果如下圖。
/** * 初始化語音識別對象 */ 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"); } }
二、原因分析
在Android Studio中,引用.so庫,會默認匹配main下的jniLibs目錄,如果沒有jniLibs目錄需要自己手動創建,把.so庫放到jniLibs目錄下。
如果想在Android Studio中使用libs下的庫,則需要手動去指定庫的位置。
注意:兩種方式引入.so庫,庫的名稱都不能隨便更改。
三、解決方法
1、方法一:語音識別SDK中的.so庫和Jar包直接放在項目的libs目錄下,同時在build.gradle文件中手動去指定庫的位置。
android { ...... //Android Studio中,使用libs下的.so庫,需要手動去指定庫的位置 sourceSets { main { jniLibs.srcDirs = ['libs'] } } }
2、方法二:在main目錄下新建jniLibs目錄,然後分別將語音識別SDK中的Jar包直接放在項目的libs目錄下,.so庫放到jniLibs目錄下。
好了,終於解決完這個問題了。最後附上一篇對解決該問題有啓發作用的博客。