版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/yus201120/article/details/83751602
我们可以通过讯飞提供的外部唤醒适配功能,可以在不用唤醒语音关键词的情况下,监听我们所发出的语音命令。比如,我们用TTS播报一段消息,“规划前往北京鸟巢,是否前往?” ,这个时候语音其实是还没有通过唤醒词唤醒的,我们就需要通过外部唤醒适配功能,让语音去识别到我们的命令,是前往还是取消。实现此功能有以下几步:
- 添加custommvw.jar,并build path把jar包导入到library里;
- 实现接口ICustomMvwCallback,这个接口中定义了远程连接状态的回调、开启唤醒词监听的回调、唤醒词监听结果的回调。
ICustomMvwCallback customcallback = new ICustomMvwCallback() {
@Override
public void onWakeupResult(int nMvwId, int nMvwScore) {
Log.i(TAG, "nMvwId:"+nMvwId); //识别的回调接口
Message msg = ServiceHandler.obtainMessage();
msg.what = 0x12;
msg.arg1 = nMvwId;
ServiceHandler.sendMessage(msg);
}
@Override
public void initMvwCallback(boolean state, int errId) {
Log.i(TAG, "initMvwCallback :"+state + " ;errId:"+errId); //开启唤醒状态的接口
}
@Override
public void initCallback(boolean state, int errId) {
Log.i(TAG, "initCallback :"+state + " ;errId:"+errId); //SDK远程服务连接的回调接口
if(!state){
mCustomMvwSession.initService();
}
}
};
- 初始化CustomMvwSession,
if(mCustomMvwSession == null){
mCustomMvwSession = CustomMvwSession.getInstance(getApplicationContext(), customcallback);
}
在获取实例的时候,默认会调用一次initService(),如果后面的回调方法initCallback(boolean state, int errId)中,state为false的时候,表示远程连接有问题,需要重新调用initService()连接。
- 调用startForegroundMvw(java.util.List<java.lang.String> keywords,
boolean needSpWords)或者startBackgroundMvw(java.util.List<java.lang.String> keywords,
boolean needSpWords),开启自定义语音唤醒功能,其中的参数keywords表示自定义唤醒词组,定义这些词组传入SDK之后,一旦语音识别到其中的一个唤醒词,那么就会通过customcallback 中的onWakeupResult方法把该唤醒词在传入词组中的索引index回调回来,这样我们就可以获取到用户的命令了。调用上面的两个方法的时候,还要返回值的,
- 需要注意的是,如果在调用了getInstance之后马上就调用startBackgroundMvw方法,会出现调用不成功的情况,返回值为REMOTE_EXCEPTION,因为这个时候远程的连接还没有完成。我们需要在getInstance并收到了initCallback为true的回调之后,方可以开始调用唤醒方法。