Skip to content
  • Home
  • Recent
  • Tags
  • 0 Unread 0
  • Categories
  • Unreplied
  • Popular
  • 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

  • Default (No Skin)
  • No Skin
Collapse
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.9k

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

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

Rhasspy Offline Sprachsteuerung

Scheduled Pinned Locked Moved Off Topic
403 Posts 30 Posters 100.9k Views 47 Watching
  • Oldest to Newest
  • Newest to Oldest
  • Most Votes
Reply
  • Reply as topic
Log in to reply
This topic has been deleted. Only users with topic management privileges can see it.
  • joergeliJ joergeli

    @tobetobe
    Hallo Thomas,

    Schallschutzgehäuse:
    Hat nicht viel gebracht; Fremdgeräusche werden auch aus anderen Richtungen, als aus der "Sprechrichtung" empfangen.
    Ich habe das zusätzliche Gehäuse wieder entfernt.

    WakeWord:
    Du hattest ja mal erwähnt, daß man das WakeWord am Besten mit dem später auch verwendeten Mikrofon (bei mir ReSpeaker 4 Mic-Array) trainieren sollte.
    Bei mir gab es aber das Problem, daß ich für Rhasspy Raspbian Buster light, also Headless verwende, ergo auch kein Browser (Chromium) verfügbar ist, mit dem das WakeWord auf https://snowboy.kitt.ai/ trainiert werden konnte.

    Ich habe hier: Snowboy-CustomMaker zwei Python-Scripte gefunden, mit denen man das auch ohne Browser trainieren kann.

    Es gab aber leider auch damit Probleme:
    Das erste Python-Script snowboyRecord ist bei mir auf Fehler gelaufen, somit konnte ich keine wav-Dateien aufnehmen.
    Ich habe die 3 wav-Dateien (0.wav, 1.wav, 2.wav) dann auf dem Raspi manuell mit arecord aufgenommen. Als WakeWord habe ich "Lieselotte" verwendet.
    Anschließend habe ich die 3 wav-Dateien auf einem Windows-PC mit Audacity bereinigt, d.h. Pausen am Anfang und Ende des Wakewortes entfernt.
    Anschließend die nun bereinigten wav-Dateien zurück auf den Raspi kopiert.

    Das zweite Script snowboyTrain hat funktionirt und ich konnte erfolgreich mit den 3 wav-Dateien die Datei "Lieselotte.pmdl" erstellen.
    Mit "Lieselotte" funktioniert die WakeWord-Erkennung jetzt recht gut.

    MemoryLeak:
    Ich habe mehrfach gelesen, daß evtl. ein MemoryLeak bei Rhasspy auftreten kann.
    Deshalb habe ich zur Sicherheit mit sudo crontab -e einen Cronjob angelegt (0 5 * * * sudo reboot), der den Raspi jeden morgen um 05:00 Uhr rebootet.
    __

    Status Quo:
    Rhasspy (auf Raspi P4) ist jetzt in die Essecke umgezogen, wo nur ab und zu das Radio läuft.
    WakeWord- und Sprach-Erkennung mit Kaldi funktionieren dort ganz gut (ohne Fehlauslösungen).
    Das lasse ich jetzt so laufen, bis Rhasspy V 2.5 verfügbar ist, wo dann ja wohl das kpl. Hermes-Protokoll via MQTT unterstützt werden soll.
    Schaun mer mal ...

    Frage:
    Hast Du Dich schon mit der Sprachrückführung, d.h. akustische Rückmeldung (z.B. "Es ist jetzt 12:25 Uhr") auf dem Raspi beschäftigt?
    Bei mit kommen Rückmeldungen z. Zt. mittels ioBroker-PAW-Adapter auf mein Android-Tablet, was für mich im Prinzip ausreichend ist.

    Gruß
    Jörg

    tobetobeT Offline
    tobetobeT Offline
    tobetobe
    wrote on last edited by
    #70

    @joergeli
    Hallo Jörg,

    Schallschutzgehäuse und Status Quo: Schade, aber nun ist das zumindest eine belastbare Erkenntnis. Ich glaube nun auch, dass andere Wege zielführender sind, nämlich ein zuverlässiges WakeWord, ggf. räumliche Maßnahmen (Verbesserung des Signal/Noise-Verhältnisses, dh Rhasspy näher zum "Sprecher" und weiter weg von den Störquellen) und zuletzt eine gute und zuverlässige Struktur bei den Sentences und den Slots. Das hat zumindest bei mir am meisten zu einer guten Funktionalität beigetragen. Übrigens, nach allem, was man so liest: Mit Fehlerkennungen kämpfen alle Plattformen, auch Snips und Alexa.

    WakeWord: Gut, dass du einen Weg gefunden hast. Falls du nochmals ein neues WakeWord generieren möchtest, kannst du das auch ganz ohne Skript und Browser in der Kommandozeile erledigen:

    arecord --duration 5 --rate 16000 --format S16_LE test.wav && aplay ./test.wav
    

    Wie du siehst, sind dies zwei Befehle - einer zum Aufnehmen und einer zum Abspielen, die du natürlich auch getrennt eingeben kannst. Statt test.wav gibst du einfach den von dir gewünschten Namen ein, also zB "Lieselotte". Du erstellst so drei Aufnahmen "Lieselotte1, 2, 3" und lädtst diese Dateien einfach über deinen PC mit Browser auf die Snips-Plattform. Du findest dort einen entsprechenden Button zum Hochladen von Dateien. Danach wird dir in bekannter Weise die Datei "Lieselotte.pmdl" generiert, die du dann wieder in Rhasspy hinterlegen kannst.

    Memory Leak: Habe ich noch nicht festgestellt. Ich werde das mal im Auge behalten. Die Lösung hast du ja schon beschrieben ;-))

    Akustische Rückmeldung: Bislang habe ich nur Slots und Sentences konfiguriert, die auch bei den MQTT-States richtig ankommen. Für mich kommt PAW leider nicht in Frage, da ich die Sprachausgabe wieder an den Rhasspy zurückschicken will. Ich habe begonne, mich in das Thema einzulesen, habe allerdings noch keine Lösung gefunden. Ggf. hängt das auch noch von der vollständigen Implementierung des Hermes-Protokolls ab.

    Da ich nur Sprachausgaben an den Rhasspy zurückschicken will, reichen mir kleine Lautsprecher. Ich habe mir zwei Stück von diesen bestellt:

    2 stücke Arduino Lautsprecher 3 Watt 8 Ohm Single Cavity Mini Lautsprecher Full-Range Hohlraum Mobile Portable Werbung Maschine Lautsprecher mit 11mm Line Länge JST-PH2.0mm-2 Pin Terminal
    LS

    Dazu dieses Kabel, um die Lautsprecher platzsparend an den Raspi anzuschließen:

    Pro 3Ft 3.5mm M-M Klinkenstecker 4 polig 90 gewinkelt Flach Audio Aux Kabel

    alt text

    Dieses trenne ich in der Mitte und habe somit Stecker für zwei Rasspy-Satelliten.

    3D-Drucker: Ich hatte mich noch nicht bedankt. Wirklich sehr hilfreiche Tipps und eine ausgezeichnete Beschreibung. Vielen Dank. Auf deinem Foto vom Gehäuse erkenne ich eine recht grobe Oberfläche: Ist dies Ergebnis eine Frage des Druckers oder des verwendeten Materials? Könntest du auch "glattere" Oberflächen drucken? Für mich wäre nun nämlich das Konstruieren und Drucken des Gehäuses der nächste Schritt, damit mein Rhasspy endlich im Wohnzimmer in den Live-Betrieb gehen kann.

    Soweit für heute.

    Beste Grüße
    Thomas

    Beste Grüße
    tobetobe

    joergeliJ 1 Reply Last reply
    0
    • Tom10webT Tom10web

      Hallo, in die Runde
      Ich habe nun nach einigem lesen Rhasspy auf meinem alten Raspi3b installiert . Aufwachen funktioniert und Befehle werden erkannt, die LEDs nutze ich noch nicht, doch wie weiter ?
      Kann einer einem Anfänger das weitere Vorgehen im Groben erklären.
      z B. "Wie spät ist es" oder "Schalte die Lampe XY"
      Ich nutze seit kurzem einen "Beelink BT3 - X Mini PC 4+64GB" (vorher den Raspi) auf dem IOBroker perfekt läuft, unter Objekte/MQTT/de/transition werden auch einige Datenpunkte angelegt, aber nichts mit "Lampe" oder "wie spät".
      Wie erzeuge ich die benötigten Datenpunkte, auswerten könnte ich sie doch bestimmt mit Blockly-Scripten.
      Habe bisher alles was ich wollte hinbekommen, hier fehlt mir aber das Grundverständnis. Ich steuere alles (Radio, TV, Rolladen, Garagentor, Alarmanlage,.... per Habpanel auf einem Tablet bzw. Handy, möchte aber einige Befehle per OFFLINE-Sprachsteuerung ausführen.
      Ich danke euch

      tobetobeT Offline
      tobetobeT Offline
      tobetobe
      wrote on last edited by
      #71

      @Tom10web
      Hallo und herzlich willkommen in unserer noch kleinen ioBroker/Rhasspy-Runde. Wir haben hier mittlerweile schon sehr viel Erfahrung zusammengetragen, auf die du zurückgreifen kannst. Jörg hat dir ja bereits einige Tipps zukommen lassen. Jeder geht so seinen Weg, der natürlich auch zu den betriebenen Endgeräten passen muss. Ich steuere Rollos zB nicht mit "rauf, runter, stop", sondern wie dimmbare Lampen mit %-Werten, die dem jeweiligen Verschlussgrad entsprechen. Dadurch kann ich das von @Tictactoo geschrieben Skript einheitlich für schaltbare Lampen, dimmbare Lampen und meine Rollos verwenden.

      Wichtig ist dann neben einem zuverlässigen WakeWord noch eine ebenso zuverlässige Struktur bei den Sentences und den Slots. Bei mir sehen die Sentences so aus:


      [ChangeDeviceState]
      ($synonyms_change_command) [(die | das)] ($device_name_switch){device} ($device_state){value} (:){state:.STATE}

      [ChangeDimmerLevel]
      dimmer_level = (Null:0 | aus:0 | ein:15 | (1..100)) {value}
      ($synonyms_change_command) [(die | das | den)] ($device_name_dimmer){device} [auf] <dimmer_level> (:) {state:.LEVEL} [Prozent]

      [ChangeBlindLevel]
      blind_level = (auf:100 | zu:0 | Null:0 | (1..100)) {value}
      ($synonyms_change_command) [(die | das | den)] [Rollladen] [im] ($device_name_blind){device} [auf] <blind_level> (:) {state:.State} [Prozent]

      [ChangeTemperature]
      thermostat_level = (Boost:30 | (17..30)) {value}
      ($synonyms_change_command) [(die | das | den)] ($device_name_thermostat){device} [auf] <thermostat_level> (:) {state:.SET_TEMPERATURE} [Grad]

      [ChangeWindow]
      window_duration = (5..30) {time}
      time_unit = (minute | minuten) {unit}
      ($synonyms_change_command) [(die | das)] ($device_name_switch){device} [Fenster] ($device_state){value} (:){state:.LEVEL} [für] <window_duration> <time_unit>

      [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}

      [GetTime]
      time_state = (spät | uhr | zeit | uhrzeit) {state}
      (wie | wieviel | was | sag mir) [(ist die)] <time_state> [(es ist | ist es | haben wir)]

      [SetTimer]
      timer_name = (eierkocher | backofen) {name}
      timer_duration = (Null:0 | ein:1 | (1..200)) {time}
      time_unit = (stunde | stunden | minute | minuten) {unit}
      (schalte | setze) (die | das | den) <timer_name> [auf] <timer_duration> <time_unit>

      Und so die Slots:


      {
      "device_name_blind": [
      "(schlafzimmerrechts):javascript.0.Rollladen.SchlafzimmerRechts",
      "(umkleidezimmer):javascript.0.Rollladen.Umkleidezimmer",
      "(schlafzimmerlinks):javascript.0.Rollladen.SchlafzimmerLinks"
      ],
      "device_name_dimmer": [
      "(sideboardlampe):hm-rpc.0.ABC.1",
      "(stehlampe | wohnzimmerlampe):hm-rpc.0.BCE.1",
      "(haengelampe):hm-rpc.0.CEF.1",
      "(schreibtischlampe | bürolampe):hm-rpc.0.EFG.1"
      ],
      "device_name_switch": [
      "(linkekuechenlampe):hm-rpc.0.FGH.1",
      "(schlafzimmerlampe | tannenbaum | mobilesteckdose):hm-rpc.0.GHI.1",
      "(esszimmerlampe):hm-rpc.0.HIJ.1",
      "(mobilesteckdose):hm-rpc.0.IJK.1",
      "(rechtekuechenlampe):hm-rpc.0.JKL.1",
      "(allelampen):",
      "(allekuechenlampen):",
      "(medienschrank):rflink.0.channels.milightv1_1.all_01",
      "(beidekuechenlampen):"
      ],
      "device_name_thermostat": [
      "(bad | badezimmer):hm-rpc.0.KLM.2",
      "(schlafzimmer):hm-rpc.0.LMN.4",
      "(balkon | draussen):hm-rpc.0.MNO.1",
      "(wohnzimmer | büro | esszimmer):hm-rpc.0.NOP.2",
      "(gästezimmer | schrankzimmer| ankleidezimmer | umkleidezimmer):hm-rpc.0.OPQ.4"
      ],
      "device_name_window": [
      "(bad | badezimmer):hm-rpc.0.PQR.1"
      ],
      "device_state": [
      "an:true",
      "ein:true",
      "aus:false"
      ],
      "enum_function_name": [
      "verschluss:enum.functions.Verschluss",
      "licht:enum.functions.Licht",
      "wetter:enum.functions.Wetter",
      "sicherheit:enum.functions.Sicherheit",
      "zentrale:enum.functions.Zentrale",
      "rollladen:enum.functions.Rollladen",
      "heizung:enum.functions.Heizung",
      "power:enum.functions.Power"
      ],
      "enum_room_name": [
      "(umkleidezimmer):enum.rooms.Umkleidezimmer",
      "(schlafzimmer):enum.rooms.Schlafzimmer",
      "(flur):enum.rooms.Flur",
      "(büro):enum.rooms.Buero",
      "(gästewehzeh):enum.rooms.GaesteWC",
      "(küche):enum.rooms.Kueche",
      "(diversemobil):enum.rooms.Diverse_Mobil",
      "(balkon | draussen):enum.rooms.Balkon",
      "(wohnzimmer | drinnen):enum.rooms.Wohnzimmer",
      "(bad | badezimmer):enum.rooms.Badezimmer",
      "(esszimmer):enum.rooms.Esszimmer",
      "(garage):enum.rooms.Garage",
      "(hauswirtschaftsraum | kammer):enum.rooms.Hauswirtschaftsraum"
      ],
      "scenes": [
      "(fernsehen):",
      "(raumfeld):",
      "(zehdeh):",
      "(schlafen):",
      "(ausschalten):",
      "(dehfaudeh):",
      "(radio):"
      ],
      "synonyms_change_command": [
      "schalt",
      "mach",
      "mach mal",
      "setze",
      "stell",
      "stelle",
      "setz",
      "schalte"
      ],
      "synonyms_temperature": [
      "(heizung)",
      "(thermostat)",
      "(temperatur)",
      "(warm)",
      "(Grad)",
      "(kalt)",
      "(heiss)"
      ]
      }

      Wie du siehst, habe ich auch eine saubere Struktur bei den Begrifflichkeiten eingeführt, was ich sehr hilfreich finde.

      Somit gutes Gelingen!

      Beste Grüße
      tobetobe

      1 Reply Last reply
      0
      • tobetobeT tobetobe

        @joergeli
        Hallo Jörg,

        Schallschutzgehäuse und Status Quo: Schade, aber nun ist das zumindest eine belastbare Erkenntnis. Ich glaube nun auch, dass andere Wege zielführender sind, nämlich ein zuverlässiges WakeWord, ggf. räumliche Maßnahmen (Verbesserung des Signal/Noise-Verhältnisses, dh Rhasspy näher zum "Sprecher" und weiter weg von den Störquellen) und zuletzt eine gute und zuverlässige Struktur bei den Sentences und den Slots. Das hat zumindest bei mir am meisten zu einer guten Funktionalität beigetragen. Übrigens, nach allem, was man so liest: Mit Fehlerkennungen kämpfen alle Plattformen, auch Snips und Alexa.

        WakeWord: Gut, dass du einen Weg gefunden hast. Falls du nochmals ein neues WakeWord generieren möchtest, kannst du das auch ganz ohne Skript und Browser in der Kommandozeile erledigen:

        arecord --duration 5 --rate 16000 --format S16_LE test.wav && aplay ./test.wav
        

        Wie du siehst, sind dies zwei Befehle - einer zum Aufnehmen und einer zum Abspielen, die du natürlich auch getrennt eingeben kannst. Statt test.wav gibst du einfach den von dir gewünschten Namen ein, also zB "Lieselotte". Du erstellst so drei Aufnahmen "Lieselotte1, 2, 3" und lädtst diese Dateien einfach über deinen PC mit Browser auf die Snips-Plattform. Du findest dort einen entsprechenden Button zum Hochladen von Dateien. Danach wird dir in bekannter Weise die Datei "Lieselotte.pmdl" generiert, die du dann wieder in Rhasspy hinterlegen kannst.

        Memory Leak: Habe ich noch nicht festgestellt. Ich werde das mal im Auge behalten. Die Lösung hast du ja schon beschrieben ;-))

        Akustische Rückmeldung: Bislang habe ich nur Slots und Sentences konfiguriert, die auch bei den MQTT-States richtig ankommen. Für mich kommt PAW leider nicht in Frage, da ich die Sprachausgabe wieder an den Rhasspy zurückschicken will. Ich habe begonne, mich in das Thema einzulesen, habe allerdings noch keine Lösung gefunden. Ggf. hängt das auch noch von der vollständigen Implementierung des Hermes-Protokolls ab.

        Da ich nur Sprachausgaben an den Rhasspy zurückschicken will, reichen mir kleine Lautsprecher. Ich habe mir zwei Stück von diesen bestellt:

        2 stücke Arduino Lautsprecher 3 Watt 8 Ohm Single Cavity Mini Lautsprecher Full-Range Hohlraum Mobile Portable Werbung Maschine Lautsprecher mit 11mm Line Länge JST-PH2.0mm-2 Pin Terminal
        LS

        Dazu dieses Kabel, um die Lautsprecher platzsparend an den Raspi anzuschließen:

        Pro 3Ft 3.5mm M-M Klinkenstecker 4 polig 90 gewinkelt Flach Audio Aux Kabel

        alt text

        Dieses trenne ich in der Mitte und habe somit Stecker für zwei Rasspy-Satelliten.

        3D-Drucker: Ich hatte mich noch nicht bedankt. Wirklich sehr hilfreiche Tipps und eine ausgezeichnete Beschreibung. Vielen Dank. Auf deinem Foto vom Gehäuse erkenne ich eine recht grobe Oberfläche: Ist dies Ergebnis eine Frage des Druckers oder des verwendeten Materials? Könntest du auch "glattere" Oberflächen drucken? Für mich wäre nun nämlich das Konstruieren und Drucken des Gehäuses der nächste Schritt, damit mein Rhasspy endlich im Wohnzimmer in den Live-Betrieb gehen kann.

        Soweit für heute.

        Beste Grüße
        Thomas

        joergeliJ Online
        joergeliJ Online
        joergeli
        wrote on last edited by joergeli
        #72

        @tobetobe
        Hallo Thomas,

        WakeWord:
        Hauptproblem nach Erstellen der WAV-Dateien war die Generierung des WakeWords auf https://snowboy.kitt.ai/.
        Das Hochladen der 3 WAV-Dateien per Windows-Rechner und Firefox war kein Problem, jedoch soll anschließend dort noch mal getestet werden, was ich nicht durchführen konnte, weil das ReSpeaker Mic-Array ja am Raspi hängt.
        Deshalb musste ich das mit dem Python-Script snowboyTrain vom Raspi aus machen, welches die PMDL-Datei ohne den Test erstellt.

        Ich habe - evtl. unbegründete - Bedenken bei der Rückführung:
        Wenn ein Text z.B. via MQTT von ioBroker zum Rhasspy gesendet wird, muß ja eine WAV-Datei daraus erstellt werden.
        Auf Dauer wären das ja rel. viele Schreibvorgänge auf der SD-Karte, was ja deren Lebensdauer nicht gut tun soll?

        Akustische Rückmeldung::
        Ich hatte mal mit einem Headset die "Beeps" über die 3,5mm-Buchse des Raspi getestet, das funktioniert soweit.
        Anschließend hatte ich probeweise einen kleinen 8 Ohm-Lautsprecher an die Buchse angeschlossen: da sind die Beeps kaum hörbar. Daraufhin habe ich mir auf Verdacht einen kleinen 5V NF-Verstärker bestellt, aber noch nicht getestet.
        Wenn ich das richtig gelesen habe, ist auf Deinem Matrix Voice aber bereits ein 2Kanal 3W Audio-Verstärker enthalten, sollte bei Dir also funktionieren.

        3D-Drucker:
        Naja, so grob ist die Oberfläche m. E. nicht.
        Das Gehäuse ist mit einer Schichtdicke von 0,3 mm gedruckt.
        Ich könnte noch auf 0,2 mm runter gehen, was aber die Druckzeit sehr verlängern würde.
        Anbei noch mal ein paar Fotos:
        rhasspy_01.jpg rhasspy_02.jpg rhasspy_03.jpg rhasspy_04.jpg
        Ich war mit der Tablet-Cam auch ziemlich nah am Objekt und die Schattenwürfe der Schreibtischlampe lassen das Ganze gröber aussehen, als es ist.

        Gruß
        Jörg

        tobetobeT 1 Reply Last reply
        0
        • Tom10webT Tom10web

          Hallo, in die Runde
          Ich habe nun nach einigem lesen Rhasspy auf meinem alten Raspi3b installiert . Aufwachen funktioniert und Befehle werden erkannt, die LEDs nutze ich noch nicht, doch wie weiter ?
          Kann einer einem Anfänger das weitere Vorgehen im Groben erklären.
          z B. "Wie spät ist es" oder "Schalte die Lampe XY"
          Ich nutze seit kurzem einen "Beelink BT3 - X Mini PC 4+64GB" (vorher den Raspi) auf dem IOBroker perfekt läuft, unter Objekte/MQTT/de/transition werden auch einige Datenpunkte angelegt, aber nichts mit "Lampe" oder "wie spät".
          Wie erzeuge ich die benötigten Datenpunkte, auswerten könnte ich sie doch bestimmt mit Blockly-Scripten.
          Habe bisher alles was ich wollte hinbekommen, hier fehlt mir aber das Grundverständnis. Ich steuere alles (Radio, TV, Rolladen, Garagentor, Alarmanlage,.... per Habpanel auf einem Tablet bzw. Handy, möchte aber einige Befehle per OFFLINE-Sprachsteuerung ausführen.
          Ich danke euch

          tobetobeT Offline
          tobetobeT Offline
          tobetobe
          wrote on last edited by
          #73

          @Tom10web
          Hi, hier nochmals das Skript von @Tictactoo für die Sentences zur Lampen- und Rollo-Steuerung:


          var intentResult = $('mqtt.0.rhasspy.intent.Change*');
          var intentArray = [];

          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 = intentObject.value;
              log(deviceID + state + value);
              setState(deviceID + state, JSON.parse(value));        
          }
          

          });

          Falls du noch Interesse an meinem vis für die Rollos und dem zugehörigen Skript hast, bitte melden.

          Beste Grüße
          tobetobe

          1 Reply Last reply
          0
          • Tom10webT Offline
            Tom10webT Offline
            Tom10web
            wrote on last edited by
            #74

            Herzlichen Dank an euch,
            funktioniert auf Anhieb, habe es doch mit JS und nicht mit Blockly getan.
            Wenn man´s nur kopieren und anpassen muss ist es ja auch nicht schwer.
            Die einfachen Sachen Licht, Rolladen, Garagentor..... Top.
            Welchen Vorteil haben die Slots, geht doch auch ohne, oder sind die für die LED Ansteuerung, (welche ich als letztes in Angriff nehme).
            @Tictactoo - Danke für das Angebot mit VIS, aber ich bleibe beim Habpanel, ist zwar nicht so umfangreich aber opt. "kompakter" also weniger Arbeit um eine ansehliche Oberfläche zu erreichen.
            Noch eine Frage, wie bekomme ich Rhasspy dazu, mir z.B. die Aussentemperatur anzusagen.
            Schönen Abend noch

            Raspi3
            Beelink Bt3 X

            joergeliJ tobetobeT 2 Replies Last reply
            0
            • Tom10webT Tom10web

              Herzlichen Dank an euch,
              funktioniert auf Anhieb, habe es doch mit JS und nicht mit Blockly getan.
              Wenn man´s nur kopieren und anpassen muss ist es ja auch nicht schwer.
              Die einfachen Sachen Licht, Rolladen, Garagentor..... Top.
              Welchen Vorteil haben die Slots, geht doch auch ohne, oder sind die für die LED Ansteuerung, (welche ich als letztes in Angriff nehme).
              @Tictactoo - Danke für das Angebot mit VIS, aber ich bleibe beim Habpanel, ist zwar nicht so umfangreich aber opt. "kompakter" also weniger Arbeit um eine ansehliche Oberfläche zu erreichen.
              Noch eine Frage, wie bekomme ich Rhasspy dazu, mir z.B. die Aussentemperatur anzusagen.
              Schönen Abend noch

              joergeliJ Online
              joergeliJ Online
              joergeli
              wrote on last edited by
              #75

              @Tom10web sagte in Rhasspy Offline Sprachsteuerung:

              Noch eine Frage, wie bekomme ich Rhasspy dazu, mir z.B. die Aussentemperatur anzusagen.

              Direkte Sprachausgabe auf dem Rhasspy-Raspi haben wir auch noch nicht hinbekommen.
              Evtl. wird das was, wenn die angekündigte Rhasspy Version 2.5 verfügbar ist. ( Vorschau auf das GUI: rhasspy-voltron ).

              Ich nutze momentan einen Workaround, in dem ich den entspr. Antworttext mit JavaScript generiere und diesen Text dann mit dem ioBroker PAW-Adapter an mein Tablet/Smartphone sende, wo dann die Sprachausgabe erfolgt.

              Der Wert der Aussentemperatur (bzw. weiterer Temperaturen) muss natürlich bereits in einem ioBroker-Datenpunkt vorhanden sein.

              Der Rhasspy-Sentence sieht bei mir so aus:

              [Temperatur]
              temperatur_name = (temperatur) {name}
              temperatur_state = (draussen| wohnzimmer | keller | schlafzimmer | badewasser) {state}
              wie (warm | kalt) ist [es | das] [(im)] <temperatur_state>
              

              Das entspr. Javascript:

              const temperatur = 'mqtt.0.rhasspy.intent.Temperatur'   // Temperatur
              
              //______________________________________________
              // Temperaturen
              on({id: temperatur, change: "any"},function(obj) {
                  let empf_code = getState(temperatur).val ;
                  let empf_json = JSON.parse(empf_code);
                  let name = empf_json.name;
                  let state = empf_json.state;
                  //log ("name: " + name + "  state: " + state);
              
                if (state == "draussen") {
                  let aussentemp_obj = "hm-rpc.2.CUX0100001.1.TEMPERATURE";
                  let aussenfeuchte_obj = "hm-rpc.2.CUX0100001.1.HUMIDITY";
                  let aussentemp_wert = getState(aussentemp_obj).val;
                  let aussenfeuchte_wert = getState(aussenfeuchte_obj).val;
                  let aussentemp_string =  String(aussentemp_wert);
                  let aussenfeuchte_string =  String(aussenfeuchte_wert);
                  let aussentemp = aussentemp_string.replace(".",",");
                  let aussenfeuchte = aussenfeuchte_string.replace(".",",");
                  //log ( " Aussen-Temperatur ist " + aussentemp + " Grad" );
                  sendTo("paw.0",'Tablet_Jörg',{tts: "Es sind " + aussentemp + " Grad draussen bei " + aussenfeuchte + " Prozent Luftfeuchtigkeit" });      
                   }
              else if(state == "innen" || state == "wohnzimmer") {
                  let innentemp_obj = "sonoff.0.Kodi-Stecker.AM2301_Temperature";
                  let innentemp_wert = getState(innentemp_obj).val;
                  let innentemp_string =  String(innentemp_wert);
                  let innentemp = innentemp_string.replace(".",",");
                  //log ( " Innen-Temperatur ist " + innentemp + " Grad" );
                  sendTo("paw.0",'Tablet_Jörg',{tts: "Es sind " + innentemp + " Grad im Wohnzimmer" });      
                   }
              else if(state == "keller") {
                  let kellertemp_obj = "hm-rpc.2.CUX0100008.1.TEMPERATURE";
                  let kellertemp_wert = getState(kellertemp_obj).val;
                  let kellertemp_string =  String(kellertemp_wert);
                  let kellertemp = kellertemp_string.replace(".",",");
                  //log ( " Keller-Temperatur ist " + kellertemp + " Grad" );
                  sendTo("paw.0",'Tablet_Jörg',{tts: "Es sind " + kellertemp + " Grad im Keller" });      
                   }
              else if(state == "schlafzimmer") {
                  let schlafzimmer_obj = "javascript.0.DHT22.Schlafzimmer.Temp";
                  let schlafzimmer_wert = getState(schlafzimmer_obj).val;
                  let schlafzimmer_string =  String(schlafzimmer_wert);
                  let schlafzimmer = schlafzimmer_string.replace(".",",");
                  //log ( " Schlafzimmer-Temperatur ist " + schlafzimmer + " Grad" );
                  sendTo("paw.0",'Tablet_Jörg',{tts: "Es sind " + schlafzimmer + " Grad im Schlafzimmer" });      
                   }
              else if(state == "badewasser") {
                  let badewasser_obj = "javascript.0.SolarParser.Daten5";
                  let badewasser_wert = getState(badewasser_obj).val;
                  let badewasser_string =  String(badewasser_wert);
                  let badewassertemp = badewasser_string.replace(".",",");
                  //log ( " Badewasser-Temperatur ist " + badewassertemp + " Grad" );
                  sendTo("paw.0",'Tablet_Jörg',{tts: "Das Badewasser hat " + badewassertemp + " Grad" });      
                   }
              });
              //______________________________________________
              

              Hinweis:
              Für die Sprachausgabe muß ich die Zahlenwerte in Strings konvertieren.

              Meine Temperaturwerte werden von verschiedenen Senoren geliefert:
              Aussentemp/-feuchte über CUX von meiner 433 MHz Wetterstation.
              (falls es interessiert, meine Wetterdaten gibt's auch online zu sehen: joergeli.de )
              Innentemp über einen Sonoff Basic mit zusätzlichem DHT22/AM2301-Senor
              Die restlichen Temperaturen über NodeMCUs, die mit Sketchen für DHT22 geflashed wurden.

              1 Reply Last reply
              0
              • Tom10webT Tom10web

                Herzlichen Dank an euch,
                funktioniert auf Anhieb, habe es doch mit JS und nicht mit Blockly getan.
                Wenn man´s nur kopieren und anpassen muss ist es ja auch nicht schwer.
                Die einfachen Sachen Licht, Rolladen, Garagentor..... Top.
                Welchen Vorteil haben die Slots, geht doch auch ohne, oder sind die für die LED Ansteuerung, (welche ich als letztes in Angriff nehme).
                @Tictactoo - Danke für das Angebot mit VIS, aber ich bleibe beim Habpanel, ist zwar nicht so umfangreich aber opt. "kompakter" also weniger Arbeit um eine ansehliche Oberfläche zu erreichen.
                Noch eine Frage, wie bekomme ich Rhasspy dazu, mir z.B. die Aussentemperatur anzusagen.
                Schönen Abend noch

                tobetobeT Offline
                tobetobeT Offline
                tobetobe
                wrote on last edited by
                #76

                @Tom10web said in Rhasspy Offline Sprachsteuerung:

                Welchen Vorteil haben die Slots, geht doch auch ohne, oder sind die für die LED Ansteuerung, (welche ich als letztes in Angriff nehme).

                Hallo, das beantworte ich gerne. Zunächst: Alles, was funktioniert, ist natürlich machbar. Alles, was immer zuverlässig funktioniert, ist besser. Du wirst selbst rasch feststellen, dass die Anzahl deiner Sentences und auch deren Komplexität rasch zunehmen.

                Bei mir kam es anfangs zu häufigen Fehlschaltungen, weil ich in den Sentences immer wieder Definitionen vorgenommen und Begriffe/Namen verwendet habe, die ich in einem anderen Sentence bereits definiert hatte. Das war nicht nur fehleranfällig, sondern wurde auch immer unübersichtlicher. Daher habe ich mich dazu entschlossen, alles, was ich in mehreren Sentences wiederverwenden kann, in den Slots zu hinterlegen.

                Die Slots sind also sozusagen der Baukasten, mit dem man die Sentences aufbauen kann.

                Neben der besseren Übersichtlichkeit ist auch die einfachere Pflege dieser Daten ein großer Vorteil. Beispiel: Stell dir vor, du möchtest ein weiteres Kommando für einen Schaltzustand hinzufügen, also zB zusätzlich zu "AUS" auch noch "WEG". Dann müsstest du in deinem Vorgehen jeden einzelnen Sentence ändern. Bei einer sauberen Trennung Sentences/Slots hingegen bräuchtest du nur ein einer Stelle in den Slots das neue Kommando mit aufzunehmen.

                Fazit: Zuverlässige Funktion, Übersichtlichkeit und leichtere Pflege sind für mich die entscheidenden Vorteile, eine saubre Struktur bei den Slots zu verwenden.

                @Tom10web said in Rhasspy Offline Sprachsteuerung:

                Danke für das Angebot mit VIS, aber ich bleibe beim Habpanel,

                Gerne und kein Problem. Aus welcher Oberfläche die Daten für mein Skript zur Steuerung der Rollos kommen, müsste eigentlich gleichgültig sein. Ich persönlich denke, dass es in einem Smart Home System mehr Sinn ergibt, die Rollos zeit- und eventgesteuert zu bedienen, als vor einer Bedienoberfläche zu sitzen, den Knopf "Runterfahren" zu drücken, um dann im richtigen Moment "Stop" auszulösen, wenn zB die gewünschte Beschattung erreicht wurde - zumal für ein Rollo in einem Zimmer, in das man keinen Einblick hat. Man kann natürlich auch mit dem Tablet in das Zimmer im zweiten Stock gehen, um das Rollo zu beobachten ;-))

                Beste Grüße
                Thomas

                Beste Grüße
                tobetobe

                Tom10webT 1 Reply Last reply
                0
                • joergeliJ joergeli

                  @tobetobe
                  Hallo Thomas,

                  WakeWord:
                  Hauptproblem nach Erstellen der WAV-Dateien war die Generierung des WakeWords auf https://snowboy.kitt.ai/.
                  Das Hochladen der 3 WAV-Dateien per Windows-Rechner und Firefox war kein Problem, jedoch soll anschließend dort noch mal getestet werden, was ich nicht durchführen konnte, weil das ReSpeaker Mic-Array ja am Raspi hängt.
                  Deshalb musste ich das mit dem Python-Script snowboyTrain vom Raspi aus machen, welches die PMDL-Datei ohne den Test erstellt.

                  Ich habe - evtl. unbegründete - Bedenken bei der Rückführung:
                  Wenn ein Text z.B. via MQTT von ioBroker zum Rhasspy gesendet wird, muß ja eine WAV-Datei daraus erstellt werden.
                  Auf Dauer wären das ja rel. viele Schreibvorgänge auf der SD-Karte, was ja deren Lebensdauer nicht gut tun soll?

                  Akustische Rückmeldung::
                  Ich hatte mal mit einem Headset die "Beeps" über die 3,5mm-Buchse des Raspi getestet, das funktioniert soweit.
                  Anschließend hatte ich probeweise einen kleinen 8 Ohm-Lautsprecher an die Buchse angeschlossen: da sind die Beeps kaum hörbar. Daraufhin habe ich mir auf Verdacht einen kleinen 5V NF-Verstärker bestellt, aber noch nicht getestet.
                  Wenn ich das richtig gelesen habe, ist auf Deinem Matrix Voice aber bereits ein 2Kanal 3W Audio-Verstärker enthalten, sollte bei Dir also funktionieren.

                  3D-Drucker:
                  Naja, so grob ist die Oberfläche m. E. nicht.
                  Das Gehäuse ist mit einer Schichtdicke von 0,3 mm gedruckt.
                  Ich könnte noch auf 0,2 mm runter gehen, was aber die Druckzeit sehr verlängern würde.
                  Anbei noch mal ein paar Fotos:
                  rhasspy_01.jpg rhasspy_02.jpg rhasspy_03.jpg rhasspy_04.jpg
                  Ich war mit der Tablet-Cam auch ziemlich nah am Objekt und die Schattenwürfe der Schreibtischlampe lassen das Ganze gröber aussehen, als es ist.

                  Gruß
                  Jörg

                  tobetobeT Offline
                  tobetobeT Offline
                  tobetobe
                  wrote on last edited by
                  #77

                  @joergeli

                  Hallo Jörg,

                  WakeWord: Danke für den Tipp zum Testen. Das schaue ich mir nochmals an, in der Hoffnung, dass man den Test dann auch mit dem Browsermikrofon durchführen kann. Ansonsten kann ich ja immer noch auf das von dir gefundene Skript zurückgreifen. Gute Arbeit!

                  @joergeli said in Rhasspy Offline Sprachsteuerung:

                  Wenn ein Text z.B. via MQTT von ioBroker zum Rhasspy gesendet wird, muß ja eine WAV-Datei daraus erstellt werden.

                  Interessante Überlegung. Das führt mich zu der Frage, ob die wavs wirklich dynamisch erzeugt werden müssen, oder ob man dies gesamte, anzusagende Sequenz nicht aus verschiedenen wav-Dateien zusammenstückeln kann/muss, so dass das dynamische Generieren auf ein Minimum beschränkt werden kann, also zB "die Temperatur" (festes wav1) "im Wohnzimmer beträgt" (festes wav2) "neunundneunzig" (dynamisches wav3) "Grad" (festes wav4).

                  Das ist für mich nur so eine Überlegung, die ich im Auge behalten werde. Ich denke mir, dass dies auch ein zeitlicher Aspekt sein könnte. Je mehr neu generiert werden muss, um so länger dauert auch bis zur Ansage. Wir werden sehen...

                  Akustische Rückmeldung: Ich warte noch auf mein Kabel, welches erst Anfang März geliefert werden soll. Von daher hatte ich meine kleinen Lautsprecher noch nie in Betrieb. Momentan habe ich nur einen Ohrhörersatz vom iPhone angeschlossen. In deinem Fall einen kleinen Verstärker zu verwenden, ist sicher sinnvoll. Jetzt brauchst du natürlich wieder ein neues Gehäuse...

                  3D-Drucker: Wie gesagt: Ich habe bei dem gesamten Thema noch gar keine Erfahrung. Ich habe lediglich einige BIlder von selbst erstellten Druckexemplaren (zB bei Thingiverse) gesehen, deren Oberflächen absolut glatt erscheinen. Kann natürlich auch sein, dass hier manipuliert wurde...

                  Beste Grüße
                  Thomas

                  Beste Grüße
                  tobetobe

                  joergeliJ 1 Reply Last reply
                  0
                  • tobetobeT tobetobe

                    @joergeli

                    Hallo Jörg,

                    WakeWord: Danke für den Tipp zum Testen. Das schaue ich mir nochmals an, in der Hoffnung, dass man den Test dann auch mit dem Browsermikrofon durchführen kann. Ansonsten kann ich ja immer noch auf das von dir gefundene Skript zurückgreifen. Gute Arbeit!

                    @joergeli said in Rhasspy Offline Sprachsteuerung:

                    Wenn ein Text z.B. via MQTT von ioBroker zum Rhasspy gesendet wird, muß ja eine WAV-Datei daraus erstellt werden.

                    Interessante Überlegung. Das führt mich zu der Frage, ob die wavs wirklich dynamisch erzeugt werden müssen, oder ob man dies gesamte, anzusagende Sequenz nicht aus verschiedenen wav-Dateien zusammenstückeln kann/muss, so dass das dynamische Generieren auf ein Minimum beschränkt werden kann, also zB "die Temperatur" (festes wav1) "im Wohnzimmer beträgt" (festes wav2) "neunundneunzig" (dynamisches wav3) "Grad" (festes wav4).

                    Das ist für mich nur so eine Überlegung, die ich im Auge behalten werde. Ich denke mir, dass dies auch ein zeitlicher Aspekt sein könnte. Je mehr neu generiert werden muss, um so länger dauert auch bis zur Ansage. Wir werden sehen...

                    Akustische Rückmeldung: Ich warte noch auf mein Kabel, welches erst Anfang März geliefert werden soll. Von daher hatte ich meine kleinen Lautsprecher noch nie in Betrieb. Momentan habe ich nur einen Ohrhörersatz vom iPhone angeschlossen. In deinem Fall einen kleinen Verstärker zu verwenden, ist sicher sinnvoll. Jetzt brauchst du natürlich wieder ein neues Gehäuse...

                    3D-Drucker: Wie gesagt: Ich habe bei dem gesamten Thema noch gar keine Erfahrung. Ich habe lediglich einige BIlder von selbst erstellten Druckexemplaren (zB bei Thingiverse) gesehen, deren Oberflächen absolut glatt erscheinen. Kann natürlich auch sein, dass hier manipuliert wurde...

                    Beste Grüße
                    Thomas

                    joergeliJ Online
                    joergeliJ Online
                    joergeli
                    wrote on last edited by joergeli
                    #78

                    Hallo Thomas,
                    @tobetobe sagte in Rhasspy Offline Sprachsteuerung:

                    WakeWord: Danke für den Tipp zum Testen. Das schaue ich mir nochmals an, in der Hoffnung, dass man den Test dann auch mit dem Browsermikrofon durchführen kann. Ansonsten kann ich ja immer noch auf das von dir gefundene Skript zurückgreifen

                    Mit dem Browsermikrofon hatte ich es ja vorher erfolgreich direkt online durchgeführt.
                    In den Tipps der Rhasspy-Community liest man aber, daß es wohl besser wäre, das mit dem Mikrofon durchzuführen, welches final auch verwendet wird. Deshalb meine Klimmzüge mit dem Rhasspy-Mikrofon.
                    Hat dann bis dato auch rel. gut am finalen Standort des Rhasspy funktioniert.

                    aaaber: Langsam treibt mich das Wakeword in den Wahnsinn.
                    Gestern kommt Frau nach Hause und sagt ein paar belanglose Sätze (ohne WakeWord), was zur Folge hat, daß wieder andauernd Fehlauslösungen kommen. :angry:
                    Ich habe jetzt, wie hier erwähnt, zusätzlich mit dem Gain (Verstärkungsfaktor) des Mikros experimentiert. Mein Profil diesbzgl. sieht jetzt so aus:

                        "wake": {
                            "command": {
                                "program": "$RHASSPY_BASE_DIR/bin/mock-commands/sleep.sh"
                            },
                            "precise": {
                                "model": "okay-rhasspy.pb"
                            },
                            "snowboy": {
                                "audio_gain": "1.3",
                                "model": "snowboy/liesel.pmdl",
                                "sensitivity": "0.44"
                            },
                            "system": "snowboy"
                        }
                    

                    also sensitivity runter gesetzt und audio_gain erhöht.
                    Das muß ich jetzt mal beobachten.

                    Gruß
                    Jörg

                    tobetobeT 1 Reply Last reply
                    0
                    • tobetobeT tobetobe

                      @Tom10web said in Rhasspy Offline Sprachsteuerung:

                      Welchen Vorteil haben die Slots, geht doch auch ohne, oder sind die für die LED Ansteuerung, (welche ich als letztes in Angriff nehme).

                      Hallo, das beantworte ich gerne. Zunächst: Alles, was funktioniert, ist natürlich machbar. Alles, was immer zuverlässig funktioniert, ist besser. Du wirst selbst rasch feststellen, dass die Anzahl deiner Sentences und auch deren Komplexität rasch zunehmen.

                      Bei mir kam es anfangs zu häufigen Fehlschaltungen, weil ich in den Sentences immer wieder Definitionen vorgenommen und Begriffe/Namen verwendet habe, die ich in einem anderen Sentence bereits definiert hatte. Das war nicht nur fehleranfällig, sondern wurde auch immer unübersichtlicher. Daher habe ich mich dazu entschlossen, alles, was ich in mehreren Sentences wiederverwenden kann, in den Slots zu hinterlegen.

                      Die Slots sind also sozusagen der Baukasten, mit dem man die Sentences aufbauen kann.

                      Neben der besseren Übersichtlichkeit ist auch die einfachere Pflege dieser Daten ein großer Vorteil. Beispiel: Stell dir vor, du möchtest ein weiteres Kommando für einen Schaltzustand hinzufügen, also zB zusätzlich zu "AUS" auch noch "WEG". Dann müsstest du in deinem Vorgehen jeden einzelnen Sentence ändern. Bei einer sauberen Trennung Sentences/Slots hingegen bräuchtest du nur ein einer Stelle in den Slots das neue Kommando mit aufzunehmen.

                      Fazit: Zuverlässige Funktion, Übersichtlichkeit und leichtere Pflege sind für mich die entscheidenden Vorteile, eine saubre Struktur bei den Slots zu verwenden.

                      @Tom10web said in Rhasspy Offline Sprachsteuerung:

                      Danke für das Angebot mit VIS, aber ich bleibe beim Habpanel,

                      Gerne und kein Problem. Aus welcher Oberfläche die Daten für mein Skript zur Steuerung der Rollos kommen, müsste eigentlich gleichgültig sein. Ich persönlich denke, dass es in einem Smart Home System mehr Sinn ergibt, die Rollos zeit- und eventgesteuert zu bedienen, als vor einer Bedienoberfläche zu sitzen, den Knopf "Runterfahren" zu drücken, um dann im richtigen Moment "Stop" auszulösen, wenn zB die gewünschte Beschattung erreicht wurde - zumal für ein Rollo in einem Zimmer, in das man keinen Einblick hat. Man kann natürlich auch mit dem Tablet in das Zimmer im zweiten Stock gehen, um das Rollo zu beobachten ;-))

                      Beste Grüße
                      Thomas

                      Tom10webT Offline
                      Tom10webT Offline
                      Tom10web
                      wrote on last edited by
                      #79

                      @tobetobe
                      Danke für die genaue Erklärung der Slots, hilft garantiert auch vielen die hier nur mitlesen.
                      Meine Rolladen sind schon über die Astrofunktion gesteuert(schließen zu 70% und bei TV aus zu 100%) ich möchte nur zusätzlich per Sprachbefehl eingreifen können. Was ja seit Gestern gut funktioniert, dank euch
                      Schönes Wochenende

                      Raspi3
                      Beelink Bt3 X

                      1 Reply Last reply
                      0
                      • joergeliJ joergeli

                        Hallo Thomas,
                        @tobetobe sagte in Rhasspy Offline Sprachsteuerung:

                        WakeWord: Danke für den Tipp zum Testen. Das schaue ich mir nochmals an, in der Hoffnung, dass man den Test dann auch mit dem Browsermikrofon durchführen kann. Ansonsten kann ich ja immer noch auf das von dir gefundene Skript zurückgreifen

                        Mit dem Browsermikrofon hatte ich es ja vorher erfolgreich direkt online durchgeführt.
                        In den Tipps der Rhasspy-Community liest man aber, daß es wohl besser wäre, das mit dem Mikrofon durchzuführen, welches final auch verwendet wird. Deshalb meine Klimmzüge mit dem Rhasspy-Mikrofon.
                        Hat dann bis dato auch rel. gut am finalen Standort des Rhasspy funktioniert.

                        aaaber: Langsam treibt mich das Wakeword in den Wahnsinn.
                        Gestern kommt Frau nach Hause und sagt ein paar belanglose Sätze (ohne WakeWord), was zur Folge hat, daß wieder andauernd Fehlauslösungen kommen. :angry:
                        Ich habe jetzt, wie hier erwähnt, zusätzlich mit dem Gain (Verstärkungsfaktor) des Mikros experimentiert. Mein Profil diesbzgl. sieht jetzt so aus:

                            "wake": {
                                "command": {
                                    "program": "$RHASSPY_BASE_DIR/bin/mock-commands/sleep.sh"
                                },
                                "precise": {
                                    "model": "okay-rhasspy.pb"
                                },
                                "snowboy": {
                                    "audio_gain": "1.3",
                                    "model": "snowboy/liesel.pmdl",
                                    "sensitivity": "0.44"
                                },
                                "system": "snowboy"
                            }
                        

                        also sensitivity runter gesetzt und audio_gain erhöht.
                        Das muß ich jetzt mal beobachten.

                        Gruß
                        Jörg

                        tobetobeT Offline
                        tobetobeT Offline
                        tobetobe
                        wrote on last edited by
                        #80

                        @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...

                        Beste Grüße
                        tobetobe

                        joergeliJ 1 Reply Last reply
                        0
                        • 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
                          wrote on last edited by
                          #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 Reply Last reply
                          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
                            wrote on last edited by
                            #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 Reply Last reply
                            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
                              wrote on last edited by 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 Reply Last reply
                              0
                              • B Offline
                                B Offline
                                BastianH
                                wrote on last edited by
                                #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 Reply Last reply
                                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
                                  wrote on last edited by
                                  #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 Reply Last reply
                                  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
                                    wrote on last edited by 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 Reply Last reply
                                    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
                                      wrote on last edited by 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 Reply Last reply
                                      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
                                        wrote on last edited by
                                        #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 Reply Last reply
                                        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
                                          wrote on last edited by
                                          #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 Reply Last reply
                                          0
                                          Reply
                                          • Reply as topic
                                          Log in to reply
                                          • Oldest to Newest
                                          • Newest to Oldest
                                          • Most Votes


                                          Support us

                                          ioBroker
                                          Community Adapters
                                          Donate

                                          828

                                          Online

                                          32.4k

                                          Users

                                          81.5k

                                          Topics

                                          1.3m

                                          Posts
                                          Community
                                          Impressum | Datenschutz-Bestimmungen | Nutzungsbedingungen | Einwilligungseinstellungen
                                          ioBroker Community 2014-2025
                                          logo
                                          • Login

                                          • Don't have an account? Register

                                          • Login or register to search.
                                          • First post
                                            Last post
                                          0
                                          • Home
                                          • Recent
                                          • Tags
                                          • Unread 0
                                          • Categories
                                          • Unreplied
                                          • Popular
                                          • GitHub
                                          • Docu
                                          • Hilfe