Ankündigung

Einklappen
Keine Ankündigung bisher.

Plugin speech parser

Einklappen
X
 
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

    Plugin speech parser

    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
    1. Spracherkennung mit "OK Google" oder durch betätigen des Mikrofon-Symbols starten.
    2. Befehl sprechen, z.B. "Licht in der Küche einschalten", "Licht in der Küche ein", "Beleuchtung in der Küche einschalten" usw.
    3. Der Befehl wird von Google nicht erkannt und das AutoVoice-Plugin tritt in Aktion.
    4. Das AutoVoice-Plugin übergibt den kompletten Satz an Tasker und es wird an das speech-Plugin per http-URL übertragen.
    5. Das speech-Plugin durchsucht den Text nach vorgegebenen Regeln.
    6. Wenn eine Regel zutrifft dann wird das entsprechende Item gesetzt oder die Logik getriggert.
    7. 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

    Angehängte Dateien
    Zuletzt geändert von panzaeron; 20.04.2015, 23:50. Grund: Externer Download ergänzt

    #2
    Hallo Axel,

    sieht interessant aus.
    Da ich keine Androids-Devices verwende, ist es leider nichts für mich.

    Wenn es bei soweit ist, können wir es auch gerne in das git integrieren.

    Bis bald

    Marcus

    Kommentar


      #3
      Hallo Markus,

      von mir aus spricht nichts dagegen, nur sollte es vorher noch jemand testen.
      Aber so wie es aussieht ist die nahtlose Sprachsteuerung mit einem Android Smartphone nicht so der Renner...

      Kommentar


        #4
        Doch ... aber das lässt sich sicherlich nicht in 30 Minuten zwischen Feierabend, Kinderbespaßung und den anderen lustigen Pflichten einrichten und testen. Steht aber (zumindest bei mir) auf der Liste! Tolle Arbeit!
        Umgezogen? Ja! ... Fertig? Nein!
        Baustelle 2.0 !

        Kommentar


          #5
          @JuMi2006
          OK, da hast du natürlich recht.
          Ich bin gespannt was andere Tests ergeben...

          Kommentar


            #6
            Wow. Ich bin beeindruckt! Danke.

            Kommentar


              #7
              Hi,

              auch ich bin sehr beeindruckt und werde das sicherlich auch ausprobieren. Allerdings bin ich derzeit mitten im Umzug. Und bis ich wieder irgendwas "innovatives" machen kann, ohne geköpft zu werden, haben wir wohl Q2/2015

              Gruß, Waldemar

              Kommentar


                #8
                Vielen Dank und großes Lob für Dein tolles Plugin!

                Ich hatte über die kommenden Feiertage geplant etwas mit Sprachsteuerung anzufangen und nun hast Du eine solch schöne Lösung erstellt.
                Dein Ansatz gefällt mir richtig gut!
                Der Vorteil mit dem System umgangssprachlich zu kommunizieren ohne starre Syntax befolgen zu müssen ist eine richtige Erleichterung.
                Auch ohne Voice-Steuerung kann man SmartHome jetzt super einfach über HTTP steuern.

                Ich bin übrigens Deiner Empfehlung gefolgt und habe die Namen der Items vereinheitlicht. Damit werden die Regeln viel übersichtlicher.

                Anstelle von Tasker habe ich Automagic benutzt. Die Google Voice Recognition und Voice-Ausgabe ist in Automagic schon mit drin. Die Tasker-Plugins laufen auch in Automagic und ich habe das AutoVoice Plugin kurz angetestet, bin aber nicht sicher ob es hier einen zusätzlichen Vorteil bietet.

                Eine Idee habe ich bezüglich der Ein/Aus-Befehle:
                Könntest Du die auch alternativ weglassen und dann den Schaltzustand einfach wechseln?
                Dadurch würden schon Einwortbefehle wie z.B. "Flurlicht" reichen.

                P.S.
                In der README.md Doku muss der class_name in der plugin.conf mit Großbuchstaben geschrieben werden:

                class_name = Speech_Parser
                class_path = plugins.speech
                config_file = /usr/smarthome/etc/speech.py
                ip = 0.0.0.0
                #acl = w.x.y.z
                port = 2788

                Kommentar


                  #9
                  Danke für das Lob

                  Die Ein-Wort-Befehle müssten eigentlich schon jetzt funktionieren, zumindest falls ich dich richtig verstanden habe:
                  1. Du erzeugst zunächst für smarthome.py ein bool-Item in der Beleuchtungsebene mit einem Namen wie z.B. "um" (d.h. zusätzlich zu "eg.flur.beleuchtung.decke.schalten" noch "eg.flur.beleuchtung.decke.um").
                  2. In der Konfigurationsdatei "speech.py" legst du eine weitere Liste an, z.B. "varLichtUM" die nach dem gleichen Muster aufgebaut ist wie die Räume, d. h. als Rückgabewert das "UM-Item" (eg.flur.beleuchtung.decke.um) und als Wort "Flurlicht".
                  3. Jetzt noch eine Regel die als einzigen Wert varLichtUM enthält.
                  4. In smarthome.py benötigst du zu guter Letzt noch eine Logik die von allen "UM"-Items getriggert wird. Die Logik macht nichts anderes, als bei einem Schaltzustand von 1 des Beleuchtungsobjekts "schalten" (hier: eg.flur.beleuchtung.decke.schalten) selbiges auf Null zu setzen und umgekehrt.
                  In der Reihenfolge müsste die varLichtUM-Regel nach den anderen Licht-Regeln kommen, um erst ausgelöst zu werden wenn die anderen nicht zutreffen.

                  Die geänderte Version findet sich im Post 1.
                  Zuletzt geändert von panzaeron; 18.04.2015, 14:25. Grund: Änderung im Anhang von Post 1 integriert

                  Kommentar


                    #10
                    Thank you for the nice plugin,

                    It is working very well even in Finnish language. I am using it with "Ok google" from my phone. It is nice to open garage door from the car and put the nice scene to home and etc.

                    I am wondering what would be the next level? Would it be a good solution e.g. to put Android installed Raspberry pi (or some else platform) with microphone to those rooms, where you want use it. Then you would get really automated home.

                    Maybe in the near future you can use this kind of platform:

                    Amazon Echo - Official site - Request an invitation

                    BR,
                    Tomas

                    Kommentar


                      #11
                      Hey!

                      Super Sache, werd ich auf jeden Fall auch testen - so ein Plugin hat mir noch gefehlt! Danke für deinen Aufwand, Feedback wird folgen, sobald es läuft.

                      LG Stefan

                      Kommentar


                        #12
                        Erstes Feedback

                        Hi,
                        das Plugin selber läuft gleich mal, bravo!
                        Erste Anmerkungen:
                        1. Die Variablen, z.B. varZahl, müssen auch vom komplexeren zum einfacheren sortiert sein, also zuerst "fünfzig" und dann erst "fünf", da sonst immer Fünf erkannt wird.
                        2. Fixe Werte in den Parse-Einträgen haben nicht funktioniert, z.B. ['fernseher|tv', varSchalten]. Abhilfe: Im Plugin in der Zeile "reg_ex += str(varVars[x]) + ')'" das Leerzeichen hinter der Klammer entfernt
                        3. Dimmwert muss ich noch umrechnen, momentan schickt z.B. 50% den Wert 50 auf das Item, ich verwende aber als Dimmbereich 0-255... hmmm
                        4. Ich würde mir noch in der Plugin-Config einen Switch wünschen, damit einfach alle Items rw zugreifbar sind (so wie beim visu Plugin)


                        Daumen hoch!
                        Am Abend teste ich dann die Android-Anbindung.

                        Edit: AutoVoice macht den Call auf die HTTP-Url, momentan aber leider immer, also auch wenn ich "neue Nachricht" eingebe und der SMS Dialog kommt... Geht das bei dir korrekt?

                        LG Stefan

                        Kommentar


                          #13
                          Hallo,
                          vielen Dank für eure Rückmeldungen.

                          Zitat von SvStefan Beitrag anzeigen
                          Die Variablen, z.B. varZahl, müssen auch vom komplexeren zum einfacheren sortiert sein, also zuerst "fünfzig" und dann erst "fünf", da sonst immer Fünf erkannt wird.
                          Ups, stimmt hatte ich bei meiner aktiven Version schon geändert, bei der in er ZIP noch nicht, danke für den Hinweis

                          Zitat von SvStefan Beitrag anzeigen
                          Fixe Werte in den Parse-Einträgen haben nicht funktioniert, z.B. ['fernseher|tv', varSchalten]. Abhilfe: Im Plugin in der Zeile "reg_ex += str(varVars[x]) + ')'" das Leerzeichen hinter der Klammer entfernt
                          Danke, ändere ich ab.
                          Zitat von SvStefan Beitrag anzeigen
                          Dimmwert muss ich noch umrechnen, momentan schickt z.B. 50% den Wert 50 auf das Item, ich verwende aber als Dimmbereich 0-255... hmmm
                          Da würden mir auf der schnelle folgende Möglichkeiten einfallen:
                          • Du definierst eine varZahlDimm in dem du die Umrechnung schon gemacht hast.
                          • Du legst ein extra Item an für 0-100% mit dem DPT 5.001
                          • Du triggerst eine Logic und machst darüber die Umrechnung, könnte ggf. recht aufwändig werden
                          • Das Plugin wird um diesen Fall ergänzt, allerdings weiß ich noch nicht wie, eine Berechnung ist nicht vorgesehen, könnte aber auch für andere Fälle interessant sein

                          Zitat von SvStefan Beitrag anzeigen
                          Ich würde mir noch in der Plugin-Config einen Switch wünschen, damit einfach alle Items rw zugreifbar sind (so wie beim visu Plugin)
                          Stimmt, das wäre ganz praktisch, muss ich mir mal anschauen wie man das realisiert...
                          Zitat von SvStefan Beitrag anzeigen
                          Edit: AutoVoice macht den Call auf die HTTP-Url, momentan aber leider immer, also auch wenn ich "neue Nachricht" eingebe und der SMS Dialog kommt... Geht das bei dir korrekt?
                          Ja leider, ich weiß noch nicht woran das liegt, aber da ich die Sprachsteuerung nur für das Haus verwende stört es bei mir nicht...

                          Kommentar


                            #14
                            Zitat von SvStefan Beitrag anzeigen
                            Hi,
                            [*]Ich würde mir noch in der Plugin-Config einen Switch wünschen, damit einfach alle Items rw zugreifbar sind (so wie beim visu Plugin)[/LIST]

                            LG Stefan
                            Ich habe den gleichen Bedarf gehabt (auch zum einfachen Testen) und habe folgende sehr kleine Änderung dazu im Plugin gemacht:

                            1) In der Class Speech_Parser() ist die def __init__ um den neuen Parameter default_access erweitert:
                            Code:
                            def __init__(self, smarthome, ip='0.0.0.0', port='2788', acl='*', config_file="", default_access=""):
                            2) Zuweisung einige Zeilen darunter:
                            Code:
                            self.default_access = default_access
                            3) Dann in def parse_input die if-Zeile um or self.default_access == 'rw':erweitert:
                            Code:
                            if item.conf['sp'] == 'rw' or self.default_access == 'rw':

                            In der plugin.conf können dann mit dem neuen Switch default_access = rw alle Items direkt angesprochen werden (ohne die Items in der item.conf jeweils anzupassen):
                            Code:
                            [sp]
                                class_name = Speech_Parser
                                class_path = plugins.speech
                                config_file = /usr/smarthome/etc/speech.py
                                ip = 0.0.0.0
                            #   acl = w.x.y.z
                                port = 2788
                                default_access = rw
                            Die obigen Änderungen im Plugin habe ich angehängt (Achtung: Plugin basiert allerdings noch auf der ersten Version von panzaeron von Nov. 2014)
                            Angehängte Dateien

                            Kommentar


                              #15
                              Hallo,

                              erstmal großes Lob für das tolle Plugin und die gelungene Anleitung!

                              Hab alles auf Anhieb zum Laufen gebracht.

                              Schalten und Status alles kein Problem.

                              Eine Sache ist mir aufgefallen:

                              Ich hab mal versucht meine Solltemperatur für die Heizung zu ändern.

                              Über die Androiden wird ja immer ein Zahlenwert geschickt.

                              Dort wird z.b. bei Wohnzimmer Solltemperatur 23 Grad,
                              immer die 2 als Wert gesendet.
                              Wenn ich das in Worten im Browser eingebe, also dreiundzwanzig wird immer die 3 gesendet.
                              Jetz hab ich hier gelesen, das das normal is man soll zwanzigdrei nehmen.
                              Das hab ich jetzt in allen möglichen Varianten ausprobiert, aber 23 ist nie rausgekommen. 2 oder 3 war immer das Ergebnis.

                              Zwanzig in Worten geschrieben funktioniert.


                              Mit den Androiden bekomm ich nicht mal eine 20 hin.

                              Kann mir da jemand nen Tipp geben?

                              Vielen Dank.

                              Gruß Wolfi

                              Kommentar

                              Lädt...
                              X