Modulentwicklung für Rhasspy Sprachassistent

Begonnen von drhirn, 11 März 2021, 15:59:50

Vorheriges Thema - Nächstes Thema

Beta-User

Zitat von: JensS am 28 Juni 2021, 10:33:34
Es geht ja nur um die Rückfrage-Dialoge.
Die normale sentences.ini und der bisherige Programmcode bliebe unangetastet und würde wie gewohnt abgearbeitet.
Das Problem ist aber, dass man dann eben aus der Rückfrage wieder in den "normalen" Modus wechselt (s.u.), aber - dem Gefühl nach - irgendwie festhalten muss, wo man herkommt...

Zitat
Wenn der intentFilter gesetzt ist und keine Antwort, wie "ja bitte" sondern "wie spät ist es" gegeben wurde, erhält man vor der intentNotRecognized-Nachricht eine NLU-Message (sofern aboniert).
hermes/nlu/query {"input": "wie spät ist es"
Das "wie spät ist es" ist dann auch in der intentNotRegognized-Message drin. Es ist dort (wie auch bei "query") aber überhaupt nicht klar, "wo" das hingehört (also z.B. zu welchem (deaktivierten) Intent). Das bedeutet, man muss diesen Input wieder an Rhasspy zurückgeben (noch zu klären: wo und wie?), aber eben erst, nachdem man (welchen?) Filter wieder umgestellt hat, damit die Analyse auf den Intent (und ggf. enthaltene keywords) stattfindet. Vorab noch eine Rückfrage an den User, ob das Thema gewechselt werden soll...?
Da das dann aber innerhalb eines Dialoges stattfindet, stellt sich die Frage, welche "alten" Daten eigentlich gelöscht werden sollten, damit man nicht versehentlich in der falschen Schublade landet (z.B.: bleibt man im selben Raum wie dem, der ggf. bei der ersten Ansage genannt wurde oder nimmt man den aus der siteId abgeleiteten?!?).

Vielleicht denke ich grade auch zu sehr um's Eck, aber es kommt mir alles andere als trivial vor, von dem zentralen "intentNotRecognized" wieder zielführend wegzukommen...
Server: HP-elitedesk@Debian 12, aktuelles FHEM@ConfigDB | CUL_HM (VCCU) | MQTT2: MiLight@ESP-GW, BT@OpenMQTTGw | MySensors: seriell, v.a. 2.3.1@RS485 | ZWave | ZigBee@deCONZ | SIGNALduino | MapleCUN | RHASSPY
svn: u.a MySensors, Weekday-&RandomTimer, Twilight,  div. attrTemplate-files

JensS

Zitat von: Beta-User am 28 Juni 2021, 11:47:59
Vielleicht denke ich grade auch zu sehr um's Eck, aber es kommt mir alles andere als trivial vor, von dem zentralen "intentNotRecognized" wieder zielführend wegzukommen...
Ich denke, dass das zentrale intentNotRecognized die Pflicht ist und die NLU als Kür vielleicht irgenwann mit reinkommen könnte. Vieles ist sowieso hypothetisch, solange wir keine Info/Erweiterung von Rhasspy haben.
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.

JensS

@drhirn
Da Rhasspy in einem recht gutem Zustand ist und prinzipiell die Anforderungen einer Sprachsteuerung erfüllt, wären die Voraussetzungen zu einem WIKI-Artikel in der Kategoie Sprachsteuerung gegeben.
Zumal das Modul bereits in contrib ist.
Man könnte ja https://github.com/fhem/fhem-rhasspy/blob/main/README.md dazu nehmen.

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

Ich habe meine Überlegungen dazu hier schon kund getan: https://forum.fhem.de/index.php/topic,119447.msg1157988.html#msg1157988

Kurz gesagt: Kann jeder jederzeit machen, ich unterstütze gerne. Kümmern möchte ich mich aber nicht darum.

JensS

#784
@Beta-User
Als Zwischenlösung habe ich meinen Beitrag https://forum.fhem.de/index.php/topic,119447.msg1163740.html#msg1163740 nochmals editiert.
Hast du ein Attribut, in dem ich meine per default zu deaktivierenden Intents reinpacken kann?

Gruß Jens

Edit: Funktioniert nicht, da Dialogue nach dem allg. Rhasspy-Server gestartet wird. Entweder setzt man ein qos, dass Dialogue die Nachricht erhält, wenn er sich beim MQTT anmeldet oder das notify bekommt ein at mit rein.
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.

Beta-User

Ein Attribut gibt es bisher nicht, muss mal überlegen, ob das Sinn macht (aber vermutlich erst, wenn wir mit dem ganzen gedanklich "fertig" sind). Dann wäre noch zu klären, wie das wirken soll und in welcher Form die Intents dann präsentiert werden müßten (Komma-separiert?)

An sich ist der Code aber generisch angelegt. Es sollte daher möglich sein, das über "normales Perl" im notify zu machen. Ausgangspunkt:
configure_DialogManager {
    my $hash      = shift // return;
    my $siteId    = shift // 'null'; #ReadingsVal( $hash->{NAME}, 'siteIds', 'default' ) // return;
    my $toDisable = shift // [qw(ConfirmAction CancelAction ChoiceRoom ChoiceDevice)];
    my $enable    = shift // q{false};

Das ergäbe dann ungefär sowas:
defmod updateIntentFilter notify MQTT2_rhasspyMQTT2 { my $toDisable = [qw(MeinIntent)];; RHASSPY::configure_DialogManager( $defs{Rhasspy}, undef, $toDisable ) }

Das ganze wird aber bei einer "SilentCancellation" derzeit wieder auf die defaults gesetzt!
Server: HP-elitedesk@Debian 12, aktuelles FHEM@ConfigDB | CUL_HM (VCCU) | MQTT2: MiLight@ESP-GW, BT@OpenMQTTGw | MySensors: seriell, v.a. 2.3.1@RS485 | ZWave | ZigBee@deCONZ | SIGNALduino | MapleCUN | RHASSPY
svn: u.a MySensors, Weekday-&RandomTimer, Twilight,  div. attrTemplate-files

JensS

#786
Danke, das übernehme gern. Gibt es eine Möglichkeit, nur diese Nachricht mit qos=1 o.ä. anzusetzen?
Zitat von: Beta-User am 29 Juni 2021, 13:02:25
Das ganze wird aber bei einer "SilentCancellation" derzeit wieder auf die defaults gesetzt!
Der "default intent filter" kann doch immer so bleiben.? Nach der Dialog-Session mit intentFilter gilt er doch sowieso wieder, egal ob ordentlich beendet wurde oder mit einem Timeout.

p.s. So geht's:defmod updateIntentFilter notify MQTT2_rhasspyMQTT2 {fhem('define 5_s at +00:00:05 { my $toDisable = [qw(ConfirmAction)];;;; RHASSPY::configure_DialogManager( $defs{Rhasspy}, undef, $toDisable ) }')}
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.

Beta-User

Zitat von: JensS am 29 Juni 2021, 13:30:35
Danke, das übernehme gern. Gibt es eine Möglichkeit, nur diese Nachricht mit qos=1 o.ä. anzusetzen?
Mit QoS habe ich mich bisher nicht beschäftigt, und ich bin auch nicht sicher, ob das von MQTT2_CLIENT unterstützt wird bzw. dann auch wirklich die Auswirkung hätte, die du dir wünschen würde - das ganze setzt nämlich afaik voraus, dass das eigentliche Zielgerät sich ordentlich subscribed hatte, und das scheint beim Start ja grade nicht der Fall zu sein, wenn ich den Nachtrag von vorhin richtig interpretiere?

Zitat
Der "default intent filter" kann doch immer so bleiben.? Nach der Dialog-Session mit intentFilter gilt er doch sowieso wieder, egal ob ordentlich beendet wurde oder mit einem Timeout.
Na ja, wenn ein (bestimmter) "unzulässiger" Intent kommt, unterstelle RHASSPY derzeit, dass Rhasspy neu gestartet wurde und stellt dann die default-Filter wieder her. Wenn (künftig) per Attribut gelöst, würde man wohl die default-Liste entsprechend erweitern...
Server: HP-elitedesk@Debian 12, aktuelles FHEM@ConfigDB | CUL_HM (VCCU) | MQTT2: MiLight@ESP-GW, BT@OpenMQTTGw | MySensors: seriell, v.a. 2.3.1@RS485 | ZWave | ZigBee@deCONZ | SIGNALduino | MapleCUN | RHASSPY
svn: u.a MySensors, Weekday-&RandomTimer, Twilight,  div. attrTemplate-files

JensS

Zitat von: Beta-User am 29 Juni 2021, 13:40:53
setzt nämlich afaik voraus, dass das eigentliche Zielgerät sich ordentlich subscribed hatte, und das scheint beim Start ja grade nicht der Fall zu sein
Rhasspy besteht, wie du weißt, aus veschiedenen Modulen. Das Hauptmodul (mit der Start-Message) subscribed kein configure. Das wird vom Dialog-Modul aboniert, welches später startet.
Beim Neustart ist die configure-Anweisung also längst durch, bevor das betreffende Modul gestartet wurde.
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.

Beta-User

Na ja, dem könnte man mit einer Timer-Lösung begegnen, also das configure verzögert rauszuschicken.
(Ich wollte nicht unterstellen, dass Rhasspy da was "falsch" macht, sondern nur klarstellen, dass es passieren kann, dass der MQTT-Server gar nicht weiß, dass "jemand" später einen bestimmten Topic subscriben will und daher ggf. das QoS ins Leere läuft.

Könnte man vielleicht mit einem retain-Flag lösen, aber da stellen sich dann wieder andere Probleme - kurz: Ich halte das mit dem "SilentCancellation"-reset für die noch am ehesten zielführende Lösung.

Es dämmert mir aber, dass es vermutlich hilfreich wäre, die Liste der default zu deaktivierenden Intents ggf. auf einfache Weise ergänzbar zu machen... Kein Hexenwerk, aber ein kleinerer Umbau...
Server: HP-elitedesk@Debian 12, aktuelles FHEM@ConfigDB | CUL_HM (VCCU) | MQTT2: MiLight@ESP-GW, BT@OpenMQTTGw | MySensors: seriell, v.a. 2.3.1@RS485 | ZWave | ZigBee@deCONZ | SIGNALduino | MapleCUN | RHASSPY
svn: u.a MySensors, Weekday-&RandomTimer, Twilight,  div. attrTemplate-files

JensS

Wenn die Message mit QOS 1 gepublisht wurde, hält sie Mosquitto so lange vor, bis sie von einem Client subscribed/abgerufen wurde. Die Message ist so lange in der Mosquitto-Datenbank hinterlegt und überlebt sogar einen Mosquitto-Neustart.
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.

Beta-User

OK, dann habe ich das mit QoS jetzt auch verstanden... Nur: wie publisht man via M2C mit entsprechendem Flag? Doku ist an der Stelle etwas "dünn"...
Server: HP-elitedesk@Debian 12, aktuelles FHEM@ConfigDB | CUL_HM (VCCU) | MQTT2: MiLight@ESP-GW, BT@OpenMQTTGw | MySensors: seriell, v.a. 2.3.1@RS485 | ZWave | ZigBee@deCONZ | SIGNALduino | MapleCUN | RHASSPY
svn: u.a MySensors, Weekday-&RandomTimer, Twilight,  div. attrTemplate-files

JensS

Ich hab's mal in MQTT angefragt. Rudi als Maintainer weiß das bestimmt.
Insgesamt wäre es sowieso besser, wenn das auf der Rhasspy-Seite gelöst werden würde. Eventuell mit einem flag in der Intentdefinition von sentences. Im Forum hatte ich ja gefragt, ob man die Intents per default (de)aktivieren kann. Das würde die ganze Nummer mit der Start-Message überflüssig machen. Irgendwie sind dort meine Vorschläge bislang auf kein großes Interesse gestoßen...
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.

Beta-User

Hab's dann auch gesehen...

Na ja, die Vorschläge laufen halt meinem Bauchgefühl nach auf ziemlich tiefe Eingriffe in die Gesamtfunktionalität ein und erfordern einiges an Coding. Da würde hier auch erst mal gefragt werden, wo denn die effektiven Restriktionen liegen, und ob man nicht erst mal versuchen kann, mit den vorhandenen Mitteln zurande zu kommen.
Genau an der Stelle sind jetzt mAn. erst mal wir in der Pflicht. Ich habe zwar das Gefühl, dass es noch andere "Apps" gibt, die an diesen Stellen straucheln, aber einen Bedarf zu erkennen heißt dann ja noch lange nicht, dass man eine gemeinsame Vision hat, wie sich die Probleme lösen lassen. Ergo: eines nach dem anderen...
Server: HP-elitedesk@Debian 12, aktuelles FHEM@ConfigDB | CUL_HM (VCCU) | MQTT2: MiLight@ESP-GW, BT@OpenMQTTGw | MySensors: seriell, v.a. 2.3.1@RS485 | ZWave | ZigBee@deCONZ | SIGNALduino | MapleCUN | RHASSPY
svn: u.a MySensors, Weekday-&RandomTimer, Twilight,  div. attrTemplate-files

JensS

#794
Ok, dann halte ich mal die Füße still.
Die Antwort von Rudi hast du bestimmt gelesen. Also könnte man von FHEM-Seite her (versuchen), ein extra MQTT2_CLIENT (zu) definieren, welcher die Start-Message abfängt und die Configure-Message mit QOS 1 absetzt. Ob's klappt, wird sich zeigen. Das hängt davon ab, ob das Dialogmodul nach dem subscribe einmal durchgelaufen und bereit für Messages ist.
Die Übertragung im Netzwerk dauert ja ein paar ms und das sollte eventuell als Verzögerung reichen.
Willst du dir das mal anschauen, ob man das in 10_RHASSPY reinnehmen könnte?

p.s. Andererseits ist es dem User nicht zuzumuten, den Rhasspy-Code zu editieren...  :-\
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.