Alexa Custom Skill (Part 1): Amazon

Dieser Blogbeitrag sowie der Beitrag “Alexa Custom Skill: Azure Function” beschäftigen sich mit der Entwicklung eines Custom Skills für den Echo Dot von Amazon zur Sprachsteuerung der Kantinen-App Daily Menu (hier noch novaCuisine). In diesem Beitrag liegt der Schwerpunkt vor allem auf dem Erstellen eines Custom Skills im Amazon Developer Portal, dem Anlegen eines Interaction Models und der Verarbeitung von Requests in C#.
Um einen eigenen Skill für den Echo Dot zu erstellen, muss man zunächst einen Amazon Developer Account anlegen, den man mit dem Echo Dot verknüpft: https://developer.amazon.com/
Die Verbindung zum Amazon Account kann dann über die Website der Amazon App konfiguriert werden (alexa.amazon.com). Im Amazon Developer Portal kann schließlich über das Alexa Skills Kit ein neuer Skill erstellt werden.

Amazon unterscheidet je nach Anwendungsfall zwischen vier verschiedenen Skill-Typen: Custom Skills, Smart Home Skills, Flash Briefing Skills und Video Skills. Für die Sprachsteuerung von Daily Menu haben wir einen Custom Skill erstellt.
Unter „Skill Information“ werden die Einstellungen für den Skill vorgenommen: Der Typ des Skills und die Sprache für den Skill kann ausgewählt werden. Außerdem kann man einen „Invocation Name“ angeben. Über diesen Namen kann der User später den Skill über den Echo Dot aufrufen.

In dem „Interaction Model“ befindet sich die Logik für den Skill, z.B. welche Aufrufe von dem Skill unterstützt werden. Der Service Endpoint von dem Webservice muss in der „Configuration“ eingetragen werden. In unserem Fall wird der Service Endpoint im Azure Portal gehostet.

Aufbau eines Custom Skills

Ein Custom Skill besteht aus einem Interaction Model, das sich aus folgenden Komponenten zusammensetzt:

  • Intents: Aktionen, die ein User mit dem Skill ausführen kann
  • Slots (Argumente): optional; es wird zwischen vordefinierten Slot Types von Amazon und Custom Slot Types unterschieden
  • Sample Utterances: Sätze, die ein User verwenden kann, um einen Intent aufzurufen

Erstellen des Custom Interaction Models

Das Interaction Model ist essentiell für den Skill, da hier definiert wird, wie der Skill verwendet werden kann. Die Intents können entweder über das grafische Interface Skill Builder (beta) oder manuell im JSON-Format angelegt werden. Je nach Anwendungsgebiet ist entweder das eine oder das andere Vorgehen sinnvoller: Um eine „multi-turn conversation“ zwischen Alexa und dem User zu ermöglichen, kann im Skill Builder das Dialog Model verwendet werden. Die Konversation wird dabei an Alexa delegiert und dem User werden solange Fragen gestellt, bis alle Informationen gesammelt wurden, die für einen Intent notwendig sind. Dies kann z.B. sinnvoll sein für einen Skill zur Reiseplanung: Alexa würde solange Fragen stellen, bis der User das Ziel und den Zeitpunkt für seine Reise genannt hat. Das Dialog Model wird von der JSON-Variante nicht unterstützt. Wenn man jedoch den Skill Builder verwendet hat und danach zu der anderen Variante zurück wechseln möchte, gehen die erstellten Prompts und Sätze, die für bestimmte Slots benötigt werden, verloren.
Wir haben uns dazu entschieden, das Interaction Model manuell im JSON-Format zu definieren. Dafür wählt man für jeden Intent, der unterstützt werden soll, einen Namen und trägt optional Slots für Argumente ein.

Der Intent „GetMeal“ hat z.B. keinen Slot, wohingegen der Intent „GetMenu“ den Built-in Slot Type „AMAZON.DATE“ verwendet. Von Amazon werden diverse Built-in Slot Types bereitgestellt, die man für die Intents verwenden kann. AMAZON.DATE wandelt z.B. Wörter, die auf ein Datum hinweisen, in das entsprechende Datumsformat um. Falls die Built-in Slot Types den Anwendungsfall nicht abdecken, können auch eigene Slot Types definiert werden. Dazu fügt man den Custom Slot Types einen Slot hinzu (im Beispiel wurde als Typ DISHNAME angelegt) und gibt eine Liste von Werten an, die für den Slot verwendet werden können. Der Name und Typ des Slots müssen dann im Intent Schema ergänzt werden.

