深刻理解Amazon Alexa Skill(一)

语音助手(Virtual Personal Assistants, VPA)是物联网智能家居中很火的一个领域,用户能够经过语言做为入口来控制家里各类各样的设备,而亚马逊的Alexa(echo,echo dot)是作的最先也是最优秀的一款产品,衍生出了很大的开发生态圈。本文基于亚马逊的官方文档试图记录做者对其Skill工做原理的理解。html

这不是一个手把手Skill开发入门教程,仅仅讲解了概念与我的的一些理解node

宏观概念

Alexa提供一系列内置的功能,好比回答问题,语音游戏,控制智能家居设备,这些功能都是由skill实现的。亚马逊为Alexa skill提供了一个开放的开发环境,相似于google的Android,任何开发者均可以自由的开发skill并上传到市场中供Alexa的用户使用。Skill调用的基本过程:识别用户调用请求——根据输入语音判断用户意图——执行功能。web

更具体来说,一个skill主要分为两部分:语音用户接口部分(Voice User Interface (VUI) )和功能部分。VUI部分是运行在亚马逊的Alexa云上,Alexa根据设置的规则和用户的语音判断调用哪一个skill。当选择调用你的skill后,才会执行到skill的功能部分。那么功能部分是怎么实现的呢?其实很简单,就是Alexa云发一个JSON格式的数据的HTTPS请求给你预设好的服务器(能够本身搭建web服务器来处理这个HTTPS请求,也能够用AWS的lambda设置alexa来触发)。这个JSON数据就是Alexa规定好的“协议”了,详见文档,发来的JSON内容包括用户intent,用户和设备的ID,本次会话的ID,访问用户隐私数据的令牌,用户控制设备的的token(Oauth2.0)等等不少。你本身Web服务器(本身搭建须要验证签名来判断这请求是否是Alexa服务器发来的)/Lambda的代码来处理这个发来的JSON,同时你再给Alexa回复JSON来响应。事实上,skill的功能代码能够完成任意功能,好比使用用户的token来向第三方云发送请求,实现根据语音控制他的智能家居设备。json

Skill类型(Skill Models)

官方文档将skill分为了几个类别,如定制(custom)、智能家居、资讯等。
定制类型的skill须要开发者本身处理skill中涉及的几乎全部步骤:服务器

  • intents: skill能够处理的请求,即提供的功能,例如点餐,叫出租车,查天气,等等。
  • interaction model: 定义出用户如何说才能调用intents,至关于图形化中点哪一个按钮才能触发预设的功能。例如:“叫辆车”映射到“叫出租”的功能。
  • invocation name: 定义一个Alexa识别你这个skill的名字,相似于Android App的名字,如“抖音”。由于VPA须要知根据用户说的语音来判断到底用户想启用哪一个skill,安卓中用户能够明确的用手点击屏幕的App图标,可是如何判断用户要确切的启用哪一个skill对语音交互来讲实现就很困难。Nan Zhang等发表在S&P 2019的工做就针对这点提出了voice squatting攻击,基本想法是利用口音方言、礼貌用语(“请”,“please”)的差异,让用户调用本身的恶意skill。此外还有个印度哥Deepak Kumar发现方言误发音甚至是可预测的。
  • 开发者可选引入一些除了声音之外的交互内容,好比有的高端VPA已经支持触摸屏了。

而其余类型的skill亚马逊给提供了预约义的模板,开发者不须要处理全部的步骤。好比智能家居类型(Smart Home pre-built model),就是预约义来控制门锁、灯等设备的,选择了这个模板就丧失了灵活的定制性,可是能够更方便快速的开发。使用这类的skill,由Smart Home Skill API 定义了:ide

  • device directives: skill能够处理的请求,好比开关、锁门、改变灯的亮度等等功能。其实就像intents。
  • 用户调用指令要说的话:其实就是interaction model。

开发者须要本身定义本身的skill如何响应某一个指令(directive),例如,须要写代码完成收到“turn on the light”指令时的功能,代码须要使用亚马逊的另外一个服务AWS Lambda来完成。注意,使用Smart Home Skill API 就只能响应这些API里预设的特殊指令(device directives)。(这里有个疑问,alexa是如何断定调用哪一个skill来管理本身家灯的?)ui

用户是如何与skill交互的

用户作出请求——Skill收集补充信息——用户提供须要的信息——skill完成请求功能
Custom skill的例子: User: Alexa, get high tide for Seattle from Tide Pooler.
其中Tide Pooler是skill的invocation name ,调用custom skill的用户必须明确说明这个skill的调用名称。“get high tide for Seattle ”就是须要映射到intent的语音了。google

智能家居的例子: User: Alexa, turn on the living room lights.
“turn on the...”会被Alexa识别成预设的interaction model,判断用户是要开灯。
“living room lights”是用户以前设置的具体设备的名称,而不是skill的名字,Alexa会将device directive发送给能够控制living room lights这个设备的智能家居skill,这个skill再经过与设备的云平台来交互,打开这个具体的设备,并返回结果给Alexa。orm

转载请注明出处 http://www.javashuo.com/article/p-fpaavxdo-p.htmlhtm

相关文章
相关标签/搜索