接口使用及调用流程

DEMO在SDK的基础上,封装了输入和输出格式,您可以直接使用SDK,或者使用DEMO封装好SDK接口的类。
使用SDK方式的话,比较底层,需要自行实现一部分逻辑。可以参考DEMO中对SDK的调用封装。基于SDK集成和基于DEMO集成方式2选1即可。

SDK调用过程如下:

  1. 初始化

    1.1.初始化EventManager类

    1.2.自定义输出事件类

    1.3.注册自己的输出事件类

    1.4.加载离线资源(如果需要离线命令词功能)

  2. 开始识别/唤醒

    2.1. 设置识别/唤醒输入参数

    2.2. 发送start开始事件

  3. 回调事件

    3.1. 开始回调事件

  4. 控制识别/唤醒

    4.1. 控制停止识别/唤醒,可以向SDK发送停止事件

    4.2. 取消本次识别,可以向SDK发送取消事件

  5. 事件管理器退出

    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_FINISH)){
// 识别结束
     }
// ... 支持的输出事件和事件支持的事件参数见“输入和输出参数”一节
   }
};

详见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_CANCE, 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_CANCE, 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&lt;String, Object&gt; map = new HashMap&lt;String, Object&gt;();
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 退出事件管理器"