分场景语音
机器人在OPK系统中,语音系统是分场景使用的,不同的opk有不同的appid,每个opk中可注册不同的场景(path),让某些语音只在指定的app、path中生效。现在机器人APK也支持分场景使用语音系统了,同时招财豹进行APK开发时,强制使用分场景语音,2个传值建议写公司缩写,同时联系售前对该企业ID进行白名单加白。
为支持在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