跳到内容 跳到主导航 跳到页脚

分场景语音

机器人在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

SkillApiSample.zip

这篇文章是否有帮助?

0