Abschließend müssen noch Beispielsätze angelegt werden. Mit diesen Sätzen kann mit dem Echo Dot kommuniziert werden.

Beispiel für einen Aufruf:

Intent Name Frage des Users
GetMenu was gibt es {Date} zum Mittagessen

„Was gibt es heute zum Mittagessen?“

Je mehr Sample Utterances man an dieser Stelle definiert, desto mehr Variationen bietet man dem User an, den Skill aufzurufen. Das Problem ist, dass die Auswahl der Intents ungenauer wird, je mehr Sätze angegeben werden. Vor allem, wenn Sätze für unterschiedliche Intents ähnlich klingen oder einen ähnlichen Anfang haben, kann es passieren, dass ein falscher Intent aufgerufen wird. Generell sollte man beim Angeben der Beispielsätze darauf achten, dass potentielle Fragen des Users abgedeckt werden und dass die Fragen auch in Kombination mit dem Invocation Name oder Verbindungswörtern natürlich klingen.

Testen des Skills

Der Skill kann auf verschiedene Arten getestet werden. Die eine Möglichkeit ist, den Skill direkt über den Echo Dot aufzurufen, die andere, den Test über die Texteingabe im Amazon Developer Portal durchzuführen.

Beispiel für einen Aufruf:

GetPrice wie viel kostet {DishName}
Wie viel kostet die Tomatencremesuppe?

In dem Service Request kann man das JSON-Objekt sehen, das übermittelt wurde. Die Ausgabe zeigt, dass ein IntentRequest gesendet wurde (Intent „GetPrice“ mit dem Wert „die Tomatencremesuppe“). Der Text, der in der Service Response unter outputSpeech angezeigt wird, ist der Text, der vom Echo Dot vorgelesen wird. Falls der User danach nicht mehr reagiert, wird ein reprompt ausgelöst, so dass eine Nachfrage vom Echo Dot gestellt wird.

Umsetzung im Code

Der Skill muss drei unterschiedliche Request verarbeiten können: LaunchRequest, IntentRequest und SessionEndedRequest. Für die Umsetzung in Java gibt es bereits eine Klasse, die man für die Requests verwenden kann. In unserem Fall, in C#, muss jeder Request separat behandelt werden. Die Art des Requests wird im JSON Object mitgesendet.
Wenn der User den Skill nur mit dem Invocation Name aufruft („Alexa, öffne novacuisine“) wird durch den LaunchRequest eine neue Session gestartet. Da shouldEndSession auf false gesetzt wurde, bleibt der User in der Session und kann weitere Fragen stellen, ohne jedes Mal den Invocation Name „novacuisine“ verwenden zu müssen.

Mit einem IntentRequest kann entweder eine neue Session gestartet oder eine bereits bestehende Session fortgeführt werden: „Alexa, frag novacuisine was es zum Mittagessen gibt.“ startet direkt eine Session, während „Was kostet die Tomatencremesuppe“ eine Frage innerhalb einer Session darstellt.
Wenn ein GetPrice-Intent erfolgt, wird der Wert „die Tomatencremesuppe“ über „slots.DishName.value“ bezogen und im string dishName gespeichert. Über die GetPrice-Methode wird die Textausgabe generiert (im OutputSpeech-Objekt), die dann an den Echo Dot gesendet wird.

Der User kann auch einen von Amazon bereits vordefinierten Intent verwenden (wenn sie im Intent Schema angelegt wurden!): Indem er „Stopp“ sagt, wird der „AMAZON.StopIntent“ aufgerufen und die Session danach beendet.

Der SessionEndedRequest wird ausgelöst, wenn ein Fehler aufgetreten ist oder wenn eine Session geschlossen wird, da der User nicht antwortet oder eine gestellte Frage nicht von den Intents abgedeckt wird.

Sprachausgabe über SSML

In den bisherigen Beispielen wurde für das OutputSpeech-Objekt „PlainText“ verwendet. Der Text, der in dem Objekt angegeben wird, wird von dem Echo Dot in Sprache umgewandelt und ohne besondere Betonung vorgelesen.

