运行条件:waft容器 > 1.6.250 waft前端框架 > 0.7.x

简介

所见即可说是天猫精灵增强带屏技能的语音交互能力的功能集合,可以达到在某个界面直接说某句话或者某个词,就能点击/跳转或运行一段代码逻辑的能力,例如,在电影列表的界面,我们可以直接说“我要看再见少年”,这样就能直接跳转到《再见少年》的播放页。
屏幕快照 2021-12-20 21.17.00.png
所见即可说总体包含了3个大功能:

  • 页面意图:页面意图指的是在当前 waft 的页面,对绑定的意图进行优先级识别的提升。例如正常情况下,当用户说“下一首”或“上一首”“我看要XX电影”等关键词,优先会被系统识别从而可能跳出应用,而非应用内交互,通过页面意图的绑定,可以让语音交互优先识别当前的页面意图。
  • 动态参数:当意图的语料存在参数(参数的概念)需要动态化时:比如“我要看@{movie}”,电影名称非常多,我们无法一开始在意图的语料进行完整枚举,可以在页面展示时,进行动态设置movie参数对应的取值,如“复仇者联盟”“加勒比海盗”等等,这样在意图识别时,会匹配到当前的意图。
  • NLU透传:在云端通过上述的页面意图和动态参数的方式,精准匹配到意图时,一种方式是直接在服务端逻辑实现,另一种就是NLU透传:把意图匹配结果和用户的语句直接发给waft端的代码逻辑进行处理。

接入方式

页面意图配置

1.在技能平台配置页面意图,页面path对应waft工程里app.json中的页面
image.png
image.png
2.在waft项目app.json中,如上图,配置enablePageIntent为true

  1. {
  2. "pages": [
  3. "pages/index/index",
  4. "pages/page-context/page-context"
  5. ],
  6. "default": "pages/index/index",
  7. "aliGenie":{
  8. "enablePageIntent": true
  9. }
  10. }

动态参数配置

在技能平台的意图中:
1.设置该意图为动态意图
image.png
2.意图添加语料,语料包含参数
image.png
3.设置movie参数的实体为sys.select
image.png

动态参数设置


在页面逻辑中动态设置参数的枚举,这样意图就能被动态的match到。

  1. import { aliGenie } from 'waft';
  2. import { Page, Props, history, Event, aliGenie, MessageEvent, console} from 'waft';
  3. import { JSON, JSONArray, JSONObject } from "waft-json";
  4. export class Index extends Page {
  5. constructor(props: Props) {
  6. super(props);
  7. let selectItem = new JSONObject();
  8. selectItem.set('slot', "function");
  9. let entities = new JSONObject();
  10. entities.set('audio', '音频');
  11. entities.set('video', '视频');
  12. entities.set('localStorage', '缓存');
  13. entities.set('anyWords', '页面');
  14. selectItem.set('entities', entities);
  15. let selectArray = new JSONArray();
  16. selectArray.push(selectItem);
  17. aliGenie.setSelectContent(selectArray);
  18. }
  19. onMessage(event: MessageEvent): void{
  20. // 信息推送更新
  21. console.log('page onMessage:' + JSON.stringify(event.data));
  22. // 1】找到voice的类型,说明是NLU透传的结果
  23. if(event.type == 'voice'){
  24. const payload = event.data.getObject("payload");
  25. const intent = payload.getString('intent');
  26. // 2】找到对应的意图
  27. if(intent == 'my_testing'){
  28. // 3】获取对应的slots,然后做其他想做的操作,如页面跳转等
  29. const slots = payload.getArray('slots');
  30. const value = (slots.arrayValue()[0] as JSONObject).getString('value');
  31. }
  32. }
  33. }
  34. }

NLU透传结果获取

注意:结果不一定要通过NLU透传获取,也可以通过技能服务端下发render或者nlu指令来获取。

当设置意图的实现逻辑为NLU透传的情况下,前端模板不需要技能服务端,可以直接拿到对应的语句信息。
image.png