Autor Thema: Modulentwicklung für Rhasspy Sprachassistent  (Gelesen 89894 mal)

Offline Beta-User

  • Developer
  • Hero Member
  • ****
  • Beiträge: 18078
Antw:Modulentwicklung für Rhasspy Sprachassistent
« Antwort #810 am: 14 Juli 2021, 11:31:55 »
@Beta-User
Kannst du mir bitte auf die Sprünge helfen, wie ich die sessionId und die siteId von handleCustomIntent abgreifen kann?
Versuche mich gerade am Wikipedia-Dialog...

Gruß Jens
Aus dem Kopf: DATA abfragen?
("Auspacken" müßte über die "Muster-myUtils" dargestellt sein).
Server: HP-T620@Debian 11, 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

Offline JensS

  • Hero Member
  • *****
  • Beiträge: 1074
Antw:Modulentwicklung für Rhasspy Sprachassistent
« Antwort #811 am: 14 Juli 2021, 12:23:20 »
Danke, da war doch noch was - hatte vergessen, DATA im Attribut rhasspyIntents zu abonnieren.  ???
Debian auf APU2C4, HM-CFG-USB2, SIGNALduino, HM-ES-PMSw1-Pl, AB440S, AB440R, 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.

Offline JensS

  • Hero Member
  • *****
  • Beiträge: 1074
Antw:Modulentwicklung für Rhasspy Sprachassistent
« Antwort #812 am: 14 Juli 2021, 18:12:05 »
@Beta-User
Hast du eine Idee, warum Rhasspy meine Session nach continueSession beendet?hermes/intent/de.fhem:WIKI {"input": "bitte schlage in der Wikipdia nach", "intent": {"intentName": "de.fhem:WIKI", "confidenceScore": 1.0}, "siteId": "wohnzimmer", "id": null, "slots": [], "sessionId": "wohnzimmer-alexa-3165aa4a-114b-4f6c-9628-e9ded3e34200", "customData": "alexa", "asrTokens": [[{"value": "bitte", "confidence": 1.0, "rangeStart": 0, "rangeEnd": 5, "time": null}, {"value": "schlage", "confidence": 1.0, "rangeStart": 6, "rangeEnd": 13, "time": null}, {"value": "in", "confidence": 1.0, "rangeStart": 14, "rangeEnd": 16, "time": null}, {"value": "der", "confidence": 1.0, "rangeStart": 17, "rangeEnd": 20, "time": null}, {"value": "Wikipdia", "confidence": 1.0, "rangeStart": 21, "rangeEnd": 29, "time": null}, {"value": "nach", "confidence": 1.0, "rangeStart": 30, "rangeEnd": 34, "time": null}]], "asrConfidence": 0.99609652, "rawInput": "bitte schlage in der wikipdia nach", "wakewordId": "alexa", "lang": null}
hermes/dialogueManager/continueSession {"intentFilter":["de.fhem:ABC"],"sendIntentNotRecognized":true,"sessionId":"wohnzimmer-alexa-3165aa4a-114b-4f6c-9628-e9ded3e34200","siteId":"wohnzimmer","text":"Bitte buchstabiere."}
hermes/dialogueManager/endSession {"customData": "alexa","intentFilter": null,"sessionId": "wohnzimmer-alexa-3165aa4a-114b-4f6c-9628-e9ded3e34200","siteId": "wohnzimmer","text":-1}
hermes/dialogueManager/sessionEnded {"termination": {"reason": "nominal"}, "sessionId": "wohnzimmer-alexa-3165aa4a-114b-4f6c-9628-e9ded3e34200", "siteId": "wohnzimmer", "customData": "alexa"}
Mit [WIKI] rufe ich [ABC] in continueSession auf und möchte den Rückgabewert (vorerst) als Reading ablegen.
Die Sprachausgabe "Bitte buchstabiere" wird ausgegeben, trotzdem wird die Session unmittelbar nach absetzen von continueSession geschlossen. Daher erhalte ich auch keine Rückgabe von [ABC].

