语音交互
语音对话
该功能在SDK初始化之后进行,需要这个功能时,首先需调用函数registerSpeechListener
注册监听器。之后开发者需实现本SDK提供的语音会话监听器接口(RecognizeListener),通过监听器中的回调函数来使用语音识别相关功能。本SDK会对语音识别结果,Q&A结果通过监听器的函数一一通知给开发者。如果对返回的答案的格式有特殊要求,可通过机器人平台完成智能对答内容(json内容)格式的定制化。
-
public void registerSpeechListener(SpeechCallBack callBack)
:注册语音识别监听器 参数:SpeechCallBack callBack
:一个语音识别的listener,详情点击这里(SpeechCallBack介绍) -
public void unRegisterSpeechListener(SpeechCallBack callBack)
:注销语音识别监听器 参数:SpeechCallBack callBack
:一个语音识别的listener,详情点击这里(SpeechCallBack介绍) public void startListening()
:语音识别开启函数public void stopListening()
:语音识别关闭函数public boolean isAsrRunning()
:判断语音识别是否正在执行。 输出:True 正在执行 ; False 没有工作public void startConversation()
:开始当前对话上下文(环境),即一次对话过程。public void resetConversation()
:取消当前对话上下文(环境),即初始化当前对话环境。public void switchLanguage(int languageType)
:切换识别语音的语种(目前支持中文、英文两种),必须在开启语音识别之后调用,具体参数如下:public static final int LAN_CHINESE = 0;
:中文public static final int LAN_ENGLISH = 1;
:英文public void adjustVolume(int direction)
:调节播放tts文字的音量大小(目前仅支持3326方案),必须在开启语音识别之后调用,具体参数如下:public static final int VOLUME_ADD = 0x0100;
:增大音量public static final int VOLUME_SUB = 0x0200;
:减小音量
注意:
当实现项目没有用到人脸识别模块时,可通过startConversation函数和resetConversation函数控制对话的上下文,即代表一次session会话。在调用startConversation () 方法之后到调用resetConversation()方法之前的这段时间里,语音功能模块会把使用者当做是同一个人,并且语境相同。调用resetConversation()方法之后,被认为当前对话模式结束。
语音合成
该功能在SDK初始化之后进行。
public void speak(String speech)
:TTS播报字符串。 参数:String speech
:播报的字符串。public void stopSpeaking()
:TTS停止当前正在播报的字符串。
语音唤醒
public void startWP()
:开启唤醒功能,唤醒词设置点击这里。public void stopWP()
:关闭唤醒词识别功能。
1public class WakeUpActivity implements RobotSDKEngine.SpeechCallBack
2{
3 private static final String TAG = logTag(RobotSDKEngine.class);
4 private RobotSDKEngine robotSDKEngine;
5 @Override
6 protected void onCreate(Bundle savedInstanceState) {
7 super.onCreate(savedInstanceState);
8 setContentView(R.layout.activity_wake_up);
9 // 获取SDK实例
10 robotSDKEngine = RobotSDKEngine.getInstance();
11 // 注册语音模块回调,this为当前类。
12 robotSDKEngine.registerSpeechListener(this);
13 // 开启语音识别
14 robotSDKEngine.startListening();
15 // 开启唤醒
16 robotSDKEngine.startWP();
17 // 语音合成
18 robotSDKEngine.speak("欢迎使用机器人SDK");
19 }
20 @Override
21 public void onError(int errorCode) {
22 Log.d(TAG, "错误码:" + errorCode);
23 }
24 @Override
25 public void onStatus(int status) {
26 Log.d(TAG, "麦克风状态:" + status);
27 }
28 // asr识别结果回调
29 @Override
30 public void onNewSpeech(SpeechBean speechBean) {
31 String speech = speechBean.speech;
32 boolean isFinal = speechBean.isFinal;
33 Log.d(TAG, "语音识别结果:" + speech);
34 Log.d(TAG, "是否当前识别结束:" + isFinal);
35 if (isFinal == ture) {
36 if ("再见".equals(speech)) {
37 robotSDKEngine.resetConversation();
38 }
39 }
40 }
41
42 // 唤醒回调,返回唤醒词
43 @Override
44 public void onWakeUp(String word) {
45 Log.d(TAG, "唤醒词为:" + word);
46 // 开启语音会话(上下文)
47 robotSDKEngine.startConversation ();
48 robotSDKEngine.speak("欢迎你");
49 }
50 // 唤醒角度回调
51 @Override
52 public void onWakeAngle(int angle) {
53 Log.d(TAG, "角度:" + angle);
54 }
55 @Override
56 protected void onDestroy() {
57 super.onDestroy();
58 }
59}
语音交互监听器
Interface SpeechCallBack
:语音识别器接口。具有五个回调函数:
-
public void onStatus(int status)
:当前语音识别器状态 参数:int status
:值为2时,表示当前不可用。其他值代表语音识别的不同状态 麦克风状态回调表:状态名称 状态值 类别 麦克风类别 停止(WpStop) 203 唤醒 内置/阵列 准备就绪(WpSready) 202 唤醒 内置/阵列 (在阵列中只有经过一次停止唤醒之后,以后再开启就会有回调) 准备开始(AsrBegin) 5 识别 内置 结束(onAsrEnd) 6 识别 内置 结束(onAsrFinish) 7 识别 内置 最终识别结果(AsrFinalResult) 7 识别 内置 错误(AsrFinishError) 7 识别 内置 长语音识别结束(AsrLongFinish) 7 识别 内置 退出(AsrExit) 2 识别 内置/阵列 完成(TTS_FINISHED) 302 合成 内置/阵列 开始(TTS_START) 301 合成 阵列 public void onNewSpeech(SpeechBean speechBean)
:SDK通过该回调函数,返回 语音识别的结果。SpeechBean 具有三个属性:int id
:此段语音idString speech
:语音识别到的字串boolean isFinal
:是否这句话识别结束,逐字识别模式下,当本句话还未识别结束回调的值为false,识别结束为true。-
public void onWakeUp(String word)
:SDK检测到唤醒词后回调该方法,并返回唤醒词字串。参数:
String word
:唤醒词 -
public void onWakeAngle(int angle)
:SDK检测到唤醒词后回调该方法,并返回唤醒角度(当时用具有声源定位的麦克风阵列的时候,功能才有效)。参数:
int angle
:0~360之间(逆时针方向) -
public void onError(int errorCode)
:SDK检测到语音识别器发生错误时回调用该方法 参数:int errorCode
:错误码为-2时,表示WiFi已经断开;错误码为-3时,表示麦克风阵列开启串口失败;错误码为-8时,表示麦克风阵列语音识别失败。
语音模块错误回调
状态名称 | 状态值 | 类别 | 麦克风类别 |
---|---|---|---|
阵列的WiFi已经断开 | -2 | 语音 | 阵列 |
麦克风阵列开启串口失败 | -3 | 语音 | 阵列 |
解析麦克风阵列数据失败 | -4 | 语音 | 阵列 |
SDK发送麦克风数据失败 | -5 | 语音 | 阵列 |
麦克风驱动找不到 | -6 | 语音 | 阵列 |
麦克风阵列 设备找不到 | -7 | 语音 | 阵列 |
麦克风阵列语音识别失败 | -8 | 语音 | 阵列 |
Android设备断网 | -9 | 语音 | 内置(因为设备断网触发的语音识别错误回调) |
自定义语音模块
本SDK还支持除内置麦克风和百度麦克风阵列之外的第三方麦克风的接入,具体接入过程如下:
-
设置麦克风类型为
SDKConfig.SPEECH_TYPE_CUSTOMER
Java1public Class MyApplication extends Application { // 建议在 Application 中完成 SDK 初始化 2 3 @Override 4 public void onCreate() { 5 super.onCreate(); 6 // SDK配置项 7 SDKConfig.Builder builder = new SDKConfig.Builder(); 8 builder.faceApiKey(BuildConfig.FACE_KEY) 9 .context(getApplicationContext()) 10 // 在这里设置麦克风类型为SDKConfig.SPEECH_TYPE_CUSTOMER 11 .speechServiceType(SDKConfig.SPEECH_TYPE_CUSTOMER) 12 .………………; 13 // 省略具体配置代码,初始化具体配置项代码可参考第三章节 - 3.1 引擎初始化 14 } 15}
-
实现第三方语音类(基于代理模式,继承SDK提供的BaseSpeech类,并实现必要的方法)
Java1public class CustomSpeech extends BaseSpeech { 2 // 开发者需要在业务逻辑中自己编写自己的语音能力实现类 3 // 此处以 CustomSpeechImp 举例,意指用户自定义的语音能力实现类 4 CustomSpeechImp mSpeechImp; 5 6 public CustomSpeech(CustomSpeechImp speechImp) { 7 this.mSpeechImp = speechImp; 8 } 9 10 @Override 11 public void queryConfiguration() { 12 13 } 14 15 @Override 16 public void startListening() { 17 mSpeechImp.startListening(); 18 } 19 20 @Override 21 public void cancelListening() { 22 mSpeechImp.cancelListening(); 23 } 24 25 @Override 26 public void stopListening() { 27 mSpeechImp.stopListening(); 28 } 29 30 @Override 31 public void startWakeUp() { 32 mSpeechImp.startWakeUp(); 33 } 34 35 @Override 36 public void stopWakeUp() { 37 mSpeechImp.stopWakeUp(); 38 } 39 40 @Override 41 public void speak(String speech) { 42 mSpeechImp.speak(speech); 43 } 44 45 @Override 46 public void stopSpeaking() { 47 mSpeechImp.stopSpeaking(); 48 } 49 }
-
把第三方语音服务run起来,并实现一个SpeechRecListener类的对象,最后在第三方语音服务的回调处添加SpeechRecListener的触发。 初始化一个开发者自定义的BaseSpeech类型对象、在SDK中注册、新建一个语音识别事件监听类,如下:
Java1@Override 2public void onCreate() { 3 super.onCreate(); 4 // 1. 初始化开发者自定义的BaseSpeech类型对象 5 mSpeech = new CustomSpeech(this); 6 // 2. 注册开发者自定义的 CustomSpeech 7 RobotSDKEngine.getInstance().registerSpeech(getApplicationContext(), mSpeech); 8 // 3. 初始化语音识别事件监听器 9 mListener = new SpeechRecListener(mSpeech); 10}
-
并在第三方语音服务的响应位置添加通知处理:
Java1// 识别的语音通过该函数传递给语音监听器来通知开发者 2// 通常会在语音监听器的 onNewSpeech(SpeechBean bean) 方法中进行回调 3// msgData 为 SpeechBean 中的 speech 属性 4mListener.onAsrFinalResult(msgData, null);
Java1// 语音唤醒的结果通过该函数传递给语音监听器来通知开发者 2// 该回调通常会触发语音监听器的 onWakeUp(String word) 方法 3// msgData 与 word 对应,同为唤醒词 4mListener.onWpSuccess(msgData);
-
还可以继续拓展其他函数:
Java1 // 1. 识别的中间过程回调,对应onNewSpeech(SpeechBean speechBean)中,beand的isFinal属性为false的场景: 2 mListener.onAsrPartialResult(String result, RecogResult recogResult); 3 // 2. 唤醒角度回调,通过语音监听器的onWakeAngle(int angle)通知开发者 4 mListener.onWpAngle(int angle) 5 // 3. 错误状态回调,通过语音监听器的onError(int errorCode)通知开发者 6 mListener.onError(int errorCode, String errorMsg)
注意:
以上注册要在下面这两个开启和注册语音语音之前完成。
1robotSDKEngine.stopListening();
2robotSDKEngine.registerSpeechListener(this);