Generell kommt es bei der Sprachausgabe bei fremdsprachigen Wörtern zu Problemen, da der Echo Dot versucht, sie wie deutsche Wörter zu behandeln und die Betonung dementsprechend angepasst wird. Auch bei deutschen Wörtern kann die Betonung falsch sein (Vokale werden manchmal zu kurz oder zu lang ausgesprochen). Manchmal wird auch der Invocation Name novacuisine falsch interpretiert, da es sich nicht um ein deutsches Wort handelt.
Um die Sprachausgabe anzupassen, kann SSML (Speech Synthesis Markup Language) verwendet werden. Dadurch kann z.B. die Länge von Pausen oder die Lautstärke innerhalb eines Satzes gesteuert werden. In den meisten Fällen ist SSML jedoch noch nicht so ausgereift, dass man signifikante Unterschiede erkennt. Außerdem werden von Amazon nur wenige Tags angeboten, um die Sprachausgabe zu ändern.
Um SSML zu verwenden, muss der Typ im OutputSpeech-Objekt auf SSML umgestellt werden und der Text muss von speak-Tags eingeschlossen werden. Im Beispiel wird der amazon:effect-Tag gezeigt, wodurch der Text leise vorgelesen wird.

Es ist auch möglich, das Lautschriftsystem IPA (International Phonetic Alphabet) zu verwenden. Dadurch kann man die einzelnen Laute definieren, die vom Echo Dot vorgelesen werden. Das Beispiel stellt novacuisine so dar, wie man das Wort aussprechen würde.

Erfahren Sie mehr

Ich bin im Flow! – Eine Übersicht zu Microsoft Flow
Blog
Blog

Ich bin im Flow! – Eine Übersicht zu Microsoft Flow

Die Power Platform wird aktuell von Microsoft sehr stark gepusht. Zeit, sich mit dem Potenzial der einzelnen Komponenten zu beschäftigen. Heute: Flow.

DevOps und Container
Blog
Blog

DevOps und Container

DevOps an sich ist nicht an eine Technologie gebunden, jedoch haben sich Container-Technologien und DevOps als Verwandte im Geiste gefunden.

PowerApps – Neuigkeiten, Übersicht, Tipps & Tricks
Blog
Blog

PowerApps – Neuigkeiten, Übersicht, Tipps & Tricks

Neues aus der Welt von PowerApps

May
04
novaCapta auf der dotnet Cologne
Event
Event

novaCapta auf der dotnet Cologne

In nächster Nachbarschaft zu unserem Kölner Büro findet am 04. und 05. Mai die dotnet Cologne im KOMED statt. Wir von der novaCapta sind auch dabei.

Office 365 Groups als Evolution von SharePoint?
Blog
Blog

Office 365 Groups als Evolution von SharePoint?

Zusätzlich zu SharePoint erlauben die Office 365 Groups es mir als Anwender, schnell und einfach neue Gruppen anzulegen und selbständig Benutzer hinzuzufügen.

Das neuste Mitglied der Office 365 Familie: Delve
Blog
Blog

Das neuste Mitglied der Office 365 Familie: Delve

Microsoft legt nach: Mit Delve startet eine neue Form des Suchens und des Auffinden von Dokumenten und Informationen.

Azure Functions: Der Webservice ohne Webserver
Blog
Blog

Azure Functions: Der Webservice ohne Webserver

Azure Functions als Authentifizierungs-Helfer für clientseitige Lösungen mit 3rd Party APIs

DevOps und „The Phoenix Project“
Blog
Blog

DevOps und „The Phoenix Project“

Buchvorstellung "Projekt Phoenix: Der Roman über IT und DevOps - Neue Erfolgsstrategien für Ihre Firma" von Gene Kim.

Paket Dependency Manager für .NET
Blog
Blog

Paket Dependency Manager für .NET

Paket ist ein Dependency Manager für .NET, welcher es sich zum Ziel gesetzt hat einige Probleme von NuGet zu beheben.

Sprechen Sie LUIS? – Der intelligente Chat-Bot im Praxistest
Blog
Blog

Sprechen Sie LUIS? – Der intelligente Chat-Bot im Praxistest

Mit LUIS, der Sprach- und Texterkennungssoftware von Microsoft, und dem Bot Framework von Azure haben wir eine Lösung für den IT-Support entwickelt.

Jan
25
Webcast mit Microsoft: Fit für die digitale Arbeitswelt
Webinar
Webinar

Webcast mit Microsoft: Fit für die digitale Arbeitswelt

Die digitale Transformation und die Veränderung der Arbeitswelt ist längst in vielen Unternehmen und in den öffentlichen Einrichtungen angekommen. Dennoch stell...

Theobald Software neuer Partner von novaCapta
News
News

Theobald Software neuer Partner von novaCapta

Komplexe SAP-Prozesse direkt in SharePoint durchführen – dabei unterstützt uns unser neuer Partner Theobald Software.