Sprachsteuerung

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

Dieses System habe ich an 2 Stellen erweitert.

Zuerst habe ich eine eigene App entwickelt die Grundsätzlich nach dem gleichen Prinzip wie Habroid arbeitet. 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.

Zweitens wird bei mir im Text nicht wild 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

Auf diese Art kann man relativ flexibel Sätze bilden.

Ausblick

Das einzige Manko das jetzt noch bleibt ist die “schlechte” Erkennung von google wann genau man fertig mit reden ist. Läuft z.B. der Fernseher im Hintergrund kann es sein dass die Spracherkennung noch 15 Sekunden braucht ehe sie merkt das man eigentlich fertig ist. Ein Button “Fertig” wäre hier sehr hilfreich.

Trotzdem ist die Spracherkennung eine große Hilfe da man sich so erspart durch die Endlosen Menupunkte zu navigieren bis man das Licht ein oder ausschalten kann.

Eine weitere Optimierung an der ich gerade arbeite ist die Anwesenheitserkennung. Wenn sie fertig ist kann man sich die Nennung des Raumes sparen da das Haus weiss wo man sich befindet und die entsprechende Information einfach auffüllt.

Software

Die openHAB rule zur Satzzerlegung kann hier unter dem Punkt Automatisierungs- & Steuerungsregeln runter geladen werden.

Meine Android App dazu werde ich demnächst im Play Store kostenlos veröffentlichen.