Hallo,
im Anhang habe ich ein abgewandeltes Network-Plugin angehängt, welches ich zum Parsen von Android Sprachbefehlen benutze um Aktionen im Haus auszulösen. In der ZIP-Datei ist das so genannte speech-Plugin und eine benötigte Beispiel-Konfigurationsdatei enthalten. Die Struktur passt zum RaspberryPi-Image (und auch nur darunter getestet). Eine Anleitung ist im plugin-Ordner (Readme.md) enthalten und auch die Beispiel-Konfigurationsdatei ist ausführlich kommentiert. Letzteres besteht aus drei Abschnitten.
Der erste Abschnitt enthält Listen die Begriffe und Rückgabewerte beinhalten, z.B. werden Begriffe unter unterschiedlichen Namen angesprochen, das Licht in einem Raum als "Beleuchtung", "Lampe", "Licht", "Leuchte" usw. In der Konfigurationsdatei gibt es für die häufigsten Fälle Wortkombinationen die als Basis für die eigene Sprachsteuerung verwendet werden können.
Der zweite Abschnitt sind die Regeln nach denen die Items angesprochen werden. Im wesentlichen werden verschiedene vorher definierte Variablen/Listen kombiniert um Aktionen auszuführen, z.B. Raum, Licht, Schalten um die Beleuchtung zu schalten. Beispiele finden sich in der beiliegenden Konfigurationsdatei.
Der dritte Abschnitt enthält Fehlermeldungen die zurückgegeben werden, wenn z. B. ein Befehl nicht erkannt wurde, hier muss am Anfang nicht verändert werden.
Vorgeschichte
Ich wollte für mein Haus eine flexible Sprachsteuerung realisieren, die ohne feste Befehle auskommt. Dabei nutze ich zur Spracheingabe mein Android Smartphone. Erste Versuche mit unterschiedlichen Android-Apps z.B. mit AVIC sind allesamt gescheitert, wobei AVIC noch am nächsten dran war, weil man eigene Befehle definieren kann.
Am Ende hab ich es mit einer Kombination aus Tasker zusammen mit dem AutoVoice-Plugin und einem abgewandelten network-Plugin in smarthome.pi realisiert. Verwendet wird die "normale" Goggle/Android-Spracherkennung.
Von der Spracherkennung zur ausführenden Aktion
Was ist das Plugin nicht
Es übersetzt keine Sprache direkt in Befehle, sondern ist auf die google/Android Spracherkennung angewiesen. Das bedeutet Sprache die von goggle nicht sauber erkannt wurde kann auch nicht richtig in Befehle umgesetzt werden.
Hinweise
Angemerkt sei noch, dass das mein erster Versuch mit Python und der objektorientierten Programmierung ist, Verbesserungsvorschläge sind willkommen.
Da das Anhängen des Plugins nicht funktioniert, habe ich es hier hinterlegt:
http://dav.square7.ch/speech.zip
im Anhang habe ich ein abgewandeltes Network-Plugin angehängt, welches ich zum Parsen von Android Sprachbefehlen benutze um Aktionen im Haus auszulösen. In der ZIP-Datei ist das so genannte speech-Plugin und eine benötigte Beispiel-Konfigurationsdatei enthalten. Die Struktur passt zum RaspberryPi-Image (und auch nur darunter getestet). Eine Anleitung ist im plugin-Ordner (Readme.md) enthalten und auch die Beispiel-Konfigurationsdatei ist ausführlich kommentiert. Letzteres besteht aus drei Abschnitten.
Der erste Abschnitt enthält Listen die Begriffe und Rückgabewerte beinhalten, z.B. werden Begriffe unter unterschiedlichen Namen angesprochen, das Licht in einem Raum als "Beleuchtung", "Lampe", "Licht", "Leuchte" usw. In der Konfigurationsdatei gibt es für die häufigsten Fälle Wortkombinationen die als Basis für die eigene Sprachsteuerung verwendet werden können.
Der zweite Abschnitt sind die Regeln nach denen die Items angesprochen werden. Im wesentlichen werden verschiedene vorher definierte Variablen/Listen kombiniert um Aktionen auszuführen, z.B. Raum, Licht, Schalten um die Beleuchtung zu schalten. Beispiele finden sich in der beiliegenden Konfigurationsdatei.
Der dritte Abschnitt enthält Fehlermeldungen die zurückgegeben werden, wenn z. B. ein Befehl nicht erkannt wurde, hier muss am Anfang nicht verändert werden.
Vorgeschichte
Ich wollte für mein Haus eine flexible Sprachsteuerung realisieren, die ohne feste Befehle auskommt. Dabei nutze ich zur Spracheingabe mein Android Smartphone. Erste Versuche mit unterschiedlichen Android-Apps z.B. mit AVIC sind allesamt gescheitert, wobei AVIC noch am nächsten dran war, weil man eigene Befehle definieren kann.
Am Ende hab ich es mit einer Kombination aus Tasker zusammen mit dem AutoVoice-Plugin und einem abgewandelten network-Plugin in smarthome.pi realisiert. Verwendet wird die "normale" Goggle/Android-Spracherkennung.
Von der Spracherkennung zur ausführenden Aktion
- Spracherkennung mit "OK Google" oder durch betätigen des Mikrofon-Symbols starten.
- Befehl sprechen, z.B. "Licht in der Küche einschalten", "Licht in der Küche ein", "Beleuchtung in der Küche einschalten" usw.
- Der Befehl wird von Google nicht erkannt und das AutoVoice-Plugin tritt in Aktion.
- Das AutoVoice-Plugin übergibt den kompletten Satz an Tasker und es wird an das speech-Plugin per http-URL übertragen.
- Das speech-Plugin durchsucht den Text nach vorgegebenen Regeln.
- Wenn eine Regel zutrifft dann wird das entsprechende Item gesetzt oder die Logik getriggert.
- Am Ende wird noch eine Antwort generiert und über das Smartphone als Sprache ausgegeben.
Was ist das Plugin nicht
Es übersetzt keine Sprache direkt in Befehle, sondern ist auf die google/Android Spracherkennung angewiesen. Das bedeutet Sprache die von goggle nicht sauber erkannt wurde kann auch nicht richtig in Befehle umgesetzt werden.
Hinweise
- Die Konfiguration ist am einfachsten, wenn die Items in Smarthome.py einer festen Struktur folgen, z. B. die Hauptbeleuchtung in einem Raum ist immer "stockwerk.raum.beleuchtung.schalten" oder alle Rollläden in einem Raum "stockwerk.raum.rollladen.fahren" und "stockwerk.raum.rollladen.position" usw. Dann genügt ein oder zwei Regeln um alle Lampen im Haus zu schalten.
- Am Anfang immer erst mit einem Befehl anfangen und wenn es funktioniert Stück für Stück erweitern, es ist viel Try and Error insbesondere am Anfang notwendig.
- Verschiedene Interpratationen der Spracherkennung bei einzelnen Wörtern berücksichtigen, z. B. wird Rollladen häufig als Rolladen übertragen.
- Die Reihenfolge der Befehle sollten vom speziellen zum allgemeinen angeordnet sein, d.h. erst die Wandleuchte dann die allgemeine Beleuchtung. Wenn die Reihenfolge egal ist, dann sollten die häufig benutzten Befehle am Anfang stehen (etwas schneller).
- Die Sicherheit ist relativ niedrig, weil die Befehle von Google-Servern in Text umgesetzt werden und die Kommunikation zwischen Smartphone und speech-Plugin eine normale http-URL ist. Man könnte auf dem Smartphone eine andere Spracherkennungsapp installieren, aber mir ist keine bekannt die so leistungsfähig wie die von google.
- Rückmeldungen können ebenfalls abgefragt werden, z. B. "Wie warm ist es im Büro?" und die Temperatur wird ausgegeben: "Die Lufttemperatur im Büro beträgt 23 Grad." (siehe Beispiel "Temperatur" in der Konfigurationsdatei).
Angemerkt sei noch, dass das mein erster Versuch mit Python und der objektorientierten Programmierung ist, Verbesserungsvorschläge sind willkommen.
Da das Anhängen des Plugins nicht funktioniert, habe ich es hier hinterlegt:
http://dav.square7.ch/speech.zip
Kommentar