功能
语音识别与唤醒
选择识别模式
目前 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("我是你的好朋友小雅啊,你可还记得那日盛夏,我们一同撑伞走过街角的咖啡店,雨水滴滴答答,都在为我们的步伐伴奏呢");