Skip to content

3. 语音交互之 云端配置语音交互模型(L3)

TokenChen edited this page May 31, 2020 · 3 revisions

1.云端配置语音交互模型介绍

第二章中,我们介绍了如何进行本地自定义语音交互模型配置。本章我们会介绍如何在云端完成语音交互模型配置。

通过上一章内容,我们知道语音交互的前提是,我们要告诉DuerOS(大脑),用户语音内容和意图的匹配关系。

本地自定义语音交互模型是把匹配关系写在本地,然后上报给DuerOS。云端配置语音交互模型,就是把用户语音指令和意图的匹配关系,维护在云端平台上,DuerOS直接从云端读取配置即可。

接入云端意图配置的应用,就属于L3级别应用。

2.云端配置语音交互模型-流程介绍

2.1 云端配置语音交互流程中的各个角色

云端配置语音交互模型和本地配置语音交互模型,流程和角色差异主要在开发者层面。

  1. 用户:发起语音意图的角色。需求是通过语音意图得到对应服务满足。举例:用户可能说语音内容“开始游戏”

  2. 开发者:作为业务方,为用户提供服务。需求是根据用户语音意图,执行对应业务逻辑。开发者需要在DBP技能控制台 -> 进入技能配置页面 -> 交互模型 -> 意图 完成用户语音内容和意图的匹配关系。意图概念介绍, 意图创建视频教程

  3. 度秘云端:语音交互流程的核心中枢,也就是”大脑“。从用户角度,DuerOS要”听得见“用户说什么,把语音转换成文本。从开发者角度,DuerOS要”听得懂“用户说什么,用语音转换的文本,匹配开发者创建的意图,返回HandleIntent指令给App

2.2 流程图如下:

云端意图交互流程图

前置条件:云端意图创建完毕

  1. 用户首先通过语音query"小度小度,打开XXX" 打开应用。参考快速接入
  2. 云端解析用户打开意图,返回Open指令到端上,拉起App
  3. 后面用户发起语音query:"小度小度,开始", 云端解析用户语音内容,匹配意图。返回HandleIntent指令,intent.name="startGame"
  4. 意图内容通过BotSdk的回调方法,给到App。App根据意图名称(startGame),执行开始的业务逻辑。

3.云端配置语音交互模型-代码实现

为方便理解,我们把意图分为不含槽位的简单用法 和 包含槽位的高级用法。

3.1 不含槽位意图

我们首先参考章节2.1创建一个不含槽位的简单意图:startGame

3.1.1 不含槽位的意图创建

简单意图

3.1.2 不含槽位的意图解析

意图解析结果以HandleIntent指令下发到本地。开发者可以不用关心指令细节,BotSdk会对指令做初步解析,通过回调方法handleIntent把意图内容给到App

    /***
     * 云端意图返回结果
     * @param intent 意图内容,参考{@link BotIntent} 包含意图名称和槽位参数结构如下
     *               {@link BotIntent#name} 意图名称,对应于云端创建意图的 意图标识名
     *               {@link BotIntent#slots} 槽位列表 对应于云端创建意图的 槽位信息,数量(0~n)
     *               槽位信息结构如下:
     *               {@link com.baidu.duer.botsdk.BotIntent.Slot#name} 槽位名称
     *               {@link com.baidu.duer.botsdk.BotIntent.Slot#value} 槽位值
     * @param customData 自定义数据,暂时不用
     */
    @Override
    public void handleIntent(BotIntent intent, String customData) {

        String intentResult = "\n指令名称:%s\n槽位信息:%s";
        Log.i("HandleIntentTAG", "intent result:" + intentResult);
        if ("startGame".equals(intent.name)) {
            // TODO 增加开始逻辑触发流程,例如startBtn.performClick()
        }
}

3.2 包含槽位的意图

槽位是意图的参数信息。当用户询问“今天北京天气怎么样”时,其中“今天”和“北京”就是参数信息。这些信息可以被抽象成不同的类,就是槽位,比如在查询天气意图中,我们可以根据“今天”和“北京”,抽象出location和date两个槽位。

词典是用户与技能交互过程中的一个重要概念,是指某领域词汇的集合。当用户询问北京天气怎么样时,其中北京是城市信息。将北京、天津、上海等所有城市信息集合起来就组成了中国城市的词典。DuerOS根据词典去解析相应的槽位信息,发送给技能处理。

3.2.1 创建包含槽位的意图

槽位意图

3.2.2 意图名称和槽位信息解析

意图解析结果以HandleIntent指令下发到本地。开发者可以不用关心指令细节,BotSdk会对指令做初步解析,通过回调方法handleIntent把意图内容给到App

下面我们介绍一下如何解析槽位信息:

    /***
     * 云端意图返回结果
     * @param intent 意图内容,参考{@link BotIntent} 包含意图名称和槽位参数结构如下
     *               {@link BotIntent#name} 意图名称,对应于云端创建意图的 意图标识名
     *               {@link BotIntent#slots} 槽位列表 对应于云端创建意图的 槽位信息,数量(0~n)
     *               槽位信息结构如下:
     *               {@link com.baidu.duer.botsdk.BotIntent.Slot#name} 槽位名称
     *               {@link com.baidu.duer.botsdk.BotIntent.Slot#value} 槽位值
     * @param customData 自定义数据,暂时不用
     */
    @Override
    public void handleIntent(BotIntent intent, String customData) {

        String intentResult = "\n指令名称:%s\n槽位信息:%s";
        Log.i("HandleIntentTAG", "intent result:" + intentResult);
        if ("queryWeather".equals(intent.name)) {
            String loactionOfWeather;
            if (intent.slots != null) {
                for (BotIntent.Slot slot : intent.slots) {
                    // 遍历槽位列表,找到需要的槽位值
                    if ("sys.city".equals(slot.name)) {
                        loactionOfWeather = slot.value;
                    }
                }
            }
            // TODO 使用localtionOfWeather 参数查询天气
        }
}

4. 结语

通过学习本章内容,我们完成了技能意图和DuerOS系统的深度融合。后面我们可以通过引入手势识别,内容直达 等能力,带给用户更好的交互体验

5. 参考文档:

开放平台-文档中心

开放平台-技术课堂