# 如何制作技能
# 制作简单的技能
# 技能场景示例
你:「小飞小飞,今天科大讯飞的股价多少?」
小飞:「科大讯飞今天的股份55.55,涨幅10.0%」
# 技能请求
# 用户:「小飞小飞,今天科大讯飞的股价多少?」
当用户发出这样的询问时,你的接口会收到以下的技能请求内容:
{
"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"
}
},
"request": {
"type": "TextRequest",
"requestId": "f78b7d68...",
"timestamp": "2018-08-22T16:13Z ",
"query": {
"type": "TEXT",
"original":"今天科大讯飞的股价多少?"
}
}
}
# 技能处理
# Step 1 语义解析
通过语义处理(推荐使用AIUI语义平台 (opens new window)),可以将语料解析为以下内容:
{今天}{科大讯飞}的{股价}是多少
=> {datetime}{stock_name}的{price}是多少
由此,我们得到了三个关键的数据:时间、股票名、股价
# Step 2 业务处理
通过上一步,我们得到了三个关键的数据,由此你可以通过自己的方式,来得到用户想要的数据,比如我们调用某个平台的接口得到以下数据:
{
"name": "科大讯飞",
"code": "002230",
"price": "55.55",
"fluctuate": 10.0
}
# Step 3 反馈用户
由上一步,我们得到了用户想要的数据,但我们得通过语音来反馈给用户,首先,我们可以写一个友好的语音模板,比如:
{stock_name}{datetime}的股价是{price},涨幅{fluctuate}%
=> 科大讯飞今天的股份55.55,涨幅10.0%
# 技能回复
通过技能处理,我们已经得到了要回复用户的话了,但要怎么做才能通过小飞
来语音回复用户呢?答案很简单,你只要返回以下技能回复即可:
{
"version": "1.0",
"sessionAttributes": {},
"response": {
"outputSpeech": {
"type": "PlainText",
"text": "科大讯飞今天的股份55.55,涨幅10.0%"
},
"directives": [],
"shouldEndSession": true
}
}
当IVS
收到这样的请求响应时,就会给小飞
下发一个语音合成的指令,那么小飞
就会通过语音来回复用户了
# 支持多轮会话的技能
# 技能场景示例
用户:「小飞小飞,今天股价是多少?」
小飞:「你想知道哪只股票的价格呢?」
用户:「科大讯飞的」
小飞:「科大讯飞今天的股份55.55,涨幅10.0%」
# 技能请求 1
# 用户:「小飞小飞,今天股价是多少?」
当用户发出这样的询问时,你的接口会收到以下的技能请求内容:
{
"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"
}
},
"request": {
"type": "TextRequest",
"requestId": "f78b7d68...",
"timestamp": "2018-08-22T16:13Z ",
"query": {
"type": "TEXT",
"original":"今天股价是多少?"
}
}
}
# 技能处理 1
# Step 1 语义解析
通过语义处理(推荐使用AIUI语义平台 (opens new window)),可以将语料解析为以下内容:
{今天}{股价}是多少
=> {datetime}{price}是多少
由此,我们得到了两个关键的数据:时间、股价。
# Step 2 追问响应
此时,我们缺少股票的名字,无法查询到股价,于是我们应该继续向用户进行询问
{
"version": "1.0",
"sessionAttributes": {
"datetime": "今天",
"price": "股价",
"times": 1
},
"response": {
"outputSpeech": {
"type": "PlainText",
"text": "你想知道哪只股票的价格呢?"
},
"directives": [],
"shouldEndSession": false
}
}
请注意以上数据里的两个字段,shouldEndSession
和sessionAttributes
- 当
shouldEndSession
返回false
时,IVS
就不会结束本次对话,而是通过小飞
回复用户后,重新启动录音,等待用户的回答; - 当你设置了
sessionAttributes
时,下一次会话时,IVS
会将同样的内容,带回来给你;
# 技能请求2
# 用户回复:「科大讯飞的」
当用户回答你的追问
时,你会收到如下技能请求:
{
"version": "1.0",
"session": {
"new": false,
"sessionId": "f78b7d68...",
"attributes": {
"datetime": "今天",
"price": "股价"
}
},
"context": {
"System": {
"device": {
"deviceId": "f78b7d68...",
"supportedInterfaces": {
"AudioPlayer": {},
"Display":{}
}
},
"application": {
"applicationId": "f78b7d68..."
},
"user": {
"userId": "f78b7d68..."
}
},
"AudioPlayer": {
"playerActivity": "IDLE"
}
},
"request": {
"type": "TextRequest",
"requestId": "f78b7d68...",
"timestamp": "2018-08-22T16:13Z ",
"query": {
"type": "TEXT",
"original":"科大讯飞的"
}
}
}
请重点注意以下两个字段:
session.new
变成了false
,说明这不是一个新的会话;session.attributes
将上一轮的追问响应
中的sessionAttributes
带回来了;
# 技能处理 2
# Step 1 语义解析
通过语义处理(推荐使用AIUI语义平台 (opens new window)),可以将语料解析为以下内容:
{科大讯飞}的
=> {stock_name}的
于是,我们得到了一个新的关键数据:股票名,加上之由session.attributes
返回的两个参数,我们得到了三个查询股票价格的必要数据
# Step 2 业务处理
使用以上数据,调用某个平台的接口得到以下数据:
{
"name": "科大讯飞",
"code": "002230",
"price": "55.55",
"fluctuate": 10.0
}
# Step 3 反馈用户
我们通过语音模板,比如:
{stock_name}{datetime}的股价是{price},涨幅{fluctuate}%
=> 科大讯飞今天的股份55.55,涨幅10.0%
# 技能回复
通过技能处理,我们已经得到了要回复用户的话了,通过以下技能回复,让小飞
回复用户,并让IVS
结束此次会话:
{
"version": "1.0",
"sessionAttributes": {},
"response": {
"outputSpeech": {
"type": "PlainText",
"text": "科大讯飞今天的股份55.55,涨幅10.0%"
},
"directives": [],
"shouldEndSession": true
}
}
注意:shouldEndSession
此时应该设备为true
,因为你不需要再追问了
# 制作一个音频播放技能
# 技能场景示例
你:「小飞小飞,我要听三只小猪的故事」
小飞:「好的,请欣赏儿童故事《三只小猪》」
开始为用户播放故事...
# 技能请求
# 用户:小飞小飞,我要听《三只小猪》的故事?
当用户发出这样的询问时,你的接口会收到以下的技能请求内容:
{
"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"
}
},
"request": {
"type": "TextRequest",
"requestId": "f78b7d68...",
"timestamp": "2018-08-22T16:13Z ",
"query": {
"type": "TEXT",
"original":"我要听《三只小猪》的故事"
}
}
}
# 技能处理
# Step 1 语义解析
通过语义处理(推荐使用AIUI语义平台 (opens new window)),可以将语料解析为以下内容:
我要听{三只小猪}的故事
=> 我要听{story_name}的故事
我们可以知道用户想听的故事
# Step 2 业务处理
接下来,查找出《三只小猪》的故事信息:
{
"name": "三只小猪",
"author": "佚名",
"url": "https://for.example.com/story/xxxx.mp3",
"picture": "https://for.example.com/story/xxxx.png"
}
# 技能回复
返回以下技能回复,可以让小飞
播放你想要的音频:
{
"version": "1.0",
"sessionAttributes": {},
"response": {
"outputSpeech": {
"type": "PlainText",
"text": "好的,请欣赏儿童故事《三只小猪》"
},
"directives": [
{
"type": "AudioPlayer.Play",
"playBehavior": "REPLACE_ALL",
"audioItem": {
"stream": {
"type": "AUDIO",
"url": "https://for.example.com/story/xxxx.mp3",
"token": "S0wiXQZ1rVBkov...",
"offsetInMilliseconds": 0
},
"metadata": {
"title": "《三只小猪》",
"subtitle": "佚名",
"art": {
"sources": [
{
"url": "https://for.example.com/story/xxxx.png"
}
]
}
}
}
}
],
"shouldEndSession": true
}
}