使用自定义语义服务制作拦截器

自定义技能(拦截器)

iFLYOS提供了非常多的精品技能,但如果你不希望你的设备使用其中的某些技能、或者这些技能全部都无法处理你的需求时,你可以通过iFLYOS专门为设备厂商提供的前拦截器后拦截器来实现你的自定义技能。

关于自定义技能,你可以先了解一下:拦截器说明

技能场景示例

你:「小飞小飞,打电话给张三」

小飞:「好的,正在拔打电话给张三...」

拔打电话...

技能分析

用户:「小飞小飞,打电话给张三」

技能请求内容:

{
  "version": "1.0",
  "session": {
    "new": true,
    "sessionId": "f78b7d68...",
    "attributes": {}
  },
  "context": {
    "System": {
      "device": {
        "deviceId": "f78b7d68...",
        "supportedInterfaces": {
          "AudioPlayer": {},
          "Display":{}
        }
      },
      "application": {
        "applicationId": "f78b7d68..."
      },
      "user": {
        "userId": "f78b7d68..."
      }
    },
    "AudioPlayer": {
      "playerActivity": "IDLE"
    },
    "Custom": {
      "custom_user": "custom_user_id"
    }
  },
  "request": {
    "type": "TextRequest",
    "requestId": "f78b7d68...",
    "timestamp": "2018-08-22T16:13Z ",
    "query": {
        "type": "TEXT",
        "original":"打电话给张三"
    }
  }
}

技能处理

Step 1 语义解析

通过语义处理(推荐使用AIUI语义平台),可以将语料解析为以下内容:

打电话给{张三} => 打电话给{contact}

因此,可以得到用户想要打电话的对象是 张三

Step 2 业务处理

  • 通过context.Custom,得到厂商的用户id
  • 在该用户的联系人中查找张三
  • 得到张三的信息:
{
    "name": "张三",
    "phone": "18812345678"
}

自定义指令的响应

通过以下的技能响应,可以返回设备一个自定义指令:

{
  "version": "1.0",
  "sessionAttributes": {},
  "response": {
    "outputSpeech": {
      "type": "PlainText",
      "text": "好的,正在拔打电话给张三..."
    },
     "directives": [
      {
        "type": "Custom",
        "payload": {
          "intent": "DAIL",
          "name": "张三",
          "phone": "18812345678"
        }
      }
     ],
    "shouldEndSession": true
  }
}

拨打电话

拦截器返回了以上响应时,设备端将接收到以下指令:

{
	"directive": {
	    "header": {
	        "namespace": "Custom",
	        "name": "Custom",
	        "dialogRequestId": "...",
	        "messageId": "...",
	    },
	    "payload": {
          "intent": "DAIL",
          "name": "张三",
          "phone": "18812345678"
	    }
	}
}

设备端收到自定义指令时,应该根据payload的数据进行判断,执行不同的处理(设备厂商自行实现)