步骤6: 对传送至Lambda的Alexa指令做出响应 (VSK Echo Show)
在此步骤中,您需要对Lambda函数进行编码,以相应的响应来响应六个指令中的每一个。有六个主要指令: GetPlayableItems、GetPlayableItemsMetadata、GetDisplayableItems、GetDisplayableItemsMetadata、GetBrowseNodeItems和GetNextPage。此内容的全面参考可在请求和响应参考中找到。
您的Lambda需要与后端服务进行交互才能检索信息。例如,当Alexa发送指令供您的Lambda处理时,这些指令可能涉及检索有关特定媒体的信息。您需要编写代码以在后端服务中查找媒体,并将该信息以正确的JSON格式返回给Alexa。
探索
通过探索过程,您的技能将能够向Alexa声明其功能。对于具有您技能的所有用户,这些功能可能是静态的,也可能根据用户对您的服务的订阅级别而变化。无论哪种方式,您对该指令的回应都会确定用户可以用您的技能做什么。
搜索
GetDisplayableItems指令要求在您的Lambda的响应中返回一系列项目。响应中应当包含您的内容的标识符。创建单独的指令GetDisplayableItemsMetadata(该指令将在下一部分中详细介绍),用于检索元数据以播放内容。GetDisplayableItems和GetDisplayableItemsMetadata指令分为两个请求以优化延迟。
GetDisplayableItems
当用户提出诸如“Alexa, show me <Title of Video Content>”(Alexa,显示<视频内容标题>)之类的搜索请求时,Alexa会向您的Lambda发送GetDisplayableItems指令,如下所示:
{
"directive": {
"header": {
...
"name": "GetDisplayableItems",
"namespace": "Alexa.VideoContentProvider",
...
},
"endpoint": {
"scope": {
"type": "BearerToken",
"token": "accessToken",
}
},
"payload": {
"entities": [{
"type": "Video",
"value": "视频内容的标题",
"externalIds": {
"yourCatalogKey": "yourContentIdFromCatalog"
}
}],
"locale": "en-US",
"minResultLimit": 8,
"maxResultLimit": 25,
"timeWindow": {
"end": "2016-09-07T23:59:00+00:00",
"start": "2016-09-01T00:00:00+00:00"
}
}
}
}
收到此指令后,您的Lambda应向Alexa提供包含所请求媒体的GetDisplayableItemsResponse响应,如下所示:
{
"event": {
"header": {
...
"name": "GetDisplayableItemsResponse",
"namespace": "Alexa.VideoContentProvider",
...
},
"payload": {
"nextToken": "wwrfwef3",
"mediaItems": [
{
"mediaIdentifier": {
"id": "video://content.1234567"
}
},
{
"mediaIdentifier": {
"id": "video://content.4567890"
}
}
]
}
}
}
GetDisplayableItemsMetadata
当Alexa收到您的GetDisplayableItemsResponse响应(其中包含正确的请求内容)时,Alexa会发送另一条名为GetDisplayableItemsMetadata的指令。GetDisplayableItemsMetadata的目的是获取有关已解析内容(例如图像、标题和其他元数据)的信息,以便填充设备的屏幕。以下示例是一个GetDisplayableItemsMetadata指令:
{
"directive": {
"header": {
...
"name": "GetDisplayableItemsMetadata",
"namespace": "Alexa.VideoContentProvider",
...
},
"endpoint": {
"scope": {
"type": "BearerToken",
"token": "accessToken",
}
},
"payload": {
"mediaIdentifiers": [
{
"id": "video://content.1234567"
},
{
"id": "video://content.4567890"
}
]
}
}
}
当您的Lambda收到GetDisplayableItemsMetadata指令时,您应提供GetDisplayableItemsMetadataResponse响应,该响应提供有关所请求项目的元数据。这些元数据通常会填充设备上的搜索结果模板。
{
"event": {
"header": {
...
"name": "GetDisplayableItemsMetadataResponse",
"namespace": "Alexa.VideoContentProvider",
...
},
"payload": {
"resultsTitle": "搜索结果",
"searchResults": [
{
"title": "视频名称",
"contentType": "ON_DEMAND",
"thumbnailImage": {
"small": "https://.../image.jpg",
"medium": "https: //.../image.jpg",
"large": "https: //.../image.jpg"
},
/* ... 视频1的其余元数据... */
},
{
/* ... 视频2元数据... */
}
]
}
}
}
登陆页面
当用户打开您的登录页面(通过说出“Alexa, open ACME video”(Alexa,打开ACME视频)或说出“Video Home”(视频主页),然后选择您的视频技能)时,Alexa会发送两个GetDisplayableItems指令:
-
第一个
GetDisplayableItems指令用于检索登陆页面的类别,方法是将itemType属性设置为CATEGORY并纳入RECOMMENDED的sortType。 -
第二个
GetDisplayableItems指令获取登陆页面的精选视频,在该情况下请求改为将itemType设置为VIDEO。
在收到您对这两项指令的响应 (GetDisplayableItemsResponse) 后,Alexa会发送一个GetDisplayableItemsMetadata调用,其中包含类别ID和视频ID组合而成的列表。响应包括有关视频和类别的元数据。有关每个itemType的必填字段,请参阅GetDisplayableItems和GetDisplayableItemsMetadata。
以下示例是值为CATEGORY的itemType的元数据。
{
"name": "我的播放列表",
"contentType": "ON_DEMAND",
"itemType": "CATEGORY",
"selectionAction": "BROWSE",
"thumbnailImage": {
"contentDescription": "我的播放列表图像",
"sources": [{
"url": "http://ecx.images-amazon.com/AJhF52zkD7ObETpyTTW.jpg",
"size": "SMALL",
"widthPixels": 720,
"heightPixels": 480
}]
},
"mediaIdentifier": {
"id": "entity://provider/category/myWatchList"
}
}
快速播放
快速播放场景(用户发出“Alexa, play the movie [X]”(Alexa,播放电影 [X])之类的请求)使用GetPlayableItems和GetPlayableItemsMetadata指令,它们与GetDisplayableItems和GetDisplayableItemsMetadata指令非常相似。唯一的区别在于,返回的用于播放的元数据与用于搜索的元数据略有不同。有关更多信息,请参阅GetPlayableItems和GetPlayableItemsMetadata。
频道导航
频道导航表述提示Alexa也发送GetPlayableItems和GetPlayableItemsMetadata指令。唯一的区别在于,返回的用于频道导航的元数据与用于搜索/播放的元数据略有不同。有关更多信息,请参阅GetPlayableItems。
后续步骤
前往步骤7: 实现账户关联。

