运行条件:waft容器 > 1.6.250
waft前端框架 > 0.7.x
简介
所见即可说是天猫精灵增强带屏技能的语音交互能力的功能集合,可以达到在某个界面直接说某句话或者某个词,就能点击/跳转或运行一段代码逻辑的能力,例如,在电影列表的界面,我们可以直接说“我要看再见少年”,这样就能直接跳转到《再见少年》的播放页。
所见即可说总体包含了3个大功能:
- 页面意图:页面意图指的是在当前 waft 的页面,对绑定的意图进行优先级识别的提升。例如正常情况下,当用户说“下一首”或“上一首”“我看要XX电影”等关键词,优先会被系统识别从而可能跳出应用,而非应用内交互,通过页面意图的绑定,可以让语音交互优先识别当前的页面意图。
- 动态参数:当意图的语料存在参数(参数的概念)需要动态化时:比如“我要看@{movie}”,电影名称非常多,我们无法一开始在意图的语料进行完整枚举,可以在页面展示时,进行动态设置movie参数对应的取值,如“复仇者联盟”“加勒比海盗”等等,这样在意图识别时,会匹配到当前的意图。
- NLU透传:在云端通过上述的页面意图和动态参数的方式,精准匹配到意图时,一种方式是直接在服务端逻辑实现,另一种就是NLU透传:把意图匹配结果和用户的语句直接发给waft端的代码逻辑进行处理。
接入方式
页面意图配置
1.在技能平台配置页面意图,页面path对应waft工程里app.json中的页面
2.在waft项目app.json中,如上图,配置enablePageIntent为true
{
"pages": [
"pages/index/index",
"pages/page-context/page-context"
],
"default": "pages/index/index",
"aliGenie":{
"enablePageIntent": true
}
}
动态参数配置
在技能平台的意图中:
1.设置该意图为动态意图
2.意图添加语料,语料包含参数
3.设置movie参数的实体为sys.select
动态参数设置
在页面逻辑中动态设置参数的枚举,这样意图就能被动态的match到。
import { aliGenie } from 'waft';
import { Page, Props, history, Event, aliGenie, MessageEvent, console} from 'waft';
import { JSON, JSONArray, JSONObject } from "waft-json";
export class Index extends Page {
constructor(props: Props) {
super(props);
let selectItem = new JSONObject();
selectItem.set('slot', "function");
let entities = new JSONObject();
entities.set('audio', '音频');
entities.set('video', '视频');
entities.set('localStorage', '缓存');
entities.set('anyWords', '页面');
selectItem.set('entities', entities);
let selectArray = new JSONArray();
selectArray.push(selectItem);
aliGenie.setSelectContent(selectArray);
}
onMessage(event: MessageEvent): void{
// 信息推送更新
console.log('page onMessage:' + JSON.stringify(event.data));
// 【1】找到voice的类型,说明是NLU透传的结果
if(event.type == 'voice'){
const payload = event.data.getObject("payload");
const intent = payload.getString('intent');
// 【2】找到对应的意图
if(intent == 'my_testing'){
// 【3】获取对应的slots,然后做其他想做的操作,如页面跳转等
const slots = payload.getArray('slots');
const value = (slots.arrayValue()[0] as JSONObject).getString('value');
}
}
}
}
NLU透传结果获取
注意:结果不一定要通过NLU透传获取,也可以通过技能服务端下发render或者nlu指令来获取。
当设置意图的实现逻辑为NLU透传的情况下,前端模板不需要技能服务端,可以直接拿到对应的语句信息。