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"问题的主要内容,如果未能解决你的问题,请参考以下文章