written by
Just4test

AWS认证 Alexa Skill Builder 学习笔记

3 min read , October 19, 2020

Alexa是AWS认证系列中唯一不支持中文试题的考试。本文中将以英语为首选语言,并附带中文翻译。

参见词汇表功能更新历史

基础概念

假设你想用饿了么点外卖。你知道附近有一家叫“南城香”的饭馆,你想吃它家的安格斯肥牛饭。如果是用手机,你知道首先保证手机上安装了饿了么App,打开这个App,在餐厅列表中找到“南城香”,然后点进去把安格斯肥牛饭放进购物车,下单付款。

如果用Alexa,你可能会说“Alexa,用饿了么在南城香下单一份安格斯肥牛饭”。这之后发生了什么?作为用户只要等着外卖小哥就可以了;但不幸的是想通过Alexa Specialty认证我们必须明白背后的秘密。

Skill,技能

和用手机点外卖一样,想用饿了么必须要先安装它。在这里它称为“Skill”。

Invocation Name,调用名

安装后,想让饿了么工作还要说出它的名字,称为“Invocation Name”。Skill一旦发布上架就不能修改调用名;发布之前可以随时更改。此外,还有以下规定

  • 调用名不得只有一个单词,除非这个单词是你拥有的品牌/知识产权。
  • 调用名包含冠词或介词时,不得只有两个单词。比如“a bicycle”、“for fun”不能使用。
  • 调用名不得使用单个人名或地点。比如不可使用“sam”,但可以使用“sam's market”
  • 不得包含保留字:
    启动短语 “run”, “start”, “play”, “resume”, “use”, “launch”, “ask”, “open”, “tell”, “load”, “begin”或 “enable”
    连接词 “to”, “from”, “in”, “using”, “with”, “about”, “for”, “that”, “by”, “if”, “and”或 “whether”
    唤醒词 “Alexa”, “Amazon“, “Echo“, “skill” 或 “app”
  • 单词只能包含小写字母、空格、撇号(用于所有格)和点(用于非连读缩写)
  • 如果Skill支持多语言,则需要为每种语言编写调用名。

特别的,只有Custom Skill和Audio Skill需要调用名。查看以下区别:

  • Custom Skill:使用Invocation Name
  • Music Skill:第一次使用Invocation Name激活。然后可以直接使用“下一首”等命令调用。
  • Video Skill:用户说出自己的意图,比如“播放逃学威龙”或者“我要看周星驰的电影”;Alexa将自行挑选需要的Skill以提供内容。
  • Smart Home Skill:直接说出设备名,如“Alexa, turn on the living room lights”
  • Flash Briefing Skill:无论安装了多少个Flash简报技能,都依次播放。“Alexa, what's my flash briefing?”

Intent,意图

饿了么这个Skill比较简单,只有当你的话表达出“点外卖”或者“查询附近饭馆”这两种意思时才能工作,否则就只会说“我还不知道怎么做”。“点外卖”和“查询附近饭馆”就称为“Intents”,意图。

Utterance,表达

Alexa还不能完全理解自然语言。你需要多教给Alexa几种可能的说法,比如“在南城香下单一份肥牛饭”和“我想吃南城香的肥牛饭”。对于同一Intent的不同说法称为“Utterances”,表达。这个词也用于指代用户的一句话(用于计数)。

你可以为Intent指定一系列Sample Utternaces,以文本形式输入。Sample Utternaces用单词表示数字和符号(应使用 three point five 或 dollar,不使用3.5 或$)。但缩写的字母之间使用点(n.b.a),所有格和缩略词使用撇(i’m)、适当使用连字符(man-eating)

Slots,插槽

