Lokale Sprachsteuerung mit Snips.ai und openHAB 2
Habt ihr auch Vorbehalte gegenüber Amazon Alexa und Google Home und wolltet schon immer eine lokale Sprachsteuerung? Ich schon, denn wie ihr vielleicht wisst bin ich kein Freund von Cloud Services für die Spracherkennung. Snips.ai bietet nun allen eine lokale Sprachsteuerung umzusetzen, die allein auf einem Raspberry Pi 3 läuft. Das Konzept finde ich sehr gut, denn ihr könnt Eure Assistenten Online konfigurieren und lokal für die lokale Sprachsteuerung im Smart Home nutzen. So können z.B. auch Verbesserungen durch andere Smart Home Nutzer in die lokale Spracherkennung einfließen.
In folgendem Video ein paar einleitende Worte und eine Demonstration.
Lokale Spracherkennung – benötigte Hardware
Auch wenn ihr bereits einen Raspberry Pi mit laufender Smart Home Software habt, empfehle ich einen eigenen Raspberry für die lokale Spracherkennung. Der Grund ist einfach. Falls mal etwas auf einem der Raspberry schief geht, braucht ihr nur einen Pi neu aufsetzen. So läuft euer Smart Home mit openHAB, FHEM, io Broker oder wie sie alle heißen immer noch und ihr müsst nur den Snips Raspberry neu aufsetzen.
Ich empfehle euch für die Umsetzung die folgenden Komponenten:
Lokale Spracherkennung – Snips.ai auf Raspberry Pi 3 installieren
- Ladet Euch Rasbian Stretch Lite herunter
- Entpackt die ZIP Datei
- Installiert das Image auf eine mindestens 4 GB, besser 8 GB Micro SD Karte mittels Etcher.
- Nach dem Flash vorgang legt eine Datei „ssh“ im Boot Verzeichnis an. Dies ist wichtig, da ihr sonst nicht per SSH auf Euren Pi Zugrifen könnt.
- Legt die Micro SD Karte in den Raspberry Pi 3
- Verbindet Euren Raspberry Pi mit einem LAN Kabel
- Verbindet den RPi 3 mit dem Stromkabel
- Ihr könnt euch nun direkt per Putty (unter Windows) auf dem Pi einloggen. User pi, Passwort raspberry
- Nach dem einloggen gebt sudo raspi-config
- Wählt den ersten Punkt und ändert das Passwort
- Nun wählt den Punkt Inteface Options und aktiviert den SSH Server
NodeJs und NPM
Als Grundvoraussetzung wird NPM und NodeJs benötigt. Zur Installation gebt bitte folgende Befehl nacheinander ein.
sudo apt-get update sudo apt-get upgrade curl -sL https://deb.nodesource.com/setup_10.x | sudo -E bash - sudo apt-get install -y nodejs
Prüft nun die Installation mit
node -v -
Die Version muss mindestens Node v7.5.0 entsprechen.
npm -v
Snips Installieren per Sam Assistant Manager (SAM)
Der Snips Assistant Manager (SAM) erleichtert euch die Installation, da so lange Befehl abgekürzt werden. SAM wird durch folgenden Befehl installiert.
sudo npm install -g snips-sam
Verbindet nun SAM mit euren Raspberry Pi. Wenn ihr den Hostname geändert habt, ändert bitte raspberrypi.local entsprechend ab.
sam connect raspberrypi.local
Ihr könnt nun bereits den Status mit folgendem Kommando prüfen
sam status
Installiert nun Snips mit folgendem Befehl.
sam init
Steckt einen Lautsprecher mit 3,5″ Klinke in den RPi. Kopfhörer tun es zur Not auch. Weiterhin steckt die PS3 Eye Kamera in einen USB Port. Im Anschluss könnt ihr das Audio Setup vornehmen und gebt den Befehl ein.
sam setup audio
Die Frage nach dem Maker Kit mit n beantworten. Die Kamera sollte als CameraB409241 [USB Camera-B4.09.24.1], device 0: USB Audio [USB Audio] oder ähnliches erkannt werden. Falls mehr als ein Gerät für die Audio Ausgabe gefunden wurde. Wählt den Eintrag ohne HDMI mittels der Pfeiltasten auf der Tastatur.
Found 2 interfaces to output sound. Choose the one you want to use as your speaker ❯ card 0: ALSA [bcm2835 ALSA], device 0: bcm2835 ALSA [bcm2835 ALSA] card 0: ALSA [bcm2835 ALSA], device 1: bcm2835 ALSA [bcm2835 IEC958/HDMI]
Im Anschluss sollte folgende Meldung erscheinen
Installed /etc/asound.conf Setting to volume to 90% if possible Restarting snips-audio-server service done i You can test your microphone & speaker with sam test microphone / speaker
Testet mit folgenden Befehl den Lautsprecher.
sam test speaker
Die Ansage könnt ihr mit STRG + C unterbrechen
Nun testet das Mikro mit dem Befehl.
sam test microphone
Wartet einen Augenblick bis die folgende Zeile erscheint
Say something in the microphone, then press a key to continue...
Sagt was und drückt eine Taste. Der Lautsprecher sollte nun genau das gesagte ausgeben.
Falls ihr eine Audiofeedback wünscht, gebt folgenden Befehl ein. Dies installiert auch den Mosquitto client.
sam sound-feedback on
Snips Assistenten installieren
Falls ihr noch kein Snips Account habt, legt diesen unter folgender Adressse an.
https://console.snips.ai/signup
Im Anschluss legt den ersten Assistenten an und wählt die App Lichtsteuerung.
Nun geht wieder in euren SSH Client und gebt den folgenden Befehl ein.
sam login
Gebt entsprechend User und Passwort ein. Nach erfolgreichem Login gebt den folgenden Befehl ein
sam install assistant
Falls ihr mehrere Assistenten haben solltet, wählt den entsprechenden Assistenten. Bei einem sollte es direkt losgehen. Es dauert nun eine Weile. Gerade der Punkt ASR training wird einige Zeit in Anspruch nehmen. Auch die nachfolgende Installation der packages wird etwas dauern. Wenn alles durch ist, solltet ihr folgendes Ergebnis sehen.
Fetching assistants done Found 1 assistant named Wetter Downloading assistant Fetching assistants done NLU training done ASR training done ✔ Deploying assistant to raspberrypi.local... Checking for skills No python or Home Assistant snippets found ✔ Installing pip package and virtualenv. This could take a while. ✔ Installing git package Cloning skill Wetter from url: https://github.com/MrJohnZoidberg/Snips-Wetter Cloning into 'Snips-Wetter'... Generating actions based on the snippets provided INFO:snips_actions_templates_engine_lib: parsing snippets for skill "/usr/share/snips/assistant/snippets/domi.Wetter" Checking actions for end-user parameters ✔ Generating virtual environment for python actions Relaunching snips-skill-server ✔ Snips assistant is now running. Say hey_snips to start! i Run sam watch to see the logs
Im Anschluss könnt ihr nun mit mit „Hey Snips, mach Licht im Klo an“ die Spracherkennung starten. Wollt ihr parallel beobachten was sich in Snips tut, führt den folgenden Befehl aus.
sam watch
Das Ergebnis ist eine JSONPath Zeichenkette:
{ "input": "mach licht im klo an", "intent": { "intentName": "udemy:LampenAnSchalten", "probability": 0.8252422 }, "slots": [ { "rawValue": "klo", "value": { "kind": "Custom", "value": "Toilette" }, "range": { "start": 14, "end": 17 }, "entity": "objectLocation", "slotName": "deviceLocation" } ] }
Um auf diese Werte in eurem Smart Home zuzugreifen wird nun eine Plattform benötigt, die sich mit MQTT auf den Snips Raspberry Pi verbinden kann. Wie ich das mit openHAB 2 mache, lest ihr im folgenden Kapitel.
Lokale Sprachsteuerung – Snips mit openHAB 2 verbinden
Für die lokale Sprachsteuerung braucht ihr nun natürlich noch ein System, welches die Inhalte des MQTT Topic aus Snips entgegennimmt und die Steuerung übernimmt. Hierfür könnt ihr wie ich openHAB 2 oder Home Assistant nutzen. Es geht sicher auch mit Systemen wie FHEM oder ioBroker. So lange ihr die Möglichkeit habt MQTT auf euer System zu bringen und einen JSON Path String zerlegen könnt, steht der lokalen Sprachsteuerung nichts mehr im Wege.
Snips mit openHAB 2 verbinden – MQTT Binding 1 nutzen
Da inzwischen das MQTT 2 Binding veröffentlich wurde, findet ihr das MQTT 1 Binding nicht mehr unter den Bindings. Ihr müsst hierfür über folgenden Weg die Legacy Bindings aktivieren. Ruft System (1) auf, schaltet die Integration der 1er Bindings an (2) und speichert (3).
Nun findet ihr unter Add-ons (1) unter Binding Suche (2) auch das MQTT 1 Binding und könnt dies installieren (3).
Ein Beitrag zu MQTT 2 ist geplant, wird aufgrund von Vereinsarbeit für barrierefreies SmartHome geschoben.
Snips mit openHAB 2 verbinden – MQTT Binding installieren und Item erstellen
Installiert über die Paper UI das MQTT Binding und tragt in die mqtt.cfg folgendes ein. hostname müsst ihr dabei durch euren Hostnamen ersetzen.
snipsmqtt.url=tcp://hostname:1883 snipsmqtt.clientId=oh2
Nun legt eine Items Datei snips.items an.
String Snips_Intent "Snips Intent" { mqtt="<[snipsmqtt:hermes/intent/#:state:default]" }
Snips mit openHAB 2 verbinden – Snips MQTT Topic per Regel verarbeiten
Damit ihr nun die unterschiedlichen Sprachansagen in eurem Smart Home Server verarbeiten könnt, müsst ihr das Topic bei jeder Änderung abgreifen. In openHAB 2 geht dies wie folgt. Hier wird weiterhin der Inhalt im Logviewer ausgegeben. Dies ist sehr sinnvoll um die Logik zu analysieren.
rule "Snips" when Item Snips_Intent received update then logInfo("Snips Intent: ", Snips_Intent.state.toString) end
Snips mit openHAB 2 verbinden – MQTT Topic per JSONPath Transformation aufteilen
Nun installiert noch die JSON Path Transformation über die Paper UI. Die Regel könnt ihr nun so erweitern, dass ihr den Inhalt des MQTT Topic aufteilt.
Die folgende Regel bewirkt folgendes:
- Das Intent wird aufgeteilt und in pureIntent steht der Name des Intent ohne den Nutzernamen. Für unsere App oben steht also LampenAusSchalten, LampenEinSchalten, LampenDimmen usw in dieser Variable.
- In der Variable device_val übergeben wir den Wert aus dem ersten Slot. In unserem Beispiel steht dort Toilette.
- Über eine globale Variable oh2ONOFF belegen wir anhand des Intent Namen den Zustand vor. ON oder OFF
- Als letztes fragen wir den vorher abgegriffenen Wert der Variable device_val ab. Steht hier Toilette, schalten wir das entsprechende Item mit der globalen Variable an oder aus.
var String oh2ONOFF rule "Snips" when Item Snips_Intent received update then logInfo("Snips Intent: ", Snips_Intent.state.toString) var String intentName = transform("JSONPATH", "$.intent.intentName", Snips_Intent.state.toString) var String pureIntent = intentName.split(":").get(1); var String device_val = transform("JSONPATH", "$.slots[0].value.value", Snips_Intent.state.toString) logInfo("Snips Gerät: ", device_val) pureIntent = pureIntent.toLowerCase logInfo("Snips device value: ", pureIntent) if (pureIntent == 'lampenanschalten') { oh2ONOFF = "ON" } else if (pureIntent == 'lampenausschalten') { oh2ONOFF = "OFF" } if (device_val == 'Toilette') { sendCommand(Licht_Toilette,oh2ONOFF) } logInfo("Snips device value: ", device_val) end
Lokale Sprachsteuerung – Online Kurs zum weiteren Ausbau
Für alle, die die Sprachsteuerung wesentlich ausbauen möchten, habe ich einen Online Kurs entwickelt.
Zum aktuellen Zeitpunkt umfasst der Kurs 2 Stunden und bietet folgendene Inhalte:
- Installation von Raspian
- Konfiguration von Raspian
- Installation von Snips
- Konfiguration von Snips (Mikrofon und Lautsprecher)
- Erstellung eines eigenen Assistenten in Snips.ai
- Erstellung einer generischen Regel in openHAB 2
Der Kurs zur lokalen Sprachsteuerung kann entweder einzeln für 25 € oder in Kombination mit dem openHAB 2 Kurs gebucht werden. Dies kann ich allen interessierten empfehlen, für die openHAB 2 komplettes Neuland ist. Ihr erhaltet nach Buchung des openHAB 2 Kurses einen Gutschein für den Kurs zur lokalen Sprachsteuerung.
Ihr könnt euch natürlich auch durch die einleitenden Beiträge openHAB 2 Installation und openHAB 2 Konfiguration lesen. Fragen stellt ihr dann hier auf dem Blog.
Und nun wünsche ich euch viel Spaß mit eurer lokalen Sprachsteuerung.