步骤1: 创建您的视频技能和Lambda函数 (VSK Echo Show)
在此步骤中,您将通过Alexa开发者控制台设置视频技能,并且也可在AWS上创建基本的Lambda函数来处理来自该视频技能的通信。
请注意,此步骤与Fire TV应用文档中的步骤1: 创建您的视频技能和Lambda函数几乎一致。主要区别在于基本的Lambda代码不同,并且多模式设备需要在视频技能中进行一些额外的配置。请注意,您不能对Fire TV应用和多模式设备使用相同的视频技能,因为该视频技能与之交互的Lambda函数不同。(应用和无应用设备的交互模型需要在后端使用不同的流程。)
视频技能和Lambda概述
在多模式设备上,Alexa可以侦听用户的表述,然后将这些表述转换为指令。指令是从Alexa发送至您云中的Lambda函数的一组数据和指示,以JSON表示。
例如,当用户说出“Play Bosch”(播放Bosch)时,Alexa会将此转换为具有特定JSON结构的指令。指令具有标头名称和独特的属性和结构。对于多模式设备,指令可以包括搜索、浏览、播放等(与Fire TV类似)。
但是,与Fire TV相比,指令中的标头名称有所不同。对于多模式设备,指令标头名称包括GetPlayableItems、GetPlayableItemsMetadata、GetBrowseNodeItems、GetDisplayableItems、GetDisplayableItemsMetadata和GetNextPage。
Alexa的工作是将用户的表述映射到可以用编程方式处理的正式指令。换句话说,Alexa确定用户在说什么,并将他们的请求打包成与特定的JSON结构一致的正式信息架构,这样您的代码就可以用编程方式处理该请求。
然后,Video Skill API将这些指令传送到您在AWS上的Lambda代码。Lambda是一种在云中运行代码的AWS服务,您无需拥有服务器即可托管代码。您的Lambda代码可以处理视频技能中的指令,通常与后端服务进行通信以进行查找、搜索和执行其他所需功能。
在您的Lambda检索到所需信息后,您的Lambda会将响应发送回Alexa。您发送的响应还必须符合特定的结构,以便Alexa可以对其进行处理。请注意与Fire TV应用集成的这一区别 - 多模式工作流程不是使用ADM向您的应用推送通知,而是让您的Lambda直接将响应返回给Alexa(通过您的Lambda函数中的回调)。
步骤1.1: 开始创建视频技能
在此步骤中,您将开始创建视频技能,以便获得该技能的应用ID。此应用ID将在您创建Lambda函数时使用。
要开始创建视频技能,请执行以下操作:
- 转到https://developer.amazon.com/zh/。
- 单击右上角的开发者控制台。如果您没有登录,系统会提示您登录。
- 在顶部导航栏中,单击Alexa,然后选择Alexa Skills Kit(Alexa技能工具包)。
- 单击Create Skill(创建技能)。
-
在Skill name(技能名称)字段下,键入技能的简单名称(通常是应用的名称,例如
Streamz Media)。提示: 该名称应该简单明了,便于用户通过语音说出来。如果您正在创建测试技能,请使用看起来不像电影标题的技能名称,因为这会使解析自然语言变得更加困难。此外,您的技能名称不得指示其功能受到限制。例如,您不应该在技能的名称中使用“基本”、“精简”或“简单”字样。 -
在Choose a model to add to your skil(选择要添加到技能的模型)下,选择Video(视频)方块。

在Alexa开发者控制台中创建视频技能 警告: 如果您在创建技能时看不到Video(视频)选项,请不要改为创建自定义技能。视频技能仅适用于在支持视频技能的国家和地区创建应用的开发者。如果您的目标国家/地区不支持视频技能,则您还无法为您的应用创建视频技能。 - 点击右上角的Create skill(创建技能)。
-
在Your Skill ID(您的技能ID)(在以下屏幕截图中以黄色突出显示)旁边,单击Copy to clipboard(复制到剪贴板)。

视频技能ID 将此信息存储在计算机上的简单文本文件中,因为在继续学习本教程时,您将在该文件中收集其他信息。当您为视频技能创建Lambda函数时,您将需要此技能ID值。
请注意,视频技能配置要求您为Lambda函数配置默认终端节点,具体而言就是ARN(亚马逊资源名称)。

