FHEM und Rhasspy

Begonnen von drhirn, 28 Juli 2020, 14:28:50

Vorheriges Thema - Nächstes Thema

JensS

Hallo Dreggwatz,

Rhasspy funktioniert bei uns Zuhause als Offline-Sprachsteuerung (auch als Multiroomsystem) bestens.
Ob die SONOS sich allerdings überreden lassen, die Spracheingabe auf eine zentrale Rhasspy-Base zu leiten, kann ich nicht beantworten.
Zumindestens könntest du die SONOS in FHEM einbinden und dann mit Rhasspy steuern.

Mit deinem RasPi4 und einem Mikrofon kannst du Rhasspy betreiben. Leg einfach los und melde dich, falls Fragen auftauchen.

Gruß Jens
Debian auf APU2C4, HM-CFG-USB2, SIGNALduino, HM-ES-PMSw1-Pl, TFA 30.3121, TFA 30.3125, ITS-150, PIR-5000, configurable Firmata USB & LAN, 1-wire: DS-18B20, DS-18S20, DS-2408, DS-2413, diverse I2C-Komponenten, zigbee2mqtt, ESPEasy etc.

drhirn

Zitat von: JensS am 03 Januar 2021, 16:27:00Rhasspy funktioniert bei uns Zuhause als Offline-Sprachsteuerung (auch als Multiroomsystem) bestens.

Im Ernst? Welches Hardware-Setup? Welches Wakeword?
Bei mir täte es auch gut tun, ich bekomme nur kein Wakeword so hin, dass es zuverlässig und aus mehr als 10cm Entfernung funktioniert. Wohingegen das Snips-Hotword mit dem selben Setup einwandfrei seinen Dienst verrichten würde.

JensS

#77
Mit einen "ReSpeaker 2-Mics Pi HAT" und Snowboy als Wakeword-Engine läuft es recht flott. Als Wakeword nutze ich Alexa (https://github.com/Kitt-AI/snowboy/raw/master/resources/alexa/alexa-avs-sample-app/alexa.umdl). Bei alsamixer muss die Mikrolautstärke fast auf Maximum. Man kann Alexa normal ansprechen. Bei Nebengeräuschen (Fernseher etc.) muss man auch schon mal direkt werden...    "microphone": {
        "arecord": {
            "device": "default",
            "siteId": "Wohnzimmer",
            "udp_audio_host": "127.0.0.1",
            "udp_audio_port": "12202"
        },
        "system": "arecord"
    },
    "wake": {
        "satellite_site_ids": "Wohnzimmer",
        "snowboy": {
            "apply_frontend": true,
            "model": "alexa.umdl",
            "sensitivity": "0.50",
            "udp_audio": "127.0.0.1:12202"
        },
        "system": "snowboy"
    }
Das Eingangsdevice ist "PulseAudio Sound Server (default)".
Porcupine soll ja noch schneller und besser sein. Ich habe dazu aber keinen Wakeword-Generator gefunden.

Gruß Jens

p.s. Ergänzend als Hinweis für Suchende:
Bei alsamixer mit F6 die Soundkarte auswählen und mit Tab zur Aufnahmequelle wechseln.
Nach dem Festlegen der Lautstärke mitalsactl --file=/etc/voicecard/wm8960_asound.state storedauerhaft abspeichern (ReSpeaker 2-Mics Pi HAT).
Debian auf APU2C4, HM-CFG-USB2, SIGNALduino, HM-ES-PMSw1-Pl, TFA 30.3121, TFA 30.3125, ITS-150, PIR-5000, configurable Firmata USB & LAN, 1-wire: DS-18B20, DS-18S20, DS-2408, DS-2413, diverse I2C-Komponenten, zigbee2mqtt, ESPEasy etc.

drhirn

Das ist eigentlich genau die Hardware, die ich auch verwende. Aber auch mit Snowboy wurde ich nicht glücklich. Morgen nochmal ausprobieren.

Könntest du deine wm8960_asound.state anhängen/posten bitte?

drhirn


Dreggwatz

