语音组件
语音组件整体介绍
本文档是RobotSdk中语音组件的开发指南,包含了组件配置,使用流程,方法API,自定义语音方案接入等相关说明。
RobotSdk支持三种语音方案,分别是 RK3399语音方案,Android手机自带语音和自定义的语音方案。
开发者可以根据所使用的硬件平台,来初始化不同的语音方案。
我们同样支持自定义语音方案,开发者可以根据自己语音方案的实际情况,通过我们提供的接口进行接入。
组件配置
- 获取语音组件配置对象
SpeechModuleConfig speechModuleConfig = new SpeechModuleConfig(context);
- 语音识别引擎类型
/**
* 设置语音方案前,确认使用SDK设备支持的语音引擎类型
* SDK支持语音识别引擎列表:
* RK3399: SPEECH_TYPE_NUWA
* Android手机: SPEECH_TYPE_INTERNAL
* 自定义语音方案: SPEECH_TYPE_CUSTOMER
**/
speechModuleConfig.speechType = SPEECH_TYPE_NUWA;// NUWA语音方案
3.是否开启语音角度抑制功能
// 使机器人只倾听正前方目标说话人的声音,优化其他人声和嘈杂环境的干扰。
speechModuleConfig.enableSpeechDirectionCheck = true;// 开启角度抑制
4.语音播报时,服务端控制是否打断
speechModuleConfig.isTtsIntercept = true;// 开启语音播报时,服务端控制是否打断
5.语音识别log级别设置
speechModuleConfig.speechLogLevel = 6;// 0~6, 数字越大log内容越详细
组件使用流程
下面四个方法是语音常用的四个API,通过这四个方法,开发者就可以使用整个语音功能。
开启唤醒监听
RobotSDKManager.getInstance().startWakeupListening();
关闭唤醒监听
RobotSDKManager.getInstance().stopWakeupListening();
打开语音识别
RobotSDKManager.getInstance().startSpeechListening();
关闭语音识别
RobotSDKManager.getInstance().stopSpeechListening();
具体的使用流程,根据开发者的场景需要,自主选择。下面是我们给出的两个场景示例
- 开始唤醒->用户通过唤醒词唤醒->关闭唤醒->开启识别->语音交互->交互结束->关闭识别->开启唤醒->等待用户唤醒
这种场景下,需要用户通过唤醒词唤醒后进行语音交互,在打开识别的同时,建议开发者关闭唤醒。 - 开启识别->语音交互->交互结束->关闭识别
这种场景下,不需要唤醒词唤醒,直接开启识别,开启识别的时机和方式开发者自己定义。
其它API说明
1. void adjustVolume(int direction);
调节音量
- SpeechEngine.VOLUME_UP 调大音量
- SpeechEngine.VOLUME_DOWN 调小音量
RobotSDKManager.getInstance().adjustVolume(SpeechEngine.VOLUME_UP);
2. void speak(String speech);
语音播报
RobotSDKManager.getInstance().speak("播报内容");
3. void stopSpeaking();
停止语音播报
RobotSDKManager.getInstance().stopSpeaking();
4. void cancelSpeechListening();
取消语音识别和stopSpeechListening的效果不同
- stopSpeechListening() 停止语音识别,不会立即结束当前识别,等待当前识别结束并返回结果
- cancelSpeechListening() 取消语音识别,会打断当前识别,立即结束
RobotSDKManager.getInstance().cancelSpeechListening();
5. void switchLanguage();
切换中英文识别结果
- RobotSpeechConstant.LAN_CHINESE 中文识别
- RobotSpeechConstant.LAN_ENGLISH 英文识别
RobotSDKManager.getInstance().switchLanguage(RobotSpeechConstant.LAN_ENGLISH);
5. void registerSpeechListener(ISpeechCallback callback);
注册语音回调
RobotSDKManager.getInstance().registerSpeechListener(this);
ISpeechCallback 各个接口回调的含义
/**
* 语音功能接口
*/
public interface ISpeechCallback {
/**
* 语音识别状态回调
* @param status 状态码
*/
public void onStatus(int status);
/**
* 语音识别结果回调
* @param speech 识别到的语音所转换的文本数据
*/
public void onNewSpeech(SpeechModel speech);
/**
* 语音唤醒事件回调
* @param word 唤醒词
*/
public void onWakeUp(String word);
/**
* 唤醒角度回调
* @param angle 唤醒角度
*/
public void onWakeAngle(int angle);
/**
* 错误事件回调
* @param errorCode 错误码
*/
void onSpeechRunningStatus(int statusCode, String statusMsg);
/**
* 配置语音识别语种(目前支持中文 zh-CN,英文 en-us).
* @param 语音识别语种
*/
void onConfigObtained(String languageId);
/**
* 播报音量变化回调
* @param volumePercent 当前音量的相对值(0-100)
* @param volume 当前音量
*/
void onAsrVolume(int volumePercent, int volume);
}
6. void unregisterSpeechListener(ISpeechCallback callback);
解除注册语音回调
RobotSDKManager.getInstance().unregisterSpeechListener(this);
自定义语音方案
RobotSdk支持接入自定义语音方案
1. 创建语音识别引擎SpeechEngine
继承抽象类SpeechEngine并实现对应的方法,根据自己语音方案提供相应的功能,主要方法有 startTTS, stopTTS, startASR, stopASR, startWakeUp, stopWakeUp, setVolume
// 第三方语音功能实现类, 下面为示例代码,实际初始化类以使用的第三方语音功能实现类为准
AbcSpeechControlInterface speechEngine = new AbcSpeechControlInterfaceImpl(context);
new CustomSpeechListener(speechEngine, context);
2. 实现SpeechEngine接口并将步骤1中的第三方语音功能实现类传入进来
public class CustomSpeech extends SpeechEngine {~~~~
// 第三方语音功能实现类
private AbcSpeechControlInterface mSpeechEngineImpl;
private static final String ACTION_FLAG = "KLYLSpeech";
public CustomSpeech(AbcSpeechControlInterface speechEngine) {
this.mSpeechEngineImpl = speechEngine;
}
@Override
public synchronized void speak(String speech) {
mSpeechEngineImpl.startTTS(speech, true);
}
@Override
public void stopSpeaking() {
mSpeechEngineImpl.stopTTS();
}
@Override
public void startListening() {
mSpeechEngineImpl.startASR();
}
@Override
public void cancelListening() {
mSpeechEngineImpl.stopASR();
}
@Override
public void stopListening() {
mSpeechEngineImpl.stopASR();
}
@Override
public void startWakeUp() {
mSpeechEngineImpl.startWakeUp();
}
@Override
public void stopWakeUp() {
mSpeechEngineImpl.stopWakeUp();
}
@Override
public void queryConfiguration() {
}
@Override
public void adjustVolume(int value) {
if (VOLUME_DOWN == value) {
mSpeechEngineImpl.setVolume(AbcSpeechControlInterface.VOLUME_TYPE_DECREASE, 0, null);
} else if (VOLUME_UP == value) {
mSpeechEngineImpl.setVolume(AbcSpeechControlInterface.VOLUME_TYPE_INCREASE, 0, null);
}
}
}
3. 对自定义语音方案进行初始化
public class CustomSpeechListener {
// 第三方语音功能实现类
private AbcSpeechControlInterface mSpeechEngineImpl;
private Context mContext;
public CustomSpeechListener(AbcSpeechControlInterface speechEngine, Context mContext) {
this.mSpeechEngineImpl = speechEngine;
this.mContext = mContext;
init();
}
public void init() {
KLYLSpeech speech = new KLYLSpeech(mSpeechEngine);
// 注册自定义语音方案
RobotSDKManager.getInstance().registerSpeech(mContext, speech);
// 创建回调listenner
final SpeechRecListener mListener = new SpeechRecListener(speech);
// 对自定义语音方案进行回调监听
mSpeechEngineImpl.registerSpeechLisenter(new AbcSpeechControlInterface.ThirdSpeechCallBack() {
// 语音状态回调
@Override
public void onThirdStatus(int status) {
mListener.setStatus(status);
mListener.notifyStatus();
}
// 用户语音识别回调
@Override
public void onThirdNewSpeech(int id, String speech, boolean isFinal) {
// 如果使用我们的云端服务,将识别结果通过listener回传
mListener.onAsrFinalResult(speech, null);
}
// 如果使用的是我们的云端服务,可以忽略此方法
@Override
public void onThirdNewAnswer(String answer) {
}
// 唤醒回调
@Override
public void onThirdWakeUp(String word, int wakeUpAngle) {
mListener.onWpSuccess(word);
mListener.onWpAngle(wakeUpAngle);
}
// 错误码回调
@Override
public void onError(int errorCode) {
mListener.onError(errorCode, "");
}
});
}
}
3. 在App的Application中将我们的语音方案进行初始化
AbcSpeechControlInterface speechEngine = new AbcSpeechControlInterfaceImpl(context);
new CustomSpeechListener(speechEngine, context);
状态码以及错误码
错误码为负数,状态码为正数
错误码/状态码 | 描述 |
---|---|
-20000 | RK3326语音板WIFI断开连接 |
-20001 | RK3326语音板串口打开失败 |
-20002 | RK3326语音板speech service语音读数据失败 |
-20003 | RK3326语音板串口命令发送失败 |
-20004 | RK3326语音板3326串口驱动为空 |
-20005 | RK3326语音板asr识别发生错误 |
-20006 | RK3326语音板串口通信超时 |
-20007 | RK3326语音板串口重新连接 |
-20008 | RK3326语音板speech service 重启,ASR重新连接 |
-20009 | RK3326语音板speech service 重启,Wakeup重新连接 |
-20010 | RK3326语音板speech service 其它服务重新连接 |
-20011 | RK3326语音板WIFI已关闭 |
-20012 | ASR退出,请稍等,SDK本身包含自动重启ASR机制 |
-20013 | RK3326语音板ASR退出,正在重启 |
-20014 | RK3326语音板Wakeup正在重试启动中,请勿多次调用 |
-20015 | RK3326语音板Wakeup启动失败,原因是重复开启 |
-20016 | RK3326语音板ASR正在重试启动中,请勿多次调用 |
-20017 | RK3326语音板ASR启动失败,原因是重复开启 |
20000 | RK3326语音板WIFI已连接 |
20001 | RK3326语音板WIFI已开启 |
20002 | 唤醒已经开启 |
20003 | RK3326语音板启动语音唤醒,正在重试 |
20004 | ASR已经开启 |
20005 | RK3326语音板启动语音识别,正在重试 |