配置视频技能需要ARN 在继续配置视频技能之前,您需要在此处暂停以获取Lambda ARN。为此,您需要创建IAM角色和Lambda函数。您可以打开一个新选项卡,以免失去您在视频技能中的位置(尽管您的会话可能会超时)。
步骤1.2: 为您的Lambda创建IAM角色
此任务可为创建Lambda函数(您的视频技能将与之互动)做准备。您需要定义权限以指定哪些应用可以引用您的Lambda函数。在这里,您将创建一个IAM角色,允许Lambda函数代表您调用AWS服务,例如Cloudwatch。要创建IAM角色,请执行以下操作:
- 登录AWS管理控制台。
-
在右上角,根据AWS地区和视频技能中提供的表格选择相应的AWS地区。(与IAM不同,Lambda函数特定于AWS地区。)

选择AWS地区 选择离您的客户较近的地区将确保将客户表述与Lambda引用之间的延迟降至最低。此外,如果您选择了错误的AWS地区,视频技能将不起作用。
注意: 对于其中一些区域设置,Alexa对视频技能的支持即将推出,但仍在准备中。请参阅支持的国家/地区。 - 单击左上角的Services(服务),然后转到IAM(使用搜索框)。
- 从左侧导航栏中选择Roles(角色),然后单击Create role(创建角色)。
- 在AWS service(AWS服务)(默认处于选中状态)下,单击Lambda,然后单击底部的Next: Permissions(下一步:权限)。
- 搜索AWSLambdaBasicExecutionRole并选中其旁边的复选框,然后单击Next: Tags(下一步:标签)。
- 跳过“Add tags (optional)”(添加标记 [可选])配置,然后单击Next: Review(下一步:审核)。
-
任意为角色命名(例如,“video_skill_streamz”)并提供描述,然后单击Create role(创建角色)。

创建可以与您的Lambda交互的IAM角色 记下您的IAM角色名称(特别是如果您在AWS中有多个IAM角色),这样您就可以轻松记住它以备下一步使用。
步骤1.3: 为您的视频技能创建Lambda函数
现在,您将创建Lambda函数以供您的视频技能使用。创建该函数将为您提供一个亚马逊资源名称 (ARN),这是配置视频技能的必需项。要为您的视频技能创建Lambda函数,请执行以下操作:
- 在AWS管理控制台中,单击Services,然后转到Lambda(使用搜索框)。
- 单击Create function(创建函数)。
- 保持Author from scratch(从头开始创建)按原样选中,然后完成以下各部分:
- 函数名称: 您的Lambda函数的唯一名称(例如,
multimodal_lambda)。 - Runtime(运行时): Node.js 8.10(Node JS是为本次集成编写的Lambda示例代码。稍后,您可以探索如何在Lambda中使用其他语言,例如Python、Ruby、.NET、Java等。)
- 权限
- Execution role(执行角色): 使用现有角色。
- Existing role(现有角色): 选择您在上一部分中创建的IAM角色(步骤1.2: 为您的Lambda创建IAM角色)。

