我想为Amazon Alexa创建一项技能 - 当由语音命令触发时 - 通过HTTPS请求从API获取一些信息,并将结果用作Alexa用户的口头答案。
由于node.js的事件驱动概念和Alexa Skills Kit for Node.js的内部结构,这里有一点挑战(特别是对于node.js新手)。从用户手中获取参数并不容易。
有人可以提供一些示例代码吗?
答案 0 :(得分:13)
当我创建我的第一个Alexa Skill时,我是新的node.js,Lambda和Alexa Skills SDK。所以我遇到了一些问题。我想在这里为下一个遇到同样问题的人记录解决方案。
如果我有以下代码片段,我会轻松保存两个小时的调试。 : - )
我的示例lambda脚本已经从API中获取了预先格式化的文本。如果您调用XML / JSON或任何API,您需要更多地处理答案。
'use strict';
const Alexa = require('alexa-sdk');
var https = require('https');
const APP_ID = ''; // TODO replace with your app ID (OPTIONAL).
const handlers = {
'functionwithoutdata': function() {
var responseString = '';
var mythis = this;
https.get('**YOURURL**?**yourparameters**', (res) => {
console.log('statusCode:', res.statusCode);
console.log('headers:', res.headers);
res.on('data', (d) => {
responseString += d;
});
res.on('end', function(res) {
const speechOutput = responseString;
console.log('==> Answering: ', speechOutput);
mythis.emit(':tell', 'The answer is'+speechOutput);
});
}).on('error', (e) => {
console.error(e);
});
},
'functionwithdata': function() {
var mydata = this.event.request.intent.slots.mydata.value;
console.log('mydata:', mydata);
var responseString = '';
var mythis = this;
https.get('**YOURURL**?**yourparameters**&mydata=' + mydata, (res) => {
console.log('statusCode:', res.statusCode);
console.log('headers:', res.headers);
res.on('data', (d) => {
responseString += d;
});
res.on('end', function(res) {
const speechOutput = responseString;
console.log('==> Answering: ', speechOutput);
mythis.emit(':tell', 'The answer is'+speechOutput);
});
}).on('error', (e) => {
console.error(e);
});
}
};
exports.handler = (event, context) => {
const alexa = Alexa.handler(event, context);
alexa.APP_ID = APP_ID;
alexa.registerHandlers(handlers);
alexa.execute();
};

答案 1 :(得分:3)
如果您正在寻找一种方法来创建一个支持Alexa语音的机器人,那么您就在正确的位置!
让我们使用在我们的localhost上运行的节点服务器从头开始创建一个Amazon Alexa bot,并通过ngrok进行隧道传输。
如果您没有
转到Alexa开发者页面
转到Alexa控制台
点击创建技能
为技能命名,我将其命名为TestSkill并点击Next
选择要添加到您技能的模型,我为实验选择了自定义
点击创建技能
通过这种方式,您可以访问Alexa技能信息中心
提供调用名称,我将其命名为“给我披萨”,然后点击保存模型
点击端点
现在,我们需要为Alexa控制台提供端点,但首先我们需要设置端点。
创建一个可以在默认位置接受POST请求的服务器,即“/".
有很多创建服务器的技术,我个人更喜欢节点。
我假设你已经安装了node,npm和Visual studio代码
对于本教程的特定要求,我们将按照以下步骤创建Hello World节点应用程序:
npm init
,并在被要求提供包名Alexa cd Alexa
package.json
档案运行npm i express http -save
,这将在package.json
文件中添加以下条目:
“依赖项”:{ “表达”:“4.16.3”, “http”:“0.0.0” }
将值设置为index.js
文件中主键的package.json
index.js
将以下代码添加到index.js
文件中:
const express = require('express'); const app = express(); app.post('/',(req,res)=> res.send({ 版本:'1.0', 回复:{ shouldEndSession:false, outputSpeech:{ 类型:'SSML', 文字:'Hello World!', ssml:'Hello World!' } } })); app.listen(8080,()=> console.log('示例应用程序侦听端口8080!');
将scripts
的值设置为{ “start”: “node index.js” }
npm start
按照以下步骤,使用ngrok在运行节点服务器的PORT 8080
上的localhost中添加一个隧道:
ngrok http 8080
我的开发端点是域的子域,其具有来自证书颁发机构的通配符证书
点击保存端点
单击JSON编辑器并提供以下模型:
{
"interactionModel": {
"languageModel": {
"invocationName": "get me pizza",
"intents": [
{
"name": "PizzaOrderIntent",
"slots": [],
"samples": [
"Give me a pizza"
]
},
{
"name": "AMAZON.FallbackIntent",
"samples": [
"I didn't understand"
]
},
{
"name": "AMAZON.CancelIntent",
"samples": [
"cancel plz"
]
},
{
"name": "AMAZON.HelpIntent",
"samples": [
"help"
]
},
{
"name": "AMAZON.StopIntent",
"samples": [
"stop"
]
}
],
"types": []
}
}
}
一旦构建技能模型 - 我们需要测试它。单击“测试”选项卡并切换“为此技能启用测试”。
就是这样,你创建了一个连接到你本地运行的节点项目的Alexa僵尸程序。
有问题吗?评论?请通过info@nordible.com与我联系
答案 2 :(得分:0)
这是一个使用alexa sdk的示例代码(不是我的),它不需要使用awsLambda并且只使用express,pure nodejs服务器