“我想吃南城香的肥牛饭”这个Utterance中,有“南城香”和“肥牛饭”两个变量。这称为“Slots”,插槽。

  • 插槽分为三种:数字/日期/时间、对象列表、短语
  • Alexa提供了大量的预定义插槽类型。大部分枚举类预定义插槽类型可以扩展。
  • 可以扩展预定义插槽(Extend a Slot Type),比如为“AMAZON.US_CITY”添加一些小城镇名字。扩展是Skill级别的,即当前Skill所有用到该预定义插槽的地方都共享该扩展。
  • Entity resolution,实体解析:为预定义插槽指定同义词。比如用户说“帝都”,Alexa会明白用户所指为北京。此外,还可以为实体定义ID,以便更方便的识别实体。插槽将接受到id、规范名称(北京)和用户说出的词(帝都)。
  • Phrase Slot,短语插槽:这能匹配一大段话。每个intent最多使用一个Phrase Slot。目前仅支持“AMAZON.SearchQuery”类型。
  • AMAZON.SearchQuery:目前短语插槽的唯一支持类型。当一个intent有SearchQuery插槽时,该intent只能有这一个插槽。
  • Custom Slot,自定义插槽:可以指定新的列表插槽类型。
  • 当使用自定义插槽时,系统可能会识别出不在插槽指定的列表中的值。技能可以使用代码检查用户输入,或者定义插槽验证规则
  • 自定义插槽的值使用书面形式提供。比如,用户说出 “fire h. d. seven”,插槽接收到的是“fire HD7”

Dialog,会话

如果一句话没说清楚,Skill可能想多和你聊两句。这称为Dialog。每个Intent可以包含一个Dialog。

  • Slot elicitation 插槽提示,当用户尚未提供插槽的值的时候,引导用户说出该值。
  • Slot confirmation 插槽确认,确认单个插槽的值。
  • Slot validation 插槽验证,提示用户某个插槽的值不被接受
  • Intent confirmation 意图确认,在执行意图之前再次确认。

参见以下对话:

  • 用户:Alexa,用饿了么点个肥牛饭
  • Alexa:你想点哪一家的肥牛饭?
  • 用户:南城香的。
  • Alexa:南城香的肥牛饭一份,你要现在下单吗?
  • 用户:好的。
  • Alexa:正在下单……完成了。预计会在10点28分之前送达。

Interaction Model,交互模型

交互模型定义了技能的语音用户界面。也可以认为这个概念包含了Intents、Utterances、Slots等。ASK提供一系列的pre-build models,此外开发者还可以创建自己的custom model。

Multi-Modal,多模式

指Skill同时支持语音交互和Echo Show/Fire TV上的视觉交互。

Card,卡片

Skill在响应用户时可以发送一张可视的、可交互的卡片。用户通过Alexa App或者桌面浏览器可以查看卡片并互动。注意,Echo Show等设备无法查看卡片。有如下卡片类型:

  • LinkAccount:用于连接账户
  • AskForPermissionsConsent:要求用户授予权限
  • Simple:展示纯文本
  • Standard:展示文本和一张图片。图片必须托管在https端点上并允许CORS,仅支持PNG/JPEG

Session,会话

用户可以和Alexa就单个功能进行很多句交谈,称为会话。
提供Session Attributes功能以在单个会话的多次响应之间共享状态。

术语

AVS,Alexa Voice Service

用于创建和Alexa兼容的第三方设备。

ASK,Alexa Skills Kit

用于创建Alexa技能。

Device Directive,设备指令

用于Smart Home。当用户说出“Alexa, turn on the living room lights”时,Alexa识别用户意图,并向Smart Home Skill发送JSON格式的结构化请求,此请求称为设备指令。

Endpoint,端点

  • Alexa服务处理程序的位置。这可以是一个HTTPS服务,也可以是Lambda函数。
  • 可以为每个Region指定不同的端点,不过不能混合使用HTTPS和Lambda。
  • 对于Lambda端点,除了在Alexa开发界面指定函数ARN外,还要为该函数添加Alexa触发器。触发器可以接受任何技能的调用,也可以指定特定的技能id,防止其他开发者的技能调用你的Lambda函数。

