NEWS
Rhasspy Offline Sprachsteuerung
-
Hallo Thomas,
@tobetobe sagte in Rhasspy Offline Sprachsteuerung:Ab Zeile 25 würde dann bei mir der Aufruf von Funktionen stattfinden, die zu den jeweiligen Intents passen. Dazu muss dann auch das setState-Kommando zusammengesetzt werden.
Versuche es mal so:
var intentResult = $('mqtt.1.hermes.intent.*'); var intentArray = []; for(var i = 0; i < intentResult.length; i++) { log("Zeile8:"+intentResult[i]); intentArray.push(intentResult[i]); } on({id: intentArray, change: "any"}, function (obj) { log(obj.newState.val); let intentObject = JSON.parse(obj.newState.val); let anzslots = intentObject.slots.length; //Anzahl Slots ermitteln log("Anzahl Slots:" + anzslots); let intent = intentObject.intent.intentName; log("intent:" + intent); let siteId = intentObject.siteId; log("siteID:" + siteId); let slot = []; let wertearray = []; for (i = 0; i < anzslots; i++) { let slot = intentObject.slots[i].slotName+':'+intentObject.slots[i].value.value; log("slot[" +i + "]:" + slot); let slotwert = intentObject.slots[i].value.value; wertearray.push(slotwert); // hier werden nur! die Werte der Slots in ein neues array "wertearray" geschrieben } // end of for log("Ausgabe: " + wertearray[0] + "." + wertearray[2] + "," + wertearray[1]); //Setzen der States, bzw. Aufruf der entspr. Funktionen //setState (wertearray[0] + "." + wertearray[2] , wertearray[1], true); })
Damit bekommst Du die Werte aus den Slots extrahiert und kannst dann damit das "setState" zusammenbauen.
Es setzt aber voraus, daß immer 3 Slots ( slot[0], slot[1], slot[2]) von Rhasspy geliefert werden.Gruß
Jörg -
@tobetobe
Danke für deine Hilfe!
Das Problem sitzt vor dem Monitor und ich war so blöd und habe meinen Benutzernamen nicht eingetragen.Ich fasse einmal zusammen was ich gemacht habe:
Image Flashen mit Win32 DiskImager (Raspian Buster lite) ssh und wpa_supplicant.conf auf SD-Karte anlegen sudo apt update sudo apt full-upgrade sudo curl -sSL https://get.docker.com | sh sudo usermod -aG docker pi sudo reboot -n sudo docker pull rhasspy/rhasspy:2.5.0-pre docker run -d -p 12101:12101 \ --restart unless-stopped \ -v "$HOME/.config/rhasspy/profiles:/profiles" \ --device /dev/snd:/dev/snd \ synesthesiam/rhasspy-server:latest \ --user-profiles /profiles \ --profile de
Ich mache mich dann mal an das konfigurieren und hoffe, dass ich mein respeaker 2-mics pi hat bzw. respeaker 4-mics pi hat installiert bekomme.
Danke und VG
Leif -
@capitaenz
Hallo Leif,
ich habe ein Respeaker 4-Mic Array.
Die entspr. Respeaker-Treiber kannst Du auch installieren, indem Du zuerst HLC (Hermes LED Control) installierst,
das dient zum Ansteuern des LED-Ringes.siehe HermesLedControl
und hier: Installation & updateIm Verlauf der HLC-Installation wirst Du u.a. gefragt, welches Mikrofon Du benutzt.
Wenn Du dann Dein entspr. Respeaker-Mic auswählst, wirst Du anschl. gefragt, ob Du auch die entspr. Treiber installieren willst.Gruß
Jörg -
@joergeli said in Rhasspy Offline Sprachsteuerung:
log("Ausgabe: " + wertearray[0] + "." + wertearray[2] + "," + wertearray[1]);
Hallo Jörg,
ganz hervorragend! Vielen Dank. Wie gesagt, baue ich mir nun Funktionsaufrufe ein, die ich über if- Abfragen steuere. if bezieht sich dabei auf den Namen des intents, sodass ich die Funktionen spezifisch passend zum intent aufbauen kann. Dein Feld "wertarray" enthält natürlich immer so viele Werte, wie es slots gibt. Damit kann ich dann in einer Funktion auch "setState" immer so aufbauen, wie es für das intent notwendig ist, bzw auch alles sonstige, wie zB TTS-Funktionen mit hineinpacken.. Das finde ich jetzt schon ziemlich elegant.
Mittlerweile schält sich bei mir auch immer mehr die Vorstellung heraus, dass ich wohl bei dem mqtt-Client von ioBroker bleibe und nicht direkt auf den Mosquitto-Broker zugreife. Es ist einfach angenehmer, wenn man die intents auch als Datenobjekte sehen kann. Und die Subscription erledigt der Client ja nun wirklich zuverlässig.
Es interessiert mich noch, ob ich mir den Mosquitto-Broker nicht sogar sparen kann, indem ich direkt auf den internen Broker zugreife, allerdings mit eingetragener IP-Adresse. Ich muss nochmals nachlesen, was du dazu schon geschrieben hattest, bzw andere im Rhasspy-Forum. Oder halt einfach mal testen...
Heute passiert allerdings nichts mehr. In diesem Sinne noch einen schönen Abend
Thomas -
Gut soweit! Bei Fragen meldest du dich.
-
Hallo Thomas,
@tobetobe sagte in Rhasspy Offline Sprachsteuerung:
Es interessiert mich noch, ob ich mir den Mosquitto-Broker nicht sogar sparen kann, indem ich direkt auf den internen Broker zugreife, allerdings mit eingetragener IP-Adresse. Ich muss nochmals nachlesen, was du dazu schon geschrieben hattest, bzw andere im Rhasspy-Forum. Oder halt einfach mal testen...
... das wäre mir auch lieber, und ich hatte es auch schon versucht mit Rhasspy-IP/Port 12183.
Funktioniert aber nicht, da man wohl nicht an den internen MQTT-Server im Docker herankommt?
Habe diesbzgl. auch mal gegoogelt nach " auf MQTT-Server in Docker-Container zugreifen", aber da habe ich nur gefunden, wie man einen MQTT-Broker in einem Docker-Container installieren kann.
Andererseits setzt wohl Hermes Led Control auch einen eigenständigen MQTT-Server voraus.Wenn man sich die Netzwerkparameter des Rhasspy-Raspis mit ifconfig ansieht, taucht da auch ein eigenständiges Netzwerkinterface namens "docker0" auf. Keine Ahnung, ob man damit was anfangen kann.
Dessen IP-Adresse 172.17.0.1 ist natürlich in meinem 192.168.192.xxx-LAN nicht erreichbar.pi@voltron:~ $ ifconfig docker0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500 inet 172.17.0.1 netmask 255.255.0.0 broadcast 172.17.255.255 inet6 fe80::42:e6ff:fe9b:3c5b prefixlen 64 scopeid 0x20<link> ether 02:42:e6:9b:3c:5b txqueuelen 0 (Ethernet) RX packets 3295954 bytes 2538688841 (2.3 GiB) RX errors 0 dropped 0 overruns 0 frame 0 TX packets 3287164 bytes 4911703231 (4.5 GiB) TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0 eth0: flags=4099<UP,BROADCAST,MULTICAST> mtu 1500 ether dc:a6:32:59:af:da txqueuelen 1000 (Ethernet) RX packets 0 bytes 0 (0.0 B) RX errors 0 dropped 0 overruns 0 frame 0 TX packets 0 bytes 0 (0.0 B) TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0 lo: flags=73<UP,LOOPBACK,RUNNING> mtu 65536 inet 127.0.0.1 netmask 255.0.0.0 inet6 ::1 prefixlen 128 scopeid 0x10<host> loop txqueuelen 1000 (Lokale Schleife) RX packets 8740 bytes 684161 (668.1 KiB) RX errors 0 dropped 0 overruns 0 frame 0 TX packets 8740 bytes 684161 (668.1 KiB) TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0 veth09f4fc4: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500 inet 169.254.198.203 netmask 255.255.0.0 broadcast 169.254.255.255 inet6 fe80::a520:6aa2:cace:e177 prefixlen 64 scopeid 0x20<link> ether 26:46:35:aa:f2:a2 txqueuelen 0 (Ethernet) RX packets 3295954 bytes 2584832197 (2.4 GiB) RX errors 0 dropped 0 overruns 0 frame 0 TX packets 3288284 bytes 4912121058 (4.5 GiB) TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0 wlan0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500 inet 192.168.192.26 netmask 255.255.255.0 broadcast 192.168.192.255 inet6 fe80::dea6:32ff:fe59:afdb prefixlen 64 scopeid 0x20<link> inet6 2002:5fde:1123:0:dea6:32ff:fe59:afdb prefixlen 64 scopeid 0x0<global> ether dc:a6:32:59:af:db txqueuelen 1000 (Ethernet) RX packets 118339 bytes 12174857 (11.6 MiB) RX errors 0 dropped 69914 overruns 0 frame 0 TX packets 14616 bytes 8131441 (7.7 MiB) TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
Nebenbei:
Ich habe mich in der mqtt.1-Client-Instanz jetzt nur noch auf folgende Topics subscribed:
hermes/intent/#, hermes/asr/startListening, hermes/nlu/intentNotRecognizedDas reicht aus, um alle Intents, das WakeWord und Intent-Nicht-Erkannt auszuwerten
Gruß
Jörg -
@tobetobe
Dank euch aus dem Forum hab ich die Installation jetzt soweit am laufen, aber noch nicht funktionsfähig.
Ich habe noch einmal meine Schritte dokumentiert:-
Image Flashen mit Win32 DiskImager (Raspian Buster lite)
-
ssh und wpa_supplicant.conf auf SD-Karte anlegen
-
sudo apt update
-
sudo apt full-upgrade
-
sudo curl -sSL https://get.docker.com | sh
-
sudo usermod -aG docker pi
-
sudo reboot -n
-
sudo docker pull rhasspy/rhasspy:2.5.0-pre
-
docker run -d -p 12101:12101
--restart unless-stopped
-v "$HOME/.config/rhasspy/profiles:/profiles"
--device /dev/snd:/dev/snd
synesthesiam/rhasspy-server:latest
--user-profiles /profiles
--profile de -
sudo chmod +x hlc_download.sh
-
sudo ./hlc_download.sh
Abfragen:
-
What assistant engine are you using?
2 (rhasspy) -
What's the path to your assistant config file?
/home/pi/.config/rhasspy/profiles/de/profile.json -
What device do you wish to control with SLC?
1 (respeaker2) -
What pattern do you want to use?
5 (kiboost) -
Do you need to install / configure your respeaker2?
1 (yes) -
sudo raspi-config (SPI Aktivieren)
->5->P4->EXIT -
sudo reboot -n
-
192.168.0.93:12101 -> Webinterface aufrufen
-
Use PyAudio (default)
Audio Recording -> 2: seees-2mic-vicecard: bcm2825-i2cs... -
Save + Restart Rhasspy
-
Audio Playing
Use aplay directly (ALSA)
Output Device (default:CARD=ALSA: Default Audio Device)
Jetzt muss noch MQTT aktiviert werden und ein WakeWord ausgewählt werden, allerdings scheint der Speaker
und der Leuchtringnoch nicht zu funktionieren, was wohl daran liegt, dass ich im Webinterface von Rhasspy den Output Device nicht abspeichern kann. Nach dem Neustart steht dieser wieder auf default.Kann mir bitte noch jemand den entscheidenden Hinweis geben?
Danke und VG
Leif -
-
Hallo Leif,
das sieht m.E. soweit gut aus.
@capitaenz sagte in Rhasspy Offline Sprachsteuerung:
sudo docker pull rhasspy/rhasspy:2.5.0-pre
docker run -d -p 12101:12101
--restart unless-stopped
-v "$HOME/.config/rhasspy/profiles:/profiles"
--device /dev/snd:/dev/snd
synesthesiam/rhasspy-server:latest
--user-profiles /profiles
--profile deHier ist aber möglicherweise eine Diskrepanz.
"latest" ist die aktuelle stabile Version von Rhasspy ( IMHO V.2.4.19)
"rhasspy:2.5.0-pre" ist ein Preview zur kommenden Rhasspy V.2.5 (auch "Voltron" genannt), d.h. sie ist noch nicht als stable definiert. Dennoch läuft sie schon recht stabil und ist momentan die Version, die Thomas und ich verwenden.Deshalb:
Stoppe mal Deinen docker-container:
1.) docker ps --> docker container anzeigen und Container ID notieren.
2.) docker stop <Container ID> --> docker container stoppen.
3.) Neuen docker-container wie folgt anlegen/starten:
docker run -d -p 12101:12101
--restart unless-stopped
-v "$HOME/.config/rhasspy/profiles:/profiles"
--device /dev/snd:/dev/snd rhasspy/rhasspy:2.5.0-pre
--user-profiles /profiles
--profile deSoweit, so gut.
Zuerst solltest Du dann mal überprüfen, ob Rhasspy überhaupt auf Dein WakeWord, bzw. Micro, reagiert.
Dazu im Rhasspy-GUI unter WakeWord "snowboy" aktivieren, mit einer Sensitivity = 0.9, Apply Frontend nicht aktiviert.
und unter MQTT "internal" aktivieren.
Wenn Du einen Kopfhörer zur Hand hast, diesen mal in die 3,5mm Klinkenbuchse des Raspi einstöpseln.
Wenn Du dann das WakeWord "snowboy" sagst, sollten im Kophörer dann "Beeps" zu hören sein, d.h. Micro und WakeWord-Erkennung funktionieren.
Du kannst auch im Rhasspy-GUI das Log beobachten, ob sich dort beim Sprechen des WakeWords was tut.Wenn das soweit funktioniert, können wir uns um weitere Probleme kümmern ( nebenbei: aplay steht bei mir auch auf default )
Gruß
JörgP.S.
Du hast nachträglich Deinen Post editiert:und der Leuchtring
Heißt das, das der LED-Ring funktioniert?
Du hast als LED-Pattern "kiboost" gewählt, allerdings scheint der 'ne Macke zu haben.
Ich verwende als Pattern "projectalice"
Du kannst die Konfiguration ändern, wie ich in meinem Post joergeli vom 9. Mai 2020, 20:15 beschrieben habe. -
@capitaenz
Hallo,das sieht ja alles schon ganz gut aus.
@capitaenz said in Rhasspy Offline Sprachsteuerung:
Jetzt muss noch MQTT aktiviert werden
Ich zweifle gerade, was ich dir empfehlen soll. MQTT ist gerade noch so eine Baustelle in der Version 2.5pre. Am besten, gehst du den sauberen Weg, zu dem Jörg und ich dir auch helfen können.
Das bedeutet, dass du dir einen eigenen MQTT-Broker installieren musst. Der kann auf einem anderen Rechner laufen und muss sich nicht auf dem Raspi für den Rhasspy befinden. Kann er aber auch...
Nimm zB den Eclipse, den du mit diesem Befehl lädtst:
sudo apt update docker pull eclipse-mosquitto
Eine Anleitung findest du hier:
https://hub.docker.com/_/eclipse-mosquitto
Dort siehst du auch, dass noch einige Files anzulegen sind, bevor du den Broker dann starten kannst. Dazu (zu den Files) schicke ich dir gleich noch eine Anleitung.
Noch ein Hinweis: Mit dem iobroker-Adapter für mqtt kannst du diesen Broker nicht ersetzen, so funktioniert es nicht!
Ich sehe gerade, dass soeben auch Jörg geantwortet hat. Folge zunächst einmal seinen Hinweisen, bevor du dich diesem MQTT-Broker zuwendest. Aber keine Angst, das ist kein Hexenwerk.
Als WakeWord würde ich dir zunächst den Standard "Snowboy" empfehlen. Mit dem Herstellen eigener Wakewords solltest du noch warten.
-
@joergeli @tobetobe
Ich danke euch beiden! Mich begeistert dieses Forum, denn hier begegnet man sich auf Augenhöhe.
Ich muss aber sagen, ich packe mein Testsystem erstmal wieder zusammen und verfolge weiterhin Rhasspy aufmerksam, denn auch wenn ich Ausdauer besitze (die braucht man bei Hausautomatisierung besonders), ist mir das Ganze noch zu unausgereift.
Außerdem hatte ich mir vorgestellt, den Snips-Adapter los zu werden, als ich MQTT gehört hatte.
Snips halte ich dann noch eine Weile am Leben und überarbeite das Gehäuse noch einmal:
link textTrotzdem Danke und bitte nicht böse sein, die zusammengefassten Infos können bestimmt auch andere noch brauchen.
Leif -
Hallo Leif,
so, nun nochmals in Fortführung meines vorigen Posts zum Thema MQTT.Ich habe mir unter /opt ein neues Verzeichnis mqtt angelegt. Darin befinden sich:
-
die Datei mosquitto.conf
-
die Datei docker-compose.yml, die du dir entspechend editieren musst
-
und das leere Verzeichnis pwfile
Die docker-compose.yml sollte folgenden Inhalt haben:
mosquitto: image: eclipse-mosquitto hostname: mqtt-server container_name: mqtt-server restart: unless-stopped ports: - "1883:1883" - "8883:8883" volumes: - /opt/mqtt/mosquitto.conf:/etc/mosquitto/mosquitto.conf - /opt/mqtt/pwfile:/etc/mosquitto/pwfile - /opt/mqtt:/var/lib/mosquitto
Wenn deine Datei mosquitto.con diesen Inhalt hat, ist alles OK (Datei habe ich gekürzt):
user mosquitto port 1883 listener 9001 protocol websockets persistence true persistence_location /mqtt/data allow_anonymous false password_file /mqtt/pwfile
Nun noch starten, aber bitte die Pfadangabe zur mosquitto.conf vorher anpassen!:
$ docker run -it -p 1883:1883 -p 9001:9001 -v mosquitto.conf:/mosquitto/config/mosquitto.conf eclipse-mosquitto
Damit läuft dein Broker.
In Rhasspy kannst du nun Hermes auf extern setzen und dort IP und Port eintragen, unter denen der Broker erreichbar ist.
Nun noch ein mqtt-Adapter im ioBroker installieren und ihn als Client konfigurieren. Dieser Client legt dir dann alle Objekte an, die du mit Skripten abholen und weiter verarbeiten kannst.
-
-
Hallo Leif,
schade, aber natürlich kein Problem.
@capitaenz said in Rhasspy Offline Sprachsteuerung:
das Ganze ist mir noch zu unausgereift.
Das kann man so mittlerweile eigentlich nicht mehr sagen. Aber Zeit zum Aufsetzen braucht man natürlich dennoch.
@capitaenz said in Rhasspy Offline Sprachsteuerung:
Außerdem hatte ich mir vorgestellt den Snips-Adapter los zu werden, als ich MQTT gehört hatte
Ja, das ist ja auch so. Den Snips-Adapter brauchst du nicht mehr.
-
@tobetobe
Hallo Thomas,ist es wirklich nötig, den MQTT so kompliziert aufzusetzen?
Ich habe einfach wie hier HermesLEDControl install Mosquitto beschrieben, einen normalen (nicht eclipse) Mosquitto installiert. Da braucht nichts mehr extra konfiguriert werden,
nur den mosquitto-service starten und gut ist.Ich finde es ebenfalls schade, daß Leif ausgestiegen ist, obwohl er eigentlich schon rel. weit war.
Ich verstehe aber, daß es für einen Rhasspy-Neueinsteiger sehr unübersichtlich ist, sich durch unseren "mehr oder weniger 2er-Chat" mit momentan ca. 220 Posts durchzuwühlen.Vorschlag:
Aber das veranlasst mich zu der Überlegung, ob wir nicht mal - in einem eigenen Thread ( Offline-Spracherkennung mit Rhasspy) - eine Schritt-für-Schritt-Anleitung zur Installation/Konfiguration von Rhasspy unter ioBroker erstellen sollten.
Dazu sind die Einzelschritte, die @capitaenz weiter oben aufgelistet hat, schon sehr hilfreich.
Darin sollte dann aber nur die reine Installation beschrieben werden.Unsere persönlichen Vorlieben bzgl. JS-Auswertung der Intents sollten m.E. aber besser in jeweils eigenen Threads behandelt werden.
In etwa so: Rhasspy-Sentences/Slots vorstellen und ebenfalls das zugehörige ioBroker-JS-Auswertescript.Gruß
Jörg -
Hallo Jörg,
ich habe zwischenzeitlich weiter am Skript gearbeitet. Das sieht nun so aus:// A - Definitionen var data var intentResult = $('mqtt.1.hermes.intent.*'); var intentArray = []; var intent; var siteId; var slot = []; var slotwert = []; var wertearray = []; // B - Initialisierung und Auslesen der Intents beim MQTT-Client for(var i = 0; i < intentResult.length; i++) { log(intentResult[i]); intentArray.push(intentResult[i]); } // C - Hauptfunktion zum Auslesen der Werte aus den Intents on({id: intentArray, change: "any"}, function (obj) { log(obj.newState.val); let intentObject = JSON.parse(obj.newState.val); let anzslots = intentObject.slots.length; //Anzahl Slots ermitteln log("Anzahl Slots:" + anzslots); intent = intentObject.intent.intentName; // log("intent:" + intent); siteId = intentObject.siteId; log("siteID:" + siteId); for (i = 0; i < anzslots; i++) { let slot = intentObject.slots[i].slotName+':'+intentObject.slots[i].value.value; log("slot[" +i + "]:" + slot); slotwert = intentObject.slots[i].value.value; wertearray.push(slotwert); // hier werden nur! die Werte der Slots in ein neues array "wertearray" geschrieben } // end of for log("Ausgabe Werte: " + wertearray[0] + wertearray[2] + "," + wertearray[1]); log("Ausgabe Slots: " + slot[0] + slot[2] + "," + slot[1]); // D - Aufrufen der Funktionen log("intent:" + intent); if(intent.includes("Change")) { log("intent:" + intent); changedevice()}; if(intent.includes("Set")) {setdevice()}; if(intent.includes("Get")) {getdevice()}; if(intent.includes("Window")) {controlwindow()}; }) // E - Funktionen function changedevice() // Change: BlindLevel, DeviceState, DimmerLevel, Temperature { if(wertearray[0].includes("milight")) { wertearray[2] = ".state"; } setState(wertearray[0] + wertearray[2] , wertearray[1]); log("Ausgabe Werte: " + wertearray[0] + wertearray[2] + "," + wertearray[1]); } // (weitere Funktionen nicht aufgeführt)
Beim Testen habe ich festgestellt, dass die Werte nicht an die Funktionen übergeben werden können, wenn sie innerhalb von "C" nur mit "let" gesetzt werden, da sie dann nur lokal, also innerhalb der Funktion On.Id gelten. Aus diesem Grunde habe ich sie als globale Variable an den Skriptanfang gestellt. Das funktioniert auch soweit alles, mit dem kleinen Nachteil, dass die Werte von "wertearray" schon ab dem zweiten Befehl nicht mehr aktualisiert werden. Im Log sieht das dann so aus:
- Befehl:
script.js.Rhasspy.mqttTest: Anzahl Slots:3 script.js.Rhasspy.mqttTest: siteID:Satellite1 script.js.Rhasspy.mqttTest: slot[0]:device:hm-rpc.0.ABC1234567.1 script.js.Rhasspy.mqttTest: slot[1]:value:50 script.js.Rhasspy.mqttTest: slot[2]:state:.LEVEL script.js.Rhasspy.mqttTest: Ausgabe Werte: hm-rpc.0.ABC1234567.1.LEVEL,50 script.js.Rhasspy.mqttTest: Ausgabe Slots: undefinedundefined,undefined script.js.Rhasspy.mqttTest: intent:ChangeDimmerLevel script.js.Rhasspy.mqttTest: intent:ChangeDimmerLevel script.js.Rhasspy.mqttTest: setForeignState(id=hm-rpc.0.ABC1234567.1.LEVEL, state=50) script.js.Rhasspy.mqttTest: Ausgabe Werte: hm-rpc.0.ABC1234567.1.LEVEL,50
Und nach dem zweiten Befehl:
javascript.0 (30499) script.js.Rhasspy.mqttTest: Anzahl Slots:3 script.js.Rhasspy.mqttTest: siteID:Satellite1 script.js.Rhasspy.mqttTest: slot[0]:device:hm-rpc.0.MEQ8765432.1 script.js.Rhasspy.mqttTest: slot[1]:value:100 script.js.Rhasspy.mqttTest: slot[2]:state:.LEVEL script.js.Rhasspy.mqttTest: Ausgabe Werte: hm-rpc.0.ABC1234567.1.LEVEL,50 script.js.Rhasspy.mqttTest: Ausgabe Slots: undefinedundefined,undefined script.js.Rhasspy.mqttTest: intent:ChangeDimmerLevel script.js.Rhasspy.mqttTest: intent:ChangeDimmerLevel script.js.Rhasspy.mqttTest: setForeignState(id=hm-rpc.0.ABC1234567.1.LEVEL, state=50) script.js.Rhasspy.mqttTest: Ausgabe Werte: hm-rpc.0.ABC1234567.1.LEVEL,50
Da hilft es dann nur, das Skript neu zu starten. Hast du eine Idee, woran das liegen könnte? Wahrscheinlich wie immer ein minimales Syntax-Problem.
Und dann wollte ich dich noch fragen, ob du bereits die Sprachansagen wieder lauffähig hast. Bisher liefen diese ja über die Funktion httpPost(data), müssten jetzt unter 2.5 aber doch über Hermes laufen, richtig?
-
@joergeli said in Rhasspy Offline Sprachsteuerung:
Vorschlag:
Hallo Jörg,
sehr guter Vorschlag. Ich hatte schon die gleiche Idee, weil es immer sehr mühsam ist, neue Interessierte an Bord zu holen, dazu in alten Posts zu kramen, aus denen man sein eigenes Wissen bezog oder dieses Wissen aus dem Gedächtnis hervorzuholen, unterstützt mit Recherchen im eigenen Filesystem, um dann letztlich das, was man schon einmal geschrieben hat, nochmal zu "Papier" zu bringen.
Ich denke, dir geht es genau so???
Die thematische Aufteilung finde ich gut, also zunächst die Installation, dann die Konfiguration der Sentences und Slots (schon da gibt es ja Alternativen) und dann letztlich die Verarbeitung mit JS.
Ich würde vorschlagen, dass wir uns zunächst im Grundsatz zum Vorgehen abstimmen. Entwürfe per Mail austauschen und erst abgestimmte Ergebnisse posten. So sollte das Ganze dann doch einen runden Eindruck machen.
Gruß
Thomas -
@tobetobe
Hallo Thomas,wenn ich das richtig interpretiere, werden die slots jetzt nicht mehr aktualisiert.
Ich nehme an, das hängt damit zusammen, daß Du dievar slot = []; var slotwert = []; var wertearray = [];
an den Anfang des Scriptes gesetzt hast, wo sie ja nur beim erstmaligen Starten des Scriptes ausgeführt werden.
Diese Angaben definieren ja nicht nur die Arrays, sondern löschen innerhalb der Schleife die Inhalte der Arrays, sprich:
sie machen sie leer.
IMHO müssen die wieder in die Schleife.
Wie die Werte dann an die Funktionen übergeben werden können, blicke ich im Moment auch noch nicht.Sprachansage funktioniert bei mir - wie bisher auch - über die Funktion httpPost(data)
let http = require('http'); // Für Sprachausgabe auf Rhasspy let options = { host: '192.168.192.26', //Rhasspy IP-Adresse port: 12101, //Rhasspy Port path: "/api/text-to-speech", method: 'POST', headers: { 'User-Agent' : 'ioBroker', 'Content-Type': 'text/plain', // 'Content-Length': data.length } }; //______________________________________________________________________________ function httpPost(data) { let req = http.request(options, function(res) { //console.log("http Status: " + res.statusCode); // Header (Rückmeldung vom Webserver) //console.log('HEADERS: ' + JSON.stringify(res.headers), (res.statusCode != 200 ? "warn" : "info")); }); // Fehler abfangen req.on('error', function(e) { console.log('ERROR: ' + e.message,"warn"); }); // write data to request body //console.log("Data to request body: " + data); // (data ? req.write(data) : console.log("Daten: keine Daten vorhanden")); req.write(data); req.end(); } //______________________________________________________________________________
Beispiel-Ausgabe für WakeWord:
function wakeword(){ let data = "ja?" ; httpPost(data); }
-
Hallo Jörg,
dies ist der Datenpunkt für TTS:
mqtt.1.hermes.tts.say
Ich konnte dort Text hinschicken, der aber nicht am Rhasspy-Lautsprecher ausgegeben wurde. Dazu ist wohl noch eine längere Auseinandersetzung mit dem Thema erforderlich.
Solange bleibte also erst einmal bei deinem Skript
Gruß
Thomas -
Ich habe mich ausgeruht noch einmal dran gesetzt, frei nach dem Motto: so schwer/blöd kann das/man doch nicht sein.
Also der Fehler war folgender:
Zum Test darf der MQTT nicht auf Extern stehen, ansonsten bekommt man kein Feedback.
Dann weiß ich nicht genau wie wichtig es ist folgendes abzuschalten:sudo nano /boot/config.txt // onboard Sound deaktivieren Turn dtparam=audio parameter to off: dtparam=audio=off
gefolgt von einem
sudo reboot -n
Die eigenen Ohren (und die Katze) danken einem folgendes:
sudo alsamixer sudo alsactl store
Allerdings kann ich machen was ich will, nach einen Reboot ist die Laustärke wieder auf 100%
Jetzt kommt aber das eigentlich Problem:
MQTTIch habe jetzt wie von dir @joergeli empfohlen folgendes ausgeführt und installiert:
sudo apt update sudo apt install -y mosquitto mosquitto-clients sudo systemctl enable mosquitto.service sudo systemctl start mosquitto
Wenn ich jetzt jedoch den MQTT auf Extern schalte, kommt beim ioBroker nichts an und der Lautsprecher vom Rhasspy bleibt stumm...
Es muss doch möglich sein, ohne besondere Ansprüche, wie bei Snips die erkannten Worte in den ioBroker zu bekommen.Neugierig bleibe ich, weil wer weiß wie lange Snips noch macht, Stichwort Adapter...
VG
Leif -
Zu der Ausgabe auf Lautsprecher kümmern wir uns ganz zum Schluß,
erst mal muss alles andere funktionieren !@capitaenz sagte in Rhasspy Offline Sprachsteuerung:
Dann weiß ich nicht genau wie wichtig es ist folgendes abzuschalten:
> sudo nano /boot/config.txt // onboard Sound deaktivieren > Turn dtparam=audio parameter to off: dtparam=audio=off
Mach das bitte wieder rückgängig, denn den Audio-Output über die 3,5mm-Klinkenbuchse brauchen wir später noch.
Was nicht schaden kann, damit Audio Out über die Klinkenbuchse erzwungen wird:
sudo raspi-config ausführen, dann:
7 Advanced Options --> A4 Audio --> 1 Force 3.5mm ('headphone') jackHattest Du ausgeführt, was ich geschrieben hatte?:
Stoppe mal Deinen docker-container:
1.) docker ps --> docker container anzeigen und Container ID notieren.
2.) docker stop <Container ID> --> docker container stoppen.
3.) Neuen docker-container wie folgt anlegen/starten:
docker run -d -p 12101:12101
--restart unless-stopped
-v "$HOME/.config/rhasspy/profiles:/profiles"
--device /dev/snd:/dev/snd rhasspy/rhasspy:2.5.0-pre
--user-profiles /profiles
--profile deDann solltest Du diese Rhasspy 2.5-pre GUI haben:
Wenn Dein MOSQUITTO soweit auf dem Rhasspy-Raspi läuft musst unter MQTT folgendes eintragen (wobei die IP-Adresse natürlich die von Deinem Rhasspy-Raspi sein muß):
Hinweis andere MQTT-Ports als 1883 funktionieren leider nicht, da hatte ich bei Rhasspy schon ein Issue aufgemacht, was bisher noch nicht gefixed wurde.Stelle auch die restlichen Parameter so ein, wie im Screenshot.
Wakeword sollte (erst mal) "snowboy" sein, mit einer sensitivity = 0.9 und kein Haken bei "Apply Frontend".
Hinweis: Es kann sein, wenn Du bei "Speech to Text" "Kaldi" auswählst, daß nach dem Abspeichern mit "Save Settings", Rhasspy noch weitere zu Kaldi gehörende Dateien aus dem Internet herunterladen will --> bestätigen und die Installation erfolgt dann automatisch.Dann wählst Du in der Rhasspy-GUI den Menüpunkt Sentences und trägst dort testweise nur! den Abschnitt ein, den ich blau markiert habe (das mit den Rolladen):
[Rolladen] rolladen_name = (rolladen ) {name} rolladen_state = (hochfahren | runterfahren | stoppen ) {state} <rolladen_name> <rolladen_state>
Abspeichern mit "Save Sentences" nicht vergessen!
Dann klickst Du in der Rhasspy-GUI auf das Symbol mit dem Haus.
Wenn Du jetzt das WakeWord "snowboy" und gleich anschließend "rolladen hochfahren" sagst, sollte das so in der Rhasspy-GUI erkannt werden:
Entsprechend auch "rolladen runterfahren", bzw. "rolladen stoppen".
Soweit erst mal; das weitere Vorgehen ( Auswertung in ioBroker, Sprachausgabe) können wir besprechen, wenn es bis hierher geklappt hat.
Bitte meine obige Frage beantworten und falls an irgendeiner Stelle Probleme auftreten sollten, bitte genau beschreiben, was passiert, bzw. nicht passiert ist.Gruß
Jörg -
Hallo Thomas,
@tobetobe sagte in Rhasspy Offline Sprachsteuerung:Ich konnte dort Text hinschicken, der aber nicht am Rhasspy-Lautsprecher ausgegeben wurde. Dazu ist wohl noch eine längere Auseinandersetzung mit dem Thema erforderlich.
Bei mir ist die mqtt.1-Instanz als Client/subscriber eingestellt.
IMHO kann die Instanz nur auf "subscribte" Topics hören, aber nicht an "hermes/tts/say" senden, bzw. publishen?Gruß
Jörg