RSS Feed mit einem Alexa Flash Briefing Skill ausliefern

Keine Kommentare

Einleitung

Ein Alexa Flash Briefing Skill dient zum schnellen Informationsaustausch von Neuigkeiten, Zusammenfassungen oder sonstigen Inhalten über Sprache mittels Amazon Alexa. Anders als die üblichen Alexa Skills wird dieser nicht separat gestartet, sondern in die, ab Werk vorhandene, tägliche Zusammenfassung von Alexa integriert. Für die Flash Briefing Skills muss im Idealfall nicht mal Code geschrieben werden. Wenn z. B. ein bestehender RSS-Feed bereits ein Alexa-freundliches Format hat (keine HTML Tags in Titeln, Beschreibung etc.), dauert die Einrichtung des Skills sogar nur wenige Minuten. Was macht man aber, wenn man noch Einfluss auf den Inhalt nehmen will? Oder gar Inhalte (Texte, Audio etc.) vorhanden sind, aber es gar keinen RSS-Feed gibt? Hier kommt eine leichtgewichtige Kombination aus AWS API Gateway und AWS Lambda ins Spiel. Im Folgenden beschreibe ich anhand unseres codecentric-Blogs und des bereits vorhandenen RSS-Feeds beispielhaft, wie das funktionieren kann.

Voraussetzungen

Um das Beispiel in diesem Beitrag nachzuvollziehen, benötigt man Folgendes:

  • AWS-Kenntnisse
  • Einen AWS Account und entsprechende Berechtigungen für AWS Lambda und den AWS API Gateway
  • Terraform-Kenntnisse
  • Einen Amazon Alexa Developer Account

Der Plan

Alles, was wir für einen Flash Briefing Skill benötigen, ist ein öffentlich zugänglicher HTTPS-Endpunkt, der ein definiertes XML- oder JSON-Format (in UTF-8-Kodierung) liefert (siehe API Feed Reference). Den Rest übernimmt Alexa. Um den HTTPS-Endpunkt wird sich unser API Gateway kümmern. Für das Response-Format bevorzugen wir in diesem Beispiel JSON. Der HTTP Request wird von unserer Lambda-Funktion verarbeitet. Der tatsächliche Inhalt kommt von unserem codecentric-Blog-RSS-Feed. Dieser hat schon das korrekte Atom-XML-Format, allerdings verstecken sich in der Beschreibung häufig HTML- oder XML-Tags, die wunderbar auf einer Webseite und in einem Feed-Reader aussehen, aber Alexa leider gar nicht gefallen. Also muss ein kleiner Wrapper (die Lambda-Funktion) den Inhalt einlesen und ein HTML/XML-freies JSON ausliefern. Das Schöne ist, dass wir mittels Lambda und des API Gateways nicht auf RSS Wrappen limitiert sind. Man könnte einfach Informationen und Neuigkeiten aus einem CMS oder aus sonstigen Quellen liefern oder mit dem RSS-Feed kombinieren.

Die Architektur

Skill-Architektur - Kudos an Sebastian Nemak

Skill-Architektur – Kudos an Sebastian Nemak

Startet man die tägliche Zusammenfassung, so geht Alexa die aktivierten Skills in der Reihenfolge, in der sie hinzugefügt worden sind, durch. Sobald wir mit dem codecentric-Blog an der Reihe sind, wird über unseren API-Gateway-Endpunkt die Lambda-Funktion aufgerufen. Diese holt sich die Informationen vom codecentric-RSS-Feed ab, parst das XML-Dokument, entfernt HTML- und XML-Tags aus der Beschreibung und wandelt den Feed in JSON um. Im Erfolgsfall sendet die Funktion eine Antwort an das API Gateway, die dann an Alexa durchgereicht wird.

Die Ausführung

Der Code

Für die oben genannte Architektur gibt es zwei Repositories auf GitHub. Eines, um die Infrastruktur auf AWS mit Terraform einzurichten und eines für den Quelltext der Lambda-Funktion.

Der Alexa Skill

Flash Briefing Skills sind von allen Alexa Skills wahrscheinlich am einfachsten zu erstellen und zu konfigurieren. Nach der Anmeldung auf der Developer-Konsole unter https://developer.amazon.com klickt man auf “Alexa” -> “Alexa Skills Kit” und wählt im folgenden “Flash Briefing” aus.

Neuen Flash Briefing Skill erstellen

Neuer Flash Briefing Skill erstellen

