skip to Main Content

In diesem Tutorial möchte ich euch die Grundlagen eines Alexa Skills auf PHP Basis beibringen. Dieser Teil ist der Anfang von meinem Versuch die Audiostation von Synology als Skill auf mein Echo zu bringen.  

Kurzer Hintergrund: Amazon’s Alexa ist schon eine Kunst für sich. Ich habe mir vor einigen Monaten das Echo Modell gekauft und war erst sehr begeistert über die ganzen Möglichkeiten. Schnell kam es dann aber zur Ernüchterung … derzeit wird es lediglich für Musik genutzt – kleines Beispiel morgens „Alexa spiel Radio 1Live“. Mehr nicht und es hat mich geärgert, dass die DS Audio App von Synology nicht als Alexa Skill verfügbar ist. Also habe ich mich daran versucht meinen ersten eigenen Skill für Amazon Alexa zu schreiben …

Nachfolgend beschreibe ich euch die Grundlagen für die Erstellung eines eigene Skills bei Amazon.

Als Amazon Developer Registrieren

Falls Ihr bereits Amazon Kunde seid (wer ist das nicht?), der kann sich einfach unter folgendem Link für das Developer Programm registrieren:

Amazon Developer

Einfach oben rechts auf Anmelden, Daten eingeben und einloggen. Danach landet Ihr im Dashboard. In der Menüleiste Alexa auswählen > dann unter „Alexa Skills Kit“ den Button „Get started“ klicken und Ihr landet in eurer Skill-Übersicht. Wenn Ihr noch keinen Skill erstellt habt, dann wird eure Liste leer sein. Benutzt den Button „Add a New Skill“ (oben rechts) um euren ersten Skill zu erstellen.

Amazon Developer-Dashboard
Amazon Developer-Dashboard
Amazon Alexa Skills
Amazon Alexa Skills
Alexa Skill Übersicht
Alexa Skill Übersicht

Skill Einstellungen

Die ein oder andere Einstellung bei eurem Skill gibt es schon. In ganze Sieben verschiedene Tabs werden die unterschiedlichsten Einstellungen eingeteilt:

  • Skill Information
  • Interaction Model
  • Configuration
  • SSL Certificate
  • Test
  • Publishing Information
  • Privacy & Compliance

Ich führe euch mal durch die Grundlegenden Settings:

Skill Information

Der Skill Type sollte bei euch Custom bleiben insofern Ihr nicht einen Smart Home oder Video Skill erstellen möchtet. Language auf German oder English (je nach belieben und wie eurer Alexa eingestellt ist). Name ist lediglich der Name eurer App wie er auch im Skill Store auftaucht. Der Rufname wie z.B. Alexa kommt in dem Feld darunter Invocation Name (Guidelines hierzu). Da ich den Musikplayer benutzen möchte für die DS Audio App, aktiviere ich es auch.

Alexa Skill Information
Alexa Skill Information

Interaction Model – Der wichtigste Part

Das Interaction Model eures Skills ist der Kern eurer Applikation. Hier wird festgelegt welche Intents (Vorhaben) es in eurer Applikation gibt und über welchen Sprachbefehl welcher Intent ausgeführt werden soll. Ein Intent hat immer einen bestimmten Rückgabewert den Ihr später in eurer PHP Applikation abfragen solltet.

Wir erstellen erstmal ein simplen Intent mit dem Namen „hallo“ wie folgt:

{
	"intents": [
		{
			"intent": "hallo"
		}
	]
}
Interaction Model - Intent Schema
Interaction Model - Intent Schema

Dann scrollen wir nach unten und fügen 3 Utterances (Befehle) ein auf die unser Intent ausgeführt werden soll. Unser Ziel: Auf die Befehle  „hi“, „hallo“ und „moin“ soll der Intent „hallo“ ausgeführt werden:

hallo hi
hallo hallo
hallo moin
Interaction Model - Utterances
Interaction Model - Utterances

Jetzt unten nur noch auf Save klicken und das Model wird gespeichert und kompiliert. Da wir nun aber aktiviert haben, dass es eine Audio Funktion geben soll wird der folgende Fehler beim Kompilieren ausgegeben:

Error: The intent schema is missing the following built-in intents: {„intent“:“AMAZON.PauseIntent“}, {„intent“:“AMAZON.ResumeIntent“}

Kurz und Knapp: Amazon hat eingebaute Intents, die je nach App variieren. Um den Fehler zu beheben, scrollt einfach nach oben zu eurem Intent Schema und klickt auf den Button „Add Pause/Resume Intents“. Dann werden die beiden benötigten Intents automatisch hinzugefügt.

Skill Konfiguration

In der Skill Konfiguration wird festgelegt, an welche URL eure Intents geschickt werden. Zwingend notwendig ist hier eine SSL (https) Verbindung. Falls Ihr kein SSL Zertifikat habt, dann kann man sich heutzutage über Lets Encyrpt kostenlos Zertifikate erstellen lassen.

Wählt also bei Service Endpoint Type HTTPS aus und tragt hier eure Adresse ein, wo das PHP Skript später liegen wird. Account linking und die Permission settings werden nicht benötigt.

Skill Konfiguration
Skill Konfiguration

SSL Zertifikat

Bleibt einfach bei der Einstellung „My development endpoint has a certificate from a trusted certificate authority“ insofern Ihr kein Wildcard Zertifikat für eine Subdomain habt oder das Zertifikat selbst hochladen wollt.

SSL Zertifikat
SSL Zertifikat

Skill Testen und Debuggen

Am Anfang vielleicht noch nicht, aber später werdet Ihr viel Zeit in dem Testing-Bereich lassen – glaubt mir.

Mit dem Voice Simulator könnt ihr Beispiel-Sprachausgaben simulieren wie Alexa es spricht. Tippt hier einfach mal „Hallo Welt“ ein und klickt auf „Listen“ und ihr werdet hören wie Alexa Hallo Welt ausspricht.

Viel interessanter ist allerdings der Service Simulator mit dem Ihr gucken könnt, ob die von euch erstellen Sprachbefehle auch das richtige zurückgeben. Schreibt einfach mal „hi“ in das Feld „Enter Utterance“. Als Fehler erhaltet ihr dann wahrscheinlich:

„The remote endpoint could not be called, or the response it returned was invalid.“

Warum? Natürlich weil wir noch keine PHP Applikation, also das Backend, dass die Anfragen verarbeiten soll aufgesetzt haben.

Skill Testing - Voice Simulator
Skill Testing - Voice Simulator
Skill Testing - Service Simulator
Skill Testing - Service Simulator

PHP Backend

Da wir bisher lediglich einen Intent haben „hallo“ ist die Verarbeitung per PHP simple. Erstellt eine index.php auf eurem Server und fügt folgendes ein:

<?php $responseArray = [ 'version' => '1.0',
    'response' => [
          'outputSpeech' => [
                'type' => 'PlainText',
                'text' => 'Und Hallo zurück!',
                'ssml' => null
          ],
          'shouldEndSession' => true
    ]
];

header ( 'Content-Type: application/json' );
echo json_encode ( $responseArray );
die();

Wenn ihr nun euren Service Endpoint aufruft „alexa.yourdomain.com“ sollte der response Array als JSON zurückgegeben werden. Testet jetzt nochmal den Service Simulator und ihr werdet sehen, dass ihr das JSON im Service Response zurückbekommt. Klickt auf „Listen“ und ihr hört „Und Hallo zurück!“.

Wenn ihr jetzt in Nähe eures Echo’s seid, könnt ihr folgendes fragen:

„Alexa sag RUFNAME hallo“ 

Über die App könnt ihr zusätzlich unter Skills > Ihre Skills prüfen ob die erstellt App vorhanden ist.

Daniel Barenkamp

Founder and Creator of WeLaunch (formerly DB-Dzine).

