Android科大讯飞——语音识别 解决"SpeechRecognizer.createRecognizer()获取的SpeechRecognizer对象为null"问题

Posted 摸爬滚打的程序媛

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Android科大讯飞——语音识别 解决"SpeechRecognizer.createRecognizer()获取的SpeechRecognizer对象为null"问题相关的知识,希望对你有一定的参考价值。

目录

一、问题重现 

二、原因分析

三、解决方法 


在集成讯飞语音识别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目录下。

 

好了,终于解决完这个问题了。最后附上一篇对解决该问题有启发作用的博客。

Android关于libs,jniLibs库的基本使用说明及冲突解决

以上是关于Android科大讯飞——语音识别 解决"SpeechRecognizer.createRecognizer()获取的SpeechRecognizer对象为null"问题的主要内容,如果未能解决你的问题,请参考以下文章

golang 使用科大讯飞进行语音合成与识别

语音从零之五用科大讯飞语音包实现语音打开已安装应用程序

百度语音识别vs科大讯飞语音识别

解析科大讯飞汽车产业布局:不只是智能语音,还有图像识别

科大讯飞语音识别

科大讯飞语音识别