1、上篇我们讲解了如何调用android系统提供的接口实现Asr功能,本篇我们讲解如何集成Asr引擎,这里我们以集成百度Asr为例讲解。
2、百度Ai官网https://ai.baidu.com/下载SDK包,解压后里面也有相关的开发文档。
将libs中文件和res中的文件复制到项目工程对应的文件夹,如下图
在AndroidManifest.xml文件中
添加appId,权限等信息
3、接下来就详细看下集成中重点部分,看过上篇android Asr流程分析和调用的已经知道,Asr引擎的实现需要继承RecognitionService,所以百度Asr我们就集成到service的实现中,在这我们直接说下代码实现,关于实现的原理在这不做详细说明,集成文档中已经做了说明:
private void initRecognizer() {
asrManager = EventManagerFactory.create(this, "asr");
asrManager.registerListener(eventListener);
}
初始化实例和监听,监听是监听识别的事件,监听事件如下:
EventListener eventListener = new EventListener() {
@Override
public void onEvent(String name, String params, byte[] data, int offset, int length) {
Log.i(TAG, " name=" + name + " \nparams=" + params + " \noffset=" + offset + " \nlength=" + length);
// 引擎准备就绪,可以开始说话
if(name.equals(SpeechConstant.CALLBACK_EVENT_ASR_READY)) {
try {
mRecognitionListener.readyForSpeech(new Bundle());
} catch (RemoteException e) {
e.printStackTrace();
}
}else if(name.equals(SpeechConstant.CALLBACK_EVENT_ASR_BEGIN)) {
// 检测到说话开始
try {
事件中的不同状态大家去参考继承文档中查询,接下来再实现开始监听整个流程就可以了,代码如下:
private void startListen(){
JSONObject params=new JSONObject();
try {
// params.put(SpeechConstant.PID, 1536); //语言、模型、是否需要在线语义
if (enableOffline) {
params.put(SpeechConstant.DECODER, 2); //0,在线;2,离线
}
params.put(SpeechConstant.VAD, SpeechConstant.VAD_DNN); //dnn,开启vad;touch,不开启vad,但会60s限制
//params.put(SpeechConstant.VAD_ENDPOINT_TIMEOUT, 0); //静音超时断句及长语音
//params.put(SpeechConstant.IN_FILE, ""); //输入文件路径,文件长度不超过3分钟
//params.put(SpeechConstant.OUT_FILE, 0); //识别过程产生的录音文件, 该参数需要开启ACCEPT_AUDIO_DATA后生效
params.put(SpeechConstant.ACCEPT_AUDIO_DATA, true); //是否需要语音音频数据回调,开启后有CALLBACK_EVENT_ASR_AUDIO事件
params.put(SpeechConstant.ACCEPT_AUDIO_VOLUME, true);
// params.put(SpeechConstant.NLU, "enable"); //本地语义解析设置
// params.put(SpeechConstant.ASR_OFFLINE_ENGINE_GRAMMER_FILE_PATH, "assets://baidu_speech_grammar.bsg"); //本地语义解析文件路径
//params.put(SpeechConstant.DISABLE_PUNCTUATION, false); //在选择PID为长句(输入法模式)的时候,是否禁用标点符号
} catch (JSONException e) {
e.printStackTrace();
}
Log.i(TAG, " params=" + params.toString());
asrManager.send(SpeechConstant.ASR_START, params.toString(), null, 0, 0);
}
参考如上代码,在识别中最后调用了asrManager.send接口进入识别,识别结果在onEvent中反馈,至于在JSON组包时候的参数参考百度AI平台中参数说明。
另外百度识别还支持离线,在这也说下添加方法:
这个bsg是关键词包
,需要初始化的时候load。
private void loadOfflineEngine() {
Map<String, Object> params = new LinkedHashMap<String, Object>();
params.put(SpeechConstant.DECODER, 2);
params.put(SpeechConstant.ASR_OFFLINE_ENGINE_GRAMMER_FILE_PATH, "assets://baidu_speech_grammar.bsg");
asrManager.send(SpeechConstant.ASR_KWS_LOAD_ENGINE, new JSONObject(params).toString(), null, 0, 0);
}
我们在初始化的时候把bag包加载进去,然后在组Json包发送的时候添加
params.put(SpeechConstant.DECODER, 2); //0,在线;2,离线
这个参数就可以,目前本人集成后进行简单测试,离线需要特定的关键词,而且使用离线的话必须要联网初始化一次后才能用离线,所以离线目前来说就是个鸡肋,不过离线不影响在线功能,所以在内存控制要求不高的情况下可以把离线也加上。
4、接下来说下事件处理:
@Override
public void onEvent(String name, String params, byte[] data, int offset, int length) {
在onEvent中我们拿到结果后调用RecognitionListener的callback把结果返回,再进一步处理,这也就是在上篇中我们要实现RecognitionListener监听的原因。
好了,上面就是集成百度Asr的流程,其实很简单,按照文档来就可以,主要在于事和数据的处理,这个大家多调试就可以了。
其次详细代码可以参考XunAsr模块内容,其他百度参数和错误码由于说明太多,在这不做过多讲解,可以到官网查看相关说明。
本文详细介绍如何在Android应用中集成百度ASR引擎,包括下载SDK、配置项目、实现识别流程及离线识别方法。
969

被折叠的 条评论
为什么被折叠?