sub ABC{
my $data = shift // return;
my $Buchstabe = shift // return;
fhem("setreading Rhasspy Buchstabe $Buchstabe");
my $SessionJSON = decode_json($data);
my $SessionID = $SessionJSON->{'sessionId'};
my $SiteID = $SessionJSON->{'siteId'};
my $CustomData = $SessionJSON->{'customData'}.$Buchstabe;
if ($Buchstabe ne "suche"){
my $Readingsstring = "\'\{\"customData\"\:\"$CustomData\"\,\"intentFilter\"\:\[\"de\.fhem\:ABC\"\]\,\"sendIntentNotRecognized\"\:false\,\"sessionId\"\:\"$SessionID\"\,\"siteId\"\:\"$SiteID\"\,\"text\"\:\"$Buchstabe\"\}\'";
system("/usr/bin/mosquitto_pub -h 192.168.x.x -p 1883 -t hermes/dialogueManager/continueSession -m $Readingsstring")}
else{
fhem("set Rhasspy speak siteId\=\"$SiteID\" text\=\"$CustomData\"")
}
}

sub WIKI{
my $data = shift // return;
my $SessionJSON = decode_json($data);
my $SessionID = $SessionJSON->{'sessionId'};
my $SiteID = $SessionJSON->{'siteId'};
#my $CustomData = $SessionJSON->{'customData'};
my $CustomData = "WIKI ";
my $Readingsstring = "\'\{\"customData\"\:\"$CustomData\"\,\"intentFilter\"\:\[\"de\.fhem\:ABC\"\]\,\"sendIntentNotRecognized\"\:true\,\"sessionId\"\:\"$SessionID\"\,\"siteId\"\:\"$SiteID\"\,\"text\"\:\"Bitte buchstabiere\.\"\}\'";
system("/usr/bin/mosquitto_pub -h 192.168.x.x -p 1883 -t hermes/dialogueManager/continueSession -m $Readingsstring");
}

rhasspyIntents:ABC=ABC(DATA,Ch)
WIKI=WIKI(DATA)

sentences:[de.fhem:ABC]
($de.fhem.ABC){Ch}
(suche){Ch}

$de.fhem.ABC:([zett wie] Zacharias):z
([fau wie] Viktor):v
(es zett):ß
([ce wie] Cesar):c
([ess wie] Siegfried):s
([kuh wie] Quelle):q
([u wie] Ulrich):u
([eff wie] Friedrich):f
([ell wie] Ludwig):l
([ka wie] Kaufmann):k
([ge wie] Gustav):g
([pee wie] Paula):p
([o wie] Otto):o
([de wie] Dora):d
([be wie] Berta):b
([ä wie] Ärger):ä
([sch wie] Schule):sch
([emm wie] Martha):m
([ce ha wie] Charlotte):ch
([e wie] Emil):e
([ü wie] Übermut):ü
([zett wie] Zeppelin):z
([tee wie] Theodor):t
([enn wie] Nordpol):n
([ess wie] Samuel):s
([ö wie] Ökonom):ö
([Üppsilonn wie] Üppsilonn):y
([ha wie] Heinrich):h
([i wie] Ida):i
([icks wie] ksantippe):x
([jott wie] Julius):j
([err wie] Richard):r
([a wie] Anton):a
([we wie] Wilhelm):w

EDIT: Der erste mehrstufige Dialog läuft...
In sub handleCustomIntent musste ich das finale "return respond" auskommentieren, da nach dem Respond die Session vom Modul geschlossen wird.