Dieser Beitrag hat 11 Kommentare
  1. Tag,
    Bin gerade auch dabei meinen ersten Skill zu schreiben damit mir mein Dot hoffentlich bald sagen kann was es in der Mensa gibt.
    Das Problem das ich gerade noch habe ist das ich halt gerne Platzhalter benutzen würde um den entsprechend angefragten Tag zu verarbeiten.
    Sowas in der Art
    Alexa, frag Kantine was es heute,morgen,am montag gibt.
    Ich würde dann gerne den Tag als variabel in php nutzen.
    Hat jemand ne Idee wie sich so was umsetzen lässt?

  2. Hallo,
    ich habe einen Skill erstellt und beim Test funktioniert der auch prima.
    Die Freigabe scheitert nur noch an der Endpoint-Validiierung:

    „The skill end-point is not validating the signatures for incoming requests and is accepting requests with an invalid signature URL specified. Please make sure that your signature validation is correct.“

    Hat jemand eine Ahnung, wie und was hier genau gefordert wird? Ich werde aus der Dokumentation irgendwie nicht so richtig schlau…

    1. Hi Raimund,

      ich habe es geschafft die Schnittstelle der Audiostation vom Synology NAS anzuzapfen. Das Problem danach war leider, dass Alexa bzw. der Skill einen bestimmten Timeout hat.

      Da der Aufruf des NAS + Such-API Call + download der MP3 Datei im Zwischenspeicher vom Server zu lange gedauert hat, bricht Alexa einfach ab. Output Buffering hat auch nicht funktioniert.

      Aber es gibt Hoffnung: In der DSM Beta 6.2. ist Alexa standardmäßig für die Audiostation integriert.

  3. Schade ich bekomme als Antwort nur „The response is invalid“ der Fehler muss wahrscheinlich im PHP Backend liegen oder muss ich eine extra Subdomain machen?

  4. Hi Daniel,

    Ich möchte eine Art Authentifizierung entwickeln. Sobald mein Skill startet, prüfe ich im Hintergrund, ob die Device-ID bereits in der Datenbank vorhanden ist. Wenn nicht, soll das Gerät in meiner Datenbank registriert werden. Dies möchte ich mit einer Art PIN-Eingabe lösen. Bevor der Skill startet, ist bereits ein PIN vorhanden. Wenn die Device-ID, noch nicht in meiner Datenbank vorhanden ist bzw. mit keinen PIN verknüpft ist, muss der PIN Alexa mitgeteilt werden. Der eingesprochene PIN wird nun über die Datenbank gesucht und wenn dieser gefunden wurde, wird der PIN mit der Device-ID verknüpft. D. h. ich muss vermutlich direkt auf die Spracheingabe zugreifen, um den eingesprochenen PIN auszuwerten.

    Ist dies überhaupt möglich? Ich habe hierzu noch nichts gefunden.
    Evtl. hättest du auch einen Tipp für mich, um das Problem zu lösen. Ziel ist es, dass anhand der Device-ID und des PINs erkannt wird, auf welche Daten das Gerät zugreifen darf. Im Prinzip gibt es eine Datenbank zur Verwaltung der PINs und der Device-IDs und anhand der PINs ist hinterlegt, auf welche Datenbank anschließend zugegriffen wird, um dort Daten auszulesen.

    Vielen Dank schon mal im voraus für deine Antwort! 🙂

    1. Hat sich erledigt 😉

      Falls es jemanden interessiert, wie ich es nun umgesetzt habe, hier die Lösung:

      Einfach den Spieß rum drehen. Sobald Alexa startet wird ein zufälliger PIN generiert und Alexa gibt diesen aus. Im Hintergrund wird bereits der PIN und die Device-ID in die Verwaltungsdatenbank der PINs gespeichert. Ziel soll es ja sein, dass Daten aus einer externen Datenbank ausgelesen werden. Die Verknüpfung, welche Datenbank das sein soll, läuft ja über den PIN.
      Der PIN, den Alexa vorgibt, wird also in die Externe Datenbank eingetragen. Somit ist der PIN und die Device-ID in der Verwaltungsdatenbank für die Zugriffe und der Zugriffs-PIN ist in der externen Datenbank abgelegt.

      Eigentlich ganz einfach, habe jedoch zunächst andersherum gedacht, sodass die Ziel-Datenbank den PIN vorgibt und nicht Alexa 😉

Schreibe einen Kommentar

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

×Close search
Suche