技能类型

Custom Interaction Model

只要希望使用自定义的Intents,就需要创建Custom Skill。使用调用名激活。

Smart Home Skills (Pre-built Model)

使用Smart Home Skill API支持的功能集成智能家居设备。对于用户来说,无需记忆Custom Skills的唤醒词;对于开发者来说也无需设计语音界面,仅仅需要实现设备指令Lambda即可。

如果该技能允许解锁或撤防,则必须要求用户设置至少4位数字的密码,并且每60天提醒用户更换,一旦说错三次则强制重置。上锁不需要密码。

Flash Briefing Skills (Pre-built Model)

添加Flash简报。用户说出“tell me the news”之类的唤醒词,已经安装的Flash简报技能就一个个被调用,然后读出Skill准备好的文本或音频。技能本身只提供内容,无法和用户直接交互。

  • 只能以RSS和JSON方式提供内容,并以有效的https端点提供。
  • 支持最多5个项目,每个项目可以是音频或纯文本,至少10秒长。
  • 如果以音频提供内容,则需要256kbps比特率的mp3,长度在10分钟之内。
  • 如果以纯文本提供内容,需要在4500个单词之内。

Music Skills (Pre-built Model)

实现了AudioPlayer接口的默认模型。

Video Skills (Pre-built Model)

注意,Video Skills应定期将视频节目列表以Catalog Integration方式提供给Amazon。因为用户在播放视频时可以不必说出Skill名称,而是由Alexa在所有已经安装的Video Skills的目录中搜索。

List Skills

Alexa具有简单的“待办事项”列表功能。用户可以用“Alexa, Add bananas to my shopping list” 来添加一条记录,或者直接使用Alexa APP管理列表。用户默认具有to-do和shopping两个列表。任何自定义技能都可声明列表的读写权限。用户向技能授予列表的读写权限后,技能可以使用List API读取或修改列表。

特别的,自定义技能还可以订阅列表事件。订阅了列表事件的自定义技能称为List Skills。Amazon Developer Protal无法编辑List Skills。开发者只能使用ASK CLI为技能添加订阅列表事件的功能,添加之后也只能使用ASK CLI继续之后的编辑工作。

请求类型

Alexa 服务向Skill后端发送如下几种请求:

  • LaunchRequest:当用户调用技能,但未指定任何intent时发
  • IntentRequest:Alexa通过模型,将用户的Utterance匹配到特定的Intent之后发送。
  • SessionEndedRequest:当Skill等待用户响应时,通知Skill当前Session结束。这通常是因为用户说“exit”、用户无响应或说无关的话、发生错误等原因。Skill主动结束Session不会触发此请求。
  • CanFulfillIntentRequest:Alexa的一个测试版功能:用户无需说出特定Skill的Invocation Name,直接向Alexa发起询问。Alexa将使用CanFulfillIntentRequest测试Skill,以确定Skill是否能对用户的询问作出反应。

接口类型

AudioPlayer Interface

AudioPlayer包含大量Intents(意图)、directives(指令)、Requests(请求)。

在一系列Intent中,必须实现PauseIntent和ResumeIntent。以下是列表:

  • AMAZON.PauseIntent
  • AMAZON.ResumeIntent
  • AMAZON.CancelIntent
  • AMAZON.LoopOffIntent
  • AMAZON.LoopOnIntent
  • AMAZON.NextIntent
  • AMAZON.PreviousIntent
  • AMAZON.RepeatIntent
  • AMAZON.ShuffleOffIntent
  • AMAZON.ShuffleOnIntent
  • AMAZON.StartOverIntent

提供以下指令:

  • AudioPlayer.Play 播放音频或插入播放队列。需要指定playBehavior属性:
    REPLACE_ALL:立即打断当前播放的音频并清空播放队列,然后播放指定的音频
    ENQUEUE: 将音频追加到播放队列末尾
    REPLACE_ENQUEUED:清除播放队列然后插入自身,但不打断当前播放
  • AudioPlayer.Stop 打断播放
  • AudioPlayer.ClearQueue 清除队列。需要指定clearBehavior属性:
    CLEAR_ENQUEUED:不打断当前播放
    CLEAR_ALL:打断当前播放

