Part 1 – Alexa Custom Skill: Amazon

/, Sonstiges, Web application/Part 1 – Alexa Custom Skill: Amazon

Part 1 – Alexa Custom Skill: 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.

Dokumentation von Amazon zu Alexa:
https://developer.amazon.com/public/solutions/alexa/alexa-skills-kit/getting-started-guide

By | 2017-08-02T17:01:50+00:00 August 2nd, 2017|Azure, Sonstiges, Web application|0 Comments

About the Author:

Associate Technology Specialist

Leave a Reply

%d bloggers like this: