# 如何制作技能

# 制作简单的技能

# 技能场景示例

你:「小飞小飞,今天科大讯飞的股价多少?」

小飞:「科大讯飞今天的股份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
  }
}

请注意以上数据里的两个字段,shouldEndSessionsessionAttributes

  • 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
  }
}

IVS收到这样的请求响应时,就会给小飞下发一个语音合成指令和一个播放音频指令,这样,小飞就会开始播放你的音频了。