非常简单的教程,讲怎么给 Alexa 添加新的 skill,让你的 Echo 更个性化。本篇添加的 skill 是让 Alexa 从 reddit 上读前 10 条热点。
代码戳Alexa-Starter-RedditReader,其他版本如用 python flask 实现,见Alexa 开发新技能 - python flask。这一篇截图比较细,一方面是因为 AWS 版本迭代太快,网上之前的教程可能会过时,另一方面实在是因为一步步做下来踩了很多坑,争取这篇教程可以让大家少走一些弯路。
这一篇会用到 AWS Lambda,Lambda 的优势官方说明描述的很清楚,简单来说最显著的优点就是,与 Alexa 开发新技能 - python flask 相比,我们不再需要后端运行代码并通过 ngrok 等工具将代码部署到公开网络。
通过 AWS Lambda,无需配置或管理服务器即可运行代码。您只需按消耗的计算时间付费 – 代码未运行时不产生费用。借助 Lambda,您几乎可以为任何类型的应用程序或后端服务运行代码,而且全部无需管理。只需上传您的代码,Lambda 会处理运行和扩展高可用性代码所需的一切工作。您可以将您的代码设置为自动从其他 AWS 服务触发,或者直接从任何 Web 或移动应用程序调用。
总结下来 AWS Lambda 有以下几个特点:
- run code in response to events
- no maintenance of server, no worry about infrastructure
- scale automatically
- never pay for idle
下面介绍怎么来用 Nodejs 和 Lambda 实现 Reddit Reader。
Requirements
- Nodejs 4.3
- Amazon Developer Account
Code for new skill (Lambda Function)
这里我们使用 Lambda function,get_headlines() 是我们主要的 method,从 Reddit 里返回 10 条热点。逻辑是这样的:
- (用户呼唤 Reddit Reader)
- Alexa 问用户 ‘Hello there, would you like the news?’
- 用户回答
肯定回复: 读 10 headlines
否定回复: 回答 ‘I am not sure why you asked me to run then, but okay… bye’
首先建好 project 框架
设置相关依赖
版本:
- “alexa-sdk”: “^1.0.9”,
- “request”: “^2.81.0”
代码
如果不用 alexa-sdk,也可以自己搭一个框架出来,如下
更多方法戳alexa-skills-kit-sdk-for-nodejs
Lambda Configuration
登录AWS console在 Service 下选择 Lambda
Create a Lambda function,选 Node.js.4.3, Blank Function
Configure Triggers,选 Alexa Skills Kit
Configure Function,如下设置
注意两个点,代码上传后,Handler 的路径设置必须和代码中 handler 文件的路径相一致,建议对文件内所有文件打包,而不是直接对文件夹打包。Role 如果没有 existing role,可以新建一个。
完成后选择新建的 function,在 Action 里选择 Configure test event
选择 Alexa Start Session,修改 Applicatio ID,即 Alexa console 里的 Application ID,在 Deploy 下会讲到。
选择 Save and Test,返回结果
Deploy
去Amazon developer 网站上注册用户并登陆,注意这里的用户名和你的 Echo 用户名是一致的。点开 Alexa tab,选择 add skill,开始部署。
Step1:
填写 Name 和 Invocation Name,Invocation Name 用来 invoke app,Application ID 可以在保存页面后找到,需要添加到代码以及 Configure test event 里,如果需要对 Lambda 页面进行测试的话。
Step2:
主要填写 Intent Schema 和 Sample Utterances
Intent Schema: how alexa will traverse your application
|
|
Sample Utterances: the words people say to trigger intent
Step3:
选择并填写 Endpoint,即 AWS Lambda 下 function 的 ARN
Step4:
就可以用 Echo 来 test 啦~ 如果没有 Echo,可以用 Service Simulator 来模拟,可以输入 text,也可以输入 json
先给 Alexa 一个关于 Reddit Reader 的指令,然后按照我们的代码,Alexa 会问你要不要读新闻
然后我们回答 yes,Alexa 就开始读新闻啦~