hermes/dialogueManager/continueSession {"customData":"WIKI bad","intentFilter":["de.fhem:ABC"],"sendIntentNotRecognized":false,"sessionId":"wohnzimmer-alexa-7508d27c-8dad-49c9-aab0-edc69f2b5779","siteId":"wohnzimmer","text":"d"}
hermes/nlu/query {"input": "suche", "siteId": "wohnzimmer", "id": null, "intentFilter": ["de.fhem:ABC"], "sessionId": "wohnzimmer-alexa-7508d27c-8dad-49c9-aab0-edc69f2b5779", "wakewordId": "alexa", "lang": null, "customData": "WIKI bad", "asrConfidence": 1.0, "customEntities": null}
hermes/nlu/intentParsed {"input": "suche", "intent": {"intentName": "de.fhem:ABC", "confidenceScore": 1.0}, "siteId": "wohnzimmer", "id": null, "slots": [{"entity": "Ch", "value": {"kind": "Unknown", "value": "suche"}, "slotName": "Ch", "rawValue": "suche", "confidence": 1.0, "range": {"start": 0, "end": 5, "rawStart": 0, "rawEnd": 5}}], "sessionId": "wohnzimmer-alexa-7508d27c-8dad-49c9-aab0-edc69f2b5779"}
hermes/intent/de.fhem:ABC {"input": "suche", "intent": {"intentName": "de.fhem:ABC", "confidenceScore": 1.0}, "siteId": "wohnzimmer", "id": null, "slots": [{"entity": "Ch", "value": {"kind": "Unknown", "value": "suche"}, "slotName": "Ch", "rawValue": "suche", "confidence": 1.0, "range": {"start": 0, "end": 5, "rawStart": 0, "rawEnd": 5}}], "sessionId": "wohnzimmer-alexa-7508d27c-8dad-49c9-aab0-edc69f2b5779", "customData": "WIKI bad", "asrTokens": [[{"value": "suche", "confidence": 1.0, "rangeStart": 0, "rangeEnd": 5, "time": null}]], "asrConfidence": 1.0, "rawInput": "suche", "wakewordId": "alexa", "lang": null}
hermes/dialogueManager/startSession {"init":{"canBeEnqueued": true,"customData": "de.fhem","text": "WIKI badsuche","type": "notification"},"siteId": "wohnzimmer"}
hermes/dialogueManager/sessionEnded {"termination": {"reason": "nominal"}, "sessionId": "wohnzimmer-alexa-7508d27c-8dad-49c9-aab0-edc69f2b5779", "siteId": "wohnzimmer", "customData": "WIKI bad"}

p.s. Nun läuft auch die Übergabe an die Wikiabfrage. Dazu habe ich die sub Wikipedia etwas umgeschrieben und statt return ein speak aufgerufen.  8)
Ist natürlich nur eine temporäre Teststellung zur Forschung und Entwicklung...
« Letzte Änderung: 14 Juli 2021, 23:20:28 von JensS »
Debian auf APU2C4, HM-CFG-USB2, SIGNALduino, HM-ES-PMSw1-Pl, AB440S, AB440R, 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.

Offline Beta-User

  • Developer
  • Hero Member
  • ****
  • Beiträge: 18078
Antw:Modulentwicklung für Rhasspy Sprachassistent
« Antwort #813 am: 14 Juli 2021, 18:30:11 »
Mobil-kurz:
Die Rückgabe aus der sub muss! anders sein array ? => cref der Muater-myUtils
Server: HP-T620@Debian 11, 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

Offline Beta-User

  • Developer
  • Hero Member
  • ****
  • Beiträge: 18078
Antw:Modulentwicklung für Rhasspy Sprachassistent
« Antwort #814 am: 15 Juli 2021, 07:49:34 »
Längere Antwort unter Berücksichtigung deines Edits:

Zu Forschungszwecken ist das Vorgehen ok, externe Tools zu verwenden und Teile des Codes auszukommentieren. Aber an sich ist handleCustomIntent() vorbereitet, um auch Dialoganforderungen "mit Bordmitteln" zu erledigen ;) .

