小雅OS开放平台文档

小雅OS开放平台文档

  • 快速入门
  • 客户端接入
  • 服务端接入

›Android SDK

概述

  • 客户端接入

API 接入

  • WebSocket接口协议定义
  • Http接口协议定义
  • 调用样例
  • API 列表
  • 实体列表
  • 错误码

设备端

    Android SDK

    • 配置工程
    • 初始化
    • 功能
    • 回调
    • Demo 使用
    • 更新日志

    iOS SDK

    • 配置工程
    • 初始化
    • 功能
    • 回调
    • 更新日志

    C++ SDK

    • SDK获取方法
    • 环境要求
    • 目录结构
    • SDK架构
    • 调用示例
    • 接口文档

手机伴侣

    Android SDK

    • 接入准备
    • 账号模块
    • 内容模块
    • 反向控制
    • 设备管理模块
    • 技能模块
    • 蓝牙模块
    • 更新日志

    iOS SDK

    • 接入准备
    • 账号模块
    • 内容模块
    • 反向控制
    • 设备管理模块
    • 技能模块

内容页

    Android

    • 更新日志
    • 初始化

    iOS

    • 更新日志
    • 初始化

回调

唤醒事件

添加下面代码捕捉唤醒事件,并可以在唤醒的时候,做一些处理(比如播放一个应答词)。

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 识别结果字段说明

字段类型说明
asrString识别结果的文本
isEndboolean识别结束标识: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 字符串,字段说明如下:

字段类型是否不为空说明
mDirectiveTypeString否
mDomainString是domain,如音乐、天气等
mIntentString是意图
mEndFlagboolean是
mTTSTextString是tts内容
mURLJsonObject是待播放资源的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"
    }
}
← 功能Demo 使用 →
  • 唤醒事件
  • ASR 回调
    • ASR 识别结果案例:
    • ASR 识别结果字段说明
    • NLU 识别结果案例:
    • NLU 识别结果字段说明:
  • 语音交互回调
  • 播放状态回调
    • MediaInfo 格式
北京小雅星空科技有限公司 京ICP备19010603号