Google Assistant

Beim Google Assistant heißen die Funktionen Actions.
Actions können auf viele verschiedene Arten erstellt und verwendet werden.
Ich habe mich hier auf die Variante mittels des Actions-SDK beschränkt.
Allerdings sind mit dieser Variante die Möglichkeiten sehr eingeschränkt und eher auf eine einfache Konversation ausgelegt.
Für komplexere Actions sollte man die Action jedoch mittels DialogFlow oder Cloud Functions or Firebase erstellen, da diese für umfangreichere Funktionen ausgelegt sind.
Allerdings lässt sich bei Diesen der Aufbau der Dateien nicht erkennen und sind somit nicht hilfreich, wenn ich versuche eine eigene Ordnerstruktur zu erstellen.

Befehlsstruktur

Bei Google Actions gibt es keine “richtige” Befehlsstruktur, vielmehr verschiedene Varianten einen Satz zu interpretieren.
Google nutzt nämlich eine NLU-Technik (Natural Language Understanding), um aus einem Set aus Sätzen ein KI-Modell zu generieren.
Anhand dieses Modells kann der Google Assistant dann ermitteln, um welche Action es sich handelt.

Beispiel

Um das KI-Modell zu trainieren, muss man verschiedene Trainingssätze generieren:

  • “I like red”
  • “My favorite color is yellow”
  • “black”
  • “Blue is my favorite”

Google versucht mittels eines eigenen vortrainierten KI-Modell, alle Slots aus den Trainingssätzen herauszufiltern.
Für komplexere Slots kann man jedoch über die Actions Console die einzelnen Werte (wie zum Beispiel black oder Blue) markieren und annotieren.
Hat man die benötigte Menge an Trainingssätzen erstellt und vorbereitet, kann ein Befehl wie folgt aussehen:

“OK Google, green, that’s my favorite color.”

Ordnerstruktur

Da Google Actions eine große Vielfalt an Funktionen bieten soll, gibt es auch hier wieder einige Verzeichnisse, die ich nicht näher beschreiben werde.
Dabei handelt es sich um Funktionen, die ich aufgrund des Umfangs nicht umsetzen kann.

Die vollständige Ordnerstruktur:

<Action-Verzeichnis>   
│
├── actions/
├── custom/
│   ├── global/
│   ├── intents/
│   ├── prompts/
│   ├── scenes/
│   └── types/
├── resources/
│   └── images/
├── settings/
├── webhooks/
│   └── Fulfillment/
└── manifest.yaml

Die von mir beschriebenen Verzeichnisse:

<Action-Verzeichnis>   
│
├── actions/          ->  Startpunkt einer Action
├── custom/
│   ├── global/       ->  Wenn ein Intent zu jedem Zeitpunkt einer Konversation erkannt werden soll, definiert man das unter diesem Verzeichnis
│   ├── intents/      ->  Hier können dann die eigenen Intents definiert werden
│   ├── scenes/       ->  Szenen legen eine Art Pfad fest, der abhängig von erkannten Intents "abgelaufen" wird
│   └── types/        ->  Hier werden Slots definiert
└── webhooks/
    └── Fulfillment/  ->  Unter diesem Verzeichnis befindet sich der tatsächliche Code, der von der Action ausgeführt wird

Die Erstellung und der Aufbau der einzelnen Actions weichen stark von der, der Skills (Amazon Alexa) ab.

Intents

Um einen neuen Intent anzulegen, muss man zunächst die Sätze definieren, durch die der Intent erkannt werden kann.
Dazu legt man eine Datei unter <Action-Verzeichnis>/custom/intents/ mit dem gewünschten Namen des Intents an.
In dieser Datei speichert man dann unter dem Schlüssel trainingPhrases eine Liste mit den gewünschten Ausdrücken:

trainingPhrases:
  - help me
  - I need some help
  - Help

Auszug aus der offiziellen Dokumentation

Wenn der Intent zu jeder Zeit verfügbar sein soll, legt man eine zweite Datei mit gleichem Namen unter dem Verzeichnis <Action-Verzeichnis>/custom/global/ an.
Hier wird definiert, was nach der Erkennung des Intents passieren soll.
In folgendem Beispiel soll einfach eine Szene gestartet werden:

transitionToScene: global_intent_scene
...

Auszug aus der offiziellen Dokumentation

Szenen

Eine Szene kann durch einen erkannten Intent gestartet werden.
Befindet sich der Google Assistant in einer Szene, werden einige Aktionen ausgeführt, bis die Szene abgeschlossen ist und die Nutzerin oder der Nutzer das gewünschte Ergebnis erhält.