Es muss nur durch die Perl-Funktion eine passende Datenstruktur zurückgegeben werden, dann sollte das Modul alles "von alleine" machen. Die myUtils wird ausgeführt, der Rückgabewert landet in "$error", der wird dann geprüft:
if ( ref $error eq 'ARRAY' ) {
        $response = ${$error}[0] // getResponse($hash, 'DefaultConfirmation');
        if ( ref ${$error}[0] eq 'HASH') {
            $timeout = ${$error}[1] if looks_like_number( ${$error}[1] );
            return setDialogTimeout($hash, $data, $timeout, ${$error}[0]);
        }
        respond( $hash, $data, $response );
        return ${$error}[1]; #comma separated list of devices to trigger
    } elsif ( ref $error eq 'HASH' ) {
        return setDialogTimeout($hash, $data, $timeout, $error);
    } else {
        $response = $error; # if $error && $error !~ m{Please.define.*first}x;
    }

Was macht das nun:
Kommt "nichts" zurück => defaultConfirmation wird angesagt
Kommt "scalar" zurück => Das wird als Text behandelt und angesagt, Dialog ist fertig
Kommt Datentyp "HASH" zurück => Es handelt sich um einen Dialog! Der Hash wird 1:1 durchgereicht an "setDialogTimeout()" (=> der "customData"-key kann gesetzt werden!), timeout wird mit dem Standartwerten abgehandelt
Datentyp ist ARRAY: $timeout kann verändert werden, $response wird an setDialogTimeout() durchgereicht => Dialog bleibt offen, $response (innerhalb des ARRAY, kann auch Datentyp HASH sein => s.o.) wird durchgereicht.

Erforderlichenfalls können wir das ARRAY mit einer Option erweitern, den intentFilter auch noch zu setzen (geht aber auch innerhalb der HASH-$response-Struktur).

Klingt vermutlich kompliziert, aber es sollte - ohne Eingriff in den RHASSPY-Code (!) - schon jetzt möglich sein, die volle Dialogsteuerung via myUtils zu übernehmen ;) . Da sollte dann auch "clean" JSON erzeugt werden.

PS: "qq" würde ich dir noch ans Herz legen.
Server: HP-T620@Debian 11, 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

Offline JensS

  • Hero Member
  • *****
  • Beiträge: 1074
Antw:Modulentwicklung für Rhasspy Sprachassistent
« Antwort #815 am: 15 Juli 2021, 09:01:18 »
Vielen Dank für deine ausführliche Antwort.
qq{} - da muss ich mich noch disziplinieren...

Berichtige mich bitte, wenn ich daneben liege:
  • Session wird erzeugt und mit dem Intent [WIKI] an das Modul übergeben.
  • Das Modul erkennt einen customIntent und ruft die sub WIKI auf.
  • Die sub WIKI ruft bei der Basis ein continueSession für den Intent ABC auf.
  • Die sub WIKI ist durchgelaufen und das Modul ist wieder dran.
  • Die Basis fragt nach einem Buchstaben und übergibt die Daten mit dem neuen Intent ABC an das Modul.
  • Das Modul erkennt einen customIntent und ruft die sub ABC auf.


Das geht solange, bis das Schüsselwort qq{suche} erkannt wird. Dann wird von der sub ABC die sub Wikipedia mit dem Übergabewert $CustomData aufgerufen (hier nicht im Code).
Der Wechsel der Intents WIKI->ABC innerhalb einer Session führt doch zwangsweise zum Neuaufruf der sub ABC.?
Hast du einen Beispiel-Hash, welchen ich nach 3. an das Modul zurückgeben muss?
Debian auf APU2C4, HM-CFG-USB2, SIGNALduino, HM-ES-PMSw1-Pl, AB440S, AB440R, 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.

Offline Beta-User

  • Developer
  • Hero Member
  • ****
  • Beiträge: 18078
Antw:Modulentwicklung für Rhasspy Sprachassistent
« Antwort #816 am: 15 Juli 2021, 11:13:25 »
@all: Anbei mal wieder eine aktualisierte Fassung. Im Code selbst ist nicht viel passiert, aber die cref ist aktualisiert, zum einen s.u., zum anderen https://forum.fhem.de/index.php/topic,120779.msg1166266.html#msg1166266 (feedback zu letzterem wäre klasse...!)

