接口使用及调用流程
DEMO在SDK的基础上,封装了输入和输出格式,您可以直接使用SDK,或者使用DEMO封装好SDK接口的类。 使用SDK方式的话,比较底层,需要自行实现一部分逻辑。可以参考DEMO中对SDK的调用封装。基于SDK集成和基于DEMO集成方式2选1即可。
SDK调用过程如下:
-
初始化
1.1.初始化EventManager类
1.2.自定义输出事件类
1.3.注册自己的输出事件类
1.4.加载离线资源(如果需要离线命令词功能)
-
开始识别/唤醒
2.1. 设置识别/唤醒输入参数
2.2. 发送start开始事件
-
回调事件
3.1. 开始回调事件
-
控制识别/唤醒
4.1. 控制停止识别/唤醒,可以向SDK发送停止事件
4.2. 取消本次识别,可以向SDK发送取消事件
-
事件管理器退出。
5.1. 卸载离线资源(如果1.4加载离线资源)
5.2. 释放资源
在线识别调用流程
SDK 的调用过程可以参见DEMO中的ActivityMiniRecog类
DEMO的调用过程可以参考DEMO中的ActivityAbstractRecog类
1 初始化
1.1 初始化EventManager对象
SDK中,通过工厂创建语音识别的事件管理器。注意识别事件管理器只能维持一个,请勿同时使用多个实例。即创建一个新的识别事件管理器后,之前的那个置为null,并不再使用。
EventManager asr = EventManagerFactory.create(this, "asr");
// this是Activity或其它Context类
详见ActivityMiniRecog类中”基于sdk集成1.1 初始化EventManager对象"
1.2 自定义输出事件类
SDK中,需要实现EventListener的输出事件回调接口。该类需要处理SDK在识别过程中的回调事件。可以参考DEMO中对SDK的调用封装。
EventListener yourListener = new EventListener() {
@Override
public void onEvent(String name, String params, byte [] data, int offset, int length) {
if(name.equals(SpeechConstant.CALLBACK_EVENT_ASR_READY)){
// 引擎就绪,可以说话,一般在收到此事件后通过UI通知用户可以说话了
}
if(name.equals(SpeechConstant.CALLBACK_EVENT_ASR_PARTIAL)){
// 一句话的临时结果,最终结果及语义结果
}
// ... 支持的输出事件和事件支持的事件参数见“输入和输出参数”一节
}
};
详见ActivityMiniRecog类中”基于sdk集成1.2 自定义输出事件类"
1.3 注册自己的输出事件类
asr.registerListener(yourListener);
详见ActivityMiniRecog类中”基于sdk集成1.3 注册自己的输出事件类”
DEMO中,以上两步合并为
IRecogListener listener = new MessageStatusRecogListener(handler);
// 可以传入IRecogListener的实现类,也可以如SDK,传入EventListener实现类
//如果传入IRecogListener类,在RecogEventAdapter为您做了大多数的json解析。
MyRecognizer myRecognizer = new MyRecognizer(this, listener);
//this是Activity或其它Context类
详见ActivityAbstractRecog类中”基于DEMO集成第1.1, 1.2, 1.3 步骤 初始化EventManager类并注册自定义输出事件
2 开始识别
开始事件的参数可以参见"输入和输出参数"。
2.1 设置识别输入参数
SDK中,您需要根据文档或者demo确定您的输入参数。DEMO中有UI界面简化选择和测试过程。demo中,在点击“开始录音”按钮后,您可以在界面或者日志中看见ASR_START事件的json格式的参数。
// asr.params(反馈请带上此行日志):{"accept-audio-data":false,"disable-punctuation":false,"accept-audio-volume":true,"pid":1736}
//其中{"accept-audio-data":false,"disable-punctuation":false,"accept-audio-volume":true,"pid":1736}为ASR_START事件的参数
String json ="{\"accept-audio-data\":false,\"disable-punctuation\":false,\"accept-audio-volume\":true,\"pid\":1736}"
详见ActivityMiniRecog类中”基于SDK集成2.1 设置识别参数‘’
2.2 发送start开始事件
asr.send(SpeechConstant.ASR_START, json, null, 0, 0);
详见ActivityMiniRecog类中”基于SDK集成2.2 发送开始事件
DEMO中, 您需要传递Map<String,Object>的参数,会将Map自动序列化为json
Map<String, Object> params;
... // 设置识别参数
// params ="accept-audio-data":false,"disable-punctuation":false,"accept-audio-volume":true,"pid":1736
myRecognizer.start(params);
详见ActivityAbstractRecog类中"基于DEMO集成2.1, 2.2 设置识别参数并发送开始事件"
3 收到回调事件
3.1开始回调事件
回调事件在您实现的EventListener中获取。OnEvent方法中, name是输出事件名,params该事件的参数,(data,offset, length)三者一起组成额外数据。如回调的音频数据,从data[offset]开始至data[offset + length] 结束,长度为length。
public void onEvent(String name, String params, byte [] data, int offset, int length);
详见ActivityMiniRecog类中”基于SDK集成3.1 开始回调事件"
DEMO中, 回调事件在您实现的IRecogListener中获取。
详见RecogEventAdapter类中”基于DEMO集成3.1 开始回调事件"
4控制识别
4.1 控制停止识别
asr.send(SpeechConstant.ASR_STOP, null, null, 0, 0);
//发送停止录音事件,提前结束录音等待识别结果
详见ActivityMiniRecog类中”基于SDK集成4.1 发送停止事件"
4.2 控制取消识别
asr.send(SpeechConstant.ASR_CANCEL, null, null, 0, 0);
//取消本次识别,取消后将立即停止不会返回识别结果
详见ActivityMiniRecog类中”基于SDK集成4.2 发送取消事件"
DEMO 中:
myRecognizer.stop();
// 发送停止录音事件,提前结束录音等待识别结果
详见ActivityAbstractRecog类中”基于DEMO集成4.1 发送停止事件"
myRecognizer.cancel();
// 取消本次识别,取消后将立即停止不会返回识别结果
详见ActivityAbstractRecog类中”基于DEMO集成4.2 发送取消事件"
5 事件管理器退出
5.1 在线不需要卸载离线命令词
先启动取消,避免有还在运行的识别。 之后需要将之前的listener卸载,不卸载的话,可能有内存溢出
asr.send(SpeechConstant.ASR_CANCEL, null, null, 0, 0); // 取消识别
5.2 释放资源
asr.unregisterListener(this);
详见ActivityMiniRecog类中基于SDK集成5.2 退出事件管理器"
DEMO中,
myRecognizer.release();
// 含有离线引擎卸载
详见ActivityAbstractRecog类中基于DEMO的5.2 退出事件管理器"
离线命令词调用流程
离线命令词功能需要首先实现之前的在线识别功能的代码。离线引擎加载需要在EventManager初始化之后,识别事件之前。 在SDK中,
HashMap map = new HashMap();
map.put(SpeechConstant.DECODER, 2);
// 0:在线 2.离在线融合(在线优先)
map.put(SpeechConstant.ASR_OFFLINE_ENGINE_GRAMMER_FILE_PATH, "/sdcard/yourpath/baidu_speech_grammar.bsg");
//设置离线命令词文件路径
// 下面这段可选,用于生成SLOT_DATA参数, 用于动态覆盖ASR_OFFLINE_ENGINE_GRAMMER_FILE_PATH文件的词条部分
JSONObject json = new JSONObject();
json.put("name", new JSONArray().put("王自强").put("叶问")).put("appname", new
JSONArray().put("手百").put("度秘"));
map.put(SpeechConstant.SLOT_DATA, json.toString());
// SLOT_DATA 参数添加完毕
1.1 到1.3同在线
1.4 加载离线资源
asr.send(SpeechConstant.ASR_KWS_LOAD_ENGINE,new
JSONObject(map).toString());
//加载离线引擎,使用离线命令词时使用,请在整个离线识别任务结束之后卸载离线引擎
详见ActivityMiniRecog类中”基于SDK离线命令词1.4 加载离线资源(离线时使用)"
//离线引擎加载完毕事件后,开始你的识别流程,此处开始你的识别流程,注意离线必须断网生效或者SDK无法连接百度服务器时生效,只能识别bsg文件里定义的短语。
2.1-4.2 步骤同在线
5.1 卸载离线资源
//不再需要识别功能后,卸载离线引擎。再次需要识别功能的话,可以重复以上步骤。即依旧需要EventManager初始化之后,识别事件之前加载离线引擎。
asr.send(SpeechConstant.ASR_KWS_UNLOAD_ENGINE, null, null, 0, 0);
详见ActivityMiniRecog类中”基于SDK集成5.1 卸载离线资源步骤(离线时使用)"
在demo中,
HashMap<String, Object> map = new HashMap<String, Object>();
map.put(SpeechConstant.DECODER, 2);
// 0:在线 2.离在线融合(在线优先)
map.put(SpeechConstant.ASR_OFFLINE_ENGINE_GRAMMER_FILE_PATH, "/sdcard/yourpath/baidu_speech_grammar.bsg");
//设置离线命令词文件路径
// 下面这段可选,用于生成SLOT_DATA参数, 用于动态覆盖ASR_OFFLINE_ENGINE_GRAMMER_FILE_PATH文件的词条部分
JSONObject json = new JSONObject();
json.put("name", new
JSONArray().put("王自强").put("叶问")).put("appname", new
JSONArray().put("手百").put("度秘"));
map.put(SpeechConstant.SLOT_DATA, json.toString());
// SLOT_DATA 参数添加完毕
myRecognizer.loadOfflineEngine(map);
//加载离线引擎,使用离线命令词时使用,请在整个离线识别任务结束之后卸载离线引擎
详见ActivityAbstractRecog类中”基于DEMO集成1.4 加载离线资源步骤(离线时使用)"
//离线引擎加载完毕事件后,开始你的识别流程,注意离线必须断网生效或者SDK无法连接百度服务器时生效,只能识别bsg文件里定义的短语。
//不再需要识别功能后,卸载离线引擎。再次需要识别功能的话,可以重复以上步骤, 新建MyRecognizer类即可。
myRecognizer.release();
详见ActivityAbstractRecog类中”基于DEMO5.1 卸载离线资源(离线时使用)"
唤醒词调用流程
SDK 的调用过程可以参见DEMO中的ActivityMiniWakeUp类
DEMO的调用过程可以参考DEMO中的ActivityWakeUp类
1 初始化
1.1 初始化EventManager对象
SDK中,通过工厂创建语音唤醒词的事件管理器。注意唤醒词事件管理器同识别事件管理器一样只能维持一个,请勿同时使用多个实例。即创建一个新的唤醒词事件管理器后,之前的那个设置为null。并不再使用。
EventManager wp= EventManagerFactory.create(this,"wp");
//this是Activity或其它Context类
详见ActivityMiniWakeUp类中”基于SDK唤醒词集成1.1 初始化EventManager"
1.2 自定义输出事件类
DEMO中,初始化过程合并到下一步。注意SDK和DEMO调用方式2选1即可。 注册用户自己实现的输出事件类
EventListener yourListener = new EventListener() {
@Override
public void onEvent(String name, String params, byte [] data, int
offset, int length) {
Log.d(TAG, String.format("event: name=%s, params=%s", name, params));
//唤醒事件
if(name.equals("wp.data")){
try {
JSONObject json = new JSONObject(params);
int errorCode = json.getInt("errorCode");
if(errorCode == 0){
//唤醒成功
} else {
//唤醒失败
}
} catch (JSONException e) {
e.printStackTrace();
}
} else if("wp.exit".equals(name)){
//唤醒已停止
}
}
};
详见ActivityMiniWakeUp类中”基于SDK唤醒词集成1.2 自定义输出事件类"
1.3 注册自己的输出事件类
wp.registerListener(yourListener);
详见ActivityMiniWakeUp类中”基于SDK唤醒词集成1.3 注册输出事件"
DEMO中,以上两步合并为
IWakeupListener listener = new SimpleWakeupListener();
myWakeup = new MyWakeup(this,listener);
// this是Activity或其它Context类
详见ActivityWakeUp类中”基于DEMO唤醒词集成第1.1, 1.2, 1.3步骤"
2 开始唤醒
2.1 设置唤醒输入参数
SDK中,您需要根据文档或者demo确定您的输入参数。DEMO中有UI界面简化选择和测试过程。demo中,在点击“开始”按钮后,您可以在界面或者日志中看见WAKEUP_START事件的json格式的参数。
wakeup.params(反馈请带上此行日志):{"kws-file":"assets:\/\/\/WakeUp.bin"} // 其中{"kws-file":"assets:\/\/\/WakeUp.bin"}为WAKEUP_START事件的参数
HashMap map = new HashMap();
map.put(SpeechConstant.WP_WORDS_FILE, "assets://WakeUp.bin");
详见ActivityMiniWakeUp类中”基于SDK唤醒词集成第2.1 设置唤醒的输入参数" 唤醒词文件请去http://ai.baidu.com/tech/speech/wake\#tech-demo 设置并下载
2.2 发送start开始事件
wp.send(SpeechConstantWAKEUP_START, json, null, 0, 0);
详见ActivityMiniWakeUp类中”基于SDK唤醒词集成第2.2 发送开始事件开始唤醒"
DEMO中, 您需要传递Map 的参数,会将Map自动序列化为json
HashMap<String,Object> params = new
HashMap<String,Object>();
params.put(SpeechConstant.WP_WORDS_FILE, "assets://WakeUp.bin");
myWakeup.start(params);
详见ActivityWakeUp类中”基于DEMO唤醒词集成第2.1, 2.2 发送开始事件开始唤醒"
3 收到回调事件
3.1 开始回调事件
SDK中,回调事件在您实现的EventListener中获取。OnEvent中, name是输出事件名,params该事件的参数,(data,offset, length)三者一起组成额外数据。如回调的音频数据,从data[offset]开始至data[offset + length] 结束,长度为length。
public void onEvent(String name, String params, byte [] data, int offset, int length);
详见ActivityMiniWakeUp类中”基于SDK唤醒3.1 开始回调事件"
DEMO中, 回调事件在您实现的IWakeupListener中获取。
详见WakeupEventAdapter类中”基于DEMO唤醒3.1 开始回调事件"
4 控制唤醒
SDK中,
4.1 控制停止唤醒
wp.send(SpeechConstant.WAKEUP_STOP, null, null, 0, 0);
详见ActivityMiniWakeUp类中”基于SDK唤醒词集成第4.1 发送停止事件"
DEMO中,
myWakeup.stop();
详见ActivityWakeUp类中”基于DEMO唤醒词集成第4.1 发送停止事件"
5 事件管理器退出
SDK中无需调用任何逻辑,但需要创建一个新的唤醒词事件管理器的话,之前的事件管理器请设置为null,并不再使用。
DEMO中,
myWakeup.release();
详见ActivityWakeUp类中”基于DEMO唤醒词集成第5 退出事件管理器"