Danke für den Hinweis,
hab jetzt nach meinem Kenntnisstand alles installiert schein aber noch nicht ganz richtig konfiguriert zu sein. Jedenfalls funktioniert das wakeword nicht. Ich sehe bei Audio Recording (wenn der haken bei Audio statistics gesetzt ist) dass das Mikrofon Geräusche erkennt. Text to Speech gibt mir auch den Sound wieder.
Im Log sind aber einige Meldungen welche ich nicht deuten kann:


[DEBUG:2021-01-05 16:10:25,656] rhasspyprofile.download: text_to_speech.system larynx picotts = False
[DEBUG:2021-01-05 16:10:25,655] rhasspyprofile.download: speech_to_text.deepspeech.mix_weight >0 0 = False
[DEBUG:2021-01-05 16:10:25,654] rhasspyprofile.download: speech_to_text.kaldi.mix_weight >0 0 = False
[DEBUG:2021-01-05 16:10:25,653] rhasspyprofile.download: speech_to_text.pocketsphinx.mix_weight >0 0 = False
[DEBUG:2021-01-05 16:10:25,652] rhasspyprofile.download: speech_to_text.deepspeech.open_transcription True False = False
[DEBUG:2021-01-05 16:10:25,651] rhasspyprofile.download: speech_to_text.kaldi.open_transcription True False = False
[DEBUG:2021-01-05 16:10:25,651] rhasspyprofile.download: speech_to_text.pocketsphinx.open_transcription True False = False
[DEBUG:2021-01-05 16:10:25,650] rhasspyprofile.download: speech_to_text.system deepspeech pocketsphinx = False
[DEBUG:2021-01-05 16:10:25,629] rhasspyprofile.download: speech_to_text.system kaldi pocketsphinx = False
[DEBUG:2021-01-05 16:10:25,628] rhasspyprofile.download: Skipping acoustic_model/variances (/profiles/de/acoustic_model/variances)
[DEBUG:2021-01-05 16:10:25,627] rhasspyprofile.download: Skipping acoustic_model/transition_matrices (/profiles/de/acoustic_model/transition_matrices)
[DEBUG:2021-01-05 16:10:25,627] rhasspyprofile.download: Skipping acoustic_model/noisedict (/profiles/de/acoustic_model/noisedict)
[DEBUG:2021-01-05 16:10:25,626] rhasspyprofile.download: Skipping acoustic_model/mixture_weights (/profiles/de/acoustic_model/mixture_weights)
[DEBUG:2021-01-05 16:10:25,625] rhasspyprofile.download: Skipping acoustic_model/means (/profiles/de/acoustic_model/means)
[DEBUG:2021-01-05 16:10:25,624] rhasspyprofile.download: Skipping acoustic_model/mdef (/profiles/de/acoustic_model/mdef)
[DEBUG:2021-01-05 16:10:25,623] rhasspyprofile.download: Skipping acoustic_model/feature_transform (/profiles/de/acoustic_model/feature_transform)
[DEBUG:2021-01-05 16:10:25,622] rhasspyprofile.download: Skipping acoustic_model/feat.params (/profiles/de/acoustic_model/feat.params)
[DEBUG:2021-01-05 16:10:25,622] rhasspyprofile.download: Skipping g2p.fst (/profiles/de/g2p.fst)
[DEBUG:2021-01-05 16:10:25,621] rhasspyprofile.download: Skipping base_dictionary.txt (/profiles/de/base_dictionary.txt)
[DEBUG:2021-01-05 16:10:25,620] rhasspyprofile.download: speech_to_text.system pocketsphinx pocketsphinx = True
[INFO:2021-01-05 16:10:25,449] rhasspyserver_hermes: Started
[DEBUG:2021-01-05 16:10:25,449] rhasspyserver_hermes: Subscribed to hermes/intent/#
[DEBUG:2021-01-05 16:10:25,448] rhasspyserver_hermes: Subscribed to rhasspy/asr/default/default/audioCaptured
[DEBUG:2021-01-05 16:10:25,447] rhasspyserver_hermes: Subscribed to hermes/audioServer/default/audioSummary
[DEBUG:2021-01-05 16:10:25,446] rhasspyserver_hermes: Subscribed to hermes/hotword/+/detected
[DEBUG:2021-01-05 16:10:25,446] rhasspyserver_hermes: Subscribed to hermes/asr/textCaptured
[DEBUG:2021-01-05 16:10:25,445] rhasspyserver_hermes: Subscribed to hermes/nlu/intentNotRecognized
[DEBUG:2021-01-05 16:10:25,444] rhasspyserver_hermes: Subscribed to hermes/audioServer/default/audioSummary
[DEBUG:2021-01-05 16:10:25,444] rhasspyserver_hermes: Subscribed to rhasspy/asr/default/default/audioCaptured
[DEBUG:2021-01-05 16:10:25,443] rhasspyserver_hermes: Subscribed to hermes/nlu/intentNotRecognized
[DEBUG:2021-01-05 16:10:25,442] rhasspyserver_hermes: Subscribed to hermes/intent/#
[DEBUG:2021-01-05 16:10:25,441] rhasspyserver_hermes: Subscribed to hermes/asr/textCaptured
[DEBUG:2021-01-05 16:10:25,441] rhasspyserver_hermes: Subscribed to hermes/hotword/+/detected
[DEBUG:2021-01-05 16:10:25,440] rhasspyserver_hermes: Connected to MQTT broker
[DEBUG:2021-01-05 16:10:25,412] rhasspyserver_hermes: Connecting to localhost:12183 (retries: 2/10)
[ERROR:2021-01-05 16:10:24,410] rhasspyserver_hermes: mqtt connect
Traceback (most recent call last):
  File "/usr/lib/rhasspy/rhasspy-server-hermes/rhasspyserver_hermes/__init__.py", line 289, in start
    self.client.connect(self.host, self.port)
  File "/usr/lib/rhasspy/.venv/lib/python3.7/site-packages/paho/mqtt/client.py", line 937, in connect
    return self.reconnect()
  File "/usr/lib/rhasspy/.venv/lib/python3.7/site-packages/paho/mqtt/client.py", line 1071, in reconnect
    sock = self._create_socket_connection()
  File "/usr/lib/rhasspy/.venv/lib/python3.7/site-packages/paho/mqtt/client.py", line 3522, in _create_socket_connection
    return socket.create_connection(addr, source_address=source, timeout=self._keepalive)
  File "/usr/lib/python3.7/socket.py", line 727, in create_connection
    raise err
  File "/usr/lib/python3.7/socket.py", line 716, in create_connection
    sock.connect(sa)
