回调
唤醒事件
添加下面代码捕捉唤醒事件,并可以在唤醒的时候,做一些处理(比如播放一个应答词)。
XiaoyaSDK.getInstance().addWakeupObserver(new WakeupObserver() {
@Override
public void onWakeUpDetected() {
// 唤醒事件回调,播放应答词
}
});
ASR 回调
添加下面代码可以接收到 ASR
识别结果(包含中间结果),以及 NLU
返回结果。
XiaoyaSDK.getInstance().addASRResultObserver(new ASRResultObserver() {
@Override
public void onASRResultReceive(final String message) {
// message 为识别结果 JSON 字符串
}
@Override
public boolean onNluResultReceiveOrIntercept(String nluResult) {
NluResult nluResultObj = null;
try {
nluResultObj = new Gson().fromJson(nluResult, NluResult.class);
} catch (Exception e) {
e.printStackTrace();
}
if (nluResultObj != null) {
if (nluResultObj.getDomain().equals("weather")) { // 拦截nlu自行处理
XiaoyaSDK.getInstance().playLocalTTS("拦截天气的意图,自行处理");
return true; // return true,表示拦截
}
}
return false; // 默认 return false,不拦截
}
}
ASR 识别结果案例:
{
"asr" : "今天天气怎么样",
"isEnd" : true
}
ASR 识别结果字段说明
字段 | 类型 | 说明 |
---|---|---|
asr | String | 识别结果的文本 |
isEnd | boolean | 识别结束标识:false为中间识别结果,true最终识别结果 |
例,喊一句「今天天气怎么样」,会产生如下log:
zcrrr: asr:{"asr" : "今","isEnd" : false}
zcrrr: asr:{"asr" : "今天","isEnd" : false}
zcrrr: asr:{"asr" : "今天天","isEnd" : false}
zcrrr: asr:{"asr" : "今天天气","isEnd" : false}
zcrrr: asr:{"asr" : "今天天气怎","isEnd" : false}
zcrrr: asr:{"asr" : "今天天气怎么","isEnd" : false}
zcrrr: asr:{"asr" : "今天天气怎么样","isEnd" : true}
可以看到,isEnd字段为true时,表示asr最终识别结果。
NLU 识别结果案例:
sdk默认行为是,拿到nlu结果然后根据不同domain做相应的处理,比如播放资源。用户也可在回调中匹配domain字段,拦截nlu意图自行处理。(详见上边的回调示例)
{
"mDirectiveType" : "AudioPlay.Play",
"mDomain" : "music",
"mEndFlag" : true,
"mIntent" : "search_music",
"mTTSText" : "好的,周杰伦,上海一九四三",
"mURL" : "http://dlbcdn.ocm.ainirobot.com/356/4178021e2eca4678cc6d9de3f9e070c9.mp3"
}
NLU 识别结果字段说明:
返回的 JSON 字符串,字段说明如下:
字段 | 类型 | 是否不为空 | 说明 |
---|---|---|---|
mDirectiveType | String | 否 | |
mDomain | String | 是 | domain,如音乐、天气等 |
mIntent | String | 是 | 意图 |
mEndFlag | boolean | 是 | |
mTTSText | String | 是 | tts内容 |
mURL | JsonObject | 是 | 待播放资源的url链接 |
语音交互回调
如果希望对于语音交互主要的生命周期进行监听,做一些操作,比如灯效,可以通过下面代码接收回调。
XiaoyaSDK.getInstance().addStateObserver(new UXStateObserver() {
@Override
public void onUXStateChanged(int state) {
Log.v("zc", "state is " + state);
switch (state) {
case ObserverManager.IDLE: {
Log.v("xiaoyasdk1", "空闲");
break;
}
case ObserverManager.LISTENING: {
Log.v("xiaoyasdk1", "拾音");
break;
}
case ObserverManager.THINKING: {
Log.v("xiaoyasdk1", "识别");
break;
}
case ObserverManager.SPEAKING: {
Log.v("xiaoyasdk1", "播放 TTS 或唤醒词");
break;
}
case ObserverManager.FINISHED: {
Log.v("xiaoyasdk1", "结束");
break;
}
default:
break;
}
}
});
播放状态回调
通过添加observer监听正在播放的资源。
XiaoyaSDK.getInstance().addPlayBackStateObserver(mPlayBackStateObserver = new PlayBackStateObserver() {
@Override
public void onPlayBackStateChanged(int playState, String mediaInfoJson) {
switch (playState) {
case State.PLAY_CONTENT_STARTED: {
Log.v(TAG, "onPlayBackStateChanged state: 内容开始播放");
MediaInfo mediaInfo = parseMediaInfo(mediaInfoJson);
if (mediaInfo != null) {
curMediaInfo = mediaInfo;
MediaInfo.MetaData metaData = curMediaInfo.getMetaData();
if (metaData != null) {
btnRelativeRes.setText(String.format("正在播放:%s的%s (专辑id:%s), 点击为您推荐",
metaData.getAlbumTitle(), metaData.getTitle(), metaData.getAlbumId()));
}
}
break;
}
default:
break;
}
}
private MediaInfo parseMediaInfo(String mediaInfoJson) {
try {
return GsonSingleton.get().fromJson(mediaInfoJson, MediaInfo.class);
} catch (JsonSyntaxException e) {
return null;
}
}
});
MediaInfo 格式
{
"metaData": {
"albumId": "9723091",
"albumTitle": "郭德纲21年相声精选",
"art": {
"large": "https://imagev2.xmcdn.com/group31/M07/0E/5B/wKgJX1mAQgyi9-IfAAAw0CICWi8961.jpg!op_type=3&columns=290&rows=290&magick=png",
"middle": "https://imagev2.xmcdn.com/group31/M07/0E/5B/wKgJX1mAQgyi9-IfAAAw0CICWi8961.jpg!op_type=3&columns=140&rows=140&magick=png",
"small": "https://imagev2.xmcdn.com/group31/M07/0E/5B/wKgJX1mAQgyi9-IfAAAw0CICWi8961.jpg!op_type=3&columns=86&rows=86&magick=png"
},
"artist": "郭德纲相声",
"id": "45982332",
"title": "《人在江湖》郭德纲 于谦"
},
"stream": {
"offsetInMilliseconds": 0,
"token": "",
"url": "http://audio.xmcdn.com/group31/M0A/21/AD/wKgJSVmBkvOyNFPNAQA4-ZWCTvA299.m4a"
}
}