Open Source im professionellen Einsatz
Linux-Magazin 04/2017
691

Alter Kumpel Lambda

Der nächste Screen im Entwicklungs-Flow fragt nach dem »Endpoint« der Anfrage, also dem Webservice, an den der Sprachassistent die Anfrage weiterleiten soll. Im einfachsten Fall ist dies eine Lambda-Funktion der Amazon-Cloud, deren Konfiguration in der vorletzten Snapshot-Ausgabe [4] besprochen wurde. Deren ARN (Amazon Resource Name) trägt der User mit Cut & Paste in das Textfeld in Abbildung 8 ein.

Abbildung 8: Der Endpoint der Anfrage ist in diesem Fall eine Lambda-Funktion.

Die Lambda-Funktion auf AWS darf der Entwickler entweder in Java oder nach Node-Art in Javascript schreiben, neben etwas Boilerplate-Code [5] in »AlexaSkill.js« aus einer Beispielanwendung im Alexa-Tutorial nutzt die neue Skill die Funktionen aus Listing 3, verschnürt das Ganze mit

Listing 3

index.js

01 // Alexa helper to fetch latest snapshot issue
02 // Mike Schilli, 2017 (m@perlmeister.com)
03 var APP_ID     = undefined;
04 var AlexaSkill = require('./AlexaSkill');
05
06 var LatestSnapshot = function () {
07     AlexaSkill.call(this, APP_ID);
08 };
09
10 var http = require('http');
11
12 LatestSnapshot.prototype = Object.create(AlexaSkill.prototype);
13 LatestSnapshot.prototype.constructor = LatestSnapshot;
14
15 LatestSnapshot.prototype.intentHandlers = {
16   "LatestSnapshotIntent": function (intent, session, response) {
17     getData(response);
18   },
19   "AMAZON.HelpIntent": function (intent, session, response) {
20     response.ask("Hello", "Hello");
21   }
22 };
23
24 function getData(response) {
25   http.get("http://perlmeister.com/articles.json", function(res) {
26     var json_string = '';
27
28     res.on('data', function(data) {
29       json_string += data;
30     });
31
32     res.on('end', function() {
33       var snapshots = JSON.parse(json_string);
34       var latest_issue = snapshots.issues[0];
35       var answer = latest_issue.month + " " +
36                    latest_issue.year;
37
38       response.tellWithCard(answer, "Latest Snapshot", answer);
39     });
40   });
41 }
42
43 exports.handler = function (event, context) {
44     var latestSnapshot = new LatestSnapshot();
45     latestSnapshot.execute(event, context);
46 };
zip -r upload.zip AlexaSkill.js index.js

in eine Zip-Datei und lädt diese zu einer neu angelegten Lambda-Funktion hoch (Abbildung 9).

Abbildung 9: Der Endpoint-Webservice in Lambda als Javascript-Code.

Die Handler für die erkannten Intents, die der Webservice bedient, stehen in Listing 3 ab Zeile 15 in einem assoziativen Array. Für die neue »LatestSnapshot« -Skill ruft Zeile 17 die ab Zeile 24 definierte Funktion »getData()« auf und übergibt ihr das »response« -Objekt, damit sie dem Client gleich die gefundene Antwort schicken kann.

Asynchrones HTTP

Mit dem der Node.js-Umgebung beiliegenden »http« -Modul und dessen Methode »get()« holt Zeile 25 dann den Json-Salat von der Perlmeister-Website. Entsprechend dem asynchronen Flow in Node-Systemen registriert der Code in den Zeilen 28 und 32 Handler für zurückkommende Daten und den Abschluss des Json-Transfers. Ersterer fügt eintrudelnde Stücke im String »json_string« aneinander, Letzterer wirft einen Json-Parser an, der aus dem String eine Datenstruktur füllt. Im Produktionsbetrieb sollten im Code auch noch Handler für Fehlerfälle stehen, damit Alexa den User per Sprachausgabe darüber unterrichten kann, was eigentlich schiefgelaufen ist.

Da die Einträge in umgekehrt chronologischer Reihenfolge in der Struktur stehen, holt Zeile 34 einfach das erste Element des Array unter »issues« hervor, die nächste Zeile fieselt Monat und Jahr aus der Datenstruktur heraus.

Über die Methode »tellWithCard()« des »response« -Objekts schickt Zeile 38 die Antwort als Sprachausgabe sowie als so genannte Home Card für Geräte mit Video-Ausgabe (zum Beispiel Amazon Fire, das ebenfalls Alexa einsetzt), einer Art Karteikarte mit der Antwort zur zusätzlichen visuellen Untermalung.

Damit die Lambda-Funktion Alexa-Events entgegennimmt, benötigt sie unter dem Reiter »Triggers« die Option »Alexa Skills Kit« , die der User auswählt, indem er auf das leere Kästchen klickt, von dem ein Pfeil zu den orangenen Fensterläden der Lambda-Funktion zeigt (Abbildung 10). Zurück im Flow der Konfiguration der Alexa-Skill steht nun unter der Rubrik »Test« ein orangener Schalter, der auf »Enabled« steht mit der Mitteilung, dass die Skill auf dem persönlichen Account des Users aktiviert sei. Spricht der nun "Alexa, ask latest snapshot for release|issue|last month", wird Alexa nach kurzer Denkpause auf Englisch mit "01 2017" antworten.

Abbildung 10: Auswahl der Events von Alexa.

Falls irgendetwas schiefgeht, kann der User im Alexa-Protokoll nachlesen, was Alexa tatsächlich verstanden hat, und anschließend im Logfile der Lambda-Funktion stöbern, ob der Code eventuell abgestürzt ist oder irgendwelche Fehler gemeldet hat.

Diesen Artikel als PDF kaufen

Express-Kauf als PDF

Umfang: 4 Heftseiten

Preis € 0,99
(inkl. 19% MwSt.)

Linux-Magazin kaufen

Einzelne Ausgabe
 
Abonnements
 
TABLET & SMARTPHONE APPS
Bald erhältlich
Get it on Google Play

Deutschland

Ähnliche Artikel

  • Alexa

    Apples Siri, Microsofts Cortana, Googles Sprachsuche – alle setzen auf den Dialog mit dem Computer, ohne dass dabei die Hände auf der Tastatur liegen. Wie schlägt sich Amazons Assistentin Alexa, die ihren Nutzern ebenfalls aufs gesprochene Wort gehorchen soll? Deutlich wird: Sie hat zwei Gesichter.

  • Snapshot

    Im Linux-Magazin 04/2017 bringt Mike Schilli Amazons Zuhördose Alexa neue Tricks bei: Sie soll auf Zuruf die aktuelle Ausgabe des
    Programmier-Snapshots ermitteln.

comments powered by Disqus

Ausgabe 07/2017

Digitale Ausgabe: Preis € 6,40
(inkl. 19% MwSt.)

Artikelserien und interessante Workshops aus dem Magazin können Sie hier als Bundle erwerben.