在AWS中创建基本Lambda函数 提示: 记下您的Lambda名称,因为您需要在接下来的步骤中参考此名称。
- 函数名称: 您的Lambda函数的唯一名称(例如,
-
单击Create function(创建函数)。
您的Lambda函数已创建。请注意,除非您添加智能家居触发器,告知Lambda应该从哪里获取消息,否则您的Lambda函数不会接收来自Alexa的指令。这就是智能家居API的作用 - 它将您的设备连接到云中的Lambda计算。但是,要配置Alexa智能家居触发器,您需要视频技能的应用ID。
当您的客户想要控制智能设备时,Alexa会通过云向技能发送语音命令。然后,该技能会根据客户的意图将指令发回您的设备。
- 在Designer(设计器)部分,单击+ Add trigger(+添加触发器)。
-
在触发器配置中,选择Alexa Smart Home(Alexa智能家居),然后在Application ID(应用ID)字段中输入您的视频技能ID(在1.1部分中创建)。然后单击Add(添加)。

使用您的视频技能ID配置Lambda 单击Add后,您会看到一条成功通知,内容为:“The trigger [123456…] was successfully added to function [Lambda function name].The function is now receiving events from the trigger.”(触发器123456789...已成功添加到函数 [Lambda函数名称] 中。该函数现在正在接收来自触发器的事件。)
在本例中,触发器是您的视频技能。现在,您的Lambda函数将接收来自您的视频技能的事件。
注意: 如果您对Lambda函数使用“版本控制”,则每次创建新版本时都需要重新添加智能家居触发器。 -
您的Lambda函数的ARN显示在页面的右上角,如以下屏幕截图所示。复制您的Lambda的ARN并记下来,因为您将需要在下个部分(步骤1.4: 完成视频技能设置)中用它来配置您的视频技能。

您的Lambda函数的ARN位置 - 在页面中心单击您的Lambda函数的名称(带有
的方框)。这样将在以下窗格中展开代码编辑器。 - 为了便于初始设置,我们提供了一些基本的Lambda代码。此代码为实现视频技能提供了着手点。该代码将响应Alexa的指令并传回至Alexa。
注意: 由于此示例Lambda没有与真正的后端服务进行通信来查找和查询信息,因此返回Alexa的响应都硬编码为预定义的响应。即便如此,这些预定义的硬编码响应仍会向您显示传入的Alexa指令的预期响应。
请注意以下事项:
- 单击下面的复制按钮将代码复制到剪贴板。
- 将该文件中的所有代码完全按原样粘贴到函数代码编辑器中,替换编辑器
index.js文件中的现有代码。 - 单击右上角的Save(保存)。
/**
* 版权所有 (c) 2017 Amazon.com, Inc.或其关联公司。保留所有权利。
*
* 根据亚马逊软件许可证(下文简称“许可证”)获得许可。除非符合许可证,
* 否则您不得使用此文件。许可证的副本
* 位于http://aws.amazon.com/asl/或本文件随附的“许可证”
* 文件中。此文件按“原样”分发,不提供担保
* 或任何种类的明示或暗示的条件。请参阅“许可证”
* 了解约束许可证项下权限和限制的具体措辞。
**/
// 这是一个示例lambda,用于在多模式设备上的视频技能。
// 这只是示例代码,不提供任何保证。
var AWS = require('aws-sdk');
exports.handler = (event, context, callback) => {
console.log("交互开始");
hardCodedResponse(event, context);
};
function hardCodedResponse(event, context) {
var name = event.directive.header.name;
console.log("Alexa请求:", name, JSON.stringify(event));
var DiscoverResultResponse = {
"event": {
"header": {
"namespace": "Alexa.Discovery",
"name": "Discover.Response",
"payloadVersion": "3",
"messageId": "ff746d98-ab02-4c9e-9d0d-b44711658414"
},
"payload": {
"endpoints": [{
"endpointId": "ALEXA_VOICE_SERVICE_EXTERNAL_MEDIA_PLAYER_VIDEO_PROVIDER",
"endpointTypeId": "TEST_VSK_MM",
"manufacturerName": "TEST_VSK_MM",
"friendlyName": "TEST_VSK_MM",
"description": "TEST_VSK_MM",
"displayCategories": ["APPLICATION"],
"cookie": {},
"capabilities": [{
"type": "AlexaInterface",
"interface": "Alexa.RemoteVideoPlayer",
"version": "1.0"
}, {
"type": "AlexaInterface",
"interface": "Alexa.PlaybackController",
"version": "1.0"
}, {
"type": "AlexaInterface",
"interface": "Alexa.SeekController",
"version": "1.0"
}, {
"type": "AlexaInterface",
"interface": "Alexa.ChannelController",
"version": "1.0"
},
{
"type": "AlexaInterface",
"interface": "Alexa.MultiModalLandingPage",
"version": "1.0"
}
]
}]
}
}
};
var GetPlayableItemsResponse = {
"event": {
"header": {
"correlationToken": "dFMb0z+PgpgdDmluhJ1LddFvSqZ/jCc8ptlAKulUj90jSqg==",
"messageId": "5f0a0546-caad-416f-a617-80cf083a05cd",
"name": "GetPlayableItemsResponse",
"namespace": "Alexa.VideoContentProvider",
"payloadVersion": "3"
},
"payload": {
"nextToken": "fvkjbr20dvjbkwOpqStr",
"mediaItems": [{
"mediaIdentifier": {
"id": "tt1254207"
}
}]
}
}
};
var GetPlayableItemsMetadataResponse = {
"event": {
"header": {
"correlationToken": "dFMb0z+PgpgdDmluhJ1LddFvSqZ/jCc8ptlAKulUj90jSqg==",
"messageId": "38ce5b22-eeff-40b8-a84f-979446f9b27e",
"name": "GetPlayableItemsMetadataResponse",
"namespace": "Alexa.VideoContentProvider",
"payloadVersion": "3"
},
"payload": {
"searchResults": [{
"name": "Big Buck Bunny",
"contentType": "ON_DEMAND",
"series": {
"seasonNumber": "1",
"episodeNumber": "1",
"seriesName": "Blender Foundation视频",
"episodeName": "Pilot"
},
"playbackContextToken": "{\"streamUrl\": \"http:\/\/commondatastorage.googleapis.com\/gtv-videos-bucket\/sample\/BigBuckBunny.mp4\", \"title\": \"Big Buck Bunny\"}",
"parentalControl": {
"pinControl": "REQUIRED"
},
"absoluteViewingPositionMilliseconds": 1232340
}]
}
}
};
var GetDisplayableItemsResponse = {
"event": {
"header": {
"correlationToken": "dFMb0z+PgpgdDmluhJ1LddFvSqZ/jCc8ptlAKulUj90jSqg==",
"messageId": "5f0a0546-caad-416f-a617-80cf083a05cd",
"name": "GetDisplayableItemsResponse",
"namespace": "Alexa.VideoContentProvider",
"payloadVersion": "3"
},
"payload": {
"nextToken": "fvkjbr20dvjbkwOpqStr",
"mediaItems": [{
"mediaIdentifier": {
"id": "tt1254207"
}
},
{
"mediaIdentifier": {
"id": "tt0807840"
}
},
{
"mediaIdentifier": {
"id": "tt7993892"
}
},
{
"mediaIdentifier": {
"id": "tt4957236"
}
},
{
"mediaIdentifier": {
"id": "tt2285752"
}
}
]
}
}
};
var GetNextPageResponse = {
"event": {
"header": {
"correlationToken": "dFMb0z+PgpgdDmluhJ1LddFvSqZ/jCc8ptlAKulUj90jSqg==",
"messageId": "9f4803ec-4c94-4fdf-89c2-d502d5e52bb4",
"name": "GetNextPageResponse",
"namespace": "Alexa.VideoContentProvider",
"payloadVersion": "3"
},
"endpoint": {
"scope": {
"type": "BearerToken",
"token": "Alexa-access-token"
},
"endpointId": "appliance-001"
},
"payload": {
"nextToken": "qefjrfiugef74",
"mediaItems": [{
"mediaIdentifier": {
"id": "tt0807840"
}
},
{
"mediaIdentifier": {
"id": "tt1254207"
}
},
{
"mediaIdentifier": {
"id": "tt7993892"
}
},
{
"mediaIdentifier": {
"id": "tt2285752"
}
},
{
"mediaIdentifier": {
"id": "tt4957236"
}
}
]
}
}
}
var GetDisplayableItemsMetadataResponse = {
"event": {
"header": {
"correlationToken": "dFMb0z+PgpgdDmluhJ1LddFvSqZ/jCc8ptlAKulUj90jSqg==",
"messageId": "38ce5b22-eeff-40b8-a84f-979446f9b27e",
"name": "GetDisplayableItemsMetadataResponse",
"namespace": "Alexa.VideoContentProvider",
"payloadVersion": "3"
},
"payload": {
"resultsTitle": "SearchResults",
"searchResults": [{
"name": "Big Buck Bunny",
"contentType": "ON_DEMAND",
"itemType": "VIDEO",
"releaseYear": "2014",
"selectionAction": "PLAY",
"thumbnailImage": {
"contentDescription": "Big Buck Bunny图像",
"sources": [{
"url": "https:\/\/devportal-reference-docs.s3-us-west-1.amazonaws.com\/video-skills-kit\/bigbuckbunnythumb.png",
"size": "X_LARGE",
"widthPixels": 1920,
"heightPixels": 1280
}]
},
"runtime": {
"runTimeInMilliseconds": 540000,
"displayString": "9m"
},
"closedCaption": {
"status": "AVAILABLE",
"displayString": "CC"
},
"absoluteViewingPositionMilliseconds": 0,
"parentalControl": {
"pinControl": "REQUIRED"
},
"viewingDisplayString": "PurchaseOptions",
"reviews": [{
"totalReviewCount": 1897,
"type": "FIVE_STAR",
"ratingDisplayString": "4.06"
}],
"rating": {
"category": "G"
},
"mediaIdentifier": {
"id": "tt1254207"
}
},
{
"name": "Cosmos Laundromat",
"contentType": "ON_DEMAND",
"itemType": "VIDEO",
"releaseYear": "2014",
"selectionAction": "PLAY",
"thumbnailImage": {
"contentDescription": "在一个荒凉的岛屿上,想要自杀的绵羊Franck遇到了一个古怪的推销员,推销员为他提供了毕生难忘的礼物,改变了他的命运。他几乎不知道自己一辈子只能应付这么多...",
"sources": [{
"url": "https:\/\/devportal-reference-docs.s3-us-west-1.amazonaws.com\/video-skills-kit\/cosmos_laundromat_thumb.png",
"size": "X_LARGE",
"widthPixels": 1920,
"heightPixels": 1280
}]
},
"runtime": {
"runTimeInMilliseconds": 720000,
"displayString": "2m30s"
},
"closedCaption": {
"status": "AVAILABLE",
"displayString": "CC"
},
"absoluteViewingPositionMilliseconds": 0,
"parentalControl": {
"pinControl": "REQUIRED"
},
"viewingDisplayString": "PurchaseOptions",
"reviews": [{
"totalReviewCount": 600,
"type": "FIVE_STAR",
"ratingDisplayString": "7.4"
}],
"rating": {
"category": "G"
},
"mediaIdentifier": {
"id": "tt7993892"
}
},
{
"name": "Tears of Steel",
"contentType": "ON_DEMAND",
"itemType": "VIDEO",
"releaseYear": "2015",
"selectionAction": "PLAY",
"thumbnailImage": {
"contentDescription": "Watch the full Tears of Steel movie",
"sources": [{
"url": "https:\/\/devportal-reference-docs.s3-us-west-1.amazonaws.com\/video-skills-kit\/tears_of_steel_thumb.png",
"size": "X_LARGE",
"widthPixels": 1920,
"heightPixels": 1280
}]
},
"runtime": {
"runTimeInMilliseconds": 720000,
"displayString": "2m30s"
},
"closedCaption": {
"status": "AVAILABLE",
"displayString": "CC"
},
"absoluteViewingPositionMilliseconds": 0,
"parentalControl": {
"pinControl": "REQUIRED"
},
"viewingDisplayString": "PurchaseOptions",
"reviews": [{
"totalReviewCount": 987,
"type": "FIVE_STAR",
"ratingDisplayString": "7.1"
}],
"rating": {
"category": "G"
},
"mediaIdentifier": {
"id": "tt2285752"
}
}
]
}
}
};
if (name === 'Discover') {
console.log("Lambda 响应: DiscoverResultResponse", JSON.stringify(DiscoverResultResponse));
context.succeed(DiscoverResultResponse);
} else if (name === 'GetPlayableItems') {
console.log("Lambda 响应: GetPlayableItemsResponse", JSON.stringify(GetPlayableItemsResponse));
context.succeed(GetPlayableItemsResponse);
} else if (name === 'GetPlayableItemsMetadata') {
console.log("Lambda 响应: GetPlayableItemsMetadataResponse", JSON.stringify(GetPlayableItemsMetadataResponse));
context.succeed(GetPlayableItemsMetadataResponse);
} else if (name === 'GetDisplayableItems') {
console.log("Lambda 响应: GetDisplayableItemsResponse", JSON.stringify(GetDisplayableItemsResponse));
context.succeed(GetDisplayableItemsResponse);
} else if (name === 'GetDisplayableItemsMetadata') {
console.log("Lambda 响应: GetDisplayableItemsMetadataResponse", JSON.stringify(GetDisplayableItemsMetadataResponse));
context.succeed(GetDisplayableItemsMetadataResponse);
} else if (name === 'GetNextPage') {
console.log("Lambda 响应: GetNextPageResponse", JSON.stringify(GetNextPageResponse));
context.succeed(GetNextPageResponse);
}
};
以下屏幕截图显示了您在其中插入代码的代码编辑器。

稍后将提供有关Lambda代码和逻辑的更多解释和说明(具体而言是步骤3: 了解Alexa指令和预期响应)。但简而言之,Alexa会侦听客户的表述(例如“Play Interstellar”(播放Interstellar)),并将请求打包为指令(JSON对象)。Lambda函数将接收Alexa发出的请求并采取一些操作。
在此代码中,Lambda将event和context记录到控制台。event是指向您的Lambda的Alexa指令;context包括有关event的详细信息。然后,此示例Lambda返回预定义的硬编码响应,以演示预期响应。
在此过程的后期(步骤6: 响应传递至Lambda的Alexa指令),您将配置Lambda,以便根据传入指令的要求,使用后端服务执行所需的查找和其他操作。然后,利用收集到的信息,您的Lambda将通过回调向Alexa提供响应(遵循特定的JSON架构)。
当您更详细地自定义Lambda代码时,您需要处理用户对您的技能提出的每种类型的请求,并向Video Skill API提供正确的响应。在进行更高级的自定义操作时,您需要测试您的视频技能以了解其处理各种指令的方式。所有视频技能都会经过详细认证。现在,您已经完成了基本Lambda代码的设置。
步骤1.4: 完成视频技能设置
返回您在步骤1.1: 开始创建视频技能中开始设置的视频技能:并完成视频技能设置。
要完成视频技能设置,请执行以下操作:
- 返回至Alexa开发者控制台中的视频技能。
- 在Alexa技能列表中,单击您之前开始的视频技能。(如果您将此屏幕保持打开状态,请刷新页面确保您仍处于登录状态。)
- 将Lambda的ARN粘贴到Default endpoint(默认终端节点)框中。(您复制此ARN的操作是在步骤1.3: 为您的视频技能创建Lambda函数中进行的。)
-
在“Pick a geographical region …”(选择地理区域...)部分中,您可以根据不同的地区选择不同的Lambda ARN,以缩短Alexa和Lambda之间的延迟。根据您之前选择的AWS地区,将您的ARN粘贴到这些地区中的一个。

使用Lambda ARN配置您的视频技能 -
在Country Specific Configuration(特定于国家/地区的配置)选项中,为您的技能选择一个国家/地区。默认情况下,应该已经选择了一个国家/地区(例如美国)。如果您的视频技能将在多个国家/地区使用,可单击Add Country(添加国家/地区),然后添加其他国家/地区。
在国家/地区下方,您将看到一个名为“A. [Country name] Configuration”(A. [国家/地区名称] 配置)的子部分。 此处列出了该国家/地区的目录详细信息。如果您添加了更多国家/地区,则会看到每个国家/地区的更多目录详细信息。例如,如果您为视频技能同时添加了United States和Canada,则会看到两个目录子部分,如下所示:

与国家/地区对应的目录子部分 注意: 尽管此处可能列出了许多国家/地区,但只有Supported Countries(支持的国家/地区)中列出的国家/地区可以支持视频技能。(出于测试版开发目的,可能会列出其他国家/地区。) -
在Catalog Name(目录名称)字段中,输入您的目录名称(针对每个国家/地区)。
如简介中所述,视频技能需要目录集成。当用户请求媒体标题时,亚马逊将在您的目录中查找标题匹配项,然后向您发送相应的标识符。有关目录集成(包括CDF格式)的更多详细信息,请参阅目录文档。
测试多模式设备工作流程的示例目录
要了解在多模式设备上观看运作中测试视频技能的简单设置,可以使用以下目录名称:hawaii_us(用于美国技能)。或者hawaii_ca(加拿大)、hawaii_de(德国)、hawaii_es(西班牙)、hawaii_gb(英国)、hawaii_in(印度)、hawaii_it(意大利)、hawaii_jp(日本)。该目录用于测试,仅包含一些Creative Commons视频(例如,Big Buck Bunny、Elephants Dream、Cosmos Laundromat、Caminandes: Llamigos和Tears of Steel(如本信息提要中所述)。 - 忽略MSO ID,因为此字段不用于多模式设备上的视频技能。(MSO代表多系统运营商,用于将直播TV视频技能集成到机顶盒中。)
-
在Language Specific Configuration(特定于语言的配置)部分中,为您的视频技能选择语言。将自动添加与您之前选择的国家/地区相对应的语言,但您可以根据需要单击Add Language(添加语言)来添加其他语言。您输入的其他每种语言都会创建一个包含技能引用详细信息的相应子部分。
例如,假设您的视频技能在美国和加拿大都可用。因此,默认情况下会选择两种语言:en-US和en-CA。因此,您将看到两个子部分,用来配置每种语言的技能引用: “A. English (United States): en-US Configuration”(A.英语 [美国]:en-US配置)和“B. English (Canada): en-CA Configuration”(B.英语 [加拿大]:en-CA配置),如以下屏幕截图所示:

按国家/地区划分的特定语言配置 这些子部分让您可以为每种语言自定义视频技能引用名称和图像资产。例如,假设您的视频技能名称在两个位置之间有所不同,或者标志图像不同,则可以通过这些子部分自定义引用并适当地显示。
-
在Alternate Skill Invocation(备用技能引用)框中,输入其他技能引用方式。默认情况下,可以通过您在创建视频技能时(在部分步骤1.1: 开始创建视频技能)为其赋予的名称来引用视频技能。但是您也可以在这里创建备用名称。
例如,假设您的技能被命名为XYZ。用户可以说“Play the movie Big Buck Bunny on XYZ”(在XYZ上播放电影Big Buck Bunny)来引用您的视频技能。(该表述显式地以您的技能为目标。) 如果您添加了“ACME”的备用技能引用,那么用户可以说出“Play the movie Big Buck Bunny on ACME”(在ACME上播放电影Big Buck Bunny),而Alexa也会通过这个引用以您的视频技能为目标。
- 选中Supports Echo Show in this Locale(在此区域设置中支持Echo Show)复选框。选中此框可展开其他字段,为您的多模式技能配置网页播放器URI、背景和标志图像。
-
在Web Player URI(网页播放器URI)字段中,输入您的网页播放器的位置。有关网页播放器的更多详细信息,请参见步骤5: 构建您的网页播放器。
-
在背景图像和标志图像字段中,为您的技能拖入两张图像。所需的图像资产如下:
背景图片
- 宽高比: 16/9
- 最小尺寸: 宽512像素 x 高288像素
- 最大尺寸: 宽1280像素 x 高720像素
- 文件类型: PNG
背景图像出现在视频主屏幕上(说出“Alexa, go to Video Home”(Alexa,转到视频主页)可查看此屏幕)。视频主页显示了背景图像所代表的各种视频技能。在以下屏幕截图中,“视频技能标志”代表其中一张背景图像。
背景图像示例 标志图像
- 宽高比: 1/1表示最小尺寸,16:9表示最大尺寸
- 最小尺寸: 宽48像素 x 高48像素
- 最大尺寸: 宽1280像素 x 高720像素
- 文件类型: PNG
- 透明背景: 建议
标志图像显示在搜索和浏览模板的右上角(比如说出“Alexa, Open Prime Video”(Alexa,打开Prime Video)以打开类别模板)。考虑在标志图像中使用透明背景。在以下屏幕截图中,标志图像显示“Prime Video”。
标志图像示例 用于测试多模式设备工作流程的示例图像资产
如果您要创建快速测试技能来预览视频技能在多模式设备上的运作方式,则可以将以下两个示例文件用于图像资产: 标志图像、背景图像。右键单击文件并选择Save Link As(将链接另存为)。提示: 即将发布一份设计指南,其中包含有关文件类型、透明度、安全区域、投放和其他信息的更多详细信息。 - 宽高比: 16/9
- 为视频技能配置引用名称和图像资产后,向上滚动回到顶部并单击Save。
- 点击左侧导航栏中的Account Linking(账户关联)。
-
按下表所述配置字段。
输入视频技能的示例OAuth值
创建视频技能时,可以暂时在此处输入一些测试OAuth值。在本教程的后面,您将返回并添加账户关联所需的正确OAuth配置。联系您的亚马逊联系人,获取您可以输入的一些测试OAuth值。账户关联字段 字段 描述 授权URI 如果您尚未设置OAuth,请联系您的亚马逊联系人获取可以在此处输入的测试值。 访问令牌URI 如果您尚未设置OAuth,请联系您的亚马逊联系人获取可以在此处输入的测试值。 客户端ID 输入 alexa-skill客户端密钥 如果您尚未设置OAuth,请联系您的亚马逊联系人获取可以在此处输入的测试值。 客户身份验证方案 保留默认值: HTTP Basic (Recommended)(HTTP基本身份验证(推荐)) 范围 单击+scope(+范围)并添加任何简单的单个词名称(例如 appscope)。域名列表 跳过此字段。 默认访问令牌到期时间 留空。 重定向URL 跳过此字段。 - 单击保存。
-
单击顶部导航栏中的Distribution(分发)选项卡,并确保填写所有字段,包括所有图标。如果需要,您可以稍后再修改这些字段(因为您无需正式发布技能即可对其进行测试),但现在至少要在每个字段中输入一些存根值。下表描述了该选项卡中的字段。
下表描述了每个字段:
Distribution字段 字段 描述 Public Name(公共名称) 在Alexa应用中向客户显示的技能名称。使用您的技能名称(例如,“ACME Media”)。 One Sentence Description(描述) 一个简短的概述句子,描述技能或客户可以用它做什么(例如,“此技能允许您使用自己的语音与ACME交互。”)。此文本显示为您的Alexa技能描述的第一行。 Detailed Description(详细描述) 描述如何使用该技能(例如,“按名称搜索您最喜欢的节目,使用常用命令控制播放,更改频道等。”)。 What's new(新增内容) 您技能的发行说明。(例如,“首次发布技能。”) Example Phrases(示例短语) 用户可以在您的应用中说出的示例表述。把每个表述置于新的一行。示例短语应与您实现的视频技能功能相对应。例如: - “Alexa, search for [TV show] on ACME.”(Alexa,在ACME上搜索 [电视节目]。)
- “Alexa, play [movie] on ACME.”(Alexa,播放ACME上的 [电影]。)
- “Alexa, tune to ACME.”(Alexa,调到ACME。)
- “Alexa, rewind 30 seconds.”(Alexa,倒回30秒。)
- Alexa, show episodes of [TV show] on ACME.(Alexa,在ACME上播放 [电视节目] 的剧集。)
Small Skill Icon(小技能图标) 一个108 x 108像素的图标(PNG或JPG),用于表示您Alexa应用中的技能。图像必须采用圆形设计。如果您没有图像,请使用下面的图库图像或使用Alexa技能图标生成器创建一个图像。(右键单击以下图像并将其保存到您的计算机中。) 
Large Skill Icon(大技能图标) 一个512 x 512像素的图标(PNG或JPG),提供同一图标的放大版本。此图标出现在Amazon.com的Alexa Skills(Alexa技能)部分。如果您没有图像,请使用下面的图库图像或使用Alexa技能图标生成器创建一个图像。(右键单击以下图像并将其保存到您的计算机中。) 
Category(类别) 选择Video(视频) Keywords(关键词) 描述此技能的简单搜索词。例如,您可以列出应用名称的变化形式以及应用中最受欢迎的节目。这有助于客户快捷地找到技能。在每个搜索词之间使用空格或逗号。 Privacy Policy URL(隐私政策URL) 适用于此技能的隐私政策的链接。(如果你没有,请暂时链接到你的网站。) Terms of Use URL(使用条款URL) 此技能的使用条款文档的链接。(如果你没有,请暂时链接到你的网站。) - 填完必填字段后,单击Save and continue(保存并继续)。您将在左侧导航栏中看到下一个屏幕: Privacy & Compliance(隐私与合规性)。
-
填写Privacy & Compliance字段。请注意,您必须在Testing Instructions(测试说明)中加入一些内容。
注意: 为了保护隐私,您将不会收到客户在与您的应用交互时所说的实际语音命令。取而代之的是,Alexa会解释这些表述并将其转换为指令,格式为JSON。这样可以保护客户隐私。 - 在此屏幕上完成操作后,单击Save and continue。您将在左侧导航栏中看到下一个屏幕: Availability(销售国家/地区)。
- 填写Availability字段。确保选择Public(公开)并选择适当的位置(为您的视频技能选择与应用相同的销售国家/地区)。然后单击Save and continue。
-
您将转至Certification(认证)选项卡,具体而言是转到Validation(验证)侧面选项卡。假设您填写了所有必填字段,您应该看到“Zero errors found”(未发现错误)。

视频技能已完成配置并准备好进行测试 无需浏览Functional test(功能测试)和Submission(提交)页面。此外,此时您不需要提交视频技能。您可以在开发技能的过程中测试您的技能。