Danach folgt noch eine Seite Konfiguration. Unter “Preamble” gibt man einen einleitenden Satz vor, den Alexa spricht, wenn der Skill an der Reihe ist. Wie sich das anhört, kann man hier auch gleich testen. Unter “Feed” tragen wir unseren API-Gateway-Endpunkt ein. Den URL dazu finden wir in der AWS Console im API Gateway Service unter der entsprechenden Stage (z. B. dev).

API Gateway URL

API Gateway URL

Konfiguration

Konfiguration

Die weiteren Pflichtfelder sind selbsterklärend. Noch ein schickes Logo dazu, und fertig ist der Skill. Im Anschluss müssen wir den Skill für Tests aktivieren (siehe Abbildung unten). Danach ist der Skill erstmal nur für Entwickler freigeschaltet. Er kann in der Alexa-App (entweder Web oder mobil) unter “Ihre Skills” -> ”Entwicklerskills” eingesehen und aktiviert werden. Unter “Einstellungen” -> “Tägliche Zusammenfassung” können wir nun unseren Skill in die Zusammenfassung einreihen. Jetzt kann man ihn testen, z. B. mit “Alexa, starte meine tägliche Zusammenfassung”.

Skill für Tests aktivieren

Skill für Tests aktivieren

In die tägliche Zusammenfassung integrieren

In die tägliche Zusammenfassung integrieren

Das Format

Hier ein Beispiel für eine JSON Response:

Content-Type: application/json
...
{
  "uid": "urn:uuid:3AE32FAE-A619-479B-8071-2631744DCF17",
  "updateDate": "2018-02-14T22:34:51.0Z",
  "titleText": "Continuous Integration mit Drone auf Amazon Web Services",
  "mainText": "Drone ist ein Continuous Delivery System basierend auf Docker.",
  "redirectionUrl": "https://blog.codecentric.de/en/2018/02/continuous-integration-drone-aws/"
}
So sieht das Ganze beim Aufruf aus

So sieht das Ganze beim Aufruf aus

Der “titleText” wird in der Alexa App (oder bei einem Echo Show auf dem Display) angezeigt, während der “mainText” von Alexa beim Aufruf vorgelesen wird. Über “redirectionUrl” kann der Benutzer in der App auf weiterführende Informationen mittels Browser gelangen (in unserem Fall führt der URL zu dem Artikel auf dem codecentric-Blog).

Restriktionen

  • Der Response-Type muss im Response-Header Content-Type geliefert werden (also z. B. application/json).
  • Man soll zwischen einem und fünf Feed-Items liefern und dabei das neueste zuerst.
  • Feed-Items sind auf 4500 Zeichen limitiert.
  • Die Feed-Items dürfen in den Attributen nur Text enthalten (kein HTML, XML, SSML…).
  • Antwortzeit des Servers sollte eine Sekunde nicht überschreiten.

Gotchas

Unbedingt das definierte JSON-Format einhalten, insbesondere das Datumsformat beachten. Ansonsten wird der Inhalt nicht gesprochen. Man erfährt leider auch nicht, was genau schiefgelaufen ist. Alexa erwähnt nur, dass der Inhalt derzeit nicht verfügbar ist. Die API-Referenz sollte man sich daher etwas genauer anschauen.
Wenn das Abfragen des Feed-URL des Flash Briefing Skills länger als eine Sekunde braucht, bricht Alexa ab. Manchmal ist Alexa etwas großzügiger, manchmal aber auch sehr streng. Besser, man schafft es, die Antwort in deutlich unter einer Sekunde auszuliefern. Unter Umständen kann sich hier ein einfacher Cache lohnen.

Fazit

Mit AWS Lambda und dem AWS API Gateway lassen sich auf wunderbar einfache Art und Weise Alexa Flash Briefing Skills erstellen. Diese können beliebige Text- und Audio-Inhalte liefern, zumindest solange sie die Restriktionen von Amazon erfüllen. Leider kann in einem Flash Briefing Skill (noch?) keine Speech Synthesis Markup Language (SSML) verwendet werden, was sich bei längeren Texten als großer Nachteil herausstellt. Der Benutzer verliert schnell das Interesse, wenn Alexa zu lange ohne Modulation ihrer Stimme vor sich hin monologisiert.

Daniel Hill

Daniel ist als IT Consultant bei der codecentric AG in Berlin tätig. Er beschäftigt sich leidenschaftlich mit testgetriebener Softwareentwicklung und den Prinzipien des Clean Codes.

In seiner Freizeit sucht er den sportlichen Ausgleich und liest gerne.

Kommentieren

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.