OSError: [Errno 99] Cannot assign requested address
[DEBUG:2021-01-05 16:10:24,406] rhasspyserver_hermes: Connecting to localhost:12183 (retries: 1/10)
[ERROR:2021-01-05 16:10:23,403] rhasspyserver_hermes: mqtt connect
Traceback (most recent call last):
  File "/usr/lib/rhasspy/rhasspy-server-hermes/rhasspyserver_hermes/__init__.py", line 289, in start
    self.client.connect(self.host, self.port)
  File "/usr/lib/rhasspy/.venv/lib/python3.7/site-packages/paho/mqtt/client.py", line 937, in connect
    return self.reconnect()
  File "/usr/lib/rhasspy/.venv/lib/python3.7/site-packages/paho/mqtt/client.py", line 1071, in reconnect
    sock = self._create_socket_connection()
  File "/usr/lib/rhasspy/.venv/lib/python3.7/site-packages/paho/mqtt/client.py", line 3522, in _create_socket_connection
    return socket.create_connection(addr, source_address=source, timeout=self._keepalive)
  File "/usr/lib/python3.7/socket.py", line 727, in create_connection
    raise err
  File "/usr/lib/python3.7/socket.py", line 716, in create_connection
    sock.connect(sa)
OSError: [Errno 99] Cannot assign requested address
[DEBUG:2021-01-05 16:10:23,400] rhasspyserver_hermes: Connecting to localhost:12183 (retries: 0/10)
[DEBUG:2021-01-05 16:10:23,400] rhasspyserver_hermes: Starting core
[DEBUG:2021-01-05 16:10:23,396] rhasspyprofile.profile: Loading default profile settings from /usr/lib/rhasspy/rhasspy-profile/rhasspyprofile/profiles/defaults.json
[DEBUG:2021-01-05 16:10:23,394] rhasspyprofile.profile: Loading /profiles/de/profile.json
[DEBUG:2021-01-05 16:10:23,391] rhasspyprofile.profile: Loading /usr/lib/rhasspy/rhasspy-profile/rhasspyprofile/profiles/de/profile.json
[DEBUG:2021-01-05 16:10:23,342] rhasspyserver_hermes: Restarting Rhasspy


