web-dev-qa-db-fra.com

Comment créer une compétence Alexa qui extrait les données d'une API HTTP/HTTPS (à l'aide de "Alexa Skills Kit" pour Node.js sur AWS Lambda)

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?

5
Dirk Paessler

Préliminaires

  • Pour commencer, vous avez besoin d'un compte Amazon et vous devez activer AWS pour le compte. 
  • Ensuite, il existe un guide étape par étape sur le site Web Amazon: https://developer.Amazon.com/edw/home.html#/skills
  • Il vous guide pas à pas dans le processus de création d'une "compétence". Une compétence est la capacité pour Alexa de répondre aux questions en langage naturel. Au cours de ce processus, vous créez également une fonction Lambda (sélectionnez cette option pour créer l’une des applications de script de démonstration et obtenir automatiquement toutes les bibliothèques requises).
  • Vous pouvez ensuite éditer le code dans l'interface Web de la console AWS).
  • La "compétence" est automatiquement activée sur tous vos appareils Alexa personnels, comme mon point Amazon Echo à la maison.
  • n'oubliez pas que vous pouvez consulter la sortie de la console dans votre section AWS Cloudwatch de la console AWS.

Les deux choses que je devais comprendre (et que d'autres pourraient rencontrer aussi)

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.

  1. Lorsque vous faites une requête http get dans node.js en utilisant https.get () , vous devez fournir un gestionnaire pour le rappel final, tel que res.on ('end', function (res) { });
  2. La réponse est renvoyée du script Lambda au service Alexa lorsque vous appelez this.emit (': tell', 'blabla'); (c'est ce qui est utilisé dans les exemples AWS). Mais dans le gestionnaire d'extrémité "ceci" n'est plus le bon "cela", vous devez stocker le handle à l'avance (je le fais un peu cruellement en utilisant mythis, je suis sûr qu'il existe des solutions plus intelligentes, mais cela fonctionne).

J'aurais facilement économisé deux heures de débogage si j'avais eu l'extrait de code suivant. :-)

Le code

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();
};

12
Dirk Paessler

Comment créer un bot Amazon Alexa à partir de zéro?

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éation d'un serveur de noeud

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:

  • Exécutez npm init sur un terminal et demandez le nom de package Alexa
  • Suivez l'assistant de terminal
  • Exécuter cd Alexa
  • Dans le fichier 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

  • Ajouter un fichier index.js au même niveau
  • Ajoutez 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” }

  • Exécuter npm start sur le terminal

Tunnel votre localhost

Ajoutez un tunnel à l'hôte local sur PORT 8080 exécutant le serveur de noeud à l'aide de ngrok en procédant comme suit:

  • Téléchargez et installez ngrok, si ce n'est déjà fait
  • Exécuter ngrok http 8080 sur un terminal
  • Copier le lien transféré activé par SSL, dans mon cas https://6d0d6e60.ngrok.io est le lien SSL 
  • fournir le lien dans le lien Entrer l'URL
  • Sélectionnez HTTPS et, sous le type de certificat SSL, sélectionnez la 2e option:

Mon 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": []
            }
        }
    }
  • Cliquez sur Enregistrer le modèle, puis sur Construire le modèle.

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]

Lisez entièrement l'article

1
student

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.

https://github.com/Glogo/Alexa-skill-sample-nodejs-express

0
Leandro