配置对话回复

对话回复作为对话输出中的重要组成部分,主要由对话回复条件、回复内容、客户端动作、执行时序、下一轮对话和推荐语构成。
Minion

对话回复条件

在对话过程中,对于用户说的内容,系统需要根据不同的场景为客户播报不同的内容,执行不同的操作,以导航到目的地为例,可能会有如下场景:

 

场景一
用户:导航去苏州思必驰
系统:已为您找到3条去思必驰的路线,请问您要选择哪一条?
用户:不堵车的
场景二
用户:导航去苏州思必驰
系统:已为您找到1条去思必驰的路线,确认前往?
用户:确认

 

场景三
用户:导航去苏州思必驰
系统:很抱歉,没有找到结果。

 

即在用户提出需要导航到目的地时,系统会根据查询到的结果(【找到3个结果】【找到1个结果】和【未找到结果】)为用户播报。

 

设置对话回复条件可以理解为定义不同场景的判断条件,满足条件时,则进入该场景,播报该场景下的回复内容。

举例:在导航实例中,数据资源查询结果有一个参数count,表示搜索地址的数量,可根据count值的不同设定对话回复条件,并依次配置对话回复内容。
1)当count > 1的时候,表示通过导航API找到多个结果,可配置“找到多个结果”时的对话回复内容;
2)当count = 1的时候,表示通过导航API刚好找到一个结果,可配置“找到一个结果”的对话回复内容;
3)当count = 0 的时候,表示导航API没有找到结果,可配置“没有找到结果”时的对话回复内容;

Minion

4)若未能根据语义跳转到下一轮对话时,系统则进行错误处理播报,既可使用默认播报语,也可定制错误播报语内容。

Minion


每种类型的控件都提供默认的对话回复条件,不可删除;除默认回复条件外,创建者可自己创建新的对话回复条件,优先级高于默认回复条件。控件的回复条件具体见DUI控件

新增条件

点击【新增条件】按钮,完成条件配置即可新增对话回复条件。配置新的对话回复条件时,支持引用语义槽和资源查询结果。引用功能的具体操作细节请参考对话回复语中的相关内容。

错误播报

DUI还支持针对单个技能的单个意图,配置对应的错误播报,即对于识别为空、语义理解为空的情况下,可以自定义对应的TTS播报内容。对话为空或识别为空时,系统会让用户重试,重试次数可以设置为0-5次;

设定对话条件

Minion

对于同一个说法,可以根据上一轮对话的不同意图,配置不同的对话回复语。举例如下
user:导航去苏州大学
sys:找到10个苏州大学相关的地址,请选择
user:第一个
sys:即将导航,请选择路线
user:第一个
第二轮与第三轮对话中,用户都说了“第一个”,但是执行的客户端动作是不同的,第一次是执行地址选择,第二次是执行路线选择。为了实现这样的多轮对话,创建【sys.用户选择】意图后,可以配置两个条件:
条件1:上一轮意图 == 导航到具体地址,在该条件下执行地址选择的客户端动作并配置对应的对话回复语
条件2:上一轮意图 == sys.用户选择,在该条件下执行路线选择的客户端动作并配置对应的对话回复语

Minion
Minion

注:上一轮意图可以为当前意图。

对话回复语

开发者可根据不同的对话回复条件,设定不同的对话回复语(即NLG)。在对话回复模块的在每个回复状态条件下,都有一个回复语输入框。手动输入回复语后,按enter键或按“+”按钮保存输入内容。回复内容默认展示五条,点击【展开所有】可以查看编辑的所有的对话回复内容。

Minion

引用

在设定对话回复语时,开发者可引用语义槽和资源查询结果。
如在导航技能中,用户在对话输入中提供了说法「我要去上海」,那么用户给了语义槽#目的地#一个取值“上海”,在设定回复语为:「即将为您导航到#目的地#」,引用了语义参数#目的地# 这种情况下,用户在客户端听到的回复语就是“即将为您导航到上海”,即会将用户提供的语义槽取值替换#目的地#。

参数引用功能目前支持三种类型的引用:语义参数引用、语义参数原文引用、资源返回参数引用。

引用类型

1. 语义槽引用——#语义槽名称#
以#语义槽名#的格式,引用在当前任务定义的语义槽。创建者在回复内容的输入框中,输入#号时,会联想到当前任务中所有意图的语义语义槽,可以点选需引用的语义槽。
需要注意的是,开发者可以引用当前任务下所有意图的语义槽,也就是说开发者在配置【用户选择】意图下的输出时可引用【导航】意图下的语义槽。

Minion