qq{} - da muss ich mich noch disziplinieren...
Wenn man's mal "hat", ist es sehr viel einfacher...

Zitat
Berichtige mich bitte, wenn ich daneben liege:
  • Session wird erzeugt und mit dem Intent [WIKI] an das Modul übergeben.
  • Das Modul erkennt einen customIntent und ruft die sub WIKI auf.
    [/l][/l][/l][/l][/l][/l][/l][/l][/l]
Bis dahin richtig, aber 3. gibt nicht, es geht _immer_ 4. weiter (bzw. so sollte der myUtils-Code strukturiert sein)
Zitat
   
  • Die sub WIKI ruft bei der Basis ein continueSession für den Intent ABC auf.
  • Die sub WIKI ist durchgelaufen und das Modul ist wieder dran.

    [/l]
    [/l][/l][/l][/l][/l][/l]
Das Modul prüft dann anhand der Datenstruktur der Rückgabe (explizites "return $whatYouWant"!), was genau der User nach dem MyUtils-Aufruf haben will - genau das ist ja der "Trick" an der Sache: Es funktioniert an/ bzw. nach der Stelle ganz genauso wie innerhalb des Moduls, nur dass eben anhand des Datentyps entschieden wird, ob der Dialog offen bleiben soll (=>continueSession, indirekt über den
setDialogTimeout()-Call ) oder eben nicht...

Die cref habe ich mir unter diesem Gesichtspunkt auch nochmal angesehen, da war bzgl. dieser Dinge noch ein alter Stand verarbeitet.
Zitat
5. Die Basis fragt nach einem Buchstaben und übergibt die Daten mit dem neuen Intent ABC an das Modul.
6. Das Modul erkennt einen customIntent und ruft die sub ABC auf.
5. ist Abhängig von dem, was du zurückgibst, das kann die Frage nach dem Buchstaben sein, und der HASH kann dann auch einen intentFilter setzen, der nur noch "de.fhem.ABC" (und mAn. auch zweckmäßigerweise immer "de.fhem.CancelAction") aktiv hält.

Danach geht es "ganz normal" weiter, es kann also jeder beliebige aktive Intent weiterverarbeitet  werden, egal, ob Modulintern oder Custom.

Zitat
Das geht solange, bis [...]
Das geht theoretisch bis in alle Ewigkeit, bei jedem Durchlauf muss halt jeweils eine "passende" Rückgabe erfolgen. Solange jeweils wieder ein HASH an das Modul zurückgeht, solange bleibt auch der Dialog offen (timeout ausgenommen...).

