语音组件
语音组件整体介绍
本文档是RobotSdk中语音组件的开发指南,包含了组件配置,使用流程,方法API,自定义语音方案接入等相关说明。
RobotSdk支持三种语音方案,分别是 RK3399语音方案,Android手机自带语音和自定义的语音方案。
开发者可以根据所使用的硬件平台,来初始化不同的语音方案。
我们同样支持自定义语音方案,开发者可以根据自己语音方案的实际情况,通过我们提供的接口进行接入。
组件配置
- 获取语音组件配置对象
1SpeechModuleConfig speechModuleConfig = new SpeechModuleConfig(context);
- 语音识别引擎类型
1/**
2 * 设置语音方案前,确认使用SDK设备支持的语音引擎类型
3 * SDK支持语音识别引擎列表:
4 * RK3399: SPEECH_TYPE_NUWA
5 * Android手机: SPEECH_TYPE_INTERNAL
6 * 自定义语音方案: SPEECH_TYPE_CUSTOMER
7 **/
8speechModuleConfig.speechType = SPEECH_TYPE_NUWA;// NUWA语音方案
3.是否开启语音角度抑制功能
1// 使机器人只倾听正前方目标说话人的声音,优化其他人声和嘈杂环境的干扰。
2speechModuleConfig.enableSpeechDirectionCheck = true;// 开启角度抑制
4.语音播报时,服务端控制是否打断
1speechModuleConfig.isTtsIntercept = true;// 开启语音播报时,服务端控制是否打断
5.语音识别log级别设置
1speechModuleConfig.speechLogLevel = 6;// 0~6, 数字越大log内容越详细
组件使用流程
下面四个方法是语音常用的四个API,通过这四个方法,开发者就可以使用整个语音功能。
开启唤醒监听
1RobotSDKManager.getInstance().startWakeupListening();
关闭唤醒监听
1RobotSDKManager.getInstance().stopWakeupListening();
打开语音识别
1RobotSDKManager.getInstance().startSpeechListening();
关闭语音识别
1RobotSDKManager.getInstance().stopSpeechListening();
具体的使用流程,根据开发者的场景需要,自主选择。下面是我们给出的两个场景示例
- 开始唤醒->用户通过唤醒词唤醒->关闭唤醒->开启识别->语音交互->交互结束->关闭识别->开启唤醒->等待用户唤醒
这种场景下,需要用户通过唤醒词唤醒后进行语音交互,在打开识别的同时,建议开发者关闭唤醒。 - 开启识别->语音交互->交互结束->关闭识别
这种场景下,不需要唤醒词唤醒,直接开启识别,开启识别的时机和方式开发者自己定义。
其它API说明
1. void adjustVolume(int direction);
调节音量
- SpeechEngine.VOLUME_UP 调大音量
- SpeechEngine.VOLUME_DOWN 调小音量
1RobotSDKManager.getInstance().adjustVolume(SpeechEngine.VOLUME_UP);
2. void speak(String speech);
语音播报
1RobotSDKManager.getInstance().speak("播报内容");
3. void stopSpeaking();
停止语音播报
1RobotSDKManager.getInstance().stopSpeaking();
4. void cancelSpeechListening();
取消语音识别和stopSpeechListening的效果不同
- stopSpeechListening() 停止语音识别,不会立即结束当前识别,等待当前识别结束并返回结果
- cancelSpeechListening() 取消语音识别,会打断当前识别,立即结束
1RobotSDKManager.getInstance().cancelSpeechListening();
5. void switchLanguage();
切换中英文识别结果
- RobotSpeechConstant.LAN_CHINESE 中文识别
- RobotSpeechConstant.LAN_ENGLISH 英文识别
1RobotSDKManager.getInstance().switchLanguage(RobotSpeechConstant.LAN_ENGLISH);
5. void registerSpeechListener(ISpeechCallback callback);
注册语音回调
1RobotSDKManager.getInstance().registerSpeechListener(this);
ISpeechCallback 各个接口回调的含义
1/**
2 * 语音功能接口
3 */
4public interface ISpeechCallback {
5
6 /**
7 * 语音识别状态回调
8 * @param status 状态码
9 */
10 public void onStatus(int status);
11
12 /**
13 * 语音识别结果回调
14 * @param speech 识别到的语音所转换的文本数据
15 */
16 public void onNewSpeech(SpeechModel speech);
17
18 /**
19 * 语音唤醒事件回调
20 * @param word 唤醒词
21 */
22 public void onWakeUp(String word);
23
24 /**
25 * 唤醒角度回调
26 * @param angle 唤醒角度
27 */
28 public void onWakeAngle(int angle);
29
30 /**
31 * 错误事件回调
32 * @param errorCode 错误码
33 */
34 void onSpeechRunningStatus(int statusCode, String statusMsg);
35
36 /**
37 * 配置语音识别语种(目前支持中文 zh-CN,英文 en-us).
38 * @param 语音识别语种
39 */
40 void onConfigObtained(String languageId);
41
42 /**
43 * 播报音量变化回调
44 * @param volumePercent 当前音量的相对值(0-100)
45 * @param volume 当前音量
46 */
47 void onAsrVolume(int volumePercent, int volume);
48}
6. void unregisterSpeechListener(ISpeechCallback callback);
解除注册语音回调
1RobotSDKManager.getInstance().unregisterSpeechListener(this);
自定义语音方案
RobotSdk支持接入自定义语音方案
1. 创建语音识别引擎SpeechEngine
继承抽象类SpeechEngine并实现对应的方法,根据自己语音方案提供相应的功能,主要方法有 startTTS, stopTTS, startASR, stopASR, startWakeUp, stopWakeUp, setVolume
1// 第三方语音功能实现类, 下面为示例代码,实际初始化类以使用的第三方语音功能实现类为准
2AbcSpeechControlInterface speechEngine = new AbcSpeechControlInterfaceImpl(context);
3new CustomSpeechListener(speechEngine, context);
2. 实现SpeechEngine接口并将步骤1中的第三方语音功能实现类传入进来
1public class CustomSpeech extends SpeechEngine {~~~~
2 // 第三方语音功能实现类
3 private AbcSpeechControlInterface mSpeechEngineImpl;
4 private static final String ACTION_FLAG = "KLYLSpeech";
5
6 public CustomSpeech(AbcSpeechControlInterface speechEngine) {
7 this.mSpeechEngineImpl = speechEngine;
8 }
9
10 @Override
11 public synchronized void speak(String speech) {
12 mSpeechEngineImpl.startTTS(speech, true);
13 }
14
15 @Override
16 public void stopSpeaking() {
17 mSpeechEngineImpl.stopTTS();
18 }
19
20 @Override
21 public void startListening() {
22 mSpeechEngineImpl.startASR();
23 }
24
25 @Override
26 public void cancelListening() {
27 mSpeechEngineImpl.stopASR();
28 }
29
30 @Override
31 public void stopListening() {
32 mSpeechEngineImpl.stopASR();
33 }
34
35 @Override
36 public void startWakeUp() {
37 mSpeechEngineImpl.startWakeUp();
38 }
39
40 @Override
41 public void stopWakeUp() {
42 mSpeechEngineImpl.stopWakeUp();
43 }
44
45 @Override
46 public void queryConfiguration() {
47
48 }
49
50 @Override
51 public void adjustVolume(int value) {
52 if (VOLUME_DOWN == value) {
53 mSpeechEngineImpl.setVolume(AbcSpeechControlInterface.VOLUME_TYPE_DECREASE, 0, null);
54 } else if (VOLUME_UP == value) {
55 mSpeechEngineImpl.setVolume(AbcSpeechControlInterface.VOLUME_TYPE_INCREASE, 0, null);
56 }
57 }
58}
3. 对自定义语音方案进行初始化
1public class CustomSpeechListener {
2
3 // 第三方语音功能实现类
4 private AbcSpeechControlInterface mSpeechEngineImpl;
5 private Context mContext;
6
7 public CustomSpeechListener(AbcSpeechControlInterface speechEngine, Context mContext) {
8 this.mSpeechEngineImpl = speechEngine;
9 this.mContext = mContext;
10 init();
11 }
12
13 public void init() {
14 KLYLSpeech speech = new KLYLSpeech(mSpeechEngine);
15 // 注册自定义语音方案
16 RobotSDKManager.getInstance().registerSpeech(mContext, speech);
17 // 创建回调listenner
18 final SpeechRecListener mListener = new SpeechRecListener(speech);
19 // 对自定义语音方案进行回调监听
20 mSpeechEngineImpl.registerSpeechLisenter(new AbcSpeechControlInterface.ThirdSpeechCallBack() {
21 // 语音状态回调
22 @Override
23 public void onThirdStatus(int status) {
24 mListener.setStatus(status);
25 mListener.notifyStatus();
26 }
27 // 用户语音识别回调
28 @Override
29 public void onThirdNewSpeech(int id, String speech, boolean isFinal) {
30 // 如果使用我们的云端服务,将识别结果通过listener回传
31 mListener.onAsrFinalResult(speech, null);
32 }
33 // 如果使用的是我们的云端服务,可以忽略此方法
34 @Override
35 public void onThirdNewAnswer(String answer) {
36 }
37 // 唤醒回调
38 @Override
39 public void onThirdWakeUp(String word, int wakeUpAngle) {
40 mListener.onWpSuccess(word);
41 mListener.onWpAngle(wakeUpAngle);
42 }
43 // 错误码回调
44 @Override
45 public void onError(int errorCode) {
46 mListener.onError(errorCode, "");
47 }
48 });
49 }
50}
3. 在App的Application中将我们的语音方案进行初始化
1AbcSpeechControlInterface speechEngine = new AbcSpeechControlInterfaceImpl(context);
2new 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语音板启动语音识别,正在重试 |