Gibts Probleme mit dem port 12183?

Hier meine config aus Rhasspy:

{
    "dialogue": {
        "system": "rhasspy"
    },
    "intent": {
        "system": "fsticuffs"
    },
    "microphone": {
        "system": "pyaudio"
    },
    "mqtt": {
        "enabled": "",
        "host": "****",
        "password": "****",
        "username": "****"
    },
    "sounds": {
        "system": "aplay"
    },
    "speech_to_text": {
        "system": "pocketsphinx"
    },
    "text_to_speech": {
        "system": "picotts"
    },
    "wake": {
        "porcupine": {
            "keyword_path": "terminator_raspberry-pi.ppn",
            "sensitivity": "1"
        },
        "system": "porcupine"
    }
}

MQTT Eintrag unkenntlich gemacht, passt aber...

drhirn

Scheint alles zu passen. Es wird versucht, zum MQTT Server zu verbinden. Der braucht aber offenbar etwas länger. Danach klappt's aber.

Wenn du im GUI den "Wake Up"-Button verwendest und danach einen Befehl sprichst, klappt das?

Dreggwatz

Ja über den Button scheint es zu funktionieren, wenn ich die voreingestellten sentences spreche "wie spät ist es" und "wie ist die temperatur" erkennt er gettime und gettemperature.

JensS

Hallo Dreggwatz,

versuche mal "Rhasspy Raven". Dort kannst du das Wakeword selbst reinsprechen. Ist zwar etwas langsamer aber zum Testen reichts.
Snow Boy ist auch ganz gut. Du solltest die sensitivity vorerst mit 0.5 oder weniger testen.

Gruß Jens
Debian auf APU2C4, HM-CFG-USB2, SIGNALduino, HM-ES-PMSw1-Pl, TFA 30.3121, TFA 30.3125, ITS-150, PIR-5000, configurable Firmata USB & LAN, 1-wire: DS-18B20, DS-18S20, DS-2408, DS-2413, diverse I2C-Komponenten, zigbee2mqtt, ESPEasy etc.

Dreggwatz

Ok, danke probiere ich gleich nochmal aus. Ungeachtet dessen bekomme ich in Fhem aber auch nichts geschaltet. Bzw. habe noch nicht verstanden wo/wie MQTT publish in Rhasspy funktioniert.

Das steht in sentences:
[de.fhem:SetOnOff]
schalte (den) (TestSchalter){Device} (ein | aus){Value}


Wenn ich den Wakeword button drücke und den Befehl spreche wird es erkannt und es erscheint de.fhem:SetOnOff on

Mit MQTT.fx hab ich die Erkennung auch gesehen:

hermes/asr/textCaptured

{"text": "schalte den testschalter ein", "likelihood": 0.49768850898533434, "seconds": 0.4859530610119691, "siteId": "default", "sessionId": "950b9e07-87fb-4f57-bf17-1c3248d01795", "wakewordId": null, "asrTokens": [[{"value": "<s>", "confidence": 1.000100016593933, "rangeStart": 0, "rangeEnd": 4, "time": {"start": 0.0, "end": 0.02}}, {"value": "schalte", "confidence": 1.000100016593933, "rangeStart": 4, "rangeEnd": 12, "time": {"start": 0.03, "end": 0.56}}, {"value": "den", "confidence": 1.000100016593933, "rangeStart": 12, "rangeEnd": 16, "time": {"start": 0.57, "end": 0.83}}, {"value": "testschalter", "confidence": 1.0, "rangeStart": 16, "rangeEnd": 29, "time": {"start": 0.84, "end": 1.64}}, {"value": "ein", "confidence": 1.0, "rangeStart": 29, "rangeEnd": 33, "time": {"start": 1.65, "end": 2.49}}, {"value": "</s>", "confidence": 1.0, "rangeStart": 33, "rangeEnd": 38, "time": {"start": 2.5, "end": 2.52}}]], "lang": null}


In Fhem sieht das MQTT_Device so aus:

Internals:
   CFGFN     
   FUUID      5ff566ec-f33f-8381-2d9b-72084113f9a86f28
   IODev      Mosquitto
   NAME       TestSchalter
   NR         5089
   STATE      off
   TYPE       MQTT_DEVICE
   OLDREADINGS:
   READINGS:
     2021-01-06 19:09:31   state           off
     2021-01-06 19:09:31   transmission-state incoming publish received
   message_ids:
   publishSets:
     :
       topic      /SmartHome/TestSchalter
       values:
         on
         off
         toggle
   sets:
     off       
     on         
     toggle     
   subscribe:
     /SmartHome/TestSchalter/#
     /SmartHome/TestSchalter/state
   subscribeExpr:
     ^\/SmartHome\/TestSchalter.*$
     ^\/SmartHome\/TestSchalter\/state$
   subscribeQos:
     /SmartHome/TestSchalter/#
     /SmartHome/TestSchalter/state 0
   subscribeReadings:
     /SmartHome/TestSchalter/State:
     /SmartHome/TestSchalter/state:
       cmd       
       name       state
Attributes:
   IODev      Mosquitto
   autoSubscribeReadings /SmartHome/TestSchalter/#
   publishSet on off toggle /SmartHome/TestSchalter
   rhasspyMapping SetOnOff:cmdOn=on,cmdOff=off
   rhasspyName TestSchalter
   room       MQTT
   subscribeReading_state /SmartHome/TestSchalter/state
   webCmd     on:off:toggle


Mit MQTT.fx kann ich unter den jeweiligen subscribe /SmartHome/TestSchalter/state auch on off toggle schalten, vermute allerdings das MQTT mit Rhasspy nicht ordentliche konfiguriert ist... sieht jemand das Problem?

drhirn

Warum legst du ein extra MQTT-Device an und nimmst nicht das Rhasspy-Modul? Siehe auch erste Beitrag in diesem Thread.
Anleitung zum alten Snips-Modul ist hier, gilt aber immer noch größtenteils: https://github.com/Thyraz/Snips-Fhem

JensS

Ein paar Randinfos täten gut. Du kannst die IPs ja leicht abändern aber es muss erkenntlich sein, ob es sich um dieselben Geräte handelt...
MQTT-Server IP:Port (mosquitto o.a)
FHEM-Server: IP
Rhasspy-Bridge-Device in FHEM: komplettes List

Versuche erstmal ein dummy zu schalten:

define RhasspyDummySwitch dummy
attr RhasspyDummySwitch room Rhasspy
attr RhasspyDummySwitch rhasspyName Licht
attr RhasspyDummySwitch rhasspyRoom wohnzimmer
attr RhasspyDummySwitch rhasspyMapping SetOnOff:cmdOn=on,cmdOff=off
attr RhasspyDummySwitch setList on off


Anschließend die Daten mit dem FHEM-Rhasspy-Device zu Rhasspy schicken.

set Rhasspy-Bridge updateSlots
set Rhasspy-Bridge trainRhasspy

Hier sicherheitshalber der Inhalt von senteces.ini:

[de.fhem:SetOnOff]
schalte (den|die|das) ($de.fhem.Device){Device} [($de.fhem.Room){Room}] (an|aus){Value}


Schalte das Licht im Wohnzimmer an - sollte dann zum Ergebnis führen.

Gruß Jens


Debian auf APU2C4, HM-CFG-USB2, SIGNALduino, HM-ES-PMSw1-Pl, TFA 30.3121, TFA 30.3125, ITS-150, PIR-5000, configurable Firmata USB & LAN, 1-wire: DS-18B20, DS-18S20, DS-2408, DS-2413, diverse I2C-Komponenten, zigbee2mqtt, ESPEasy etc.

Dreggwatz

Danke Euch,

ich bin in MQTT ganz frisch und dachte mir mit einem externen Broker (Mosquitto) wäre ich flexibler falls noch mehr MQQT Anwendung findet.
Was genau ist das Rhasspy-Bridge-Device? Das "RhasspyMQTT MQTT" oder "Rhasspy RHASSPY"



JensS

Einen extra Mosquitto zu nehmen ist eine gute Entscheidung. Mit Rhasspy-Bridge-Device meine ich Rhasspy RHASSPY".  Gruß Jens
Debian auf APU2C4, HM-CFG-USB2, SIGNALduino, HM-ES-PMSw1-Pl, TFA 30.3121, TFA 30.3125, ITS-150, PIR-5000, configurable Firmata USB & LAN, 1-wire: DS-18B20, DS-18S20, DS-2408, DS-2413, diverse I2C-Komponenten, zigbee2mqtt, ESPEasy etc.