包含以下请求。另见PlaybackController中的请求。

一旦一个实现了AudioPlayer Interface的Skill开始播放音频,Alexa设备就记住了该Skill。用户后续不指定Invocation Name的音频相关意图都会直接发送到该Skill,直到用户启用了另一个Skill的音频播放,或者使用内置音乐服务、Flash简报、重启Alexa设备为止。

PlaybackController Interface

用户可以使用遥控器、带触摸屏或按钮的Alexa设备发出控制播放的Requests,这类似AudioPlayer Interface中的意图。Skill应使用AudioPlayer的对应directive控制音频流播放,但不能返回语音响应。

VideoApp Interface

提供VideoApp.Launch指令以在支持的设备上播放视频。

Dialog Interface

通过编程方式控制Dialog。虽然通常可以使用自动委托让Alexa组织Dialog,但也可以使用Dialog Interface提供的directives(指令)手动控制。支持以下指令:

Display Interface

使用Display.RenderTemplate 指令,基于模板渲染一个用户界面。

Display Template

预先定义的数种显示模板,以在各类带屏幕Alexa设备上以一致的风格显示内容。支持BodyTemplate和ListTemplate两类,模板可以指定不同数量的图像。

Echo Buttons Skill API / Gadget Controller Interface / Game Engine Interface

Echo Button是可以发光的无线按钮,用于玩游戏和控制智能家居,一个Echo最多链接4个按钮。不过这玩意儿断货了,可能是被抛弃了。
之前是两个API,现在合称Echo Buttons Skill API。提供以下三个指令:

Progressive Response,渐进式回复

当别人问我们一个问题,我们需要几秒钟才能构思清楚答案时,我们会说“嗯……”、“让我想想……”、“好像是……”之类的语句。这些语句表明我们在思考。Alexa允许同样的机制,如果Skill需要数秒(8秒以内)才能返回完整响应,就可以先调用Progress Response API,发送一些连接词。
无论是否使用渐进式回复,Skill都需要在8秒内返回完整响应。

Auto Delegation,自动委托

设计Dialog很复杂,不过Alexa提供自动委托以生成一个Intent的Dialog。只要指定Slots是否必须、是否需要Slots确认、是否需要Intent确认,并为每个必须Slot和每个确认配置一条或更多提示语,Alexa就会自动生成dialog模型。

收集每个必须Slots的语音提示、是否提示

Request Customer Contact Information,获取用户信息

不应在Alexa对话中询问用户的个人信息。而是应使用API获取。

  • 技能要使用任何权限,都必须在Build>Premissions页面中声明该技能所涉及的权限。当用户第一次启用技能时,Alexa提示用户使用手机App授予权限。
  • 技能应处理以下情况:
    1. 用户授予权限
    2. 用户拒绝权限。此时可以优雅退出,并发送Premissions Card。
    3. 用户忽略了权限请求
    4. (对于某些用户信息)用户授予了权限,但未填写该项信息。
  • 使用Customer Profile API获取Alexa设备购买者身份,包括全名/Given Name/Email/电话。注意,全名和GivenName只能声明二者之一。
  • 使用Person Profile API获取当前使用者身份。虽然一个Alexa设备只能注册到一个Amazon账户(只有一个Customer),但可能被一家人使用。如果Alexa认出了当前说话的人类的身份,则可以获取该身份,包括全名、Given Name、手机号。注意,Alexa设备很可能没认出当前说话者是谁,或者用户根本没有启用这一设置。
    特别的,开发者不能保存用户信息,必须每次用到的时候再获取;也不能将用户信息与用户账号关联。
  • 使用Device Address API获取设备地址。与GPS定位不同,该API获取的地址是由用户输入的人类可读地址,以及邮编信息等。这需要用户授权(会展示一个权限卡)
  • 使用列表读/列表写权限访问列表(包括默认列表:ToDo和Shopping)。注意,这和List Skill不同,List Skill是指设置了List变更监听的Skill。
  • 当技能开始运行时,使用context中的apiAccessToken和apiEndpoint获取对应信息。注意,如果技能需要多种信息,则可能部分可用。
  • 技能不应保存用户信息,而应该在每次运行时获取。
  • 若用户不允许技能获取对应信息,技能应优雅地处理此种情况。可以将Permissions card发送到Alexa App或带有屏幕的Alexa设备。
  • 如果用户没有填写对应信息,可以提示其在Amazon.com上填写。

