Je souhaite créer une compétence pour Amazon Alexa qui, lorsqu'elle est déclenchée par des commandes vocales, obtient des informations d'une API via une requête HTTPS et utilise le résultat comme réponse parlée à l'utilisateur Alexa.
Il y a un petit défi ici (en particulier pour les débutants node.js) en raison du concept de node.js basé sur les événements et des éléments internes du Alexa Skills Kit pour Node.js . Et obtenir une main sur les paramètres de l'utilisateur n'est pas si facile, non plus.
Quelqu'un peut-il fournir un exemple de code pour commencer?
Lors de la création de ma première compétence Alexa, j’étais nouvellement nommé node.js, Lambda et le SDK Alexa Skills. Alors j'ai rencontré quelques problèmes. Je voudrais documenter les solutions ici pour la prochaine personne qui rencontre le même problème.
J'aurais facilement économisé deux heures de débogage si j'avais eu l'extrait de code suivant. :-)
Mon échantillon, le script lambda, reçoit déjà le texte préformaté de l’API. Si vous appelez un XML/JSON ou une API, vous devez travailler un peu plus avec la réponse.
'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();
};
Si vous cherchez un moyen de créer un bot compatible avec la voix Alexa, vous êtes au bon endroit!
Créons un bot Amazon Alexa à partir de rien en utilisant un serveur de nœud exécuté sur notre hôte local et tunnelisé par ngrok.
Inscrivez-vous pour un compte de développeur Amazon, si vous n'en avez pas.
Aller à la page développeur Alexa
Aller à la console Alexa
Cliquez sur Créer une compétence
Donnez un nom à la compétence, j'ai nommé mien TestSkill et cliquez sur Suivant
Choisissez un modèle à ajouter à votre compétence, j'ai sélectionné la personnalisation pour mes expériences.
Cliquez sur Créer une compétence
De cette façon, vous accédez au tableau de bord des compétences Alexa
Donnez un nom d’invocation, je l’ai nommé «Give me pizza» et cliquez sur Save Model
Cliquez sur le point final
Nous devons maintenant fournir le point de terminaison à la console Alexa, mais nous devons d’abord configurer un point de terminaison.
Créez un serveur pouvant accepter POST demandes à l'emplacement par défaut, c'est-à-dire «/».
Il y a tellement de techniques pour créer un serveur que je préfère personnellement noeud.
Je suppose que vous avez déjà installé le code de noeud, npm et Visual studio.
Pour les besoins spécifiques de ce didacticiel, nous allons créer une application de nœud Hello World en procédant comme suit:
npm init
sur un terminal et demandez le nom de package Alexacd Alexa
package.json
Exécutez npm i express http -save
et ceci ajoutera l'entrée suivante dans le fichier package.json
:
“Dépendances”: { “Express”: “4.16.3”, “Http”: “0.0.0” }
Définissez la valeur sur index.js
de la clé principale dans le fichier package.json
index.js
au même niveauAjoutez le code suivant dans le fichier index.js
:
const express = require ('express'); const app = express (); app.post ('/', (req, res) => res.send ({ version: '1.0', réponse: { shouldEndSession: false, outputSpeech: { type: 'SSML', texte: 'Bonjour tout le monde!', ssml: 'Bonjour tout le monde!' } } })) app.listen (8080, () => console.log ('Exemple d'application en écoute sur le port 8080!'));
Définissez la valeur de scripts
sur { “start”: “node index.js” }
npm start
sur le terminalAjoutez un tunnel à l'hôte local sur PORT 8080
exécutant le serveur de noeud à l'aide de ngrok en procédant comme suit:
ngrok http 8080
sur un terminalMon noeud final de développement est un sous-domaine d'un domaine qui possède un certificat générique émis par une autorité de certification.
Cliquez sur Save Endpoints
Cliquez sur l'éditeur JSON et fournissez le modèle suivant:
{
"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": []
}
}
}
Une fois, le modèle de compétences est construit - nous devons le tester. Cliquez sur l'onglet Test et activez l'option «Le test est activé pour cette compétence».
C’est tout, vous avez créé un bot Alexa connecté à votre projet de nœud en cours d’exécution locale.
Des questions? Commentaires? Me joindre à [email protected]
C’est un exemple de code (pas le mien) qui utilise le sdk Alexa qui n’a pas besoin d’utiliser awsLambda et qui fonctionne uniquement avec un serveur purement nodejs.