it-swarm.com.de

Wie erstelle ich eine Alexa Skill, die Daten von einer HTTP/HTTPS-API abruft (mithilfe des "Alexa Skills Kit" für Node.js für AWS Lambda)

Ich möchte eine Fähigkeit für Amazon Alexa erstellen, die - wenn sie durch Sprachbefehle ausgelöst wird - über eine HTTPS-Anforderung einige Informationen von einer API erhält und das Ergebnis als gesprochene Antwort an den Alexa-Benutzer verwendet.

Aufgrund des ereignisgesteuerten Konzepts von node.js und der Interns des Alexa Skills Kit für Node.js besteht hier eine kleine Herausforderung (insbesondere für Neuling von node.js). Außerdem ist es nicht so einfach, die Parameter des Benutzers in den Griff zu bekommen.

Kann jemand einen Beispielcode bereitstellen, um damit zu beginnen?

5
Dirk Paessler

Vorrunde

  • Um zu beginnen, benötigen Sie ein Amazon-Konto und müssen AWS für das Konto aktivieren. 
  • Dann gibt es auf der Amazon-Website eine Schritt-für-Schritt-Anleitung von Nizza: https://developer.Amazon.com/edw/home.html#/skills
  • Es führt Sie Schritt für Schritt durch die Erstellung einer "Fertigkeit". Eine Fähigkeit ist die Fähigkeit von Alexa, Fragen in natürlicher Sprache zu beantworten. Während dieses Vorgangs erstellen Sie auch eine Lambda-Funktion (wählen Sie, um eine der Demo-Skript-Anwendungen zu erstellen, und Sie erhalten automatisch alle erforderlichen Bibliotheken).
  • Anschließend können Sie den Code in der WebUI der AWS Console bearbeiten.
  • Die "Fertigkeit" wird automatisch auf allen Ihren persönlichen Alexa-Geräten aktiviert, z. B. meinem Amazon Echo-Punkt zu Hause.
  • beachten Sie, dass Sie die Konsolenausgabe in Ihrem AWS Cloudwatch-Abschnitt der AWS-Konsole anzeigen können.

Die zwei Dinge, die ich verstehen musste (und auf die auch andere stoßen könnten)

Während ich meinen ersten Alexa Skill erstellte, war ich neu node.js, Lambda und das Alexa Skills SDK. Also bin ich auf ein paar Probleme gestoßen. Ich möchte hier die Lösungen für die nächste Person dokumentieren, die das gleiche Problem hat.

  1. Wenn Sie eine http-Anforderung in node.js mit https.get () absenden, müssen Sie einen Handler für den Endcallback bereitstellen, z. B. res.on ('end', function (res) { });
  2. Die Antwort wird vom Lambda-Skript an den Alexa-Dienst zurückgesendet, wenn Sie this.emit (': tell', 'blabla') aufrufen. (dies wird in den Beispielen von AWS verwendet). Aber im End-Handler ist "das" nicht mehr das "Dies" mehr, Sie müssen den Griff vorher speichern (ich mache dies etwas schief mit Mythis, ich bin sicher, es gibt intelligentere Lösungen, aber es funktioniert).

Ich hätte leicht zwei Stunden Debuggen eingespart, wenn ich den folgenden Code-Ausschnitt hätte. :-)

Der Code

In meinem Beispiel erhält das Lambda-Skript bereits den vorformatierten Text von der API. Wenn Sie eine XML/JSON-API oder eine andere API aufrufen, müssen Sie etwas mehr mit der Antwort arbeiten.

'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

Wie erstelle ich einen Amazon Alexa Bot von Grund auf?

Wenn Sie nach einem Weg suchen, einen Alexa Voice-fähigen Bot zu erstellen, sind Sie an der richtigen Stelle!

Erstellen wir einen Amazon Alexa-Bot von Grund auf, indem wir einen Knotenserver verwenden, der auf unserem localhost ausgeführt wird und durch ngrok getunnelt wird.

  • Melden Sie sich für ein Amazon-Entwicklerkonto an, falls Sie noch keinen haben

  • Gehen Sie zur Alexa-Entwicklerseite

  • Gehen Sie zur Alexa-Konsole

  • Klicken Sie auf Fertigkeit erstellen

  • Geben Sie der Fertigkeit einen Namen, ich habe meinen TestSkill benannt und klicken Sie auf Weiter

  • Wählen Sie ein Modell aus, das Sie Ihrer Fertigkeit hinzufügen möchten. Ich habe für meine Experimente benutzerdefinierte Einstellungen ausgewählt

  • Klicken Sie auf Fertigkeit erstellen

