【Android】科大訊飛——語音識別 解決"SpeechRecognizer.createRecognizer()獲取的SpeechRecognizer對象爲null"問題

目錄

一、問題重現 

二、原因分析

三、解決方法 


在集成訊飛語音識別SDK過程中,遇到了“SpeechRecognizer.createRecognizer()獲取的SpeechRecognizer對象爲null”的問題,上網百度,有的說是權限沒給,還有的說是沒聯網等等,但都沒有解決問題,後來一番折騰搗鼓,找到了原因以及解決方案。

一、問題重現 

1、下載完SDK解壓後,有如圖所示的文件。其中lIbs目錄下的.so庫和Jar包是我在項目中需要集成的,於是我直接將libs目錄下的文件拷貝到了項目的libs目錄下。

訊飛SDK

SDK-LIBS

x項目結構

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");
        }
    }

log打印

二、原因分析

在Android Studio中,引用.so庫,會默認匹配main下的jniLibs目錄,如果沒有jniLibs目錄需要自己手動創建,把.so庫放到jniLibs目錄下。

如果想在Android Studio中使用libs下的庫,則需要手動去指定庫的位置。

注意:兩種方式引入.so庫,庫的名稱都不能隨便更改。

三、解決方法 

1、方法一:語音識別SDK中的.so庫和Jar包直接放在項目的libs目錄下,同時在build.gradle文件中手動去指定庫的位置。

項目-libs

android {
    ......

    //Android Studio中,使用libs下的.so庫,需要手動去指定庫的位置
    sourceSets {
        main {
            jniLibs.srcDirs = ['libs']
        }
    }

}

2、方法二:在main目錄下新建jniLibs目錄,然後分別將語音識別SDK中的Jar包直接放在項目的libs目錄下,.so庫放到jniLibs目錄下。

新建jniLibs

 jniLibs

jniLibs-libs

好了,終於解決完這個問題了。最後附上一篇對解決該問題有啓發作用的博客。

Android關於libs,jniLibs庫的基本使用說明及衝突解決

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章