自动化测试

  • 如果接收到签名时间戳为150秒之前的Alexa请求,技能必须丢弃它。

Beta Test

可以将In Development版本发送给指定的用户进行Beta测试。只需要向用户所使用的Alexa账户邮箱发送邀请,对方同意即可开始。邀请邮件包含一个提供反馈的链接。一个Beta Test最多持续90天,最多邀请500名用户。
一个Skill可以同时有一个online版本和一个beta版本,处于测试期的用户只能访问beta版本。开发者可以更新beta版本,但无法为一个skill同时启用多个beta版。

Analytics

可以指定的过滤:

  • 特定语言或所有语言
  • 特定Skill
  • 特定Stage(阶段)
  • 特定的时间范围,比如过去7天

技能指标-总览:

  • Actions 动作,仅用于智能家居。提供总动作次数、每个动作的独立用户数和表达数。
  • Customers 用户,使用过该技能的总用户数。限智能家居、Flash简报和自定义技能。
  • Intents 意图,提供总意图数、每个意图的独立用户数和表达数,以及失败的意图数。仅限自定义技能。
  • Interaction Path 互动路径
  • Plays 总播放次数,仅用于Flash简报
  • Retention 12周留存。仅限自定义技能的Live阶段。
  • Sessions 会话。总会话数,每用户平均会话数,会话的成功比例。仅限自定义技能。
  • Utterances 表达,仅限自定义技能和智能家居。提供总表达数,每用户平均表达数,自定义技能还提供表达的响应。

技能指标-激活:

  • Account Linking Completion Rate 账户关联率,用于包含账户链接的自定义技能和智能家居
  • Account Linking Initiations Per User 每个用户的平均账户链接启动次数,用于包含账户链接的自定义技能
  • Total Account Linking Events 账户链接的启动和完成总数,用于包含账户链接的自定义技能和智能家居
  • Total Account Linking Users 账户关联用户总数,启动技能且完成账户关联的用户数,用于包含账户链接的自定义技能
  • User Enablement's 用户启用数,对于不包含账户链接的自定义技能和音乐技能,以及所有简报技能,这是启用该技能的用户总数;对于智能家居、视频和婴儿活动技能,这是启用该技能且完整账户链接的用户总数。
    注意,对于启用了技能但从未使用过的用户,不计入此数量。

技能指标-表现:

  • Endpoint Latency 端点延迟,指示90%的用户表达小于等于展示的值。
  • Endpoint Response 对用户表达的成功响应次数

Solt,插槽

In-Skill Purchasing

类似应用内购。遵循以下原则:

  • 创建一些In-Skill Products,有以下类型:
    One-time purchases:一次性解锁的功能。
    Subscriptions:周期性订阅的功能。
    Consumables:消耗性物品,比如游戏金币。
  • 面向儿童的技能不能包含Consumables。
  • 支持用户进入购买流程,比如一个游戏Skill可以在用户角色血量低时提示购买补给品,或者创建一个Intent允许用户指名购买某种Product。
  • 当用户表示购买意愿时返回一个购买响应。这会中断当前Skill并进入由Alexa管理的购买Dialog。
  • 稍后购买结果将会传回Skill,Skill开始运行并处理该结果。购买结果可能是成功、用户取消购买、购买失败;如果是One-time purchase或Subscription,还可能返回已经购买。Skill应能处理这几种情况。
  • Skill必须包含cancel subscription/refund意图,并返回取消响应,这会中断当前Skill并进入由Alexa管理的取消流程。
  • 所有产品的最低价格是0.99,消耗品的最高价格是9.99,订阅、一次性解锁的最高价格是99.99。美元、英镑、欧元都是如此,日元乘以100。
  • 如果销售实体物品,应使用Amazon Pay