Zitat
Hast du einen Beispiel-Hash, welchen ich nach 3. an das Modul zurückgeben muss?
Im Modul selbst wird eigentlich nur innerhalb des setDialogTimeout()-Codes ein $response-HASH gebaut, dort heißt er $reaction (am besten ab #1270 anfangen zu lesen wg. des Zusammenbauens des intentFilters).

(Aus Listen zu zitieren ist echt schwierig in der Nachformatierung...)
   
   
[/list][/list]
« Letzte Änderung: 22 Juli 2021, 13:44:30 von Beta-User »
Server: HP-T620@Debian 11, 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

Offline JensS

  • Hero Member
  • *****
  • Beiträge: 1074
Antw:Modulentwicklung für Rhasspy Sprachassistent
« Antwort #817 am: 15 Juli 2021, 11:59:29 »
Der Hash ist mir doch noch unklar. Soll ich in der sub WIKI und ABC die Keys und Values von siteId, sessionId, intentFilter, sendIntentNotRecognized, text und customData in ein HASH legen und dann mit return übergeben? Reicht das?

Die cref muss ich mir erstmal Wort für Wort anschauen und in meinem 8-Bit-Rechner(Kopf) übersetzen.
Das letzte Wort aus Zeile 4634 habe ich schon mal verstanden.  ;D

Ein Beispiel zum Tweak intentFilter fände ich hilfreich.
Insgesamt ist das schon eine sehr weitreichende Anleitung.  :Daumenhoch
Für eine Neuinstallation durch einen Rhasspy-Beginner könnte noch ein Hinweis zu einer sentences.ini-Anleitung rein.
Debian auf APU2C4, HM-CFG-USB2, SIGNALduino, HM-ES-PMSw1-Pl, AB440S, AB440R, 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.

Offline Beta-User

  • Developer
  • Hero Member
  • ****
  • Beiträge: 18078
Antw:Modulentwicklung für Rhasspy Sprachassistent
« Antwort #818 am: 15 Juli 2021, 12:56:53 »
Der Hash ist mir doch noch unklar. Soll ich in der sub WIKI und ABC die Keys und Values von siteId, sessionId, intentFilter, sendIntentNotRecognized, text und customData in ein HASH legen und dann mit return übergeben? Reicht das?
M.E. ist das sogar zu viel: die "Kommunikationsdaten" siteId und sessionId sind bekannt (in $data enthalten) und brauchen mAn. nicht gesondert übergeben zu werden

Zitat
Die cref muss ich mir erstmal Wort für Wort anschauen und in meinem 8-Bit-Rechner(Kopf) übersetzen.
So war's gar nicht gemeint: Es geht v.a. darum, dass die Hilfetexte jetzt auch erscheinen sollten, wenn man ein (mit beliebigem RHASSPY-prefix versehenes) Attribut an einem "fremden" Device auswählt, sieht man die Beschreibung (aktuelles FHEMWEB vorausgesetzt) direkt beim Auswählen des Attributs ;) . Screenshot anbei (das ist ein MQTT2_DEVICE).

Zitat
Ein Beispiel zum Tweak intentFilter fände ich hilfreich.
"just adding their names" meint: einfach die Namen (ohne "de.fhem.") hinschreiben...
attr RHASSPY rhasspyTweaks intentfilter=ABC 2.filter Phantasie:true(Das letzte macht eigentlich keinen Sinn...)

Zitat
Insgesamt ist das schon eine sehr weitreichende Anleitung.  :Daumenhoch
Für eine Neuinstallation durch einen Rhasspy-Beginner könnte noch ein Hinweis zu einer sentences.ini-Anleitung rein.
Danke auch für die allgemeine Rückmeldung.
Das mit sentences.ini ist ein guter Punkt; nach meinem Geschmack wäre es gut, wenn man da jeweils ein (kurzes!) Beispiel in der "intent"-Liste am Ende hätte, aber evtl. wäre auch ein globaler (de-) Link ok. Letztlich finde ich die Haltung von drhirn berechtigt, dass "irgendwann" auch gut ist mit der Doku. Die muss/soll soweit gehen, dass man weiß, wie man es in etwa einrichtet, aber dann ist auch "gut"...
Server: HP-T620@Debian 11, 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

Offline JensS

  • Hero Member
  • *****
  • Beiträge: 1074
Antw:Modulentwicklung für Rhasspy Sprachassistent
« Antwort #819 am: 15 Juli 2021, 19:49:21 »
Ok, das mit den Hilfetexten bei der Auswahl von z.B. rhasspyMapping funktioniert (getestet mit Edge).

sentences.ini - Wir paar User sind mittlerweile mit Rhasspy und dem Modul vertraut. Anfangs war es nicht ganz trivial reinzufinden und jetzt gibt es wesentlich mehr Optionen, bei denen man noch nicht mal weiß, ob man sie braucht.

continueSession - habe ich folgende sub:sub WIKI{
my $data = shift // return;
my $SessionJSON = decode_json($data);
my $SessionID = $SessionJSON->{'sessionId'};
my $SiteID = $SessionJSON->{'siteId'};

my %ReturnHash = (
siteId => qq{$SiteID},
sessionId => qq{$SessionID},
intentFilter => qq{de.fhem:ABC},
customData => qq{WIKI},
text => qq{Bitte buchstabiere}
);

return %ReturnHash
}
Nun erwarte ich die Aufforderung "Bitte buchstabiere" aber nichts passiert.
Die Session wird vom Modul beendet.
hermes/intent/de.fhem:WIKI {"input": "bitte schlage in der Wikipdia nach", "intent": {"intentName": "de.fhem:WIKI", "confidenceScore": 1.0}, "siteId": "wohnzimmer", "id": null, "slots": [], "sessionId": "wohnzimmer-alexa-c03a7f9b-b8e9-43f9-a3ff-9ea0ebb392ef", "customData": "alexa", "asrTokens": [[{"value": "bitte", "confidence": 1.0, "rangeStart": 0, "rangeEnd": 5, "time": null}, {"value": "schlage", "confidence": 1.0, "rangeStart": 6, "rangeEnd": 13, "time": null}, {"value": "in", "confidence": 1.0, "rangeStart": 14, "rangeEnd": 16, "time": null}, {"value": "der", "confidence": 1.0, "rangeStart": 17, "rangeEnd": 20, "time": null}, {"value": "Wikipdia", "confidence": 1.0, "rangeStart": 21, "rangeEnd": 29, "time": null}, {"value": "nach", "confidence": 1.0, "rangeStart": 30, "rangeEnd": 34, "time": null}]], "asrConfidence": 0.999430304, "rawInput": "bitte schlage in der wikipdia nach", "wakewordId": "alexa", "lang": null}
hermes/dialogueManager/endSession {"customData": "alexa","intentFilter": null,"sessionId": "wohnzimmer-alexa-c03a7f9b-b8e9-43f9-a3ff-9ea0ebb392ef","siteId": "wohnzimmer","text":5}
hermes/dialogueManager/sessionEnded {"termination": {"reason": "nominal"}, "sessionId": "wohnzimmer-alexa-c03a7f9b-b8e9-43f9-a3ff-9ea0ebb392ef", "siteId": "wohnzimmer", "customData": "alexa"}
Hab' ich immer noch falsch verstanden... :-\
Debian auf APU2C4, HM-CFG-USB2, SIGNALduino, HM-ES-PMSw1-Pl, AB440S, AB440R, 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.

Offline Beta-User

  • Developer
  • Hero Member
  • ****
  • Beiträge: 18078
Antw:Modulentwicklung für Rhasspy Sprachassistent
« Antwort #820 am: 15 Juli 2021, 19:56:19 »
Ungetestet: Versuch's mal mit geschweiften Klammern statt rundenmy %ReturnHash = {Edit: evtl. auch die Referenz auf den Hash zurückgeben...
« Letzte Änderung: 15 Juli 2021, 19:58:55 von Beta-User »
Server: HP-T620@Debian 11, 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

Offline JensS

  • Hero Member
  • *****
  • Beiträge: 1074
Antw:Modulentwicklung für Rhasspy Sprachassistent
« Antwort #821 am: 15 Juli 2021, 21:26:35 »
"my $ReturnHash ={" passt.
Also ein Schritt weiter.hermes/nlu/intentParsed {"input": "bitte schlage in der Wikipdia nach", "intent": {"intentName": "de.fhem:WIKI", "confidenceScore": 1.0}, "siteId": "wohnzimmer", "id": null, "slots": [], "sessionId": "wohnzimmer-alexa-1811f6f9-2e60-4263-8a54-494715a146c5"}
hermes/intent/de.fhem:WIKI {"input": "bitte schlage in der Wikipdia nach", "intent": {"intentName": "de.fhem:WIKI", "confidenceScore": 1.0}, "siteId": "wohnzimmer", "id": null, "slots": [], "sessionId": "wohnzimmer-alexa-1811f6f9-2e60-4263-8a54-494715a146c5", "customData": "alexa", "asrTokens": [[{"value": "bitte", "confidence": 1.0, "rangeStart": 0, "rangeEnd": 5, "time": null}, {"value": "schlage", "confidence": 1.0, "rangeStart": 6, "rangeEnd": 13, "time": null}, {"value": "in", "confidence": 1.0, "rangeStart": 14, "rangeEnd": 16, "time": null}, {"value": "der", "confidence": 1.0, "rangeStart": 17, "rangeEnd": 20, "time": null}, {"value": "Wikipdia", "confidence": 1.0, "rangeStart": 21, "rangeEnd": 29, "time": null}, {"value": "nach", "confidence": 1.0, "rangeStart": 30, "rangeEnd": 34, "time": null}]], "asrConfidence": 1.0, "rawInput": "bitte schlage in der wikipdia nach", "wakewordId": "alexa", "lang": null}
hermes/dialogueManager/continueSession {"customData": "WIKI","intentFilter": "de.fhem:ABC","sessionId": "wohnzimmer-alexa-1811f6f9-2e60-4263-8a54-494715a146c5","siteId": "wohnzimmer","text": "Bitte buchstabiere"}
hermes/dialogueManager/endSession {"customData": "alexa","intentFilter": null,"sessionId": "wohnzimmer-alexa-1811f6f9-2e60-4263-8a54-494715a146c5","siteId": "wohnzimmer","text": "Tut mir leid, da hat etwas zu lange gedauert"}
hermes/dialogueManager/sessionEnded {"termination": {"reason": "nominal"}, "sessionId": "wohnzimmer-alexa-1811f6f9-2e60-4263-8a54-494715a146c5", "siteId": "wohnzimmer", "customData": "alexa"}
Rhasspy reagiert auf keine Ansprache.
hermes/dialogueManager/continueSession {"customData": "WIKI","intentFilter": "de.fhem:ABC"Bei intentFilter müssen noch die eckigen Klammern rein. ["de.fhem:ABC"]
Debian auf APU2C4, HM-CFG-USB2, SIGNALduino, HM-ES-PMSw1-Pl, AB440S, AB440R, 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.

Offline Beta-User

  • Developer
  • Hero Member
  • ****
  • Beiträge: 18078
Antw:Modulentwicklung für Rhasspy Sprachassistent
« Antwort #822 am: 15 Juli 2021, 21:33:48 »
 
Zitat
(am besten ab #1270 anfangen zu lesen wg. des Zusammenbauens des intentFilters
).
Server: HP-T620@Debian 11, 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

Offline JensS

  • Hero Member
  • *****
  • Beiträge: 1074
Antw:Modulentwicklung für Rhasspy Sprachassistent
« Antwort #823 am: 15 Juli 2021, 21:39:29 »
Ok, intentFilter => [qq{de.fhem:ABC}] passt.
Debian auf APU2C4, HM-CFG-USB2, SIGNALduino, HM-ES-PMSw1-Pl, AB440S, AB440R, 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.

Offline Beta-User

  • Developer
  • Hero Member
  • ****
  • Beiträge: 18078
Antw:Modulentwicklung für Rhasspy Sprachassistent
« Antwort #824 am: 16 Juli 2021, 07:44:21 »
Ok, intentFilter => [qq{de.fhem:ABC}] passt.
...jein...: Für eine Musterlösung würde ich empfehlen, immer auch "CancelAction" aktiv zu lassen, damit der User auch immer die Option hat, aktiv aus dem Dialog auszusteigen. Und "qq" brauchst du hier nicht, es gibt keine Variablen aufzulösen => "qw"

Und meine Vermutung ist weiter, dass es unnötig (mind., evtl. sogar irreführend) ist, in den Hash sieteId und sessionId mit aufzunehmen. Wirf es zumindest testweise bitte mal raus. Diese Daten werden mAn. von "respond()" sowieso "passend" ergänzt (bzw. vermutlich in diesem Fall überschrieben). Würde evtl. Sinn machen, die cref zu den HASH-Inhalten zu ergänzen, ich müßte nur mal schauen, wie es mit zusätzlichen Inhalten ausschaut (v.a. "lang").
Server: HP-T620@Debian 11, 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

 

decade-submarginal