Über Szenen werden fehlende Slots abgefragt und Sprachausgaben in einer Warteschlange abgelegt.
Sind alle benötigten Angaben vorhanden und die Warteschlange abgearbeitet, wird der eingehende Intent behandelt.
Danach wird in eine andere Szene übergegangen oder die normale Sprachaktivierung wieder gestartet.

Um eine neue Szene zu erstellen, muss man eine Datei im Verzeichnis <Action-Verzeichnis>/custom/scenes/ erstellen.
Mit onEnter kann man dann festlegen, was passieren soll, wenn die Szene geladen wird.
Im folgenden Beispiel wird ein einfacher Satz per Sprachausgabe ausgegeben:

onEnter:
  staticPrompt:
    candidates:
    - promptResponse:
        firstSimple:
          variants:
          - speech: This message is sent to the user when the scene loads

Auszug aus der offiziellen Dokumentation

Scenes-Lifecycle
Bild aus der offiziellen Dokumentation

Slots

Slots werden unter <Action-Verzeichnis>/custom/types/ definiert.
Dazu muss man eine Datei mit dem Namen des Slots erstellen.

synonym:
  entities:
    boba:
      synonyms:
      - Boba Special
      - boba special
      - Boba
      - boba
    matcha:
      synonyms:
      - Matcha
      - Matcha Tea
      - matcha
      - matcha tea

Auszug aus der offiziellen Dokumentation

Durch obiges Beispiel werden zwei Slots mit den Namen boba und matcha und den unter synonyms angegebenen Werten definiert.

Webhooks

Damit sich die Funktionen einer Action nicht nur auf simple Sprachausgaben beschränken, kann man unter dem Verzeichnis <Action-Verzeichnis>/webhooks/ Code definieren, der ausgeführt wird, sobald ein solcher Prozess von einer Szene angestoßen wird.
Dabei handelt es sich um JavaScript-Code, welcher mittels Google-eigener Funktionen auf diese Webhooks “hört”.

Um einen Webhook zu definieren, benötigt man eine Datei Namens ActionsOnGoogleFulfillment.yaml:

handlers:
  - name: questionOnEnterFunc
  - name: fruitSlotValidationFunc
inlineCloudFunction:
  executeFunction: ActionsOnGoogleFulfillment
    

Auszug aus der offiziellen Dokumentation

Der eigentliche Code befindet sich dann unter dem Verzeichnis <Action-Verzeichnis>/webhooks/ActionsOnGoogleFulfillment.
Dazu legt man die beiden - für NodeJS typischen - Dateien index.js und package.json an:

const {conversation} = require('@assistant/conversation');
const functions = require('firebase-functions');

const app = conversation();

app.handle('questionOnEnterFunc', conv => {
  conv.add('questionOnEnterFunc triggered on webhook');
});

app.handle('fruitSlotValidationFunc', conv => {
  conv.add('fruitSlotValidationFunc triggered on webhook');
});

exports.ActionsOnGoogleFulfillment = functions.https.onRequest(app);

Auszug aus der offiziellen Dokumentation

Wie üblich stehen in der package.json eine Beschreibung des NodeJS-Projekts und die benötigten dependencies.
Google Actions nutzen einige Firebase-Ressourcen und ein Google-eigenes Package, um mit dem Sprachassistenten zu kommunizieren:

{
  "name": "ActionsOnGoogleFulfillment",
  "version": "0.1.0",
  "description": "Actions on Google fulfillment",
  "main": "index.js",
  "dependencies": {
    "@assistant/conversation": "^3.0.0",
    "firebase-admin": "^5.4.3",
    "firebase-functions": "^0.7.1"
  }
}

Auszug aus der offiziellen Dokumentation

Actions Console

Bei Actions Console handelt es sich um eine UI-basierte IDE, welche direkt über einen Browser abrufbar ist.
Hier kann man dann neue Projekte erstellen.
Dazu kann man zu Beginn eine Kategorie und somit ein vorgefertigtes Template auswählen, wodurch eine einfache Action mit einigen Intents und Sätzen angelegt wird.
Man hat jedoch auch die Möglichkeit ein leeres Projekt anzulegen, wenn keine der Kategorien auf die eigene Anwendung passt.
Wenn man die Actions-Console nutzen möchte, braucht man sich um die Ordnerstruktur keine Gedanken zu machen, da alle Dateien von der IDE angelegt werden und man beim Erstellen der Skills und Slots stark an die Hand genommen wird.

Actions-Console

Screenshot der Actions Console

Deprecated

Google plant zum 13. Juni 2023 die Conversational Actions und zum 13. September 2023 die Actions Console Analytics abzuschalten.
Diese gelten daher bereits jetzt als “deprecated”.

Quellen

Google Assistant Dokumentation
Google I/O’19
Behind the Actions