NEWS
Rhasspy Offline Sprachsteuerung
-
Hallo Jörg,
Ich habe ioBroker mit Raspi3 begonnen und einen mittlerweile durch Raspi4 mit 4GByte ersetzt. Der Performance-Unterschied ist schon beachtlich und würde meiner Meinung nach auch bei Rhasspy einiges bringen. Schließlich hat der Raspi4 nicht nur mehr RAM, sondern insgesamt eine leistungsfähigere Architektur. Wenn du allerdings daran denken solltest, evtl mehrere Rhasspy-Satelliten zu verteilen, so nimm den jetzigen Raspi3 für den Satelliten und den Raspi4 (oder besser noch etwas leistungsfähigeres) für den Rhasspy-Server. Und noch etwas: Nimm die schnellsten Mikro-SDs, die du bekommen kannst, zB Scandisk Ultra.Und sonst: Ich hoffe, du bekommst aus der Rhasspy Community noch eine brauchbare Antwort. Ich bin noch nicht dazu gekommen, mir die Antwort von KiboOst anzuschauen, werde das aber in den nächsten Tagen mal ins Auge fassen. Vielleicht erkenne ich ja noch was Brauchbares.
Beste Grüße
Thomas -
@tobetobe
Hallo Thomas,
ich bin mit ioBroker ebenfalls von einem Raspi3 auf einen Raspi4 mit 4Gbyte umgestiegen, weil bei dem 3er das RAM knapp wurde. Es laufen in ioBroker "nur" 17 Instanzen, wobei der 3er schon mal unter 10% freies RAM ging, während jetzt beim 4er so um die 70% frei sind. Performancemäßig habe ich "gefühlt" keinen großen Unterschied festgestellt.Hier jetzt auch die Antwort bzgl HLC von KiboOst aus der community.rhasspy.org :
Frei übersetzt:
Von der aktuellen Rhasspy-Version werden noch keine Hermes-Topics geplublished (was für ein Wort ).
HLC wird erst mit einer entspr. Rhasspy-Version funktionieren
... und ich Blödmann probiere es seit 1,5 TagenGruß
Jörg -
@tobetobe Versuch es mal mit einem State, den alle deine Homatic-Geräte haben und mach bei replace dann auch den ".0" oder ".1" mit weg. Da er den Namen rausfinden will, muss es der erste Knoten des Geräts sein.
Außerdem müsstest du dann sinvollerweise bei dir, je nach State den du schalten willst "state:.1.STATE" in den Sentense mit einbauen, damit er da richtig schaltet. Bei Zigbee (für das ich das bei mir gemacht hab) sind alle States unter einem Knoten, daher geht es da so.
-
@Tictactoo
Hi, vielen Dank. Vor nächstem Wochenende habe ich keinen Zugang zum Rhasspy, kann also nicht testen und auch nicht antworten -
@joergeli
Hi Jörg
Das habe ich anders verstanden. Es fehlen noch einige Hermes Features. Wenn auf dem Rhasspy jedoch mosquito läuft, können LED Konfigurationen in Abhängigkeit vom jeweiligen Sprachbefehl ausgelöst werden. Leider kann ich dich aktuell nicht unterstützen, indem ich selbst teste.Bitte Lies nochmals im Rhasspy Forum unter Hermes Support nach. Ich melde mich, sobald ich selbst wieder testen kann
-
@tobetobe
Hallo Thomas,aus der Antwort von KiboOst:
Nothing have to be sent to have the led on when service starts. HLC doesn’t send anything on mqtt, it just listen on some topics to give a visual feedback
Also horcht HLC auf bestimmte Topics.
And once more, actual version of rhasspy doesn’t publish every hermes topics so it doesn’t work actually.
Aktuelle Rhasspy-Version sendet (published) nicht alle Hermes-Topics.
Wie ich - und Du wahrscheinlich auch - festegestellt habe, werden bei der Installation von HLC zwar die entspr. Topics in ioBroker mqtt.0 angelegt, diese aber nicht von der aktuellen Rhasspy-Version (bei mr 2.4.17) "gefüttert".Ich habe aber einen Workaround von H3adcra5h gefunden, der ein Python-Script geschrieben hat, das zumindest auf einige Topics horcht und dann entspr. LED-Reaktionen auslöst.
Das Script ist für ein ReSpeaker 6 Mic gedacht, funktioniert aber auch mit meinem ReSpeaker 4.
Die LED-Ringe der ReSpeaker Mics werden über SPI des Raspis angesteuert.
Ob es auch mit Deinem Matrix Voice funktioniert, kann ich nich sagen.Ich musste das Script aber etwas anpassen, um es zum Laufen zu bringen.
Zusätzlich musste ich die pixel-ring-Library mit pip install pixel_ring installieren.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 '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(2.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 __name__ == '__main__': # logging.basicConfig(filename='test.log', level=logging.INFO) power = LED(5) power.on() pixel_ring.set_brightness(20) pixel_ring.change_pattern('echo') client = mqtt.Client('spracherkenner') client.connect(MQTT_IP, port=MQTT_PORT) client.on_message = on_message client.loop_start() client.subscribe('hermes/nlu/intentNotRecognized') 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)
Ich habe die MQTT-Adresse und MQTT-Port auf meine mqtt.0-Instanz von ioBroker umgebogen.
Zu erwähnen wären noch die beiden Zeilen:
power = LED(5) power.on()
.GPIO5 wird auf HIGH gesetzt und damit wird beim Respeaker der LED-Ring aktiviert
Dadurch leuchtet aber noch nichts, der LED-Ring befindet sich lediglich in "Bereitschaft".Die folgenden 4 if-Abfragen horchen auf bestimmte Topics und lösen dann bestimmte LED-Sequenzen aus (abhängig vom voreingestellten Pattern).:
pixel_ring.think() : alle LEDS drehen sich blau/grün
pixel_ring.listen() : alle LEDs leuchten konstant blau
pixel_ring.speak(): alle LEDs blinken blau/grünanschließend bleiben diese Sequenzen für eine bestimmte Zeit aktiv, dann wird der LED-Ring ausgeschaltet:
time.sleep(x.x)
pixel_ring.off()Ein Workaround ist das Ganze deshalb, weil momentan nur ein paar Topics von Rhasspy unterstützt werden und das Abschalten der LEDs einfach durch einen Timeout (sleep) realisiert wird.
Wenn alle Hermes-Topics von Rhasspy unterstützt werden, wird das Abschalten aber wohl durch die entspr. Topics gesteuert. Für mich ist das so aber erst mal vollkommen ausreichend.Ach ja, der HLC-service muss vor dem Starten des Scriptes mit sudo systemctl stop hermesledcontrol gestoppt werden!.
Hier ein Foto meiner Konstruktion (Gehäuse habe ich nach einer Vorlage von Thingiverse auf meinem 3D-Drucker ausgedruckt):
Gruß
Jörg -
@joergeli
Hallo Jörg,
Zunächst einmal Glückwunsch, du bist da ja schon recht weit gekommen.Es war auch mein Verständnis, dass HLC auf bestimmte Topics reagieren kann, was ja auch durch das Skript bestätigt wird.
Ich hoffe, diese LED Steuerung beansprucht den Raspi nicht zu sehr, sodass es wieder zu Problemen bei der Erkennung der Intents kommt.
Auf alle Fälle jedenfalls ein riesiger Schritt nach vorne. Ich komme leider erst am nächsten Wochenende wieder zum Testen.
-
@tobetobe
Hallo Thomas,ich konnte bislang keine Auslastungsprobleme durch die LED-Steuerung feststellen.
mal was anderes: Was hast Du in Rhasspy unter Intent Recognition aktiviert?
Ich bin von "Do intent recognition with fuzzywuzzy on this device" auf
"Do intent recognition with OpenFST on this device" , bzw. "fsticuffs" gewechselt und habe
zusätzlich das "Fuzzy text matching" ausgeschaltet.Warum?:
Nun, ich hatte doch einige Fehlerkennungen meiner Sätze, worauf dann nicht das gewünschte Intent, sondern ein anderes ausgelöst wurde.
Ich verstehe das mit OpenFST so, daß hier nur die trainierten Sätze erkannt werden und nicht versucht wird, mit "fuzzy text matching" Unbekanntes zu erkennen.Der Nachteil ist zwar, daß wirklich nur auf die exakt trainierten sentences reagiert wird, aber andererseits keine Fehlinterpretionen mehr vorkommen können. Bei Nichterkennung wird dann halt kein Intent ausgelöst.
Kannst ja nächstes Wochenende mal berichten, wie sich das bei Dir mit Fehlerkennungen verhält.
Gruß
Jörg -
Hi Jörg,
Das schaue ich mir gerne am nächsten Wochenende an. Allerdings verfolge ich aktuell die Lösung eines anderen Problems. Siehe hier https://community.rhasspy.org/t/number-range-not-working/398/15Auf der einen Seite wird behauptet, dass Kaldi das bessere Erkennungsverfahren darstellt. Auf der anderen Seite wird aber auch wieder darauf hingewiesen, dass Kaldi mehr Ressourcen in Anspruch nimmt, was wiederum zu einer schlechteren Erkennungsquote führen könnte. Ich brauche Zeit, mir das in Ruhe anzuschauen. Next weekend...
-
@tobetobe
Mmmh, bei mir wird bei Speech Recognition angezeigt:
Do speech recognition with kaldi on this device
Not compatible with this profile
.. und somit kann ich es auch nicht auswählen.Gruß
Jörg -
Au. Das ist wohl ein Fall fürs Entwicklerteam
-
@joergeli
Hallo Jörg,
Ich hatte auch schon Fälle, die zu Fehlermeldungen führten und die über die Konfig nicht behoben werden konnten. Mach bitte dahermal folgendes: Im Rhasspy Verzeichnis alles löschen, was nach Kaldi klingt, also Ordner und Dateien. Dann profile.json editieren und ebenfalls alle Einträge zu Kaldi löschen. Am besten Den Raspi neustarten und danach in der Rhasspy Konfig Kaldi neu einrichten und TRAIN ausführen. Falls das nicht helfen sollte, brauchst du in der Tat Hilfe vom Rhasspy Forum.Beste Grüße
Th -
@tobetobe
Hallo Thomas,
Es gibt bei mir nur eine einzige Datei kaldi_custom_words.txt im Verzeichnis /home/pi/.config/rhasspy/profiles/de und sonst nichts, was auf Kaldi hinweist.
Insofern stimmt die obige Angabe aus den Rhasspy-Settings Do speech recognition with kaldi on this device -> Not compatible with this profile wohl schon, denn Kaldi ist bei mir anscheinend nicht installiert worden.
Ich nehme an, daß das mit dem "de"-Profil zusammenhängt.Ist aber nicht so schlimm, denn mit Pocketsphinx klappt es soweit ganz gut.
Was Rhasspy bei mir in den sentences nicht mag:[Zeit] zeit_name = (zeit) {name} zeit_state = (späht) {state} wie späht ist es wieviel uhr haben wir wieviel uhr ist es
ist das "wie späht ist es".
Wobei er sich aber nicht an dem "späht", also Umlaut stört, sondern an dem "ist es", das wird manchmal vollkommen willkürlich durch ein anderes Wort ersetzt.
Komischerweise wird "wieviel uhr ist es" korrekt erkannt.
Auch mit "wieviel uhr haben wir" klappt es einwandfrei.Das ist das einzige Erkennungsproblem bei mir, alle anderen Befehle werden korrekt umgesetzt.
Insofern belasse ich es bei Pocketsphinx.Gruß
Jörg -
@joergeli
@joergeli
Hallo Jörg,
Versuche es mal mit einem alternativen Aufbau des Sentence, zB so wie bei ChangeLightState (s.o.). Ich würde es auch mit Alternativen für das Intent versuchen, also (spät | Uhr | Uhrzeit). Die Füllwörter wie „wie, wieviel“ sowie „ist“ und „es“ würde ich als Optionen einbauen, die nicht unbedingt gesprochen werden müssen. Zusätzlich hättest du noch die Möglichkeit, „istes“ als ein Customer Word anzulernen. Und dann hilft nur probieren und testenGruß Thomas
-
@tobetobe
Hallo Thomas,
schon gesehen ?: MATRIX Labs has created two Rhasspy tutorials for beginners using a MATRIX microphoneGruß
Jörg -
@joergeli
Hallo Jörg,
Nein noch nicht. Vielen Dank für den Tipp. Das muss ich mir unbedingt bei Gelegenheit mal anschauen.Gruß Thomas
-
@joergeli
Hallo Jörg,ich habe mir deine Frage zur Uhrzeit nochmals angeschaut und mir folgenden Sentence gebaut:
[GetTime] time_state = (spät | uhr | zeit | uhrzeit) {state} (wie | wieviel | was | sag mir) [(ist die)] <time_state> [(ist es | haben wir)]
Ich habe alle möglichen Fragen durchprobiert, angefangen bei wie ist die zeit über wie spät ist es, wieviel uhr ist es bis hin zu sag mir die zeit, sag mir wieviel uhr es ist usw. Das klappt bei mir alles und der State wird als spät, uhr, uhrzeit, zeit an mqtt ausgegeben, wo die Abfrage dann entsprechend weiter verarbeitet werden kann.
Vielleicht kannst du damit ja noch etwas anfangen.
Noch etwas anderes: die beiden Artikel zu Matrix kannte ich doch schon. Ich dachte, es wäre etwas neues...
Und bei der Intent Erkennung arbeite ich jetzt mit Kaldi. Hier (wie auch zuvor bei Pocketsphinx) habe ich den Open transcription mode NICHT eingeschaltet. Ich hatte gelesen, dass dies zu erheblich längeren Antwortzeiten führt.
-
@joergeli said in Rhasspy Offline Sprachsteuerung:
mal was anderes: Was hast Du in Rhasspy unter Intent Recognition aktiviert?
Ich bin von "Do intent recognition with fuzzywuzzy on this device" auf
"Do intent recognition with OpenFST on this device" , bzw. "fsticuffs" gewechselt und habe
zusätzlich das "Fuzzy text matching" ausgeschaltet.Also, ich bin nun deiner Frage nochmals genauer nachgegangen. Ich verwende ebenfalls OpenFST allerdings mit der Option Fuzzy Text Matching. Die Erkennung funktioniert bei mir damit soweit ganz gut. Alle Probleme, die bei mir mit der Intent Erkennung auftraten, hatten eher mit einem unsauberen Aufbau der Slots und Sentences zu tun. Da ich beides nun relativ sauber strukturiert habe, treten auch kaum noch Fehler auf, selbst bei Hintergrundgeräuschen.
In wie weit, mein Umstieg auf Kaldi hierbei einen positiven Beitrag geleistet hat, kann ich noch nicht abschließend beurteilen.
-
@tobetobe
Hallo Thomas,
ich habe Deinen sentence 1:1 übernommen und jetzt funktioniert die Uhrzeit-Abfrage auch bei mir.
Keine Ahnung, warum da vorher der Wurm drin war. Danke!Intent Recognition mache ich mit OpenFST (wobei "Fuzzy text matching" ausgeschaltet ist).
Speech Recognition mache ich nach wie vor mit "pocketsphinx", "Open transcription mode " ist bei mir ebenfalls ausgeschaltet.Ich habe noch mal mit den webrtcvad-Einstellungen gespielt, um die Erkennung bei Umgebungsgeräuschen (TV/Radio) zu verbessern.
Dazu habe ich folgende Einstellungen für webrtcvad im profile.json ergänzt:{ "command": { "webrtcvad": { "silence_sec": 1.5, "timeout_sec": 4, "vad_mode": 3 } }, "handle": { "command": { "program": "$RHASSPY_BASE_DIR/bin/mock-commands/handle.sh" } }, "intent": { .........
Meine Überlegungen dabei:
silence_sec:
Die Zeitspanne zwischen WakeWord-Erkennung und Sprechen des Befehls war mir mit 0,5s zu kurz.
Deshalb habe ich sie auf 1,5s geändert, damit ich nach der WakeWord-Erkennung etwas länger Zeit habe, um meinen Sprachbefehl abzusetzen.timeout_sec:
Habe ich von 30s auf 4s verkürzt, damit wird erzwungen, daß auch bei Umgebungsgeräuschen Rhasspy nach 4 Sekunden gezwungen wird, mit der Spracherkennung zu beginnen.
Bei den defaultmäßigen 30s hat Rhasspy (bei Umgebungsgeräuschen) diese 30s abgewartet, bevor er mit der Sprachanalyse begonnen hat.vad_mode:
Lt. Beschreibung: "how aggressive the voice activity filter vad_mode is: this is an integer between 0 and 3. 0 is the least aggressive about filtering out non-speech, 3 is the most aggressive."
Ich bin mir nicht sicher, ob meine Umstellung von 0 auf 3 signifikante Änderungen bewirkt.Gefühlt habe ich jetzt auch bei Umgebungsgeräuschen eine bessere Chance, daß Rhasspy meine Befehle erkennt.
Sehr schlecht ist es aber nach wie vor, wenn im TV, oder Radio gesprochen wird.
Bei musikalischem Hintergrund klappt es so aber ganz gut.Gruß
Jörg -
@tobetobe
Hallo Thomas,
ich habe gerade hier gelesen, daß "Sikk" einfach seinen Fernseher automatisch stumm schaltet (mute), wenn das WakeWord erkannt wurde.
Nachdem das Intent erkannt wurde, deaktiviert er wohl die Stummschaltung wieder.
Das ist m.E. ein guter Workaround, um das leidige Erkennen bei TV-Geräuschen zu umgehen.
Muß ich bei mir mal testen.