Skip to content
  • Home
  • Aktuell
  • Tags
  • 0 Ungelesen 0
  • Kategorien
  • Unreplied
  • Beliebt
  • GitHub
  • Docu
  • Hilfe
Skins
  • Light
  • Brite
  • Cerulean
  • Cosmo
  • Flatly
  • Journal
  • Litera
  • Lumen
  • Lux
  • Materia
  • Minty
  • Morph
  • Pulse
  • Sandstone
  • Simplex
  • Sketchy
  • Spacelab
  • United
  • Yeti
  • Zephyr
  • Dark
  • Cyborg
  • Darkly
  • Quartz
  • Slate
  • Solar
  • Superhero
  • Vapor

  • Standard: (Kein Skin)
  • Kein Skin
Einklappen
ioBroker Logo

Community Forum

donate donate
  1. ioBroker Community Home
  2. Deutsch
  3. Off Topic
  4. Rhasspy Offline Sprachsteuerung

NEWS

  • UPDATE 31.10.: Amazon Alexa - ioBroker Skill läuft aus ?
    apollon77A
    apollon77
    48
    3
    8.8k

  • Monatsrückblick – September 2025
    BluefoxB
    Bluefox
    13
    1
    2.2k

  • Neues Video "KI im Smart Home" - ioBroker plus n8n
    BluefoxB
    Bluefox
    16
    1
    3.2k

Rhasspy Offline Sprachsteuerung

Geplant Angeheftet Gesperrt Verschoben Off Topic
403 Beiträge 30 Kommentatoren 100.5k Aufrufe 47 Watching
  • Älteste zuerst
  • Neuste zuerst
  • Meiste Stimmen
Antworten
  • In einem neuen Thema antworten
