小雅OS开放平台文档

小雅OS开放平台文档

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

›Android SDK

概述

  • 客户端接入

API 接入

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

设备端

    Android SDK

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

    iOS SDK

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

    C++ SDK

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

手机伴侣

    Android SDK

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

    iOS SDK

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

内容页

    Android

    • 更新日志
    • 初始化

    iOS

    • 更新日志
    • 初始化

功能

语音识别与唤醒

选择识别模式

目前 SDK 有两种模式:

  • 唤醒识别模式:一直在收音,监听到小雅小雅关键词后,开始识别。
  • 按键识别模式:通过主动调用开始识别和结束识别方法,来识别用户录音的录入,不会一直开启收音。

默认是第二种按键识别模式,如果是应用场景是第二种,点击按钮或者长按开始识别,可以不做设置,直接按照长按识别步骤实现即可。 如果应用场景是第一种,那么可以通过下面的方法,开启识别模式:

XiaoyaSDK.getInstance().disableKeywordWakeup(false);

实现长按识别(录音方式)

startRecognize()接口在开启识别的同时自动开启录音

在按钮按下的时候,开始识别:

XiaoyaSDK.getInstance().startRecognize();

在按钮抬起时,停止识别:

XiaoyaSDK.getInstance().stopRecognize();

注意:调用 startRecognize 后,一次完整语音交互后,即使还没有抬起按钮,没有调用 stopRecognize ,再继续说话,也不会继续识别,产生交互了

实现长按识别2(外部音频流方式)

startRecognizeWithoutRecorder()接口只开启识别,不会开启内部的录音

在按钮按下的时候,开始识别:

XiaoyaSDK.getInstance().startRecognizeWithoutRecorder();

在按钮抬起时,停止识别:

XiaoyaSDK.getInstance().stopRecognizeWithoutRecorder();

开始识别的同时,写入外部音频流:

XiaoyaSDK.getInstance().writeRecordData(byte[][] outputBuffer, byte[][] referenceBuffer);

示例,从InputStream(可以是文件或网络)中读取音频流。 手机上通常只用写一路数据,即写到outputBuffer[0]中,而referenceBuffer赋值new byte[2][256],不写数据即可。

private volatile boolean exitReader;
// 异步线程池
private Executor readExecutor = Executors.newFixedThreadPool(1);

// 用线程池在子线程执行writeRecordData()操作
readExecutor.execute(new Runnable() {
    @Override
    public void run() {
        byte[][] outputBuffer = new byte[6][256];
        byte[][] referenceBuffer = new byte[2][256];

        InputStream is = pipedIs;
        try {
            while (true) {  // 每次从inputStream读256byte, 写入sdk
                Log.v(TAG, "startReader available = " + is.available());
                if (is.available() < 256) { // 读太快,不足256时, sleep 100ms
                    try {
                        Thread.sleep(100);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
                int readed = is.read(outputBuffer[0]);

                if (exitReader) {
                    Log.v(TAG, "startReader exitReader !!!");
                    break;
                }

                Log.v(TAG, "startReader read = " + readed);
                if (readed < 0) {
                    Log.v(TAG, "startReader read end");

                    break;
                }

                XiaoyaSDK.getInstance().writeRecordData(outputBuffer, referenceBuffer);
            }

        } catch (IOException e) {
            e.printStackTrace();
            Log.v(TAG, "startReader catch read IOException");
        } finally {
            if (is != null) {
                try {
                    is.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
            Log.v(TAG, "startReader finally");
        }

        // 写完数据,调用停止识别
        XiaoyaSDK.getInstance().stopRecognizeWithoutRecorder();
    }
});

监听音量状态

由于音量的调节可能涉及到对于系统全部音量的调节,所以音量调节的实现,暴露给开发者实现。通过下面的代码接管音量调节的实现:

VolumeObserver接口本身比较复杂,可以使用sdk封装过的实现类VolumeChangedAdapter.Simple(),提供了对系统音量调节的默认实现。

int maxVolume = audioManager.getStreamMaxVolume(AudioManager.STREAM_MUSIC);
XiaoyaSDK.getInstance().addVolumeObserver(mVolumeChangedObserver = new VolumeChangedAdapter.Simple(getContext(), 1, maxVolume, maxVolume / XiaoyaSDK.getMaxVolume()));

XiaoyaSDK.getMaxVolume()默认为10,可以认为是1~10档。

设置音量

// 设置音量,合法范围 [0, 手机系统最大音量]。
XiaoyaSDK.getInstance().setVolume(float volume);

// 音量+1挡,一格档位步长由 VolumeChangedAdapter.mVolumeStep 决定
XiaoyaSDK.getInstance().adjustVolume(VolumeChangedObserver.VolumeRange.VOLUME_UP);

// 音量-1挡
XiaoyaSDK.getInstance().adjustVolume(VolumeChangedObserver.VolumeRange.VOLUME_DOWN);

// 静音/取消静音
XiaoyaSDK.getInstance().setMute(Boolean mute);

播放控制

SDK 也支持,通过调用方法的方式,来进行一些常见的控制,比如播放、暂停、上一首、下一首,这样,开发者可以实现点击按钮来控制播放,或者点击物理按键来实现播放控制。支持的方法有:

XiaoyaSDK.getInstance().play(); // 播放
XiaoyaSDK.getInstance().pause(); // 暂停
XiaoyaSDK.getInstance().previous(); // 上一首
XiaoyaSDK.getInstance().next(); // 下一首
XiaoyaSDK.getInstance().enableMic(); // 开启麦克风
XiaoyaSDK.getInstance().disableMic(); // 关闭麦克风

播放 TTS

输入文本,sdk会下载云端tts音频,并自动播放

XiaoyaSDK.getInstance().playLocalTTS("我是你的好朋友小雅啊,你可还记得那日盛夏,我们一同撑伞走过街角的咖啡店,雨水滴滴答答,都在为我们的步伐伴奏呢");
← 初始化回调 →
  • 语音识别与唤醒
    • 选择识别模式
    • 实现长按识别(录音方式)
    • 实现长按识别2(外部音频流方式)
  • 监听音量状态
  • 设置音量
  • 播放控制
  • 播放 TTS
北京小雅星空科技有限公司 京ICP备19010603号