Sprachsteuerung mit Amazon Alexa
Eine Sprachsteuerung für Zuhause zur Steuerung des SmartHomes stellt eine gewisse Herausforderung da. Zwar werben Amazon Alexa und Google Home genau damit, wenn man es aber ausprobiert merkt man schnell wie begrenzt das ganze noch ist. Es funktioniert mit einer begrenzten Anzahl an Lampen, Steckdosen und vielleicht noch der Heizung recht gut. Wenn es aber um komplexere Scenarien mit hunderten von Steuerbaren Elementen geht, stößt man an die Grenzen der eingebauten Skills.
Allgemein
Mit der Android App Habdroid und openHAB ist schon von Hause aus eine rudimentäre Spracherkennung möglich. Wobei die Android App sich darauf beschränkt mit Hilfe der Google Spracherkennung den erkannten Text per REST API an openHAB zu senden. Dort wird der Text dann mit einer RULE weiter verarbeitet. Meistens wird hier per regex nach Wörtern gesucht um dann verschiedene Aktionen auszulösen.
Umsetzung
Eine erste Umsetzung basierte auf einer eigenen App welche Grundsätzlich nach dem gleichen Prinzip wie Habroid arbeitet hat. Der entscheidende Unterschied ist dass es im Anschluss nachdem der Text an openHAB geschickt wurde auf eine Rückmeldung wartet um diese dann als Toast Message anzuzeigen. d.h. man erhält von openHAB ein Feedback was erkannt und geschaltet wurde.
Da diese Variante aber immer eine App benötigt und damit zwangsläufig ein Handy benötigt habe ich auch mit einer zweiten Variante experimentiert. Diese Variante ist bei mir nun auch dauerhaft im Einsatz. Sie basiert auf einem eigenem Alexa Skill der unter folgender URL verfügbar ist.
https://github.com/HolgerHees/semanticdetection
Dieser Skill sendet den erkannten Text per REST API an openhab und wird dort per custom python rule weiterverarbeitet. Im Haus habe ich hierzu 6 Echo Dot 2 von Amazon verteilt.
Satzanalyse und semantic detection
Es wird nicht einfach im Text nach Wörtern gesucht die dann direkt in einer Aktion münden, sondern etwas strukturierter der Satz zerlegt und nach Was, Wo und Wie ausgewertet.
Auf diese Art kann man etwas komplexere und zusammengesetzte Sätze bilden.
Beispiel:
“Alle Rollläden runter und im Wohnzimmer das indirekte Licht auf 30%”.
“Licht im Flur und im Wohnzimmer an und im Schlafzimmer die Rollläden runter”
Im zweiten Beispiel wird z.B. erkannt dass es im Wohnzimmer auch um das Licht geht und dass es auch im Flur an geschaltet werden soll.
Die Satzzerlegung folgt hierbei folgendem Schema
- Zuerst wird der Satz an Trennwörtern wie “und” zerlegt
- Jetzt wird in jedem Teilsatz nach einer Gruppe (Licht, Dimmer, Steckdose, Rollladen) gesucht
- Wird in dem Teilsatz mehr als ein Raum gefunden wird erneut geteilt
- Jetzt wird bei den erkannten Teilen die Gruppe aufgefüllt. Das geschieht erst rückwärts und dann vorwärts. Rückwärts deshalb zuerst, weil zuletzt genannte Gruppen eine höhere Priorität haben
- Jetzt wird für jeden Teilsatz die Aktion erkannt. Dies ist wiederum Gruppenabhängig. “Hoch” und “Runter” ist nur für Rollläden möglich. An und Aus nur für Licht und Prozentangaben nur für Dimmer
- Im Anschluss wird die Aktion bei allen Teilsätzen genauso aufgefüllt wie bei der Gruppe. Erst rückwärts und dann vorwärts.
- Zuletzt werden bei den Teilsätzen die Räume aufgefüllt. Dies geschieht erst vorwärts und dann rückwärts. Auch hier ist die Reihenfolge auf sprachliche gegebenheiten zurückzuführen. Zuerst genannte Räume sind mit hoher wahrscheinlichkeit auch im folgenden Teilsatz relevant falls dort keiner explizit genannt wurde.
- Wenn alles gut gegangen ist hat man jetzt folgende Informationen:
den Raum, die Gruppe (Licht etc…) und die Aktion (An / Aus, Hoch / Runter) - Zuletzt wird anhand der Gruppe und des Raumes erkannt welches Licht, Steckdose oder Rollladen genau gemeint sein könnte
- Falls kein Raum erkannt wurde, wird der Standort des Alexa Dot, welcher den Satz entgegen genommen hat, verwendet. Bsp: Wenn ich im Wohnzimmer sage “Licht an” weiß ich daß das Wohnzimmerlicht gemeint ist.
Auf diese Art kann man relativ flexibel Sätze bilden.