Werbung
Hinweis: Diese Seite enthält Werbelinks

Lokale Sprachsteuerung mit Snips.ai und openHAB 2

Snips.ai wurde von Sonos gekauft. Der Service wird zum 31.01.2020 eingestellt. Ihr solltet alle eure Konfigurationen sichern. Der Kurs ist nicht mehr käuflich zu erwerben. An einer Alternative wird gearbeitet.

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.

YouTube

Mit dem Laden des Videos akzeptieren Sie die Datenschutzerklärung von YouTube.
Mehr erfahren

Video laden

PGlmcmFtZSB0aXRsZT0iTG9rYWxlIFNwcmFjaHN0ZXVlcnVuZyBmw7xyIGRlaW4gU21hcnQgSG9tZSBtaXQgU25pcHMuYWkgKGxva2FsZSBTcHJhY2hlcmtlbm51bmcpIiB3aWR0aD0iODQwIiBoZWlnaHQ9IjQ3MyIgc3JjPSJodHRwczovL3d3dy55b3V0dWJlLW5vY29va2llLmNvbS9lbWJlZC9TaWNRLW5aN09yRT9mZWF0dXJlPW9lbWJlZCIgZnJhbWVib3JkZXI9IjAiIGFsbG93PSJhY2NlbGVyb21ldGVyOyBhdXRvcGxheTsgY2xpcGJvYXJkLXdyaXRlOyBlbmNyeXB0ZWQtbWVkaWE7IGd5cm9zY29wZTsgcGljdHVyZS1pbi1waWN0dXJlIiBhbGxvd2Z1bGxzY3JlZW4+PC9pZnJhbWU+

 

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

  1. Ladet Euch Rasbian Stretch Lite herunter
  2. Entpackt die ZIP Datei
  3. Installiert das Image auf eine mindestens 4 GB, besser 8 GB Micro SD Karte mittels Etcher.
  4. 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.
  5. Legt die Micro SD Karte in den Raspberry Pi 3
  6. Verbindet Euren Raspberry Pi mit einem LAN Kabel
  7. Verbindet den RPi 3 mit dem Stromkabel
  8. Ihr könnt euch nun direkt per Putty (unter Windows) auf dem Pi einloggen. User pi, Passwort raspberry
  9. Nach dem einloggen gebt sudo raspi-config
  10. Wählt den ersten Punkt und ändert das Passwort
  11. 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

smart-home-openhab-2-snips-lokale-sprachsteuerung-SAM-installieren

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.

smart-home-openhab-2-snips-app-installieren-1

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).

snips-mqtt-binding-1

Nun findet ihr unter Add-ons (1) unter Binding Suche (2) auch das MQTT 1 Binding und könnt dies installieren (3).snips-mqtt-binding-2

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.

Smarthome Training and Tutorials
Logo