识别-理解-分发语音指令

机器人具备“跳舞”、“唱歌”、“导航”等技能,用户可以通过向机器人发出语音指令触发机器人对应的技能。比如:用户说“跳个舞吧”,机器人便会开始跳舞。用户发出指令到机器人执行指令,机器人工作步骤如下:

  1. 识别:机器人“听出”有用户在对自己说话,并“听出”用户对其说了什么;
  2. 理解:听懂用户所说话的含义,并转换成对应的指令;
  3. 分发指令:将指令通过一定的途径分发出去;
  4. 执行指令。

以上步骤代码实现如下:

准备工作

准备工作包括搭建开发环境、创建项目、添加库依赖等,详情请见开发你的第一个机器人应用

识别

开启机器人“听”的技能,可利用语音识别语音唤醒技术。使用语音识别或语音唤醒技术均需通过语音服务访问代理对象 SpeechManager 提供的 API。 SpeechManager 对象创建请见语音服务

识别过程使用的 API 均来自语音服务,此实现过程出现的参数、接口、专有名称等详细信息,均可通过语音服务查阅到,以下将不再赘述。

利用语音识别技术,使用机器人“听”的技能,可通过以下代码实现。

speechManager.recognize(new RecognitionOption.Builder(
    RecognitionOption.MODE_CONTINUOUS).build())
    .progress(new ProgressCallback<RecognitionProgress>() {
        @Override
        public void onProgress(RecognitionProgress recognitionProgress) {
            if (recognitionProgress.getProgress()
                .equals(RecognitionProgress.PROGRESS_RECOGNITION_TEXT_RESULT)) {
                String asr = recognitionProgress.getTextResult();
                understand(asr); // 执行“理解”操作
            }
        }
    })
    .fail(new FailCallback<RecognitionException>() {
        @Override
        public void onFail(RecognitionException e) {
            // “听” 出错会运行至此
        }
    });

利用语音唤醒技术,使用机器人“听”的技能,可通过以下代码实现。

speechManager.registerWakeUpListener(new WakeUpListener() {
    @Override
    public void onWakingUp(WakeUp wakeUp) {
        // 机器人感知到被唤醒可进行如下工作:调整姿势(面向用户)、开启识别
        // 开启识别
        speechManager.recognize(new RecognitionOption.Builder(
            RecognitionOption.MODE_SINGLE).build())
            .done(new DoneCallback<RecognitionResult>() {
                @Override
                public void onDone(RecognitionResult recognitionResult) {
                    if (!recognitionResult.withUnderstandingResult()) {
                        String inputText = recognitionResult.getText();
                        understand(inputText); // 执行“理解”操作
                    }
                }
            })
            .fail(new FailCallback<RecognitionException>() {
                @Override
                public void onFail(RecognitionException e) {
                    // “听” 出错会运行至此
                }
            });
    }
});

若机器人“听”技能处于关闭状态,只利用语音识别技术,需要用户通过非语音的方式(点击按钮)才能开启该技能。如果使用语音唤醒技术,则用户可通过语音的方式(唤醒词)开启听的技能。

理解

机器人要想听懂用户说什么,可利用自然语言处理技术,代码实现如下。

public Promise<UnderstandingResult, UnderstandingException> understand(String inputText) {
    return speechManager.understand(inputText)
        .done(new DoneCallback<UnderstandingResult>() {
            @Override
            public void onDone(UnderstandingResult understandingResult) {
                String action = understandingResult.getIntent().getAction();
                dispatchDirective(action); // 执行分发指令操作
            }
        }).fail(new FailCallback<UnderstandingException>() {
            @Override
            public void onFail(UnderstandingException e) {
                // 理解出错会运行至此
            }
        });
}

分发指令

public Promise<Void, DispatchException> dispatchDirective(String action) {
    return Robot.globalContext().dispatchDirective(action).done(new DoneCallback<Void>() {
                @Override
                public void onDone(Void aVoid) {
                    // “分发指令” 完成将运行至此
                }
            }).fail(new FailCallback<DispatchException>() {
                @Override
                public void onFail(DispatchException e) {
                    // “分发指令”出错将运行至此
                }
            });
}

执行指令

执行指令的应用称为技能应用,主要用于接收指令,接收到指令后,通过调用对应的系统服务即可执行指令。技能应用与分发指令的应用可以是同一个应用,也可以是不同应用,若是不同应用,则需创建,创建应用请参考开发你的第一个机器人应用,关于技能的实现请参考技能