# 使用自定义语义服务制作拦截器
# 自定义技能(拦截器)
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":"打电话给张三"
}
}
}
context.Custom
是通过厂商设备传递的自定义上下文而来的
# 技能处理
# Step 1 语义解析
通过语义处理(推荐使用AIUI语义平台 (opens new window)),可以将语料解析为以下内容:
打电话给{张三}
=> 打电话给{contact}
因此,可以得到用户想要打电话的对象是 张三
# Step 2 业务处理
- 通过
context.Custom
,得到厂商的用户id
- 在该用户的联系人中查找
张三
- 得到张三的信息:
{
"name": "张三",
"phone": "18812345678"
}
# 自定义指令的响应
通过以下的技能响应 (opens new window),可以返回设备一个自定义指令:
{
"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
的数据进行判断,执行不同的处理(设备厂商自行实现)