Roman

Hallo zusammen,

ich versuche mich auch gerade an Rhasspy und bin hier ein wenig am testen.
Prinzipiell klappt das Lampen schalten schon recht gut, aber ich möchte hier etwas flexibler sein was die möglichen sentences angeht.
Beispiel:
'Schalte die Wohnzimmerlampe an' oder 'schalte Wohnzimmerlicht an'  funktioniert.
'Schalte Licht im Wohnzimmer an' funktioniert nicht.

Bei den funktionierenden Kommandos wird 'Device' und 'Value' übergeben.
Bei den nicht funktionierenden Kommandos wird 'Room' und 'Value' übergeben, er hat in dem Fall ja kein Device.
Gibt es eine Möglichkeit, dass Rhasspy den 'genericDeviceType' (hier light, bzw. für Rollos 'blind' auswertet ?

sentences.ini
[de.fhem:SetOnOff]
(schalte|mach|mache) [(die | das)] $devices {Device} $values{Value}
(schalte|mach|mache) [Licht] [(im|an der|in der)] $rooms {Room} $values{Value}


Slot: devices
(wohnzimmerlampe | wohnzimmerlicht ):Licht_Wohnzimmer
(esszimmerlampe | esszimmerlicht ):Licht_Esszimmer
(kuechenlampe | kuechenlicht | küchenlicht | küchenlampe):Licht_Kueche

Slot:values
(aus | dunkel ):aus
(an | ein | hell ):an

Slot:rooms
esszimmer
wohnzimmer
(kueche|küche):


Logausgabe:
2021.01.07 16:34:37 5: publish received for hermes/intent/de.fhem:SetOnOff, {"input": "schalte Licht im esszimmer an", "intent": {"intentName": "de.fhem:SetOnOff", "confidenceScore": 1.0}, "siteId": "Master", "id": "1587544c-4396-4854-8378-1532945e1015", "slots": [{"entity": "rooms", "value": {"kind": "Unknown", "value": "esszimmer"}, "slotName": "Room", "rawValue": "esszimmer", "confidence": 1.0, "range": {"start": 17, "end": 26, "rawStart": 17, "rawEnd": 26}}, {"entity": "values", "value": {"kind": "Unknown", "value": "an"}, "slotName": "Value", "rawValue": "an", "confidence": 1.0, "range": {"start": 27, "end": 29, "rawStart": 27, "rawEnd": 29}}], "sessionId": "1587544c-4396-4854-8378-1532945e1015", "customData": null, "asrTokens": [[{"value": "schalte", "confidence": 1.0, "rangeStart": 0, "rangeEnd": 7, "time": null}, {"value": "Licht", "confidence": 1.0, "rangeStart": 8, "rangeEnd": 13, "time": null}, {"value": "im", "confidence": 1.0, "rangeStart": 14, "rangeEnd": 16, "time": null}, {"value": "esszimmer", "confidence": 1.0, "rangeStart": 17, "rangeEnd": 26, "time": null}, {"value": "an", "confidence": 1.0, "rangeStart": 27, "rangeEnd": 29, "time": null}]], "asrConfidence": null, "rawInput": "schalte licht im esszimmer an", "wakewordId": null, "lang": null}
2021.01.07 16:34:37 5: Parsed value: esszimmer for key: Room
2021.01.07 16:34:37 5: Parsed value: Master for key: siteId
2021.01.07 16:34:37 5: Parsed value: schalte licht im esszimmer an for key: rawInput
2021.01.07 16:34:37 5: Parsed value: 1 for key: probability
2021.01.07 16:34:37 5: Parsed value: an for key: Value
2021.01.07 16:34:37 5: Parsed value: schalte Licht im esszimmer an for key: input
2021.01.07 16:34:37 5: Parsed value: 1587544c-4396-4854-8378-1532945e1015 for key: sessionId
2021.01.07 16:34:37 5: Parsed value: SetOnOff for key: intent
2021.01.07 16:34:37 5: handleIntentSetOnOff called
/code]