Auf diese Weise gelangen Sie zum Alexa Skill Dashboard

  • Geben Sie einen Anrufnamen an. Ich habe ihn "Gib mir Pizza" genannt und klicke auf Modell speichern

  • Klicken Sie auf den Endpunkt

Nun müssen wir den Endpunkt für die Alexa-Konsole bereitstellen, aber zuerst müssen wir einen Endpunkt einrichten.

Erstellen eines Knotenservers

Erstellen Sie einen Server, der POST -Anfragen am Standardspeicherort akzeptieren kann, d. H. "/".

Es gibt so viele Techniken zum Erstellen eines Servers, ich persönlich bevorzuge Knoten.

Ich gehe davon aus, dass bereits Knoten, npm und Visual Studio-Code installiert sind

Für die besonderen Anforderungen dieses Tutorials erstellen wir eine Hello World-Knoten-App. Gehen Sie dabei wie folgt vor:

  • Führen Sie npm init auf einem Terminal aus und fragen Sie nach dem Paketnamen Alexa
  • Folgen Sie dem Terminal-Assistenten
  • cd Alexa ausführen
  • In der package.json-Datei
  • Führen Sie npm i express http -save aus und fügen Sie der package.json-Datei den folgenden Eintrag hinzu:

    "Abhängigkeiten": { "Express": "4.16.3", "Http": "0.0.0" }

  • Setzen Sie den Wert auf index.js des Hauptschlüssels in der package.json-Datei

  • Fügen Sie eine Datei index.js auf derselben Ebene hinzu
  • Fügen Sie folgenden Code in die index.js-Datei ein:

    const express = required ('express'); const app = express (); app.post ('/', (req, res) => res.send ({ version: '1.0', antwort: { shouldEndSession: false, outputSpeech: { type: 'SSML', Text: 'Hallo Welt!', ssml: 'Hallo Welt!' } } })); app.listen (8080, () => console.log ('Beispielanwendung für Port 8080!'));

  • Setzt den Wert von scripts auf { “start”: “node index.js” }

  • Führen Sie npm start auf dem Terminal aus

Tunneln Sie Ihren localhost

Fügen Sie dem localhost auf PORT 8080, auf dem der Knotenserver ausgeführt wird, einen Tunnel mit ngrok hinzu. Führen Sie dazu die folgenden Schritte aus:

  • Laden Sie ngrok herunter und installieren Sie es, falls noch nicht geschehen
  • Führen Sie ngrok http 8080 auf einem Terminal aus
  • Kopieren Sie den SSL-fähigen weitergeleiteten Link. In meinem Fall https://6d0d6e60.ngrok.io ist der SSL-Link 
  • geben Sie den Link in den Link URL eingeben ein
  • Wählen Sie HTTPS aus und wählen Sie unter SSL-Zertifikatstyp die zweite Option aus:

Mein Entwicklungsendpunkt ist eine Unterdomäne einer Domäne, die über ein Platzhalterzertifikat einer Zertifizierungsstelle verfügt

  • Klicken Sie auf Endpunkte speichern

  • Klicken Sie auf den JSON-Editor und geben Sie das folgende Modell an:


    {
        "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": []
            }
        }
    }
  • Klicken Sie auf Modell speichern und dann auf Modell erstellen

Sobald das Skillmodell erstellt ist, müssen wir es testen. Klicken Sie auf die Registerkarte "Test" und aktivieren Sie die Option "Test ist für diese Fertigkeit aktiviert".

Das ist es, Sie haben einen Alexa-Bot erstellt, der mit Ihrem lokal laufenden Knotenprojekt verbunden ist.

Fragen? Bemerkungen? Erreichen Sie mich unter [email protected]

Lesen Sie den gesamten Artikel

1
student

Dies ist ein Beispielcode (nicht meiner), der Alexa SDK verwendet, der awsLambda nicht verwenden muss und nur mit einem reinen, reinen nodejs-Server arbeitet

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

0
Leandro