首先区分一下语音听写和语音识别二者的不同。
语音听写是把你说话的内容转换成文字内容,而语音识别是把你在abnf/bnf的语法文件里定义的关键词识别出来。
显然如果你是想用在输入法中的话当然是使用前者,如果你想打电话,发控制家电的指令当然用后者。
接下来我简单的介绍下离线识别的内容,本人刚研究两三天,掌握的也比较浅,有不妥之处,还望指出。
同样第一步是把准备工作做好,加载语音识别包,加入相关权限(这部分内之前的博客里提到过,这里就不赘述)。
其中在线识别和离线识别包有点不同,离线识别包要多一个common.jet.这个文件是要收费的,不过可以先下载体验版的先用着。
然后就是code了,第一步初始化,当然你要有appid,没有的可以去讯飞官网申请。
SpeechUtility.createUtility(OnLineReg.this, SpeechConstant.APPID +"=12345678");
2.创建SpeechRecognizer对象,并得到语法文件mAsr = SpeechRecognizer.createRecognizer(context, mInitListener);//离线识别语音初始化监听mLocalGrammar=FucUtil.readFile(this,"call.bnf","utf-8");//这里使用的离线语法文件
3.构建语法文件
4,设置参数并启动监听if (mEngineType.equals(SpeechConstant.TYPE_LOCAL)){ mAsr.setParameter(SpeechConstant.TEXT_ENCODING, "utf-8"); mAsr.setParameter(SpeechConstant.ENGINE_TYPE, mEngineType); ret = mAsr.buildGrammar("bnf", mLocalGrammar , localGrammarListener); if (ret != ErrorCode.SUCCESS){ Log.d(TAG,"语法构建失败,错误码: " + ret); }else{ Log.d(TAG,"语法构建成功"); }
//设置返回值数据格式 mAsr.setParameter(SpeechConstant.RESULT_TYPE, "json"); //设置本地识别使用语法id mAsr.setParameter(SpeechConstant.LOCAL_GRAMMAR, "call"); //设置本地识别的门限值 mAsr.setParameter(SpeechConstant.ASR_THRESHOLD, "30");
ret = mAsr.startListening(mRecognizerListener); Log.d(TAG,"语法构建成功 " + ret); } if (ret != ErrorCode.SUCCESS) { if(ret == ErrorCode.ERROR_COMPONENT_NOT_INSTALLED){ //未安装则跳转到提示安装页面 Log.d(TAG,"未安装则跳转到提示安装页面 " + ret); }else { Log.d(TAG,"识别失败,错误码: " + ret); } }demo 的bnf 文件
#BNF+IAT 1.0 UTF-8; !grammar order; !slot; !slot ; !slot ; !slot ; !start ; :[ ][ ] |[ ] [ ] ; :张海洋; :我要|我想|我想要; :打电话; :给;
分享的很简单,具体内容可以参考讯飞语音开发文档和我写的离线识别demo,离线识别体验包三个月内有效。
另外下载demo以后请把appid改为开发者申请的appid。
http://download.csdn.net/detail/t03330130/8944945