【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库的基本使用说明及冲突解决

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