SSML

注意,Amazon Polly的SSML支持和Alexa不同。比如,amazon:emotion标签尚不能在Polly中使用。支持以下标签:

  • speak 必须的根元素
  • amazon:domain 以“news”或者“music”风格渲染语音。 目前仅支持 English (US) 和 English (AU).
  • amazon:effect 支持“whispered”(耳语)特效。
  • amazon:emotion 指定情绪
  • audio 插入一段mp3音频。必须是48kbps比特率和22050/24000/16000hz采样率,总长不超过240秒,需要以https提供。
  • break 插入停顿,可指定长度,最多10秒
  • emphasis 重音效果
  • lang 以指定语种朗读片段
  • p 指定段落。这相当于插入一个x-strong级别的break
  • phoneme 音素:为包含的单词指定音标
  • prosody 韵律:为包含的文本指定语速、音调、音量
  • s 指定一个句子。相当于在句子末尾插入strong级别的break
  • say-as 指示TTS引擎以特定方式理解包含的文本。比如以字母拼读方式发音,或者将值解释为日期,或朗读电话号码等等。
  • sub 将包含的文本替换为另一种发音
  • voice 指定另一个Polly发音者朗读包含的语音
  • w 指定单词的词性,动词/过去分词/名词/非默认含义。

Account Linking,账户链接

某些Skill需要链接外部账户。Smart Home、Video、Meetings必须链接外部账户才能使用;Custom Skill和Music则是可选的。

账户链接基于Oauth2.0。链接有两种流程:通常的方式是当用户在Alexa App中启用需要账户链接的技能时,Alexa App打开Skill账户的登陆界面,登录后跳回Alexa。另一种方式是用户在Skill的App或网页中

Policy Testing

非常长,但有必要一读。可能出现的考点有(但不限于):

  • 当使用第三方的商标/名称时,应获得该第三方的许可,或者在技能标题中明确声明为“unofficial”
  • 不得收集任何个人健康信息。
  • 面向儿童的技能不得宣传任何Alexa之外的内容,出售任何实物产品,收集任何个人信息
  • 不得允许用户通过Alexa联系任何紧急响应者,比如911电话。
  • 如果Skill提供搜索,则搜索必须来自特定在线资源(比如不能直接返回Google信息),并通过技能说明/邮件/SMS/语音/HomeCard等方式指出信息来源。此外,搜索结果不能包含违反内容政策的内容。
  • 不得推荐其他开发者的Skill,不能使用Alexa语音推荐Skill。

发布

技能可用性

用户可以设置国家和语言;技能需满足下列三条要求才能被用户使用。

  • 技能默认分发到全球,开发者也可以指定分发到的region或国家。
  • 技能支持用户所在国家的主语言。如果不支持主语言,技能将不会出现在商店中。
  • 技能支持用户当前设置的语言。

例如:用户使用.de账户,并将Alexa语言设置为英语。则一个技能应满足:1. 分发到了德国 2. 支持德语 3. 支持英语,该用户才能使用。

开发控制台界面

Build

该界面依据技能的类型有所不同。

CUSTOM 自定义技能

FLASH BRIEFING 简报技能

Custom Error Message 指定该技能不能正常工作时的报错语音。比如 'Skill Name is not available at the moment'

Feeds 简报的feed源。

其他服务

Dynamo DB

Lambda