2. 语义槽原文引用——#语义槽名称_origin#
有时候,为了让对话的上下文更加紧密和自然,需要引用用户说法的原文进行输出。比如:用户提问:“今天苏州的天气怎么样”,将“今天”标注为语义槽#日期#,绑定词库【sys.日期】,“苏州”标注为语义槽#城市#,绑定词库【sys.城市】。
回复内容可设定为两种:
1)#日期##城市#的天气$weather$;
2)#日期_origin##城市#的天气$weather$。
用户在客户端听到的回复内容也为不同的两种:
1)20170810苏州的天气晴
2)今天苏州的天气晴
引用语义槽的原文可以使上下文语义更加连贯,也规避了返回的数据内容和实际语言习惯的差异。
在回复内容输入框输入“#”,下拉框展示该任务下所有语义槽,鼠标移上去上出现【原文】字样,点击【原文】即为引用语义槽原文,否则为引用语义槽。

Minion

3. 资源查询结果引用——$参数名称$
语音交互不仅仅是一问一答,语音技能通常需要查询资源。例如天气技能需要查询天气的资源才能进行回复,导航技能需要查询地图的资源才能回复并执行导航。因此输出文字/语音的时候,也需要引用资源查询结果(资源返回的参数)。
例如天气的回复语设置为:「 #日期##城市#天气$weather$,气温$temperature$。」
用户在客户端听到的回复内容则是:「 20170808苏州天气晴,气温33摄氏度。」
以$参数名$的格式,引用资源查询结果。在回复内容输入框输入$,下拉框会展现使用的API资源返回的查询结果,按需选择即可。

Minion

注: 只要知道资源查询结果的名称就可以进行引用,但联想功能(即下拉框展现查询结果的名称)的功能需开发者在【API配置】中完成接口测试后,才能使用。

对话回复语输出优先级

如果开发者定义了多个回复语,系统会优先播报命中语义槽最多的那个。
例如在音乐技能里面,开发者定义了4个回复语:
「为你播放#歌手#的#歌曲名#」
「为你播放#歌手#的歌」
「为你播放#歌曲名#」
「为你播放歌曲」
如果用户说法包含歌手和歌曲名两个语义槽,那么系统会播报第一个回复语; 如果用户只说了歌曲名,则使用第3个;如果一个语义槽都没有说,则使用最后一个。

SSML标签

对话回复语除常用的text格式外,还可以采用SSML标签。点击对话回复语输入框前的TEXT,即可切换成SSML标签格式。如果想切回TEXT,再次点击SSML即可。

Minion

推荐语

技能创建者可根据不同的对话回复条件,设定不同的推荐语。推荐语是用来引导用户开展下一轮对话、关联至其他意图的说法。如果是强说法,则可以跳转该说法命中的意图,如果是弱说法,则只能跳转勾选为下一轮对话的意图。

Minion

客户端动作

部分意图下,除了文字/语音的回复外,还需要客户端/本地执行对应的操作才能完成用户指令,此时就需要配置【客户端动作】以向客户端发出对应指令。例如拨打电话的技能,用户说「给XXX打电话」,要输出指令给本地执行【拨打电话】这个操作。

Minion

【客户端动作】的配置支持用“?”标识传参,参数之间用“&”连接。
示例:command://sys.action.call?phone=$phone$&name=#联系人#

配置项 配置含义
command:/// 客户端传参的固定格式
sys.action.call 客户端指令
? 客户端与参数间的分隔符
phone=$phone$ 客户端指令的参数名=资源返回参数名
& 多个参数之间的连接符
name=#联系人# 客户端指令的参数名=语义参数名

响应command

当您在DUI平台上定制了command之后,可以使用如下的方式在您的工程中做实。
以Android环境为例,类似于Android的广播接收器,您可以在需要的地方注册和注销CommandObserver,同一个CommandObserver可以处理多个commands。
IOS环境下,响应command的操作说明详见文档《IOS SDK集成》
command

// 注册
DDS.getInstance().getAgent().subscribe(new String[]{"open_window"}, commandObserver);
 
// 注销
DDS.getInstance().getAgent().unSubscribe(commandObserver);
 
private CommandObserver commandObserver = new CommandObserver() {
    @Override
    public void onCall(final String command, final String data) {
        if (command.equals("open_the_window")){
            JSONObject jsonData = new JSONObject(data);
            String intentName = jsonData.optString("intentName");
            String w = jsonData.optString("w");
            // TODO 依据w的值,执行打开窗户操作
        }
    }
};

执行时序

客户端动作和回复内容播报的先后执行顺序可以进行相应设置。用户可根据不同技能的具体情况,设计客户端动作和回复内容播报的顺序。

Minion

下一轮对话

设置【下一轮对话】是要表明对话交互的背景信息、传递上下文语义、管理会话流,将孤立的意图彼此串联起来。技能创建者可依据实际选择不同的关联意图,并且同一对话回复条件下,可关联多个意图。

Minion