分场景语音
机器人在OPK系统中,语音系统是分场景使用的,不同的opk有不同的appid,每个opk中可注册不同的场景(path),让某些语音只在指定的app、path中生效。现在机器人APK也支持分场景使用语音系统了,同时招财豹进行APK开发时,强制使用分场景语音。
为支持在APK开发时分场景使用,我们在skillApi中集成了一系列指定appid、path的操作方法,具体如下:
//指定并初始化某个appid mSkillApi.onCreate(SPEECH_APPID); //指定appid的版本号 mSkillApi.setVersion(SPEECH_APPID, SPEECH_VERSION); //指定当前appid和场景 mSkillApi.setPath(SPEECH_APPID,SPEECH_DEFAULT_PATH); //指定当前appid处于前台状态(工作状态) mSkillApi.onForeground(SPEECH_APPID); //指定当前appid处于后台状态(暂停工作状态) mSkillApi.onBackground(SPEECH_APPID); //指定退出某个appid,退出后如需再次使用,重新create mSkillApi.onDestroy(SPEECH_APPID); //当状态混乱不清,使用它重置状态,随后从create重新开始 mSkillApi.resetNlpState();
由于APK开发中,并不像opk开发时每个appid对应一个机器人插件,所以如何定义appid的作用域取决于开发者自己,例如在分场景使用语音的demo apk中,我们定义整个app都使用一个appid不会切换,而activity的生命周期状态用来控制语音状态机的转化。于是我们写了如下代码来控制它(这部分代码在SkillApiHelper中可以找到)
package com.ainirobot.robotos.application; import android.os.Build; import com.ainirobot.coreservice.client.speech.SkillApi; public class SkillApiHelper { //APPID是申请注册的APPID,也即使申请的opk的appid。 private static final String SPEECH_APPID = "xxx"; //在接待后台注册的场景,语音会在正确的appi的中某个场景中生效 private static final String SPEECH_DEFAULT_PATH = "yyyy"; //在接待后台注册的版本号,没有实际的opk填1.0.0 private static final String SPEECH_VERSION = "1.0.0"; private static SkillApi mSkillApi; public static void setSkillApi(SkillApi skillApi) { mSkillApi = skillApi; } public static void startApp() { if(mSkillApi != null){ mSkillApi.onCreate(SPEECH_APPID); mSkillApi.setVersion(SPEECH_APPID, SPEECH_VERSION); mSkillApi.setPath(SPEECH_APPID,SPEECH_DEFAULT_PATH); mSkillApi.onForeground(SPEECH_APPID); } } public static void moveToForeground() { if(mSkillApi != null){ mSkillApi.onForeground(SPEECH_APPID); } } public static void moveToBack() { if(mSkillApi != null){ mSkillApi.onBackground(SPEECH_APPID); } } public static void destroyApp(){ if(mSkillApi != null){ mSkillApi.onDestroy(SPEECH_APPID); } } public static void setAppPath(String path){ if(mSkillApi != null){ mSkillApi.setPath(SPEECH_APPID,path); } } public static void reset(){ if(mSkillApi != null){ mSkillApi.resetNlpState(); } } }
对应的调用点,在MainActivity和RobotOSApplication中可以找到
//MainActivity public class MainActivity extends AppCompatActivity { ... @Override protected void onStart() { super.onStart(); SkillApiHelper.startApp(); } @Override protected void onResume() { super.onResume(); SkillApiHelper.moveToForeground(); } @Override protected void onPause() { super.onPause(); SkillApiHelper.moveToBack(); } @Override protected void onStop() { super.onStop(); SkillApiHelper.destroyApp(); } ... } //RobotOSApplication public class RobotOSApplication extends Application { ... private void initSkillApi() { mSkillApi = new SkillApi(); ApiListener apiListener = new ApiListener() { @Override public void handleApiDisabled() { } /** * Handle speech service * 语音服务连接成功,注册语音回调 */ @Override public void handleApiConnected() { mSkillApi.registerCallBack(mSkillCallback); //设置path和version SkillApiHelper.setSkillApi(mSkillApi); SkillApiHelper.startApp(); } /** * Disconnect speech service * 语音服务已断开 */ @Override public void handleApiDisconnected() { } }; mSkillApi.addApiEventListener(apiListener); mSkillApi.connectApi(mContext); } ... }
Enjoy & Have fun