语音交互
语音对话
该功能在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()
:关闭唤醒词识别功能。
public class WakeUpActivity implements RobotSDKEngine.SpeechCallBack
{
private static final String TAG = logTag(RobotSDKEngine.class);
private RobotSDKEngine robotSDKEngine;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_wake_up);
// 获取SDK实例
robotSDKEngine = RobotSDKEngine.getInstance();
// 注册语音模块回调,this为当前类。
robotSDKEngine.registerSpeechListener(this);
// 开启语音识别
robotSDKEngine.startListening();
// 开启唤醒
robotSDKEngine.startWP();
// 语音合成
robotSDKEngine.speak("欢迎使用机器人SDK");
}
@Override
public void onError(int errorCode) {
Log.d(TAG, "错误码:" + errorCode);
}
@Override
public void onStatus(int status) {
Log.d(TAG, "麦克风状态:" + status);
}
// asr识别结果回调
@Override
public void onNewSpeech(SpeechBean speechBean) {
String speech = speechBean.speech;
boolean isFinal = speechBean.isFinal;
Log.d(TAG, "语音识别结果:" + speech);
Log.d(TAG, "是否当前识别结束:" + isFinal);
if (isFinal == ture) {
if ("再见".equals(speech)) {
robotSDKEngine.resetConversation();
}
}
}
// 唤醒回调,返回唤醒词
@Override
public void onWakeUp(String word) {
Log.d(TAG, "唤醒词为:" + word);
// 开启语音会话(上下文)
robotSDKEngine.startConversation ();
robotSDKEngine.speak("欢迎你");
}
// 唤醒角度回调
@Override
public void onWakeAngle(int angle) {
Log.d(TAG, "角度:" + angle);
}
@Override
protected void onDestroy() {
super.onDestroy();
}
}
语音交互监听器
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
public Class MyApplication extends Application { // 建议在 Application 中完成 SDK 初始化 @Override public void onCreate() { super.onCreate(); // SDK配置项 SDKConfig.Builder builder = new SDKConfig.Builder(); builder.faceApiKey(BuildConfig.FACE_KEY) .context(getApplicationContext()) // 在这里设置麦克风类型为SDKConfig.SPEECH_TYPE_CUSTOMER .speechServiceType(SDKConfig.SPEECH_TYPE_CUSTOMER) .………………; // 省略具体配置代码,初始化具体配置项代码可参考第三章节 - 3.1 引擎初始化 } }
-
实现第三方语音类(基于代理模式,继承SDK提供的BaseSpeech类,并实现必要的方法)
public class CustomSpeech extends BaseSpeech { // 开发者需要在业务逻辑中自己编写自己的语音能力实现类 // 此处以 CustomSpeechImp 举例,意指用户自定义的语音能力实现类 CustomSpeechImp mSpeechImp; public CustomSpeech(CustomSpeechImp speechImp) { this.mSpeechImp = speechImp; } @Override public void queryConfiguration() { } @Override public void startListening() { mSpeechImp.startListening(); } @Override public void cancelListening() { mSpeechImp.cancelListening(); } @Override public void stopListening() { mSpeechImp.stopListening(); } @Override public void startWakeUp() { mSpeechImp.startWakeUp(); } @Override public void stopWakeUp() { mSpeechImp.stopWakeUp(); } @Override public void speak(String speech) { mSpeechImp.speak(speech); } @Override public void stopSpeaking() { mSpeechImp.stopSpeaking(); } }
-
把第三方语音服务run起来,并实现一个SpeechRecListener类的对象,最后在第三方语音服务的回调处添加SpeechRecListener的触发。 初始化一个开发者自定义的BaseSpeech类型对象、在SDK中注册、新建一个语音识别事件监听类,如下:
@Override public void onCreate() { super.onCreate(); // 1. 初始化开发者自定义的BaseSpeech类型对象 mSpeech = new CustomSpeech(this); // 2. 注册开发者自定义的 CustomSpeech RobotSDKEngine.getInstance().registerSpeech(getApplicationContext(), mSpeech); // 3. 初始化语音识别事件监听器 mListener = new SpeechRecListener(mSpeech); }
-
并在第三方语音服务的响应位置添加通知处理:
// 识别的语音通过该函数传递给语音监听器来通知开发者 // 通常会在语音监听器的 onNewSpeech(SpeechBean bean) 方法中进行回调 // msgData 为 SpeechBean 中的 speech 属性 mListener.onAsrFinalResult(msgData, null);
// 语音唤醒的结果通过该函数传递给语音监听器来通知开发者 // 该回调通常会触发语音监听器的 onWakeUp(String word) 方法 // msgData 与 word 对应,同为唤醒词 mListener.onWpSuccess(msgData);
-
还可以继续拓展其他函数:
// 1. 识别的中间过程回调,对应onNewSpeech(SpeechBean speechBean)中,beand的isFinal属性为false的场景: mListener.onAsrPartialResult(String result, RecogResult recogResult); // 2. 唤醒角度回调,通过语音监听器的onWakeAngle(int angle)通知开发者 mListener.onWpAngle(int angle) // 3. 错误状态回调,通过语音监听器的onError(int errorCode)通知开发者 mListener.onError(int errorCode, String errorMsg)
注意:
以上注册要在下面这两个开启和注册语音语音之前完成。
robotSDKEngine.stopListening();
robotSDKEngine.registerSpeechListener(this);