Anmelden zum Antworten
Dieses Thema wurde gelöscht. Nur Nutzer mit entsprechenden Rechten können es sehen.
  • tobetobeT tobetobe

    @joergeli said in Rhasspy Offline Sprachsteuerung:

    aaaber: Langsam treibt mich das Wakew

    Mikrofon: Vielen Dank - Wieder etwas dazugelernt

    WakeWord: Nachdem ich mir ja auch schon zwei untaugliche WakeWords generiert hatte, steht mir dieser Wahnsinn wohl auch noch bevor...

    Ich hatte mich ja schon mal zu meinen angelesenen Erkenntnissen über gute WakeWords ausgelassen und auch gaaaanz vorsichtig hinterfragt, ob "Lieselotte" den Ansprüchen an ein gutes WakWord wohl wirklich genügt. Ich glaube, es gibt zu viele Ähnlichkeiten in der Phonetik mit üblicher Wortwahl. Daher die Fehler.

    Du kannst ja selbst testen, auf was dein Rhasspy so alles reagiert: Fieser/mieser Otto, tiefer Pott, lieber Gott, Liebe? Not! Hiebe Schrott, wieso not, ggf. sogar nur auf "Lotte"...

    Bei "Snowboy" sind die Umlaute dominant. Hier funktioniert alles wie Oh Boy, Showboy, Oh oy usw. Nur kommen diese Umlaute nun mal eben im Deutschen nicht vor, sodass auch nicht so viel schief geht. Alle technischen Maßnahmen (Gain und Sensitivity zu optimieren) halte ich für Feinschliff, um das letzte Quäntchen zu optimieren. Ein "schlechtes" WakeWord" wird man damit allerdings nicht heilen können.

    Sorry, dass ich das so deutlich auf den Punkt bringe, aber ich bin vom Gesagten wirklich überzeugt, da ich mich in meinem Nachrichtentechnikstudium mit Mustererkennung befasst habe. In aller Bescheidenheit ergänze ich: Die Weisheit mit Löffeln gefressen habe ich natürlich auch nicht!

    Bis mir selbst ein "gutes" WakeWord einfällt, arbeite ich halt zunächst mit "Snowboy" weiter, um allem Ärger aus dem Weg zu gehen. Ich persönlich möchte momentan lieber die Gesamtfunktionalität im Auge behalten, die bei mir schon recht gut und zuverlässig ist. Die Sache mit den WakeWords lasse ich nebenher laufen. Vielleicht fällt uns ja gemeinsam ein supertolles 100%-Wort ein...

    joergeliJ Online
    joergeliJ Online
    joergeli
    schrieb am zuletzt editiert von
    #81

    @tobetobe
    Hallo Thomas,
    es funktioniert nach ersten Tests mit den gain-Einstellungen jetzt schon besser - toi, toi, toi
    Selbst auf Frau reagiert es jetzt und der Haussegen hängt wieder halbwegs gerade.
    Wird allerdings mit einer geringeren Empfindlichkeit bei größerem Sprechabstand erkauft.

    Trotzdem wäre es schön, wenn wir ein besseres WakeWord finden, was aber kein Zungenbrecher werden soll.
    Ich persönlich mag auch solche WakeWords nicht, die aus 2 Wörtern bestehen ( OK, Rhasspy - Hey, Google, etc.)

    Nebenbei:
    Bei meinem Nachrichtentechnik-Studium (70er Jahre des letzten Jahrtausends) gab's noch keine Mikroprozessoren, da haben wir noch in Fortran auf Lochstreifen programmiert :grin:

    Gruß
    Jörg

    tobetobeT 1 Antwort Letzte Antwort
    0
    • joergeliJ joergeli

      @tobetobe
      Hallo Thomas,
      es funktioniert nach ersten Tests mit den gain-Einstellungen jetzt schon besser - toi, toi, toi
      Selbst auf Frau reagiert es jetzt und der Haussegen hängt wieder halbwegs gerade.
      Wird allerdings mit einer geringeren Empfindlichkeit bei größerem Sprechabstand erkauft.

      Trotzdem wäre es schön, wenn wir ein besseres WakeWord finden, was aber kein Zungenbrecher werden soll.
      Ich persönlich mag auch solche WakeWords nicht, die aus 2 Wörtern bestehen ( OK, Rhasspy - Hey, Google, etc.)

      Nebenbei:
      Bei meinem Nachrichtentechnik-Studium (70er Jahre des letzten Jahrtausends) gab's noch keine Mikroprozessoren, da haben wir noch in Fortran auf Lochstreifen programmiert :grin:

      Gruß
      Jörg

      tobetobeT Offline
      tobetobeT Offline
      tobetobe
      schrieb am zuletzt editiert von
      #82

      @joergeli said in Rhasspy Offline Sprachsteuerung:

      Nebenbei:
      Bei meinem Nachrichtentechnik-Studium (70er Jahre des letzten Jahrtausends) gab's noch keine Mikroprozessoren, da haben wir noch in Fortran auf Lochstreifen programmiert

      Gibt ja gar nicht!!! Da haben wir etwas gemeinsam. Und der Ausdruck kam auf DIN A3 Nadeldruckern heraus. Ich hab dich für vieeel jünger gehalten...

      Gruß
      Thomas

      Beste Grüße
      tobetobe

      joergeliJ 1 Antwort Letzte Antwort
      0
      • tobetobeT tobetobe

        @joergeli said in Rhasspy Offline Sprachsteuerung:

        Nebenbei:
        Bei meinem Nachrichtentechnik-Studium (70er Jahre des letzten Jahrtausends) gab's noch keine Mikroprozessoren, da haben wir noch in Fortran auf Lochstreifen programmiert

        Gibt ja gar nicht!!! Da haben wir etwas gemeinsam. Und der Ausdruck kam auf DIN A3 Nadeldruckern heraus. Ich hab dich für vieeel jünger gehalten...

        Gruß
        Thomas

        joergeliJ Online
        joergeliJ Online
        joergeli
        schrieb am zuletzt editiert von joergeli
        #83

        @tobetobe sagte in Rhasspy Offline Sprachsteuerung:

        Ich hab dich für vieeel jünger gehalten...

        nun ja, 62 Lenze, aber im Kopf immer noch ein Spielkind/Elektronik-Bastler geblieben

        1 Antwort Letzte Antwort
        0
        • B Offline
          B Offline
          BastianH
          schrieb am zuletzt editiert von
          #84

          Hi,
          ich benötige mal eure Unterstützung, ich habe snips und mehreren Satelliten erfolgreich mit fhem verbunden. Jetzt würde ich gerne dies auch mit iobroaker testen. Da aber seit Februar die snips Console abgeschaltet wurde kann ich mir darüber nicht mehr einen eigenen Assistenten mit der iobroaker app erstellen.

          Daher die Frage an euch, hat jemand noch eine assistant_proj_...zip Datei (Damals unter deploy assistant als Download) oder kann jemand von seinem funktionierenden System den Order /usr/share/snips/assistant als zip bereitstellen?

          MFG BastianH

          tobetobeT 1 Antwort Letzte Antwort
          0
          • B BastianH

            Hi,
            ich benötige mal eure Unterstützung, ich habe snips und mehreren Satelliten erfolgreich mit fhem verbunden. Jetzt würde ich gerne dies auch mit iobroaker testen. Da aber seit Februar die snips Console abgeschaltet wurde kann ich mir darüber nicht mehr einen eigenen Assistenten mit der iobroaker app erstellen.

            Daher die Frage an euch, hat jemand noch eine assistant_proj_...zip Datei (Damals unter deploy assistant als Download) oder kann jemand von seinem funktionierenden System den Order /usr/share/snips/assistant als zip bereitstellen?

            MFG BastianH

            tobetobeT Offline
            tobetobeT Offline
            tobetobe
            schrieb am zuletzt editiert von
            #85

            @BastianH
            Hallo Bastian,
            leider kann ich dir dabei nicht weiterhelfen. Als ich mich im Dez19 bei snips anmelden wollte, war die Plattform schon für Neuzugänge gesperrt. Am besten, du schaust mal im Smcon-Forum oder bei anderen "Gestrandeten" hier: Snips auf ioBroker Forum

            Grüße
            Thomas

            Beste Grüße
            tobetobe

            1 Antwort Letzte Antwort
            0
            • joergeliJ joergeli

              @tobetobe
              Hallo Thomas,
              ich habe pixel_ring bei mir im Verzeichnis /home/pi/4mics_hat/pixel_ring installiert.
              Das ist das Verzeichnis, wo meine ReSpeaker-Dateien liegen, ist aber (wahrscheinlich) egal, wo es installiert wird.
              Ob mit oder ohne sudo weiß ich nicht mehr, allerdings gehören nach Installation der Ordner pixel_ring und die darunter liegenden Dateien/Ordner den User "pi".

              Mein python-script liegt im Ordner /home/pi/4mics_hat.
              Achtung: das Script läuft nur, wenn ich vorher die virtuelle Umgebung für Python starte.
              source /home/pi/env/bin/activate
              Diese virtuelle Umgebung wurde bei mir mit der Installation meines ReSpeaker Mic-Arrays angelegt.
              Die Eingabezeile im Terminal sieht dann so aus, wenn die virtuelle Umgebung aktiv ist:
              (env) pi@Rhasspy:~/4mics_hat $

              Anschließend kann ich das Script mit
              (env) pi@Rhasspy:~/4mics_hat $ python rhasspy_led_ring.py
              starten

              Hinweis: Das Script, bzw. die virtuelle Umgebung kann man nur mit
              Ctrl + c und anschl.
              (env) pi@Rhasspy:~/4mics_hat $ deactivate
              beenden.

              Damit das Script, bzw. der Pixel-Ring automatisch beim Boot gestartet wird, habe ich mit sudo nano .profile
              folgende Zeile in die Datei .profile eingefügt:
              (cd /home/pi/4mics_hat; echo "4Mic:Hat"; source /home/pi/env/bin/activate; echo "Virtuelle Umgebung gestartet"; python rhasspy_led_ring.py)&
              (Wichtig ist das & am Ende)
              Zuerst wird in das Verzeichnis /home/pi/4mics_hat gewechselt.
              Dann wird die virtuelle Umgebung gestasrtet: source /home/pi/env/bin/activate
              Das echo xxxxxxxx gibt nur einen Hinweistext aus.
              Anschließend wird der Pixel-Ring gestartet: python rhasspy_led_ring,py

              Man kann das Ganze wohl auch als Service implementieren, das habe ich aber nicht hinbekommen.

              Wie schon erwähnt, weiß ich nicht, ob das Script auch mit Deinem Matrix-Voice funktioniert
              Ich weiß z.B. nicht, ob die Befehle:

                  power = LED(5)
                  power.on()
              

              speziell für das ReSpeaker Mic-Array gelten.
              (Damit wird GPIO5 auf HIGH gesetzt.)

              Ich werde aber trotzdem abwarten, bis in einer künftigen Rhasspy-Version alle Hermes MQTT-Topics unterstützt werden,
              denn dann soll ja angeblich auch HERMES-LED funktionieren.

              Intent Recognition:
              Das Wakeword wird bei mir meist auch bei laufendem TV erkannt, nur mit der anschl. Intent-Erkennung hat es dann gehapert.
              Ich habe heute den Workaround implementiert, daß ich den Fernseher nach WakeWord-Erkennung stumm (mute) schalte und ein paar Sekunden nach Abschluß der Intent-Erkennung die Stummschaltung wieder aufhebe.
              Die Stummschaltung läuft bei mir über JavaScript -> Broadlink RM 3+ --> Umwandlung und Senden via Infrarot.
              Das funktioniert soweit ganz gut.

              Die Problematik hängt aber m.E. nicht nur mit dem Schallpegel zusammen, sondern ob im TV/Radio gerade gesprochen, oder Musik gespielt wird.
              Musik ist m.E. unproblematischer, wenn aber gesprochen wird, weiß Rhasspy nicht , "auf wen" er hören soll, auf den TV/Radio, oder meine Stimme - was dann i.d.R. mit einem "nicht erkannt" quittiert wird.
              Ich hatte mal bei einem Nachbarn, der Alexa hat, nachgefragt, wie das bei ihm funktioniert.
              Angeblich soll es keine Probleme geben, auch wenn die Box ziemlich nah beim Fernseher steht.
              Was bei mir natürlich die Frage aufkommen läßt " .... wie machen die das?"
              Reine Software-Lösung, und/oder spezielle Hardware?

              Reaktionszeit
              Ist bei mir so ca. 2-3 Sekunden.

              LAN/WLAN
              Ist das wirklich so relevant?
              Ich denke, daß Rhasspy ja erst mal die ganze Erkennungsprozedur abarbeitet und dann "nur" das Intent zu iobroker via MQTT übertragt. Die paar Byte sollten m.E. den Kohl nicht fett machen.
              Ich kann mich natürlich auch irren.

              Rhasspy-Satellit/Host
              Was für Hardware willst Du für den Host verwenden? Auch einen Raspi, oder was leistungsfähigeres?
              Halt mich mit Deinen Erfahrungen diesbzgl. mal auf dem Laufenden.

              Gruß
              Jörg

              Tom10webT Offline
              Tom10webT Offline
              Tom10web
              schrieb am zuletzt editiert von Tom10web
              #86

              @joergeli
              Hi, wieder Wochenende, Zeit zum testen.
              Versuche jetzt die LED Ansteuerung, die vorgegebenen Profile als Test funktionieren.
              Wenn ich aber die virtuelle Umgebung für Python starte
              source /home/pi/env/bin/activate
              lande ich hier : (env) pi@raspberrypi:~$
              und nicht im Ordner : (env) pi@Rhasspy:~/4mics_hat $
              4mics_hat ist vorhanden und die Dateien liegen auch darin.
              ich habe aber leider keine Ahnung von Python.
              Und natürlich kommt dann diese Fehlermeldung
              "pi@raspberrypi:~$ Virtuelle Umgebung gestartet
              python: can't open file 'rhasspy_led_ring.py': [Errno 2] No such file or directory" , habe auch schon probiert das script eine Ebene höher (pi)
              zu legen, auch keine Lösung, MQTT-Adresse und MQTT-Port sind angepasst, hat aber nichts direkt mit dem Scriptstart zu tun.
              Muss "hermesledcontrol" deaktiviert werden, dies startet doch jedes mal wieder mit oder reicht es die LED-Muster zu entfernen?

              Oder besser doch warten, auf eine neue Version von Rhasspy, in der es implementiert ist ? (ich würde es trotzdem gerne hinbekommen)

              Raspi3
              Beelink Bt3 X

              joergeliJ 1 Antwort Letzte Antwort
              0
              • Tom10webT Tom10web

                @joergeli
                Hi, wieder Wochenende, Zeit zum testen.
                Versuche jetzt die LED Ansteuerung, die vorgegebenen Profile als Test funktionieren.
                Wenn ich aber die virtuelle Umgebung für Python starte
                source /home/pi/env/bin/activate
                lande ich hier : (env) pi@raspberrypi:~$
                und nicht im Ordner : (env) pi@Rhasspy:~/4mics_hat $
                4mics_hat ist vorhanden und die Dateien liegen auch darin.
                ich habe aber leider keine Ahnung von Python.
                Und natürlich kommt dann diese Fehlermeldung
                "pi@raspberrypi:~$ Virtuelle Umgebung gestartet
                python: can't open file 'rhasspy_led_ring.py': [Errno 2] No such file or directory" , habe auch schon probiert das script eine Ebene höher (pi)
                zu legen, auch keine Lösung, MQTT-Adresse und MQTT-Port sind angepasst, hat aber nichts direkt mit dem Scriptstart zu tun.
                Muss "hermesledcontrol" deaktiviert werden, dies startet doch jedes mal wieder mit oder reicht es die LED-Muster zu entfernen?

                Oder besser doch warten, auf eine neue Version von Rhasspy, in der es implementiert ist ? (ich würde es trotzdem gerne hinbekommen)

                joergeliJ Online
                joergeliJ Online
                joergeli
                schrieb am zuletzt editiert von joergeli
                #87

                @Tom10web
                Hallo,
                "hermesledcontrol" habe ich kpl. deaktiviert ( sudo systemctl stop hermesledcontrol) weil es sonst wohl in Konflikt zu meinem Workaround kommt.

                Nochmals meine einzelnen Schritte:
                1.) Datei rhasspy_led_ring.py im Ordner /home/pi/4mics_hat mit folgendem Inhalt anlegen:

                import logging
                import time
                
                import paho.mqtt.client as mqtt
                from gpiozero import LED
                from pixel_ring import pixel_ring
                
                MQTT_IP = '192.168.192.29'
                MQTT_PORT = 1891
                
                
                def on_message(client, userdata, message):
                    if 'hermes/nlu/intentNotRecognized' == message.topic:
                        logging.info('intent not recognized')
                        pixel_ring.think()
                        time.sleep(0.5)
                        pixel_ring.off()
                
                
                
                    if 'hermes/asr/textCaptured' == message.topic:
                        logging.info('text recognized')
                        pixel_ring.speak()
                        time.sleep(2.5)
                        pixel_ring.off()
                
                
                
                    if 'rhasspy/de/transition/SnowboyWakeListener' == message.topic:
                        if 'loaded' == str(message.payload.decode("utf-8")):
                            logging.info('### Snowboy-Wake-Listener: listen')
                            pixel_ring.listen()
                            time.sleep(0.5)
                            pixel_ring.off()
                
                    if 'rhasspy/de/transition/WebrtcvadCommandListener' == message.topic:
                        if 'loaded' == str(message.payload.decode("utf-8")):
                            logging.info('### WebCard: listen')
                            pixel_ring.think()
                            time.sleep(1.5)
                            pixel_ring.off()
                
                    if 'rhasspy/speech-to-text/transcription' == message.topic:
                        if 'loaded' != str(message.payload.decode("utf-8")):
                            logging.info('### Text: listen')
                            pixel_ring.speak()
                            time.sleep(2.5)
                            pixel_ring.off()
                
                
                
                
                
                    if message.topic.startswith('hermes/intent/'):
                        logging.info('intent ' + message.topic.rpartition('/')[-1])
                
                #    if 'rhasspy/de/transition/MaryTTSSentenceSpeaker' == message.topic:
                #        state = str(message.payload.decode("utf-8"))
                #        if 'speaking' == state:
                #            logging.info('speaking')
                #            pixel_ring.speak()
                #       elif 'ready' == state:
                #            logging.info('speaking done')
                #            pixel_ring.off()
                
                
                if __name__ == '__main__':
                #    logging.basicConfig(filename='test.log', level=logging.INFO)
                    power = LED(5)
                    power.on()
                
                    pixel_ring.set_brightness(10)
                    pixel_ring.change_pattern('echo')
                
                    client = mqtt.Client('Rhasspy')
                    client.connect(MQTT_IP, port=MQTT_PORT)
                    client.on_message = on_message
                    client.loop_start()
                    client.subscribe('hermes/nlu/intentNotRecognized')
                    client.subscribe('hermes/asr/textCaptured')
                    client.subscribe('rhasspy/de/transition/SnowboyWakeListener')
                    client.subscribe('rhasspy/de/transition/WebrtcvadCommandListener')
                    client.subscribe('rhasspy/speech-to-text/transcription')
                    client.subscribe('hermes/intent/#')
                    client.subscribe('rhasspy/de/transition/MaryTTSSentenceSpeaker')
                    logging.info('starting pixels')
                
                    while True:
                        try:
                            time.sleep(3)
                        except KeyboardInterrupt:
                            client.loop_stop()
                            break
                
                    pixel_ring.off()
                    power.off()
                    time.sleep(1)
                
                

                Im Script musst Du MQTT_IP und MQTT_PORT natürlich auf Deine eigenen Gegebenheiten anpassen

                Dieses Python-Script reagiert auf die entspr. Rhasspy-Topics ( Befehl not recognized, Text recognized, Wakeword erkannt, etc.) und steuert dann den 4 Mics-Hat LED-Ring mit verschiedenen Mustern an.

                2.)
                Damit das Ganze automatisch, d.h. nach dem Booten funktioniert, habe ich folgende Zeile am Ende der Datei /home/pi/.profile ( sudo nano /home/pi/.profile) angehängt:

                (cd /home/pi/4mics_hat; echo "4Mic:Hat"; source /home/pi/env/bin/activate; echo "Virtuelle Umgebung gestartet"; python rhasspy_led_ring.py)&
                
                

                Wichtig ist das & am Ende der Zeile!

                Nach einem Reboot des Raspi sollte dann der LED-Ring bei Rhasspy-Sprachkommandos reagieren.
                Das läuft bei mir soweit, ich werde diesbzgl. aber erst weitermachen, wenn Rhasspy 2.5 verfügbar ist.

                Gruß
                Jörg

                tobetobeT 1 Antwort Letzte Antwort
                0
                • joergeliJ joergeli

                  @Tom10web
                  Hallo,
                  "hermesledcontrol" habe ich kpl. deaktiviert ( sudo systemctl stop hermesledcontrol) weil es sonst wohl in Konflikt zu meinem Workaround kommt.

                  Nochmals meine einzelnen Schritte:
                  1.) Datei rhasspy_led_ring.py im Ordner /home/pi/4mics_hat mit folgendem Inhalt anlegen:

                  import logging
                  import time
                  
                  import paho.mqtt.client as mqtt
                  from gpiozero import LED
                  from pixel_ring import pixel_ring
                  
                  MQTT_IP = '192.168.192.29'
                  MQTT_PORT = 1891
                  
                  
                  def on_message(client, userdata, message):
                      if 'hermes/nlu/intentNotRecognized' == message.topic:
                          logging.info('intent not recognized')
                          pixel_ring.think()
                          time.sleep(0.5)
                          pixel_ring.off()
                  
                  
                  
                      if 'hermes/asr/textCaptured' == message.topic:
                          logging.info('text recognized')
                          pixel_ring.speak()
                          time.sleep(2.5)
                          pixel_ring.off()
                  
                  
                  
                      if 'rhasspy/de/transition/SnowboyWakeListener' == message.topic:
                          if 'loaded' == str(message.payload.decode("utf-8")):
                              logging.info('### Snowboy-Wake-Listener: listen')
                              pixel_ring.listen()
                              time.sleep(0.5)
                              pixel_ring.off()
                  
                      if 'rhasspy/de/transition/WebrtcvadCommandListener' == message.topic:
                          if 'loaded' == str(message.payload.decode("utf-8")):
                              logging.info('### WebCard: listen')
                              pixel_ring.think()
                              time.sleep(1.5)
                              pixel_ring.off()
                  
                      if 'rhasspy/speech-to-text/transcription' == message.topic:
                          if 'loaded' != str(message.payload.decode("utf-8")):
                              logging.info('### Text: listen')
                              pixel_ring.speak()
                              time.sleep(2.5)
                              pixel_ring.off()
                  
                  
                  
                  
                  
                      if message.topic.startswith('hermes/intent/'):
                          logging.info('intent ' + message.topic.rpartition('/')[-1])
                  
                  #    if 'rhasspy/de/transition/MaryTTSSentenceSpeaker' == message.topic:
                  #        state = str(message.payload.decode("utf-8"))
                  #        if 'speaking' == state:
                  #            logging.info('speaking')
                  #            pixel_ring.speak()
                  #       elif 'ready' == state:
                  #            logging.info('speaking done')
                  #            pixel_ring.off()
                  
                  
                  if __name__ == '__main__':
                  #    logging.basicConfig(filename='test.log', level=logging.INFO)
                      power = LED(5)
                      power.on()
                  
                      pixel_ring.set_brightness(10)
                      pixel_ring.change_pattern('echo')
                  
                      client = mqtt.Client('Rhasspy')
                      client.connect(MQTT_IP, port=MQTT_PORT)
                      client.on_message = on_message
                      client.loop_start()
                      client.subscribe('hermes/nlu/intentNotRecognized')
                      client.subscribe('hermes/asr/textCaptured')
                      client.subscribe('rhasspy/de/transition/SnowboyWakeListener')
                      client.subscribe('rhasspy/de/transition/WebrtcvadCommandListener')
                      client.subscribe('rhasspy/speech-to-text/transcription')
                      client.subscribe('hermes/intent/#')
                      client.subscribe('rhasspy/de/transition/MaryTTSSentenceSpeaker')
                      logging.info('starting pixels')
                  
                      while True:
                          try:
                              time.sleep(3)
                          except KeyboardInterrupt:
                              client.loop_stop()
                              break
                  
                      pixel_ring.off()
                      power.off()
                      time.sleep(1)
                  
                  

                  Im Script musst Du MQTT_IP und MQTT_PORT natürlich auf Deine eigenen Gegebenheiten anpassen

                  Dieses Python-Script reagiert auf die entspr. Rhasspy-Topics ( Befehl not recognized, Text recognized, Wakeword erkannt, etc.) und steuert dann den 4 Mics-Hat LED-Ring mit verschiedenen Mustern an.

                  2.)
                  Damit das Ganze automatisch, d.h. nach dem Booten funktioniert, habe ich folgende Zeile am Ende der Datei /home/pi/.profile ( sudo nano /home/pi/.profile) angehängt:

                  (cd /home/pi/4mics_hat; echo "4Mic:Hat"; source /home/pi/env/bin/activate; echo "Virtuelle Umgebung gestartet"; python rhasspy_led_ring.py)&
                  
                  

                  Wichtig ist das & am Ende der Zeile!

                  Nach einem Reboot des Raspi sollte dann der LED-Ring bei Rhasspy-Sprachkommandos reagieren.
                  Das läuft bei mir soweit, ich werde diesbzgl. aber erst weitermachen, wenn Rhasspy 2.5 verfügbar ist.

                  Gruß
                  Jörg

                  tobetobeT Offline
                  tobetobeT Offline
                  tobetobe
                  schrieb am zuletzt editiert von
                  #88

                  @joergeli said in Rhasspy Offline Sprachsteuerung:

                  Nochmals meine einzelnen Schritte:

                  Hallo Jörg,

                  ich habe dein Skript noch immer nicht zum Laufen bekommen ;-((
                  Allerdings habe ich auf GitHub passend zu meinem Matrix Voice ein Skript zur Ansteuerung der LEDs über Rhasspy, also über Sprachkommando gefunden, welches auch funktioniert. Meine ersten Versuche, Code-Schnipsel aus deinem Skript bei mir einzubauen, waren erfolglos. Sos sieht das von mir verwendete Skript aus:

                  import websocket
                  import requests
                  import json
                  import logging
                  import time
                  import paho.mqtt.client as mqtt
                  from matrix_lite import led
                  #from pixel_ring import pixel_ring

                  MQTT_IP = '192.168.13.152'
                  MQTT_PORT = 1883

                  def say(text):
                  url = "http://localhost:12101/api/text-to-speech"
                  requests.post(url, text)

                  Intents are passed through here

                  def on_message(ws, message):

                  data = json.loads(message)
                  print("**Captured New Intent**")
                  print(data)
                  
                  
                  if ("Led" == data["intent"]["name"]):
                      led.set(data["slots"]["color"])
                      say("Matrix ist jetzt: " + data["slots"]["color"])
                  

                  Zum Testen:

                  def on_message(client, userdata, message):

                  if 'hermes/nlu/intentNotRecognized' == message.topic:
                      led.set(data["slots"]["red"])
                      say("Matrix ist jetzt: " + data["slots"]["color"])
                  

                  Ende Test

                  def on_error(ws, error):
                  print(error)

                  def on_close(ws):
                  print("\nDisconnected\n")

                  def on_open(ws):
                  print("\nConnected\n")

                  Start web socket client

                  if name == "main":
                  ws = websocket.WebSocketApp("ws://localhost:12101/api/events/intent",
                  on_message = on_message,
                  on_error = on_error,
                  on_close = on_close)
                  ws.on_open = on_open
                  ws.run_forever()

                  Wie du siehst, findet mit diesem Skript auch eine Sprachausgabe auf dem Rhasspy statt. In diesem Zusammenhang habe ich mit den Settings gespielt, weil mir die Ausgabe mit eSpeak überhaupt nicht gefiel. In den Settings habe ich daher auf PicoTTS umgestellt und unter "Advanced" das Profil folgendermaßen ergänzt:

                  "text_to_speech": {
                    "system": "picotts",
                    "picotts": {
                      "language": "de-DE"
                    }
                  }
                  

                  Die Aussprache finde ich, ist völlig akzentfrei und die Stimme sehr angenehm.

                  Ich dachte, das könnte dich ggf auch interessieren.

                  Bis zum nächsten Mal
                  Thomas

                  Beste Grüße
                  tobetobe

                  joergeliJ 1 Antwort Letzte Antwort
                  0
                  • tobetobeT tobetobe

                    @joergeli said in Rhasspy Offline Sprachsteuerung:

                    Nochmals meine einzelnen Schritte:

                    Hallo Jörg,

                    ich habe dein Skript noch immer nicht zum Laufen bekommen ;-((
                    Allerdings habe ich auf GitHub passend zu meinem Matrix Voice ein Skript zur Ansteuerung der LEDs über Rhasspy, also über Sprachkommando gefunden, welches auch funktioniert. Meine ersten Versuche, Code-Schnipsel aus deinem Skript bei mir einzubauen, waren erfolglos. Sos sieht das von mir verwendete Skript aus:

                    import websocket
                    import requests
                    import json
                    import logging
                    import time
                    import paho.mqtt.client as mqtt
                    from matrix_lite import led
                    #from pixel_ring import pixel_ring

                    MQTT_IP = '192.168.13.152'
                    MQTT_PORT = 1883

                    def say(text):
                    url = "http://localhost:12101/api/text-to-speech"
                    requests.post(url, text)

                    Intents are passed through here

                    def on_message(ws, message):

                    data = json.loads(message)
                    print("**Captured New Intent**")
                    print(data)
                    
                    
                    if ("Led" == data["intent"]["name"]):
                        led.set(data["slots"]["color"])
                        say("Matrix ist jetzt: " + data["slots"]["color"])
                    

                    Zum Testen:

                    def on_message(client, userdata, message):

                    if 'hermes/nlu/intentNotRecognized' == message.topic:
                        led.set(data["slots"]["red"])
                        say("Matrix ist jetzt: " + data["slots"]["color"])
                    

                    Ende Test

                    def on_error(ws, error):
                    print(error)

                    def on_close(ws):
                    print("\nDisconnected\n")

                    def on_open(ws):
                    print("\nConnected\n")

                    Start web socket client

                    if name == "main":
                    ws = websocket.WebSocketApp("ws://localhost:12101/api/events/intent",
                    on_message = on_message,
                    on_error = on_error,
                    on_close = on_close)
                    ws.on_open = on_open
                    ws.run_forever()

                    Wie du siehst, findet mit diesem Skript auch eine Sprachausgabe auf dem Rhasspy statt. In diesem Zusammenhang habe ich mit den Settings gespielt, weil mir die Ausgabe mit eSpeak überhaupt nicht gefiel. In den Settings habe ich daher auf PicoTTS umgestellt und unter "Advanced" das Profil folgendermaßen ergänzt:

                    "text_to_speech": {
                      "system": "picotts",
                      "picotts": {
                        "language": "de-DE"
                      }
                    }
                    

                    Die Aussprache finde ich, ist völlig akzentfrei und die Stimme sehr angenehm.

                    Ich dachte, das könnte dich ggf auch interessieren.

                    Bis zum nächsten Mal
                    Thomas

                    joergeliJ Online
                    joergeliJ Online
                    joergeli
                    schrieb am zuletzt editiert von
                    #89

                    @tobetobe
                    Hallo Thomas,
                    wie gesagt, ich hatte ja geschrieben, daß ich nicht weiß, ob das Script mit Deinem Matrix-Voice funktioniert, weil da einige Sachen drin sind, die wohl speziell nur für das Respeaker Mic-Array zutreffen.

                    Sprachausgabe direkt auf dem Rhasspy interessiert mich natürlich, muss aber erst noch meinen Mini-NF-Verstärker mit dem Rhasspy verbinden.
                    Ich nehme an, das "Herzstück" in Deinem Script ist die Zeile url = "http://localhost:12101/api/text-to-speech", wo die API angezapft wird?

                    Kannst Du mal ein paar Beispiel-Sprachausgaben posten, weil ich mir momentan unter "say("Matrix ist jetzt: " + data["slots"]["color"])" nichts rechtes vorstellen kann.
                    Wird da sowas wie "Matrix ist jetzt Wohnzimmerlampe grün" gesprochen?

                    Gruß
                    Jörg

                    tobetobeT 1 Antwort Letzte Antwort
                    0
                    • joergeliJ joergeli

                      @tobetobe
                      Hallo Thomas,
                      wie gesagt, ich hatte ja geschrieben, daß ich nicht weiß, ob das Script mit Deinem Matrix-Voice funktioniert, weil da einige Sachen drin sind, die wohl speziell nur für das Respeaker Mic-Array zutreffen.

                      Sprachausgabe direkt auf dem Rhasspy interessiert mich natürlich, muss aber erst noch meinen Mini-NF-Verstärker mit dem Rhasspy verbinden.
                      Ich nehme an, das "Herzstück" in Deinem Script ist die Zeile url = "http://localhost:12101/api/text-to-speech", wo die API angezapft wird?

                      Kannst Du mal ein paar Beispiel-Sprachausgaben posten, weil ich mir momentan unter "say("Matrix ist jetzt: " + data["slots"]["color"])" nichts rechtes vorstellen kann.
                      Wird da sowas wie "Matrix ist jetzt Wohnzimmerlampe grün" gesprochen?

                      Gruß
                      Jörg

                      tobetobeT Offline
                      tobetobeT Offline
                      tobetobe
                      schrieb am zuletzt editiert von
                      #90

                      @joergeli

                      Hallo Jörg,

                      zunächst mal sorry, dass der Text im Spoiler so schlecht formatiert ist. Das ist mir beim Hineinkopieren gar nicht aufgefallen. Das ist von der ersten bis zur letzten Zeile im Spoiler der komplette Skript-Inhalt. Für die Sprachausgabe sind wahrscheinlich alle Zeilen mit der url "localhost" sowie mit dem Kommando "say" relevant. In der Sentences.ini steht bei mir:

                      [Led]
                      ($synonyms_change_command) [(die | das | den)] device [auf] (red | green | blue | purple | yellow | black){color}
                      

                      wobei "$synonyms_change_command" bei mir nur auf den Slot mit den Kommandos (Setze, stelle, mache, etc) verweist. Ansonsten gibt es in den Slots keine weiteren Informationen. Ich muss also per Sprachbefehl lediglich "Setze das Device auf green" eingeben. (Bei den Farben habe ich es der Einfachheit halber erst einmal bei den englischen Begriffen belassen).

                      So wie es für mich aussieht, müsste es für dein Mikrofon doch möglich sein, nicht nur die LEDs anzusteuern, sondern auch eine Sprachansage vorzunehmen. Wenn man das irgendwie hinbekommt, wäre das für mich der nächste Schritt, um auch Ansagen über Datum, Zeit, Wetter etc am Rhasspy ausgeben zu können. Die halte ich persönlich für interessanter, als eine zur LED-Anzeige redundante Statusinformation per Sprachausgabe.

                      Mich interessiert deine Meinung. Siehst du das auch so?

                      Gruß Thomas

                      Beste Grüße
                      tobetobe

                      joergeliJ 1 Antwort Letzte Antwort
                      0
                      • tobetobeT tobetobe

                        @joergeli

                        Hallo Jörg,

                        zunächst mal sorry, dass der Text im Spoiler so schlecht formatiert ist. Das ist mir beim Hineinkopieren gar nicht aufgefallen. Das ist von der ersten bis zur letzten Zeile im Spoiler der komplette Skript-Inhalt. Für die Sprachausgabe sind wahrscheinlich alle Zeilen mit der url "localhost" sowie mit dem Kommando "say" relevant. In der Sentences.ini steht bei mir:

                        [Led]
                        ($synonyms_change_command) [(die | das | den)] device [auf] (red | green | blue | purple | yellow | black){color}
                        

                        wobei "$synonyms_change_command" bei mir nur auf den Slot mit den Kommandos (Setze, stelle, mache, etc) verweist. Ansonsten gibt es in den Slots keine weiteren Informationen. Ich muss also per Sprachbefehl lediglich "Setze das Device auf green" eingeben. (Bei den Farben habe ich es der Einfachheit halber erst einmal bei den englischen Begriffen belassen).

                        So wie es für mich aussieht, müsste es für dein Mikrofon doch möglich sein, nicht nur die LEDs anzusteuern, sondern auch eine Sprachansage vorzunehmen. Wenn man das irgendwie hinbekommt, wäre das für mich der nächste Schritt, um auch Ansagen über Datum, Zeit, Wetter etc am Rhasspy ausgeben zu können. Die halte ich persönlich für interessanter, als eine zur LED-Anzeige redundante Statusinformation per Sprachausgabe.

                        Mich interessiert deine Meinung. Siehst du das auch so?

                        Gruß Thomas

                        joergeliJ Online
                        joergeliJ Online
                        joergeli
                        schrieb am zuletzt editiert von
                        #91

                        @tobetobe
                        Hallo Thomas,
                        ja klar, "aussagekräftige" Sprachausgaben sind natürlich wünschenswert.
                        Die sind aber m.E. nur auf dem Rhasspy allein nicht realisierbar ( zumindest wenn man sich -wie ich- mit Python nicht auskennt).
                        Somit müssen sie an anderer Stelle, sprich: mit ioBroker erzeugt werden.

                        Wie Du weißt, reagiere "ich" ja schon jetzt auf Rhasspy-Intents per JavaScript.
                        vereinfachtes Beispiel:
                        Frage an Rhasspy: Hat es heute geregnet?
                        -> Rhasspy sendet Intent mit Inhalt "geregnet" an ioBroker.
                        -> JavaScript reagiert auf "geregnet".
                        -> JavaScript generiert Antwort aus den vorhandenen Datenpunkten:
                        Regenmenge = 0 -> Antwort:"Nein, bisher war es trocken"
                        Regenmenge = 0 und Regendauer > 0 -> Antwort: "Ja, aber es gab nur geringen Niederschlag."
                        Regenmenge > 0 -> Antwort: "Ja, es hat heute xx Liter pro Quadratmeter geregnet."
                        -> entspr. Antwort wird mittels PAW-Adapter an Tablet gesendet und dort per Sprache ausgegeben.

                        Wenn es - wie in Deinem Python-Script beschrieben - ausreicht, diese Antwort an die API von Rhasspy zu senden, dann sollte es mit say(antwort) möglich sein, die Antwort auf den Rhasspy-Lautsprecher(n) auszugeben.

                        Im Prinzip stelle ich mir das so vor:
                        -> Intent von Rhasspy wird in ioBroker empfangen.
                        -> ioBroker generiert per JavaScript die entspr. Antwort.
                        .> ioBroker schreibt die Antwort in einen eigenen Datenpunkt.
                        -> bei jeder Änderung dieses Datenpunktes wird der Inhalt des Datenpunktes ( = Antworttext) an Rhasspy gesendet.
                        -> Rhasspy reagiert mittels Python-Script auf diese Antwort und erzeugt mittels TexttoSpeech-engine die akustische Ausgabe.
                        Somit sollte es möglich sein, je nach Intent, beliebige Sprachausgaben auf dem Rhasspy zu erzeugen.
                        Der Nachteil dabei ist, daß man alle zutreffenden Antworten mittels JavaScript manuell erzeugen, d.h. selbst proggen muß.

                        Ich werde am Wochenende mal probieren, ob mir das gelingt, momentan habe ich von der "Regierung" andere Prioritäten gesetzt bekommen :relieved:

                        tobetobeT 1 Antwort Letzte Antwort
                        0
                        • joergeliJ joergeli

                          @tobetobe
                          Hallo Thomas,
                          ja klar, "aussagekräftige" Sprachausgaben sind natürlich wünschenswert.
                          Die sind aber m.E. nur auf dem Rhasspy allein nicht realisierbar ( zumindest wenn man sich -wie ich- mit Python nicht auskennt).
                          Somit müssen sie an anderer Stelle, sprich: mit ioBroker erzeugt werden.

                          Wie Du weißt, reagiere "ich" ja schon jetzt auf Rhasspy-Intents per JavaScript.
                          vereinfachtes Beispiel:
                          Frage an Rhasspy: Hat es heute geregnet?
                          -> Rhasspy sendet Intent mit Inhalt "geregnet" an ioBroker.
                          -> JavaScript reagiert auf "geregnet".
                          -> JavaScript generiert Antwort aus den vorhandenen Datenpunkten:
                          Regenmenge = 0 -> Antwort:"Nein, bisher war es trocken"
                          Regenmenge = 0 und Regendauer > 0 -> Antwort: "Ja, aber es gab nur geringen Niederschlag."
                          Regenmenge > 0 -> Antwort: "Ja, es hat heute xx Liter pro Quadratmeter geregnet."
                          -> entspr. Antwort wird mittels PAW-Adapter an Tablet gesendet und dort per Sprache ausgegeben.

                          Wenn es - wie in Deinem Python-Script beschrieben - ausreicht, diese Antwort an die API von Rhasspy zu senden, dann sollte es mit say(antwort) möglich sein, die Antwort auf den Rhasspy-Lautsprecher(n) auszugeben.

                          Im Prinzip stelle ich mir das so vor:
                          -> Intent von Rhasspy wird in ioBroker empfangen.
                          -> ioBroker generiert per JavaScript die entspr. Antwort.
                          .> ioBroker schreibt die Antwort in einen eigenen Datenpunkt.
                          -> bei jeder Änderung dieses Datenpunktes wird der Inhalt des Datenpunktes ( = Antworttext) an Rhasspy gesendet.
                          -> Rhasspy reagiert mittels Python-Script auf diese Antwort und erzeugt mittels TexttoSpeech-engine die akustische Ausgabe.
                          Somit sollte es möglich sein, je nach Intent, beliebige Sprachausgaben auf dem Rhasspy zu erzeugen.
                          Der Nachteil dabei ist, daß man alle zutreffenden Antworten mittels JavaScript manuell erzeugen, d.h. selbst proggen muß.

                          Ich werde am Wochenende mal probieren, ob mir das gelingt, momentan habe ich von der "Regierung" andere Prioritäten gesetzt bekommen :relieved:

                          tobetobeT Offline
                          tobetobeT Offline
                          tobetobe
                          schrieb am zuletzt editiert von
                          #92

                          @joergeli said in Rhasspy Offline Sprachsteuerung:

                          ( zumindest wenn man sich -wie ich- mit Python nicht auskennt).

                          das ist leider auch mein Problem

                          @joergeli said in Rhasspy Offline Sprachsteuerung:

                          Wenn es - wie in Deinem Python-Script beschrieben - ausreicht, diese Antwort an die API von Rhasspy zu senden, dann sollte es mit say(antwort) möglich sein, die Antwort auf den Rhasspy-Lautsprecher(n) auszugeben.
                          genau das wäre zu verifizieren, denn es wäre ja unabhängig vom verwendten Mikrofon

                          @joergeli said in Rhasspy Offline Sprachsteuerung:

                          Im Prinzip stelle ich mir das so vor:

                          Dieser Überlegung zu einem Vorgehen würde ich mich zu 10% anschließen

                          @joergeli said in Rhasspy Offline Sprachsteuerung:

                          momentan habe ich von der "Regierung" andere Prioritäten gesetzt bekommen

                          ich schätze deine Meinung, möchte dich jedoch keinesfalls zu irgendetwas drängen. Auch habe ich überhaupt keine "Forderungen". Insofern fühl dich bitte vollkommen frei, so zu verfahren, wie du möchtest.

                          Beste Grüße
                          tobetobe

                          joergeliJ 1 Antwort Letzte Antwort
                          0
                          • tobetobeT tobetobe

                            @joergeli said in Rhasspy Offline Sprachsteuerung:

                            ( zumindest wenn man sich -wie ich- mit Python nicht auskennt).

                            das ist leider auch mein Problem

                            @joergeli said in Rhasspy Offline Sprachsteuerung:

                            Wenn es - wie in Deinem Python-Script beschrieben - ausreicht, diese Antwort an die API von Rhasspy zu senden, dann sollte es mit say(antwort) möglich sein, die Antwort auf den Rhasspy-Lautsprecher(n) auszugeben.
                            genau das wäre zu verifizieren, denn es wäre ja unabhängig vom verwendten Mikrofon

                            @joergeli said in Rhasspy Offline Sprachsteuerung:

                            Im Prinzip stelle ich mir das so vor:

                            Dieser Überlegung zu einem Vorgehen würde ich mich zu 10% anschließen

                            @joergeli said in Rhasspy Offline Sprachsteuerung:

                            momentan habe ich von der "Regierung" andere Prioritäten gesetzt bekommen

                            ich schätze deine Meinung, möchte dich jedoch keinesfalls zu irgendetwas drängen. Auch habe ich überhaupt keine "Forderungen". Insofern fühl dich bitte vollkommen frei, so zu verfahren, wie du möchtest.

                            joergeliJ Online
                            joergeliJ Online
                            joergeli
                            schrieb am zuletzt editiert von
                            #93

                            @tobetobe sagte in Rhasspy Offline Sprachsteuerung:

                            Dieser Überlegung zu einem Vorgehen würde ich mich zu 10% anschließen

                            ... und bei den restlichen 90% hast Du Bedenken? :grin: :grin: :grin:

                            @tobetobe sagte in Rhasspy Offline Sprachsteuerung:

                            ich schätze deine Meinung, möchte dich jedoch keinesfalls zu irgendetwas drängen. Auch habe ich überhaupt keine "Forderungen". Insofern fühl dich bitte vollkommen frei, so zu verfahren, wie du möchtest.

                            Habe ich auch nicht so aufgefasst, mich juckt es ja selbst in den Fingern das zu testen

                            tobetobeT 1 Antwort Letzte Antwort
                            0
                            • joergeliJ joergeli

                              @tobetobe sagte in Rhasspy Offline Sprachsteuerung:

                              Dieser Überlegung zu einem Vorgehen würde ich mich zu 10% anschließen

                              ... und bei den restlichen 90% hast Du Bedenken? :grin: :grin: :grin:

                              @tobetobe sagte in Rhasspy Offline Sprachsteuerung:

                              ich schätze deine Meinung, möchte dich jedoch keinesfalls zu irgendetwas drängen. Auch habe ich überhaupt keine "Forderungen". Insofern fühl dich bitte vollkommen frei, so zu verfahren, wie du möchtest.

                              Habe ich auch nicht so aufgefasst, mich juckt es ja selbst in den Fingern das zu testen

                              tobetobeT Offline
                              tobetobeT Offline
                              tobetobe
                              schrieb am zuletzt editiert von
                              #94

                              @joergeli said in Rhasspy Offline Sprachsteuerung:

                              ... und bei den restlichen 90% hast Du Bedenken?

                              Erwischt!!! Ein Tipfehler...

                              Ich habe mich heute auch noch einmal intensiv mit dem Thema beschäftigt. Zunächst gibt es einen ganz einfachen Weg, Sprachausgaben auf dem Rhasspy mit dem jeweils aktivierten TTS-Modul (bei mir PicoTTS) zu testen. Hierzu in der Rhasspy-Oberfläche einfach auf das Feld mit der Versionsnummer klicken. Man erhält dann direkten Zugang zur API. Weiter unten gibt es dann die Möglichkeit, einen eigenen Text an den Rhasspy zu schicken, der dann über die Lautsprecherbuchse ausgegeben wird. Alternativ kann man die Seite auch durch Aufruf im Browser finden:

                              http://<IP>:12101/api/#/default/post_api_text_to_speech
                              

                              Die Beschreibung zur API hier:

                              https://rhasspy.readthedocs.io/en/latest/reference/#http-api
                              

                              Nun habe ich versucht, mithilfe vorhandener Skripts, Befehle an diese API-Schnittstelle zu senden. Zum Einen mit dem Befehl "send", zum Anderen mit "request" bzw. XMLHttpRequest. Für Letzteres mus "xmlhttprequest" als zusätzliches Modul im JS-Adapter eingetragen sein.

                              Hier meine beiden Skripte:

                              1. Mit send:
                              // Skript zur Abfrage von Temperaturen
                              var intentResult = $('mqtt.0.rhasspy.intent.*Temperature');
                              var intentArray = [];
                              var url = "http://<IP>:12101/api/text-to-speech?repeat=false&play=true";
                              var method = "POST";
                              var shouldBeAsync = true;
                              
                              
                               for(var i = 0; i < intentResult.length; i++)
                              {
                                  log(intentResult[i]);
                                  intentArray.push(intentResult[i]);
                              }
                              
                              on({id: intentArray, change: "any"}, function (obj) {
                              //   log(obj.newState.val);
                              
                                  let intentObject = JSON.parse(obj.newState.val);
                                     if(intentObject.hasOwnProperty('device'))
                                  {
                                      var deviceID = intentObject.device;
                                      var state = intentObject.state;
                                      var value = getState(deviceID + state);
                                      var postData = value.val;
                                      log(value.val); 
                                      sendTo('http://<IP>:12101/api/text-to-speech?repeat=false&play=true', 'send', 'value.val + "Grad Celsius"');
                                  }
                              });
                              

                              Dieses gibt im Log die Temperatur richtig aus, sendet die Daten jedoch nicht an Rhasspy.

                              Bei dem Skript mit "request" bekomme ich schon Fehlermeldungen zu Zeile 8. Offensichtlich wird xmlhttprequest trotz im JS-Adapter installiertem Zusatzmodul nicht erkannt.

                              //Skript zur Abfrage von Temperaturen
                              var intentResult = $('mqtt.0.rhasspy.intent.*Temperature');
                              var intentArray = [];
                              var url = "http://192.168.13.157:12101/api/text-to-speech";
                              var method = "POST";
                              var shouldBeAsync = true;
                              
                              var request = new XMLHttpRequest();
                              
                              
                               for(var i = 0; i < intentResult.length; i++)
                              {
                                  log(intentResult[i]);
                                  intentArray.push(intentResult[i]);
                              }
                              
                              on({id: intentArray, change: "any"}, function (obj) {
                                  log(obj.newState.val);
                              
                                  let intentObject = JSON.parse(obj.newState.val);
                                     if(intentObject.hasOwnProperty('device'))
                                  {
                                      var deviceID = intentObject.device;
                                      var state = intentObject.state;
                                      var value = getState(deviceID + state);
                                      var postData = value.val;
                              
                                      request.open(method, url, shouldBeAsync);
                                      request.setRequestHeader("Content-Type", "text/plain;charset=UTF-8");
                                      request.push(postData);
                              // ggf. letzten Befehl alternativ mit .send statt mit .push        
                                      log(postData);            
                                  }
                              });
                              
                              

                              Die dritte Möglichkeit wäre über jQuery, mit der ich mich jedoch noch nicht befasst habe. Hier mal ein Code-Fetzen:

                              /*
                                          jQuery.ajax({
                                          method: "POST",
                                          url: "save.php",
                                          data: { image: canvasToDataURLString }
                                          });
                              */
                              

                              Dies soweit nur zu deiner Info. Ich wende mich mal an andere Forenmitglieder, die sich schon mit ähnlichen Aufgabenstellungen befasst haben.

                              Gruß
                              Thomas

                              Beste Grüße
                              tobetobe

                              joergeliJ 1 Antwort Letzte Antwort
                              0
                              • tobetobeT tobetobe

                                @joergeli said in Rhasspy Offline Sprachsteuerung:

                                ... und bei den restlichen 90% hast Du Bedenken?

                                Erwischt!!! Ein Tipfehler...

                                Ich habe mich heute auch noch einmal intensiv mit dem Thema beschäftigt. Zunächst gibt es einen ganz einfachen Weg, Sprachausgaben auf dem Rhasspy mit dem jeweils aktivierten TTS-Modul (bei mir PicoTTS) zu testen. Hierzu in der Rhasspy-Oberfläche einfach auf das Feld mit der Versionsnummer klicken. Man erhält dann direkten Zugang zur API. Weiter unten gibt es dann die Möglichkeit, einen eigenen Text an den Rhasspy zu schicken, der dann über die Lautsprecherbuchse ausgegeben wird. Alternativ kann man die Seite auch durch Aufruf im Browser finden:

                                http://<IP>:12101/api/#/default/post_api_text_to_speech
                                

                                Die Beschreibung zur API hier:

                                https://rhasspy.readthedocs.io/en/latest/reference/#http-api
                                

                                Nun habe ich versucht, mithilfe vorhandener Skripts, Befehle an diese API-Schnittstelle zu senden. Zum Einen mit dem Befehl "send", zum Anderen mit "request" bzw. XMLHttpRequest. Für Letzteres mus "xmlhttprequest" als zusätzliches Modul im JS-Adapter eingetragen sein.

                                Hier meine beiden Skripte:

                                1. Mit send:
                                // Skript zur Abfrage von Temperaturen
                                var intentResult = $('mqtt.0.rhasspy.intent.*Temperature');
                                var intentArray = [];
                                var url = "http://<IP>:12101/api/text-to-speech?repeat=false&play=true";
                                var method = "POST";
                                var shouldBeAsync = true;
                                
                                
                                 for(var i = 0; i < intentResult.length; i++)
                                {
                                    log(intentResult[i]);
                                    intentArray.push(intentResult[i]);
                                }
                                
                                on({id: intentArray, change: "any"}, function (obj) {
                                //   log(obj.newState.val);
                                
                                    let intentObject = JSON.parse(obj.newState.val);
                                       if(intentObject.hasOwnProperty('device'))
                                    {
                                        var deviceID = intentObject.device;
                                        var state = intentObject.state;
                                        var value = getState(deviceID + state);
                                        var postData = value.val;
                                        log(value.val); 
                                        sendTo('http://<IP>:12101/api/text-to-speech?repeat=false&play=true', 'send', 'value.val + "Grad Celsius"');
                                    }
                                });
                                

                                Dieses gibt im Log die Temperatur richtig aus, sendet die Daten jedoch nicht an Rhasspy.

                                Bei dem Skript mit "request" bekomme ich schon Fehlermeldungen zu Zeile 8. Offensichtlich wird xmlhttprequest trotz im JS-Adapter installiertem Zusatzmodul nicht erkannt.

                                //Skript zur Abfrage von Temperaturen
                                var intentResult = $('mqtt.0.rhasspy.intent.*Temperature');
                                var intentArray = [];
                                var url = "http://192.168.13.157:12101/api/text-to-speech";
                                var method = "POST";
                                var shouldBeAsync = true;
                                
                                var request = new XMLHttpRequest();
                                
                                
                                 for(var i = 0; i < intentResult.length; i++)
                                {
                                    log(intentResult[i]);
                                    intentArray.push(intentResult[i]);
                                }
                                
                                on({id: intentArray, change: "any"}, function (obj) {
                                    log(obj.newState.val);
                                
                                    let intentObject = JSON.parse(obj.newState.val);
                                       if(intentObject.hasOwnProperty('device'))
                                    {
                                        var deviceID = intentObject.device;
                                        var state = intentObject.state;
                                        var value = getState(deviceID + state);
                                        var postData = value.val;
                                
                                        request.open(method, url, shouldBeAsync);
                                        request.setRequestHeader("Content-Type", "text/plain;charset=UTF-8");
                                        request.push(postData);
                                // ggf. letzten Befehl alternativ mit .send statt mit .push        
                                        log(postData);            
                                    }
                                });
                                
                                

                                Die dritte Möglichkeit wäre über jQuery, mit der ich mich jedoch noch nicht befasst habe. Hier mal ein Code-Fetzen:

                                /*
                                            jQuery.ajax({
                                            method: "POST",
                                            url: "save.php",
                                            data: { image: canvasToDataURLString }
                                            });
                                */
                                

                                Dies soweit nur zu deiner Info. Ich wende mich mal an andere Forenmitglieder, die sich schon mit ähnlichen Aufgabenstellungen befasst haben.

                                Gruß
                                Thomas

                                joergeliJ Online
                                joergeliJ Online
                                joergeli
                                schrieb am zuletzt editiert von joergeli
                                #95

                                @tobetobe
                                Hallo Thomas,
                                so, wieder Zeit zum Spielen gehabt:
                                Rhasspy-Sprachausgabe läuft via pico-tts bei mir mit folgender JavaScript-Funktion:

                                
                                //#########################################
                                // Rhasspy - Text to Speech
                                //#########################################
                                
                                let http = require('http');
                                const temp  = 'hm-rpc.2.CUX0100001.1.TEMPERATURE'      // Datenpunkt Aussen-Temperatur
                                
                                // Für Rhasspy-TTS:
                                let options = {
                                    host: '192.168.192.24', //Rhasspy IP-Adresse
                                    port: 12101,            //Rhasspy Port
                                    path: "/api/text-to-speech",
                                    method: 'POST',
                                    headers: {
                                        'User-Agent' : 'ioBroker',
                                        'Content-Type': 'text/plain',
                                       // 'Content-Length': data.length
                                    }
                                };
                                
                                //______________________________________________________________________________
                                
                                function httpPost(data) {
                                    let req = http.request(options, function(res) {
                                    console.log("http Status: " + res.statusCode);
                                    // Header (Rückmeldung vom Webserver)
                                    console.log('HEADERS: ' + JSON.stringify(res.headers), (res.statusCode != 200 ? "warn" : "info"));
                                    });
                                
                                    // Fehler abfangen
                                    req.on('error', function(e) { 
                                        console.log('ERROR: ' + e.message,"warn");
                                    });
                                
                                    // write data to request body
                                    console.log("Data to request body: " + data);
                                    (data ? req.write(data) : console.log("Daten: keine Daten vorhanden"));
                                    req.end();
                                }
                                
                                //______________________________________________________________________________
                                
                                // Beispiel-Sprachausgabe auf Rhasspy bei Temperaturänderung
                                on({id: temp, change: "any"},function(obj) {
                                    let aussentemp_wert = getState(temp).val;
                                    let data = 'Es sind momentan ' + aussentemp_wert + ' Grad Celsius draussen';
                                    //console.log("data: " + data);
                                    httpPost(data);
                                });
                                //______________________________________________________________________________
                                
                                

                                Das funktioniert bei mir einwandfrei, zwar immer noch über Kopfhörer, da ich noch nicht dazu gekommen bin, den Mini-NF-Verstärker am Rhasspy anzuschließen.

                                Mir ist dabei im Rhasspy-Log aufgefallen, daß anscheinend bei jeder Sprachausgabe eine xxxxxxxx.wav-Datei in den /tmp-Ordner geschrieben wird:

                                [INFO:10688731] quart.serving: 192.168.192.29:38380 POST /api/text-to-speech 1.1 200 43 4624186
                                [DEBUG:10688718] InboxActor:  -> stopped
                                [DEBUG:10688713] SnowboyWakeListener: paused -> listening
                                [DEBUG:10688711] PicoTTSSentenceSpeaker: speaking -> ready
                                [DEBUG:10684307] APlayAudioPlayer: ['aplay', '-q']
                                [DEBUG:10684305] SnowboyWakeListener: listening -> paused
                                [DEBUG:10684305] PicoTTSSentenceSpeaker: ready -> speaking
                                [DEBUG:10684112] PicoTTSSentenceSpeaker: ['pico2wave', '-w', '/tmp/tmpxk8vw7cj.wav', '-l', 'de-DE', 'Es sind momentan 23.5 Grad Celsius draussen']
                                [INFO:10674234] quart.serving: 192.168.192.29:38296 POST /api/text-to-speech 1.1 200 40 3331912
                                [DEBUG:10674218] InboxActor:  -> stopped
                                [DEBUG:10674213] SnowboyWakeListener: paused -> listening
                                [DEBUG:10674211] PicoTTSSentenceSpeaker: speaking -> ready
                                [DEBUG:10671065] APlayAudioPlayer: ['aplay', '-q']
                                [DEBUG:10671064] SnowboyWakeListener: listening -> paused
                                [DEBUG:10671063] PicoTTSSentenceSpeaker: ready -> speaking
                                [DEBUG:10670907] PicoTTSSentenceSpeaker: ['pico2wave', '-w', '/tmp/tmpzlb4_9pn.wav', '-l', 'de-DE', 'Es sind momentan 8 Grad Celsius draussen']
                                

                                Ich bin mir nicht sicher, ob die dann gleich nach der Sprachausgabe wieder gelöscht wird, jedenfalls sind via SSH keine wav-Dateien im /tmp-Ordner zu finden.

                                Übrigens:
                                @tobetobe sagte in Rhasspy Offline Sprachsteuerung:

                                Bei dem Skript mit "request" bekomme ich schon Fehlermeldungen zu Zeile 8. Offensichtlich wird xmlhttprequest trotz im JS-Adapter installiertem Zusatzmodul nicht erkannt.

                                Falls Du damit die rote Wellenlinie unter request im JS-Editor meinst:
                                Einfach ignorieren, ist ein Problem des JS-Editors, Script sollte trotzdem funktionieren.

                                Gruß
                                Jörg

                                tobetobeT 2 Antworten Letzte Antwort
                                0
                                • joergeliJ joergeli

                                  @tobetobe
                                  Hallo Thomas,
                                  so, wieder Zeit zum Spielen gehabt:
                                  Rhasspy-Sprachausgabe läuft via pico-tts bei mir mit folgender JavaScript-Funktion:

                                  
                                  //#########################################
                                  // Rhasspy - Text to Speech
                                  //#########################################
                                  
                                  let http = require('http');
                                  const temp  = 'hm-rpc.2.CUX0100001.1.TEMPERATURE'      // Datenpunkt Aussen-Temperatur
                                  
                                  // Für Rhasspy-TTS:
                                  let options = {
                                      host: '192.168.192.24', //Rhasspy IP-Adresse
                                      port: 12101,            //Rhasspy Port
                                      path: "/api/text-to-speech",
                                      method: 'POST',
                                      headers: {
                                          'User-Agent' : 'ioBroker',
                                          'Content-Type': 'text/plain',
                                         // 'Content-Length': data.length
                                      }
                                  };
                                  
                                  //______________________________________________________________________________
                                  
                                  function httpPost(data) {
                                      let req = http.request(options, function(res) {
                                      console.log("http Status: " + res.statusCode);
                                      // Header (Rückmeldung vom Webserver)
                                      console.log('HEADERS: ' + JSON.stringify(res.headers), (res.statusCode != 200 ? "warn" : "info"));
                                      });
                                  
                                      // Fehler abfangen
                                      req.on('error', function(e) { 
                                          console.log('ERROR: ' + e.message,"warn");
                                      });
                                  
                                      // write data to request body
                                      console.log("Data to request body: " + data);
                                      (data ? req.write(data) : console.log("Daten: keine Daten vorhanden"));
                                      req.end();
                                  }
                                  
                                  //______________________________________________________________________________
                                  
                                  // Beispiel-Sprachausgabe auf Rhasspy bei Temperaturänderung
                                  on({id: temp, change: "any"},function(obj) {
                                      let aussentemp_wert = getState(temp).val;
                                      let data = 'Es sind momentan ' + aussentemp_wert + ' Grad Celsius draussen';
                                      //console.log("data: " + data);
                                      httpPost(data);
                                  });
                                  //______________________________________________________________________________
                                  
                                  

                                  Das funktioniert bei mir einwandfrei, zwar immer noch über Kopfhörer, da ich noch nicht dazu gekommen bin, den Mini-NF-Verstärker am Rhasspy anzuschließen.

                                  Mir ist dabei im Rhasspy-Log aufgefallen, daß anscheinend bei jeder Sprachausgabe eine xxxxxxxx.wav-Datei in den /tmp-Ordner geschrieben wird:

                                  [INFO:10688731] quart.serving: 192.168.192.29:38380 POST /api/text-to-speech 1.1 200 43 4624186
                                  [DEBUG:10688718] InboxActor:  -> stopped
                                  [DEBUG:10688713] SnowboyWakeListener: paused -> listening
                                  [DEBUG:10688711] PicoTTSSentenceSpeaker: speaking -> ready
                                  [DEBUG:10684307] APlayAudioPlayer: ['aplay', '-q']
                                  [DEBUG:10684305] SnowboyWakeListener: listening -> paused
                                  [DEBUG:10684305] PicoTTSSentenceSpeaker: ready -> speaking
                                  [DEBUG:10684112] PicoTTSSentenceSpeaker: ['pico2wave', '-w', '/tmp/tmpxk8vw7cj.wav', '-l', 'de-DE', 'Es sind momentan 23.5 Grad Celsius draussen']
                                  [INFO:10674234] quart.serving: 192.168.192.29:38296 POST /api/text-to-speech 1.1 200 40 3331912
                                  [DEBUG:10674218] InboxActor:  -> stopped
                                  [DEBUG:10674213] SnowboyWakeListener: paused -> listening
                                  [DEBUG:10674211] PicoTTSSentenceSpeaker: speaking -> ready
                                  [DEBUG:10671065] APlayAudioPlayer: ['aplay', '-q']
                                  [DEBUG:10671064] SnowboyWakeListener: listening -> paused
                                  [DEBUG:10671063] PicoTTSSentenceSpeaker: ready -> speaking
                                  [DEBUG:10670907] PicoTTSSentenceSpeaker: ['pico2wave', '-w', '/tmp/tmpzlb4_9pn.wav', '-l', 'de-DE', 'Es sind momentan 8 Grad Celsius draussen']
                                  

                                  Ich bin mir nicht sicher, ob die dann gleich nach der Sprachausgabe wieder gelöscht wird, jedenfalls sind via SSH keine wav-Dateien im /tmp-Ordner zu finden.

                                  Übrigens:
                                  @tobetobe sagte in Rhasspy Offline Sprachsteuerung:

                                  Bei dem Skript mit "request" bekomme ich schon Fehlermeldungen zu Zeile 8. Offensichtlich wird xmlhttprequest trotz im JS-Adapter installiertem Zusatzmodul nicht erkannt.

                                  Falls Du damit die rote Wellenlinie unter request im JS-Editor meinst:
                                  Einfach ignorieren, ist ein Problem des JS-Editors, Script sollte trotzdem funktionieren.

                                  Gruß
                                  Jörg

                                  tobetobeT Offline
                                  tobetobeT Offline
                                  tobetobe
                                  schrieb am zuletzt editiert von
                                  #96

                                  @joergeli

                                  Hallo Jörg,

                                  wirklich super! Damit ist die Aufgabenstellung, Sprachausgaben an den Rhasspy zu schicken, ja prinzipiell gelöst. Nun muss ich dein Skript mal in meines hineinbasteln, damit ich über Rhasspy die Temperatur in allen Räumen und auch draußen abfragen kann. Und dann muss der abgefragte Raum noch wieder zum Bestandteil der Antwort werden. Heute wird das wohl nichts mehr. Ich halte dich natürlich auf dem Laufenden...

                                  Ein anderes Thema: Hast du dir mal ODAS angeschaut? Damit kann man sich die Performance von Mikrofon Arrays anzeigen lassen und diese auch optimieren. Es gibt Config Files für Matrix und ReSpeaker.

                                  Schau mal hier:

                                  ODAS Frontend für Desktop und hier:
                                  ODAS Core für Rhasspy-Raspi

                                  Bin selbst noch dabei, es zum Laufen zu bringen.

                                  Gruß, Thomas

                                  Beste Grüße
                                  tobetobe

                                  1 Antwort Letzte Antwort
                                  0
                                  • joergeliJ joergeli

                                    @tobetobe
                                    Hallo Thomas,
                                    so, wieder Zeit zum Spielen gehabt:
                                    Rhasspy-Sprachausgabe läuft via pico-tts bei mir mit folgender JavaScript-Funktion:

                                    
                                    //#########################################
                                    // Rhasspy - Text to Speech
                                    //#########################################
                                    
                                    let http = require('http');
                                    const temp  = 'hm-rpc.2.CUX0100001.1.TEMPERATURE'      // Datenpunkt Aussen-Temperatur
                                    
                                    // Für Rhasspy-TTS:
                                    let options = {
                                        host: '192.168.192.24', //Rhasspy IP-Adresse
                                        port: 12101,            //Rhasspy Port
                                        path: "/api/text-to-speech",
                                        method: 'POST',
                                        headers: {
                                            'User-Agent' : 'ioBroker',
                                            'Content-Type': 'text/plain',
                                           // 'Content-Length': data.length
                                        }
                                    };
                                    
                                    //______________________________________________________________________________
                                    
                                    function httpPost(data) {
                                        let req = http.request(options, function(res) {
                                        console.log("http Status: " + res.statusCode);
                                        // Header (Rückmeldung vom Webserver)
                                        console.log('HEADERS: ' + JSON.stringify(res.headers), (res.statusCode != 200 ? "warn" : "info"));
                                        });
                                    
                                        // Fehler abfangen
                                        req.on('error', function(e) { 
                                            console.log('ERROR: ' + e.message,"warn");
                                        });
                                    
                                        // write data to request body
                                        console.log("Data to request body: " + data);
                                        (data ? req.write(data) : console.log("Daten: keine Daten vorhanden"));
                                        req.end();
                                    }
                                    
                                    //______________________________________________________________________________
                                    
                                    // Beispiel-Sprachausgabe auf Rhasspy bei Temperaturänderung
                                    on({id: temp, change: "any"},function(obj) {
                                        let aussentemp_wert = getState(temp).val;
                                        let data = 'Es sind momentan ' + aussentemp_wert + ' Grad Celsius draussen';
                                        //console.log("data: " + data);
                                        httpPost(data);
                                    });
                                    //______________________________________________________________________________
                                    
                                    

                                    Das funktioniert bei mir einwandfrei, zwar immer noch über Kopfhörer, da ich noch nicht dazu gekommen bin, den Mini-NF-Verstärker am Rhasspy anzuschließen.

                                    Mir ist dabei im Rhasspy-Log aufgefallen, daß anscheinend bei jeder Sprachausgabe eine xxxxxxxx.wav-Datei in den /tmp-Ordner geschrieben wird:

                                    [INFO:10688731] quart.serving: 192.168.192.29:38380 POST /api/text-to-speech 1.1 200 43 4624186
                                    [DEBUG:10688718] InboxActor:  -> stopped
                                    [DEBUG:10688713] SnowboyWakeListener: paused -> listening
                                    [DEBUG:10688711] PicoTTSSentenceSpeaker: speaking -> ready
                                    [DEBUG:10684307] APlayAudioPlayer: ['aplay', '-q']
                                    [DEBUG:10684305] SnowboyWakeListener: listening -> paused
                                    [DEBUG:10684305] PicoTTSSentenceSpeaker: ready -> speaking
                                    [DEBUG:10684112] PicoTTSSentenceSpeaker: ['pico2wave', '-w', '/tmp/tmpxk8vw7cj.wav', '-l', 'de-DE', 'Es sind momentan 23.5 Grad Celsius draussen']
                                    [INFO:10674234] quart.serving: 192.168.192.29:38296 POST /api/text-to-speech 1.1 200 40 3331912
                                    [DEBUG:10674218] InboxActor:  -> stopped
                                    [DEBUG:10674213] SnowboyWakeListener: paused -> listening
                                    [DEBUG:10674211] PicoTTSSentenceSpeaker: speaking -> ready
                                    [DEBUG:10671065] APlayAudioPlayer: ['aplay', '-q']
                                    [DEBUG:10671064] SnowboyWakeListener: listening -> paused
                                    [DEBUG:10671063] PicoTTSSentenceSpeaker: ready -> speaking
                                    [DEBUG:10670907] PicoTTSSentenceSpeaker: ['pico2wave', '-w', '/tmp/tmpzlb4_9pn.wav', '-l', 'de-DE', 'Es sind momentan 8 Grad Celsius draussen']
                                    

                                    Ich bin mir nicht sicher, ob die dann gleich nach der Sprachausgabe wieder gelöscht wird, jedenfalls sind via SSH keine wav-Dateien im /tmp-Ordner zu finden.

                                    Übrigens:
                                    @tobetobe sagte in Rhasspy Offline Sprachsteuerung:

                                    Bei dem Skript mit "request" bekomme ich schon Fehlermeldungen zu Zeile 8. Offensichtlich wird xmlhttprequest trotz im JS-Adapter installiertem Zusatzmodul nicht erkannt.

                                    Falls Du damit die rote Wellenlinie unter request im JS-Editor meinst:
                                    Einfach ignorieren, ist ein Problem des JS-Editors, Script sollte trotzdem funktionieren.

                                    Gruß
                                    Jörg

                                    tobetobeT Offline
                                    tobetobeT Offline
                                    tobetobe
                                    schrieb am zuletzt editiert von
                                    #97

                                    @joergeli said in Rhasspy Offline Sprachsteuerung:

                                    Rhasspy-Sprachausgabe läuft via pico-tts

                                    Hallo Jörg,

                                    Kompliment: Das war eine super Arbeit von dir. Ich habe dein Skript angepasst und in meines eingebaut. Dies sieht nun so aus:

                                    //Skript zur Abfrage von Temperaturen
                                    
                                    // Variablen für MQTT
                                    var intentResult = $('mqtt.0.rhasspy.intent.*Temperature');
                                    var intentArray = [];
                                    
                                    // Für Rhasspy-TTS:
                                    let http = require('http');
                                    let options = {
                                        host: '192.168.13.157', //Rhasspy IP-Adresse
                                        port: 12101,            //Rhasspy Port
                                        path: "/api/text-to-speech",
                                        method: 'POST',
                                        headers: {
                                            'User-Agent' : 'ioBroker',
                                            'Content-Type': 'text/plain',
                                           // 'Content-Length': data.length
                                        }
                                    };
                                    
                                    //______________________________________________________________________________
                                    function httpPost(data) {
                                        let req = http.request(options, function(res) {
                                        console.log("http Status: " + res.statusCode);
                                        // Header (Rückmeldung vom Webserver)
                                        console.log('HEADERS: ' + JSON.stringify(res.headers), (res.statusCode != 200 ? "warn" : "info"));
                                        });
                                    
                                         // Fehler abfangen
                                            req.on('error', function(e) { 
                                            console.log('ERROR: ' + e.message,"warn");
                                        });
                                    
                                         // write data to request body
                                        console.log("Data to request body: " + data);
                                        (data ? req.write(data) : console.log("Daten: keine Daten vorhanden"));
                                        req.end();
                                    }
                                    
                                    
                                    // Abfrage des MQTT-Inhaltes bei Status-Änderung
                                    for(var i = 0; i < intentResult.length; i++)
                                    {
                                        log(intentResult[i]);
                                        intentArray.push(intentResult[i]);
                                    }
                                    
                                    
                                    on({id: intentArray, change: "any"}, function (obj) {
                                        log(obj.newState.val);
                                        let intentObject = JSON.parse(obj.newState.val);
                                           if(intentObject.hasOwnProperty('device'))
                                        {
                                            var deviceID = intentObject.device;
                                            var state = intentObject.state;
                                            var value = getState(deviceID + state);
                                    
                                            let data = 'Es sind momentan ' + value.val + ' Grad Celsius';
                                            console.log("data: " + data);
                                            log(value.val);
                                            httpPost(data);
                                        }
                                    });
                                    

                                    Zusammen mit diesem Sentence:

                                    [GetTemperature]
                                    (sag mir | wie | wieviel | was | welche) [(ist die | ist der | ist das | ist es | sind es)] ($synonyms_temperature){value} [(es ist | ist es | haben wir | sind es)][im] ($device_name_thermostat){device}(:) {state:.ACTUAL_TEMPERATURE}
                                    

                                    und diesem Slot:

                                    "device_name_thermostat": [
                                            "(schlafzimmer):hm-rpc.0.LEQ9876543.4",
                                            "(bad | badezimmer):hm-rpc.0.OEQ0111111.2",
                                            "(balkon | draussen):hm-rpc.0.OEQ2666666.1",
                                            "(wohnzimmer | büro | esszimmer):hm-rpc.0.LEQ1777777.2",
                                            "(gästezimmer | schrankzimmer| ankleidezimmer | umkleidezimmer):hm-rpc.0.LEQ1234567.4"
                                        ],
                                    

                                    kann ich mir nun die Temperatur von jedem Raum und von draußen ansagen lassen. Anfangs hatte ich den merkwürdigen Effekt, dass mir eine falsche IP mit Fehler zurückgemeldet wurde. Nach mehrfachem Ändern und Speichern war dieser dann jedoch unerklärlicherweise verschwunden.

                                    Also: Super - wieder ein Stück weiter. Vielen herzlichen Dank für deine Hilfe.

                                    Ich wünsche noch einen schönen Sonntag
                                    Thomas

                                    Beste Grüße
                                    tobetobe

                                    joergeliJ 1 Antwort Letzte Antwort
                                    0
                                    • tobetobeT tobetobe

                                      @joergeli said in Rhasspy Offline Sprachsteuerung:

                                      Rhasspy-Sprachausgabe läuft via pico-tts

                                      Hallo Jörg,

                                      Kompliment: Das war eine super Arbeit von dir. Ich habe dein Skript angepasst und in meines eingebaut. Dies sieht nun so aus:

                                      //Skript zur Abfrage von Temperaturen
                                      
                                      // Variablen für MQTT
                                      var intentResult = $('mqtt.0.rhasspy.intent.*Temperature');
                                      var intentArray = [];
                                      
                                      // Für Rhasspy-TTS:
                                      let http = require('http');
                                      let options = {
                                          host: '192.168.13.157', //Rhasspy IP-Adresse
                                          port: 12101,            //Rhasspy Port
                                          path: "/api/text-to-speech",
                                          method: 'POST',
                                          headers: {
                                              'User-Agent' : 'ioBroker',
                                              'Content-Type': 'text/plain',
                                             // 'Content-Length': data.length
                                          }
                                      };
                                      
                                      //______________________________________________________________________________
                                      function httpPost(data) {
                                          let req = http.request(options, function(res) {
                                          console.log("http Status: " + res.statusCode);
                                          // Header (Rückmeldung vom Webserver)
                                          console.log('HEADERS: ' + JSON.stringify(res.headers), (res.statusCode != 200 ? "warn" : "info"));
                                          });
                                      
                                           // Fehler abfangen
                                              req.on('error', function(e) { 
                                              console.log('ERROR: ' + e.message,"warn");
                                          });
                                      
                                           // write data to request body
                                          console.log("Data to request body: " + data);
                                          (data ? req.write(data) : console.log("Daten: keine Daten vorhanden"));
                                          req.end();
                                      }
                                      
                                      
                                      // Abfrage des MQTT-Inhaltes bei Status-Änderung
                                      for(var i = 0; i < intentResult.length; i++)
                                      {
                                          log(intentResult[i]);
                                          intentArray.push(intentResult[i]);
                                      }
                                      
                                      
                                      on({id: intentArray, change: "any"}, function (obj) {
                                          log(obj.newState.val);
                                          let intentObject = JSON.parse(obj.newState.val);
                                             if(intentObject.hasOwnProperty('device'))
                                          {
                                              var deviceID = intentObject.device;
                                              var state = intentObject.state;
                                              var value = getState(deviceID + state);
                                      
                                              let data = 'Es sind momentan ' + value.val + ' Grad Celsius';
                                              console.log("data: " + data);
                                              log(value.val);
                                              httpPost(data);
                                          }
                                      });
                                      

                                      Zusammen mit diesem Sentence:

                                      [GetTemperature]
                                      (sag mir | wie | wieviel | was | welche) [(ist die | ist der | ist das | ist es | sind es)] ($synonyms_temperature){value} [(es ist | ist es | haben wir | sind es)][im] ($device_name_thermostat){device}(:) {state:.ACTUAL_TEMPERATURE}
                                      

                                      und diesem Slot:

                                      "device_name_thermostat": [
                                              "(schlafzimmer):hm-rpc.0.LEQ9876543.4",
                                              "(bad | badezimmer):hm-rpc.0.OEQ0111111.2",
                                              "(balkon | draussen):hm-rpc.0.OEQ2666666.1",
                                              "(wohnzimmer | büro | esszimmer):hm-rpc.0.LEQ1777777.2",
                                              "(gästezimmer | schrankzimmer| ankleidezimmer | umkleidezimmer):hm-rpc.0.LEQ1234567.4"
                                          ],
                                      

                                      kann ich mir nun die Temperatur von jedem Raum und von draußen ansagen lassen. Anfangs hatte ich den merkwürdigen Effekt, dass mir eine falsche IP mit Fehler zurückgemeldet wurde. Nach mehrfachem Ändern und Speichern war dieser dann jedoch unerklärlicherweise verschwunden.

                                      Also: Super - wieder ein Stück weiter. Vielen herzlichen Dank für deine Hilfe.

                                      Ich wünsche noch einen schönen Sonntag
                                      Thomas

                                      joergeliJ Online
                                      joergeliJ Online
                                      joergeli
                                      schrieb am zuletzt editiert von
                                      #98

                                      Hallo Thomas,

                                      @tobetobe sagte in Rhasspy Offline Sprachsteuerung:

                                      Kompliment: Das war eine super Arbeit von dir

                                      Zu viel des Lobes, ist nicht allein auf meinem Mist gewachsen, ich habe mir nur die Code-Schnipsel hier aus dem Forum zusammengesucht. :kissing_closed_eyes:

                                      @tobetobe sagte in Rhasspy Offline Sprachsteuerung:

                                      Ein anderes Thema: Hast du dir mal ODAS angeschaut? Damit kann man sich die Performance von Mikrofon Arrays anzeigen lassen und diese auch optimieren.

                                      Ich habe zwar ODAS hier ReSpeaker_4_Mic_Array_for_Raspberry_Pi im Abschnitt "Realtime Sound Source Localization and Tracking" (ziemlich weit unten auf der Seite) gesehen, mich damit aber nicht weiter beschäftigt.
                                      Dort ist auch eine Installationsanleitung aufgeführt. Evtl. kannst Du die gebrauchen, wobei ich nicht weiß, ob sie speziell für das Respeaker Mic-Array gilt.

                                      Gruß
                                      Jörg

                                      tobetobeT 1 Antwort Letzte Antwort
                                      0
                                      • joergeliJ joergeli

                                        Hallo Thomas,

                                        @tobetobe sagte in Rhasspy Offline Sprachsteuerung:

                                        Kompliment: Das war eine super Arbeit von dir

                                        Zu viel des Lobes, ist nicht allein auf meinem Mist gewachsen, ich habe mir nur die Code-Schnipsel hier aus dem Forum zusammengesucht. :kissing_closed_eyes:

                                        @tobetobe sagte in Rhasspy Offline Sprachsteuerung:

                                        Ein anderes Thema: Hast du dir mal ODAS angeschaut? Damit kann man sich die Performance von Mikrofon Arrays anzeigen lassen und diese auch optimieren.

                                        Ich habe zwar ODAS hier ReSpeaker_4_Mic_Array_for_Raspberry_Pi im Abschnitt "Realtime Sound Source Localization and Tracking" (ziemlich weit unten auf der Seite) gesehen, mich damit aber nicht weiter beschäftigt.
                                        Dort ist auch eine Installationsanleitung aufgeführt. Evtl. kannst Du die gebrauchen, wobei ich nicht weiß, ob sie speziell für das Respeaker Mic-Array gilt.

                                        Gruß
                                        Jörg

                                        tobetobeT Offline
                                        tobetobeT Offline
                                        tobetobe
                                        schrieb am zuletzt editiert von
                                        #99

                                        @joergeli
                                        Hallo Jörg,
                                        nun habe ich auch dein Wakeword-Skript zum Laufen gebracht. PAW hat mir ja nicht genutzt, weil ich ja die Ansage am Rhasspy haben wollte. Mit deinem Skript zu Ansage über httPost geht dies nun. Statt deine Zeilen für PAW ist lediglich:

                                        function wakeword(){
                                            httpPost(ansage);
                                            }
                                        
                                        bzw.
                                        
                                        function befehl_empf(){ 
                                            httpPost(empf_ok);
                                        }
                                        

                                        Beste Grüße
                                        tobetobe

                                        tobetobeT joergeliJ 2 Antworten Letzte Antwort
                                        0
                                        • tobetobeT tobetobe

                                          @joergeli
                                          Hallo Jörg,
                                          nun habe ich auch dein Wakeword-Skript zum Laufen gebracht. PAW hat mir ja nicht genutzt, weil ich ja die Ansage am Rhasspy haben wollte. Mit deinem Skript zu Ansage über httPost geht dies nun. Statt deine Zeilen für PAW ist lediglich:

                                          function wakeword(){
                                              httpPost(ansage);
                                              }
                                          
                                          bzw.
                                          
                                          function befehl_empf(){ 
                                              httpPost(empf_ok);
                                          }
                                          
                                          tobetobeT Offline
                                          tobetobeT Offline
                                          tobetobe
                                          schrieb am zuletzt editiert von
                                          #100

                                          @joergeli
                                          erforderlich, wollte ich noch sagen.

                                          Ich bleibe dabei: Wirklich super. Übrigens: schreibe mal statt

                                          const ansage =  'Ja'
                                          const ansage =  'Ja?'
                                          

                                          Gestern Abend habe ich noch einen anderen Beitrag gepostet, der dich evtl auch interessieren könnte:
                                          Bring!-Adapter mit Rhasspy steuern

                                          Gruß, Thomas

                                          Beste Grüße
                                          tobetobe

                                          joergeliJ 1 Antwort Letzte Antwort
                                          0
                                          Antworten
                                          • In einem neuen Thema antworten
                                          Anmelden zum Antworten
                                          • Älteste zuerst
                                          • Neuste zuerst
                                          • Meiste Stimmen


                                          Support us

                                          ioBroker
                                          Community Adapters
                                          Donate

                                          893

                                          Online

                                          32.4k

                                          Benutzer

                                          81.5k

                                          Themen

                                          1.3m

                                          Beiträge
                                          Community
                                          Impressum | Datenschutz-Bestimmungen | Nutzungsbedingungen | Einwilligungseinstellungen
                                          ioBroker Community 2014-2025
                                          logo
                                          • Anmelden

                                          • Du hast noch kein Konto? Registrieren

                                          • Anmelden oder registrieren, um zu suchen
                                          • Erster Beitrag
                                            Letzter Beitrag
                                          0
                                          • Home
                                          • Aktuell
                                          • Tags
                                          • Ungelesen 0
                                          • Kategorien
                                          • Unreplied
                                          • Beliebt
                                          • GitHub
                                          • Docu
                                          • Hilfe