Mit schlappen zwei Jahren Verzögerung nach dem Start in den USA ist Amazons Sprachassistentin Alexa nun auch in Deutschland in Geräten wie Echo oder Echo Dot zu haben. Alte Programmierhasen bringen ihr sogar neue Tricks bei.
Wer steht schon gerne vom Sofa auf, um etwas im Internet nachzuschauen, wenn das Handy außer Reichweite ist? Im Haushalt der Zukunft steht zu diesem Zweck ein Gerät wie Amazons Echo in Form einer Konservenbüchse im Zimmer (siehe auch Artikel “Die Zwiegesichtige” in der Know-how-Rubrik). Preisgünstiger als der Echo-Zylinder ist das Nachfolgegerät Amazon Echo Dot, das aussieht wie ein Eishockey-Puck (Titelbild).
Amazon träumt natürlich davon, dass der Kunde eines Tages zu Hause nur “Alexa, bestell Klopapier” ruft, und schon gibt die Sprachassistentin die Bestellung beim Internetdiscounter auf, der eilends eine Drohne mit dem dringend benötigten Haushaltsartikel auf den Weg zum Verbraucher schickt.
Angeblich abhörsicher
Das Gerät lauscht zwar ständig in den Raum hinein, um auf gesprochene Wörter zu reagieren, schwebt aber in einer Art Dämmerzustand und leitet ins Mikrofon verirrte Geräusche laut Anbieter nicht in die Amazon-Cloud zur Analyse weiter. Vielmehr wartet die Sprachbüchse, bis der User das so genannte Wake-Word, normalerweise “Alexa”, spricht und aktiviert dann erst die Verbindung mit der Spracherkennung in der Amazon-Cloud. Statt “Alexa”, “Amazon”, “Echo” dürfen Star-Trek-Fans auch das Wake-Word “Computer” einstellen (Abbildung 2) und dann mit der Assistentin reden wie Captain James T. Kirk mit dem Bordcomputer im Raumschiff Enterprise.
Alexa lernt neue Tricks
Von Haus aus kann Alexa einfache Fragen beantworten. Mehr Möglichkeiten bieten so genannte Skills [2], die soweit kostenlos (aber wohl irgendwann mal nach dem App-Bezahlmodell) im Skills Store abrufbar sind ([3], Abbildung 3). Hierbei handelt es sich um Softwarepakete, die Drittanbieter ähnlich wie Apps im Appstore programmiert und veröffentlicht haben. Vom Runterbeten der aktuellen Kurse im maßgeschneiderten Aktienportfolio (“Motley Fool”) über das Spiel Jeopardy bis zur Lampensteuerung im Smart Home ist alles dabei.
Um Alexa eine Skill beizubringen, aktiviert der User sie in der Smartphone-App Alexa oder spricht einfach ins Mikrofon: “Alexa, enable the Fool.” Kurze Zeit später kennt Alexa auch den Aktienmarkt: “Ask the Fool how is the market doing today” und “Ask the Fool to add Microsoft to my watchlist”.
Wen es in den Fingern juckt, Alexa nach seiner eigenen Pfeife tanzen zu lassen, der kann auf http://developers.amazon.com einen Alexa-Account einrichten, der separat vom AWS-Business läuft und eigentlich der Entwicklung von Android-Apps dient (Abbildung 4). Nach dem notwendigen Abnicken einer ellenlangen Vorschriftenliste führt ein Klick auf den Reiter »Alexa« und dann auf »Alexa Skills Kit«[2] zu einer Liste mit eigenen Skills (Abbildung 5) samt einem Knopf, der »Create New Skill« verheißt.Snapshot-Ausgabe auf Zuruf
Als praktisches Beispiel soll Alexa auf Zuruf mitteilen, welche die aktuelle Ausgabe des Programmier-Snapshots ist. Dazu liest sie hinter den Kulissen eine Json-Datei »articles.json« von meiner Website http://Perlmeister.com, die alle Ausgaben in umgekehrter chronologischer Reihenfolge auflistet (Abbildung 6), pickt sich den ersten Eintrag in der langen Liste heraus, puhlt daraus Monat und Jahr hervor und übergibt die beiden Werte dem Sprachprozessor, der sie wiederum über den Lautsprecher dem User verkündet.
Spricht also der User den Satz “Alexa, ask latest snapshot for issue”, dann leitet Alexa die Anfrage an die neue Latest-Snapshot-Skill weiter, die die Daten einholt und aufbereitet, damit die Antwort dann etwa “01 2017” für das Januar-Heft lautet, falls dies gerade die aktuelle Ausgabe des Linux-Magazins ist.
Den Namen der Skill, die Alexa beherrscht und an die sie Anfragen delegiert, gibt der Entwickler im Web-Flow für eine neue Skill unter »invokation name« an. Mehrere Wörter sind erlaubt, sie dürfen allerdings keine andersweitig verwendeten Schlüsselwörter, zum Beispiel “Alexa”, enthalten.
Äußerung und Absicht
Sprachverarbeitungsfüchse unterteilen die Kommunikation des Users mit dem Gerät in Intent und Utterances. Dabei kann der User zum Beispiel “latest release” oder “newest issue” äußern (Utterance) und damit beide Male die gleiche Absicht kundtun (Intent), nämlich in der Skill Latest Snapshot die Funktion aufzurufen, die Monat und Jahr des aktuellen Snapshots aufsagt. Im Web-Flow der neu angelegten Skill trägt der Entwickler auf der Seite »Interaction Model« (Abbildung 7) hierzu die in den Listings 1 und 2 angegebenen Daten ein.
Listing 1 legt im Json-Format die später erkannten Intents fest und definiert neben der eigentlichen Funktion »LatestSnapshot« ein generisches Hilfe-Menü, das Alexa rezitiert, falls der User “Help” sagt. Listing 2 weist dann jedem Intent verschiedene gesprochene Sätze zu.
Listing 1
IntentSchema.json
1 { "intents": [ {
2 "intent": "LatestSnapshotIntent"
3 }, {
4 "intent": "AMAZON.HelpIntent"
5 } ] }
Listing 2
SampleUtterances.txt
01 LatestSnapshotIntent issue 02 LatestSnapshotIntent release 03 LatestSnapshotIntent last month
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.
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).
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.
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.
Auch auf Deutsch
Neben US-Englisch und UK-Englisch unterstützt Alexa seit Neuestem auch deutsche Kommandos und die zugehörige Sprachausgabe. Hierzu muss die App im »Settings«-Menü »Deutsch« eingestellt und die Skill auf der ersten Seite in der Auswahlbox »Language« die Option »German« selektiert haben.
Dann darf der User in einer Art deutscher Sprache mit Alexa konversieren, die aber wegen der vorgeschriebenen syntaktischen Folge der Kommandos etwas komisch klingt: “Alexa, fragen letzter Schnappschuss nach Ausgabe” und Alexa antwortet auf Deutsch: “01 2017.” Es erstaunt, dass Amazon nach Englisch tatsächlich Deutsch als zweite Sprache gewählt hat und nicht etwa Spanisch, das weit häufiger gesprochen wird. Scheinbar ist der deutsche Markt lukrativer.
Skills [6] können mehrere Sprachen unterstützen, der Endpunkt muss dann in der Sprache antworten, in der die Frage gestellt wurde. Falls der Entwickler vergessen hat, der Skill die richtige Sprache beizubringen, geht gar nichts mehr.
Abbildung 11 zeigt, dass Alexa “Frogs that was born on no sucks elvis” verstanden hat, als der Tester eine neu geschaffene bayrische Skill ansprechen wollte, die “servus beinand” sagt. Entsprechend seiner Absicht kommandierte er: “Alexa frage servus beinand nach sag servus.”
Wer mit Alexa sein Smart Home steuern will, muss nicht so weit in die Tiefen der Programmierung hinabsteigen wie hier ausgeführt, sondern kann gleich am Anfang des Flow unter »Skill Type« statt »Custom Interaction Model« die Option »Smart Home Skill API« anwählen und steigt dann auf einer einfacher zu handhabenden höheren Kommandoebene ein. »Flash Briefing« ist eine weitere Option zum Abspielen vorher eingetüteter Radiosendungen.
Wer statt einer Lambda-Funktion auf Amazons Web Services als Endpunkt lieber einen eigenen Webserver nutzen möchte, muss diesen mit SSL fahren und dann das Zertifikat bei Alexa hinterlegen. Und bevor die Skill in der öffentlichen Liste auf der Alexa-App von Amazon erscheint, behält sich Amazon selbstredend die manuelle Überprüfung und Zertifizierung vor.
Online PLUS
Im Screencast demonstriert Michael Schilli das Beispiel: https://www.linux-magazin.de/Ausgaben/2017/04/plus
Infos
- Listings zu diesem Artikel: https://www.linux-magazin.de/static/listings/magazin/2017/04/snapshot/
- “Getting Started with the Alexa Skills Kit”:https://developer.amazon.com/public/solutions/alexa/alexa-skills-kit/getting-started-guide
- Deutscher “Alexa Skills Store”: https://www.alexaskillstore.de
- Michael Schilli, “Neue Heimat”: Linux-Magazin 02/17, S. 88, https://www.linux-magazin.de/Ausgaben/2017/02/Snapshot
- Alexa.js boilerplate: https://github.com/amzn/alexa-skills-kit-js/blob/master/samples/helloWorld/src/AlexaSkill.js
- Programmierbeispiele für Alexa-Skills auf Github: https://github.com/amzn/alexa-skills-kit-js/tree/master/samples



![Abbildung 4: Entwickeln neuer Alexa-Skills auf [developers.amazon.com].](/wp-content/uploads/2017/04/alexa-skills-kit-300x257.jpg)













