II. Snips das „Hören und Verstehen“ beibringen
Dies ist der zweite Teil eines längeren Artikels. Der Erste Teil zur Installation von snips ist hier:
Snips auf einem Raspberry Pi installieren
Wenn die beiden Audio-Tests erfolgreich waren, kann snips im Prinzip bereits Tonquellen empfangen und Laute ausgeben. Aber das Programm weiß noch nicht, was es mit Spracheingaben machen soll. Es gibt noch keine Verbindung zu Aktionen. Dies wird mit dem Sprachtraining erreicht. Das Sprachtraining wiederum findet auf der Website von snips.ai statt. Wir dürfen deren KI und die gesammelten Sprachtrainings nutzen, um unsere Anweisungen zu trainieren. Dazu sind folgende Schritte erforderlich:
Einen Account auf snips.ai anlegen
Sich mit den Zugangsdaten einloggen
Einen Assistenten (Arbeitsumgebung) anlegen (create assisstant) Eine App anlegen (create app)
Einen Funktionszusammenhang oder Projekt anlegen (create intent) Eine Aktion (Vorgang) anlegen (create slot)
Schritt 1: Einen Account anlegen
Die Seite https://snips.ai aufrufen und rechts oben auf Sign Up klicken und sich anmelden.
Danach geht es gleich los mit dem Klick auf Let‘s start öffnet man eine „Console“.
Schritt 2: Einen Assistenten (Projekt, Arbeitsumgebung) anlegen
Auf Create Assistant klicken, einen Namen vergeben, z. B. Versuch_1, und die Sprache auswählen. Dies ist wichtig für die Spracherkennung!
Schritt 3: Eine App anlegen
Auf Add an App klicken. Nun hat man die Auswahl zwischen frei gegebenen Apps anderer oder der Programmierung einer eigenen App. Ich empfehle zunächst eine eigene App zu bauen. Wenn man die Funktionsweise verstanden hat, kann später mit einer Fremd-App arbeiten. Also ist der nächste Schritt auf das Plus-Zeichen für Create a New App zu klicken. Wieder wird ein Name vergeben, z. B. App_1.
Schritt 4: Einen Intent anlegen
Klick auf Edit App um einen Intent anzulegen: + Create New Intent. Wieder muss ein Name (z. B. smarthome) und ggfs. Eine Bescheibung angelegt werden.
Schritt 5: Die ersten beiden Slots anlegen
Für dieses kleine Projekt legen wir den ersten Slot mit Create New Slot an und geben ihm den Namen „schalten“ und wählen bei Select unterhalb der Auswahlliste den Eintrag + Create New Slot Type aus. Als Slot Type Namen können wir z. B. „an_aus“ vergeben. Dann richten wir noch zwei Values ein. Das erste Value (anstelle von „Type yor value here“) ist die Ziffer 0. Als Synonyme wird eingeben: „aus,ausschalten,schalte aus“ (ohne Anführungszeichen). Nach dem Komma keine Leerstelle eingeben! Anschließend auf + Add klicken.
Der zweite Value ist die Ziffer 1 mit den Synonymen „ein,einschalten,schalte ein“. Ebenfalls mit + Add speichern und rechts oben auf Close klicken.
Nun legen wir noch einen zweiten Slot an mit dem Namen „geraete“ mit ebenfalls einem neuen Slot Type namens „geraete“. Darin den Value „Fernseher“ mit den Synonymen „Glotze,TV „ und den Value „Werkstattlampe“ mit den Synonymen „Werkstattleuchte,Lampe in der Werkstatt,Leuchte in der Werkstatt,Arbeitslicht,Licht in der Werkstatt“. Mit Close diesen Bereich verlassen und das Training beginnen.
Schritt 6: Das erste Training
Auf der linken Seite stehen unsere beiden Slots. In die Zeile „Type your training example“ wird nun eine Formulierung eingegeben z. B. „Bitte die Glotze ausschalten“ (ohne Anführungszeichen) und mit Klick auf + Add übergeben. Der Satz wandert nach unten. Dort nun mit Doppelklick das Wort „Glotze“ markieren. Es erscheinen am Cursor die beiden Slots „geraete“ und „an_aus“. Glotze gehört zum Slot geraete. Dieser wird ausgewählt. Das Wort ist nun in der Farbe des Slots markiert. Das Wort „ausschalten“ wird dem Slot „schalten“ zugewiesen. Der nächste Satz könnte lauten „Mache das Werkstattlicht an“. Aus diesem Satz „Werkstattlicht“ dem Slot geraete zuweisen und „an“ dem Slot schalten. Auf diese Weise noch drei, vier weitere Sätze eingeben und die entsprechenden Worte dem jeweiligen Slot zuweisen. Nicht vergessen zwischendurch und nach Eingabe der Trainingssätze unten auf Save zu klicken. Nach ein paar Trainingssätzen sieht es dann ungefähr so aus:
Schritt 7: Leistungsprüfung und Ergebniskontrolle.
Nun ist es an der Zeit den Headset an dem PC anzuschließen, der mit snips.ai verbunden ist. Rechts oben im Browserfenster gibt es ein Eingabefeld für Text. Wir fangen zunächst mit einem Satz aus dem Training an, z. B. Bitte die Glotze ausschalten <enter>. Nun erscheint dieser JSON-Code. Zur Verdeutlichung der Struktur, habe ich Leerzeilen eingefügt:
{
"input": "bitte die glotze ausschalten",
"intent": { "intentName": "JoergZ3:smarthome", "confidenceScore": 1
},
"slots":
[
{
"rawValue": "glotze",
"value": {
"kind": "Custom",
"value": "Fernseher" },
"range": {
"start": 10,
"end": 16 },
"entity": "geraete",
"slotName": "geraete" },
{
"rawValue": "ausschalten",
"value": {
"kind": "Custom",
"value": "0" },
"range": {
"start": 17,
"end": 28 },
"entity": "an_aus",
"slotName": "schalten"
}
]
}
Alles anzeigen
Es gibt auf der obersten Ebene die Objekte intent, input und slots. Man kann das u. a. an der Tiefe der Einrückung erkennen. Für‘s Erste interessiert uns vor allem das Objekt slots. Slots ist ein Array (Liste, Tabelle) aus zwei Objekten. (Zum besseren Auffinden: Die beiden slots fangen mit "rawValue" an.) In der Syntax von JSON handelt es sich um slots[0] und slots[1]. Das erste Objekt enthält ein weiteres Objekt mit Angaben aus dem Slot „geraete“ (z. B. „slotName“ : „geraete“ ) und das zweite Angaben aus dem Slot „schalten“. Auch hier kann mann die Unterobjekte an der Tiefe der Einrückung identifizieren. Wichtig ist in beiden Slot-Objekten, was im darin enthaltenen Objekt value steht, die ihrerseits nochmals jeweils ein Objekt mit dem Namen value enthalten. Dort stehen die Werte, die nach Interpretation des Sprachausdrucks übermittelt werden sollen. Das ist im Falle des ersten Objektes „Fernseher“ (obwohl Glotze gesagt wurde) und im Falle des „schalten“-Objektes der Zahlenwert 0. Oder in der Syntax von JSON ausgedrückt steht „Fernseher“ in slots[0]['value']['value'] und die Null („0“) in slots[1]['value']['value']
Wer sich ein bisschen mit JSON auskennt, sieht schon, dass sich aus diesem JSON-String mit allen gängigen Programmier- und Skriptsprachen alles Notwendige an Informationen herausziehen lässt, um Auswertungen vorzunehmen und weitere Befehle zu abzusetzen.
Anstelle der Texteingabe kann nun auch die Eingabe mit Mikrofon erfolgen. Klicke auf das Mikrofon-Symbol und warte bis die Sprechaufforderung angezeigt wird. Sage dann einen Satz wie "Glotze ausmachen!" Nach wenigen Sekunden sollte der JSON-String erscheinen mit den beiden Slots und den korrekten Values Fernseher und 0.
Falls bei der gesprochenen Sprache (oder auch dem schriftlichen Test) auffällt, dass eine Formulierung ganz oder teilweise nicht verstanden – die Slots fehlen dann - müssen die Synonymlisten ergänzt werden. Beispiel: Schalte das Programm ab. Das geht einfach: Mit der Maus zu dem Slot gehen. Es erscheint ein Editier-Stift. Darauf klicken und "schalte ab" und "abschalten" als Synonyme zum Value 0 im Slot schalten ergänzen und "Programm" als Synonym für Fernseher eintragen. Save und Training nicht vergessen! Hier schon mal der Hinweis, dass es heikel werden kann das Wort Programm als Synonym für Fernseher zu verwenden.
Schritt 8: Die Spracherkennung auf den eigenen Raspberry Pi laden und offline verfügbar machen.
Wir klicken im Browserfenster rechts unten auf Deploy Assistant und kopieren die nun angezeigte Zeile sam install assistant -i <Projektnummer>
Wir wechseln wieder zu unserem Terminal-Fenster des Client Computers. Dort geben wir
sam login<enter>
Wir werden nach Benutzernamen (E-Mail-Adresse) und Passworts unseres Snips-Accounts gefragt.
Das gespeicherte Arbeitsergebnis wird von unserem Client-Rechner mit dem Befehl
sam install assistant -i Projektnummer auf den Raspberry Pi aufgespielt.
Dann schließen wir unseren Headset wieder an den Raspberry Pi an und starten ihn neu. Wenn er hochgefahren ist, sprechen wir in das Mikrofon zunächst das Aufwach-Wort „Hey snips“. Es wird mit einem Pling quittiert. Danach einen Satz sagen Wie Schalte den Fernseher ein. Es erfolgt ein zweiter Pling, etwas tiefer. Falls ein sehr tiefer Ton erfolgt, hat snips nichts verstanden. Eventuell war die Pause nach dem Hey snips zu lang. Einfach versuchen. Ob snips tatsächlich was verstanden hat und das auch richtig, kann man auf zwei Wegen überprüfen. Der eine geht mit sam watch im Terminal des Client-Rechners. Zuerst sich jedoch mit sam connect mit dem Gerät verbinden und danach sam watch eingeben. Nach ein paar Sekunden mit Hey snips die Befehlssequenz einleiten und sprechen. Im Terminalfenster sollte der Originaltext und die Slots mit ihren Values erscheinen. (Hinweis: Das Bild ist aus einer anderen App mit den Slots „geraet“ und „Schaltzustand“; die Values sind „Schalter“ und „an“.)
Der zweite Weg mit Hilfe des MQTT-Clients mosquitto_sub, mit dem wir das relevante Topic hermes/intent/# abonnieren. In einem weiteren Terminal geben wir ein:
mosquitto_sub -h 192.168.178.20 -t hermes/intent/#
Übersichtlicher wird es, wenn zunächst das Paket jq installiert wird und anschließend der Inhalt des Topics besser lesbar aufbereitet wird (Siehe dazu mein Artikel im Wiki ). Die entsprechende Befehle lauten dann:
mosquitto_sub -h 192.168.178.20 -t hermes/intent/# | jq .
oder
mosquitto_sub -h 192.168.178.20 -t hermes/intent/# | jq .slots
In noch folgenden Artikeln oder Ergänzungen werde ich auf folgende Themen eingehen:
- Mit Satelliten arbeiten (Spracheingabe in mehreren Räumen),
- Die Nutzung von Snips für die Heimautomation mittels MQTT (und später auch mittels HTTP),
- Sprachausgabe mit Snips einrichten (TTS = Text To Speech bzw. Wiedergabe von WAV-Dateien),
- Snips JSON-Ausdrücke mit Python auswerten.