SNIPS: Sprachsteuerung (mittlerweile auch per Textcommands) über snips.ai

Begonnen von Thyraz, 21 Juli 2018, 20:28:48

Vorheriges Thema - Nächstes Thema

tehlers

Hi,

es gibt ja die Möglichkeit per notify eine Aktion auszuführen, wenn Snips ausgelöst wird, also bspw:


define n_snips_listening_wohnzimmer_shield notify Snips:listening_wohnzimmer.* { bla }


Das wird dann beim Auslösen und beim Ende der Snips-Interaktion gestartet. Ich würde gerne aber beim Auslösen was anderes machen, als beim Ende. Ich vermute, dass man das "*" durch irgendwas ersetzen muss, damit es jeweils nur bei Start oder Ende auslöst, aber ich bekomme das irgendwie nicht raus. Hat jemand einen Tipp?

Danke

tehlers

So ich denke, dass ich die Logik jetzt verstanden habe. Also ".*" ist nur die Regex -- hatte ich aus Beispielen. Es matchen dann einfach auch Strings, die noch etwas hinten dran haben, also "listening_wohnzimmer44324234" würde auf "listening_wohnzimmer.*" auch matchen. Hat also nicht mit "{Snipsdevice}:listening_{Raum}.{Status}" oder so zu tun.

Aber inzwischen habe ich in der Hilfe zu Notify (https://wiki.fhem.de/wiki/Notify) gelernt, dass die Variablen $NAME und $EVENT gesetzt werden mit $EVTPART1 bekommt man dann nur den status (bei Snips-listening-Events 1 oder 0), oder $EVTPART0 nur den Eventnamen. Man kann also mit:


define n_snips_listening_wohnzimmer_shield notify Snips:listening_wohnzimmer { if ($EVTPART1 == 1 ) { bla } }


Etwas nur beim Starten ausführen.

Viele Grüße

Che007

Guten Morgen,

hat jemand schon eine Lösung warum Snips das Wiedergabegerät nicht erkennt?
Starte das Radio über die Mediacontrols. Wenn ich sage "Stoppe", ertönt die Meldung, dass keine Wiedergabegerät aktiv ist.

Habe ich ggf. Readingsvergessen?

attr Radio userattr snipsChannels:textField-long
attr Radio devStateIcon play:rc_STOP:stop stop:rc_PLAY:play pause:rc_PAUSE:pause error:icoBlitz
attr Radio group Musik
attr Radio icon it_radio
attr Radio loadPlaylists 1
attr Radio player mpd
attr Radio room Musik,Snips
attr Radio snipsChannels swr3=playlist swr3\
wdr2=playlist wdr2\
bigfm=playlist bigfm\
1live=playlist 1live\
wdr4=playlist wdr4\
welleniederrhein=playlist welleniederrhein
attr Radio snipsMapping MediaControls:cmdPlay=play,cmdPause=pause,cmdStop=stop,cmdFwd=next,cmdBack=prev
attr Radio snipsName Radio
attr Radio snipsRoom Wohnzimmer
attr Radio titleSplit 1

uwemicro

Hallo,
ich habe mal ein Gehäuse für den Raspi gebaut, der Master im runden Gehäuse ist ein Raspi 3A+ mit ReSpeaker 4 Mic, der Satellite ein Raspi Zero WH mit ReSpeaker 2 Mic.

Viele Grüße
Uwe

chicco

Hallo zusammen,

obwohl mein fhem schon ein paar Jahre alt ist, bin ich hier im Forum noch (fast) neu.
An der Stelle erst mal ein allgemeines Danke an Rudolf, dass er das Projekt auf die Beine gestellt hat.
Danke an all die anderen Entwickler die so fleißig Module und sonstige Sachen entwickelt haben.
Und um den Bogen zu diesem Thema zu schlagen: Danke Thyraz.

Diese Sachen konnte ich mit dem Modul umsetzen:
- Licht schalten
- Heizung abfragen und Werte setzen
- VDR und Kodi fernsteuern
- ein paar Info-Abfragen (Wetter, Datum, Uhrzeit)
- ein eigener Intent um Artikel auf meine Einkaufsliste zu setzen

Mehr gibt meine fhem-Installation nicht her.
Aber ich habe einige Fragen, Anregungen und Wünsche.

1. Gibt es keinen Befehl/Intent um ein Gerät stumm zu schalten? Oder habe ich was übersehen?
Ich habe es mit einem shortcut gelöst.

2. Gibt es die Möglichkeit alle Beispielsätze zu einem Intent zu sehen?
Bsp: ich bin in der Snips-Konsole und gehe auf die fhem-App.
Da ist dann z.B. der Intent SetNumeric, darunter steht "50 examples" und 2 Beispielsätze "Standardgerät auf 50" und "Standardgerät um 10 heller".
Was ist mit den anderen 48 Sätzen? Kann ich die irgendwo sehen?
Ich würde einfach nur gerne wissen was man bei den einzelnen Intents jeweils als Formulierung verwenden kann.

3. Wie bereits erwähnt, habe ich einen eigenen Intent für meine Einkaufsliste gebastelt.
D.h. ich habe eine eigene App erstellt und darin einen Intent "addToList". Dann ein paar Beispielsätze z.B. "setze {ARTIKELNAME} auf die Liste" oder "{ARTIKELNAME} einkaufen".
Dazu einen Slot mit den Name "Artikel" und der Slot-Type ist custom. Im Slot-Type habe ich dann bei den Values alle Artikel eingefügt, die ich in meiner Android-Einkaufslisten-App-Datenbank gespeichert habe, sonst erkennt Snips meine gesprochenen Artikel ja nicht.
Jetzt ist die Frage: Kann ich die Artikel-Bezeichnungen auch per Inject an Snips übergeben?
Das hätte den Vorteil, dass ich die Artikelliste per fhem einfacher pflegen könnte, wenn z.B. mal ein neuer Artikel dazu kommt. Und ich wäre unabhängig von der Snips-Konsole.
Ich habs versucht mit einem dummy-device und habe dort per "attr dummy-device snipsName Butter,Brot,usw." Artikel angelegt, gefolgt von einem "set Snips updateModel".
Aber es hat leider nicht funktioniert, der Befehl "Butter einkaufen" wird dann erkannt als "unknownword einkaufen" bzw. nur "einkaufen".
Muss ich die injizierten Begriffe evtl. noch meinem Intent zuordnen? Wenn ja, wie?

4. Ich habe einen reproduzierbaren Fehler bei dem die TTS-Engine von Snips abstürzt.
Ich habe einen Shortcut angelegt, der schaltet ein Gerät per http-Request.
Wenn ich mir das ganze per snips-watch anschaue, sehe ich dort den gesamten html-Quelltext der vom Request zurückkommt. Dann stürzt die TTS-Engine ab.
Nach einem reboot vom snips-raspi ist alles wieder ok. Vermutlich würde es reichen den entsprechenden Service neu zu starten.
Ich kann das abfangen indem ich hinter dem Request noch ein "return Ok" aufrufe. Der Shortcut sieht so aus:
Katzenklappe öffnen={GetFileFromURL("http://192.168.x.y/index.php?flap=open"); return "Ok.";}
Ich weiß nicht was genau den Absturz verursacht. Vielleicht ist es die Menge an (html-)Text, vielleicht sind es die Sonderzeichen?
Ich kann das zwar abfangen, aber vielleicht macht es Sinn, dass man das direkt im Modul abfängt? Nur so als Anregung.

5. Ich würde gerne mehrere Bezeichnungen/Trigger für einen Shortcut anlegen.
Bsp: die Befehle "nächstes Lied" und "nächstes Video" senden den gleichen Befehl an Kodi:
nächstes Lied={MediaAction("next")}
nächstes Video={MediaAction("next")}
Ich würde es gerne so umbauen:
nächstes Lied,nächstes Video={MediaAction("next")}
Wäre übersichtlicher und spart Pflegeaufwand.
Ist das irgendwie möglich?

6. Gibt es die Möglichkeit Snips temporär auszuschalten?
z.B. Hey Snips: mach mal Pause
und dann lauscht Snips nicht mehr auf das Wakeword.
Dann brauchts natürlich noch einen Befehl um wieder einzuschalten.
Habe schon überlegt auf dem snips-raspi einen webserver zu installieren, dann könnte man einen http-request rüber schicken und so den snips-service ein/ausschalten.
Aber bevor ich da was bastel, wollte ich erstmal fragen.

7. Zur Anleitung noch 2 Anmerkungen.
Im Kapitel "Snips Installation" sind 2 Links die beide auf die Snips-Seite verweisen, aber beide Links geben ein "page not found". War für mich nicht wichtig, denn ich habe es installiert nach der Anleitung die vor einigen Wochen in der ct war.
Die Shortcuts sind in der Anleitung nicht drin. Ich weiß, das ist bekannt, auch dem Thyraz. Aber ich denke es ist ein sehr wichtiges Feature, das sollte in die Anleitung. Ich steuer die meisten Sachen per Shortcut.

So, das war mal ne Menge Text zum Einstand. Ich hoffe ihr könnt mir die eine oder andere Frage beantworten.

Gruß
chicco

MadMax-FHEM

@uwemicro:

sieht ja wirklich schick aus!

Habe/hatte Snips etwas auf Eis gelegt, da die Spracherkennung noch nicht so wollte wie ich...
...bzw. halt viel Zeit kostet/gekostet hätte... ;)

Weiterer Punkt: selbst wenn ich das mit der Erkennung gut hinbekomme, es fehlt(e) immer (noch) an der Optik...
...aber da hast du ja echt was geschafft...

Wie muss man sich das vorstellen?

Kunsstoffgehäuse mit "Stoffüberzug" oder alles 3D gedruckt!?

Gruß, Joachim
FHEM PI3B+ Bullseye: HM-CFG-USB, 40x HM, ZWave-USB, 13x ZWave, EnOcean-PI, 15x EnOcean, HUE/deCONZ, CO2, ESP-Multisensor, Shelly, alexa-fhem, ...
FHEM PI2 Buster: HM-CFG-USB, 25x HM, ZWave-USB, 4x ZWave, EnOcean-PI, 3x EnOcean, Shelly, ha-bridge, ...
FHEM PI3 Buster (Test)

uwemicro

Hallo,
das Gehäuse stammt aus dem 3D Drucker und ist mit Bespannstoff für Lautsprecher bezogen. Der "Deckel" ist opakes Acrylglas damit man die LED's sehen kann.

Viele Grüße
Uwe

homespinner

Hallo zusammen!

Echt tolle Arbeit, endlich mal eine schöne Lösung, um das Alexa/Google Geraffel abzulösen  ;D
Leider will sich bei mir ein Phillips Hue Bloom nicht einschalten lassen (bzw. alle Geräte habe ich bisher noch nicht getestet):

Ich bin analog der Anleitung bei GitHub vorgegangen, aber es scheint noch etwas zu fehlen.
sam watch sagt:

[23:10:53] [Asr] captured text "nachttisch ein" in 1.0s
[23:10:53] [Asr] was asked to stop listening on site default
[23:10:53] [Nlu] was asked to parse input "nachttisch ein"
[23:10:53] [Nlu] detected intent Thyraz:SetOnOff with confidence score 1.000 for input "nachttisch ein"
              Slots ->
                 Device -> Nachttisch (confidence: 0.832)
                  Value -> an (confidence: 0.505)
[23:10:53] [Dialogue] New intent detected Thyraz:SetOnOff with confidence 1.000
              Slots ->
                 Device -> Nachttisch (confidence: 0.832)
                  Value -> an (confidence: 0.505)


Im FHEM log steht auf Level 5 Verbose:

2019.07.16 23:10:54 5 : publish received for hermes/intent/Thyraz:SetOnOff, {"sessionId":"9e0817f6-d5fa-4292-aa83-3a9f1bf3db3b","customData":null,"siteId":"default","input":"nachttisch ein","asrTokens":[[{"value":"nachttisch","confidence":0.8316527,"rangeStart":0,"rangeEnd":10,"time":{"start":0.036039993,"end":0.61415046}},{"value":"ein","confidence":0.50485045,"rangeStart":11,"rangeEnd":14,"time":{"start":0.6144896,"end":0.8722443}}]],"asrConfidence":0.64796627,"intent":{"intentName":"Thyraz:SetOnOff","confidenceScore":1.0},"slots":[{"rawValue":"nachttisch","value":{"kind":"Custom","value":"Nachttisch"},"range":{"start":0,"end":10},"entity":"de.fhem.Device","slotName":"Device","confidenceScore":0.8316527},{"rawValue":"ein","value":{"kind":"Custom","value":"an"},"range":{"start":11,"end":14},"entity":"de.fhem.OnOffValue","slotName":"Value","confidenceScore":0.50485045}]}
2019-07-16 23:10:54 SNIPS Snips transmission-state: incoming publish received
2019.07.16 23:10:54 5 : Parsed value: Nachttisch for key: Device
2019.07.16 23:10:54 5 : Parsed value: 9e0817f6-d5fa-4292-aa83-3a9f1bf3db3b for key: sessionId
2019.07.16 23:10:54 5 : Parsed value: default for key: siteId
2019.07.16 23:10:54 5 : Parsed value: 1 for key: probability
2019.07.16 23:10:54 5 : Parsed value: an for key: Value
2019.07.16 23:10:54 5 : Parsed value: nachttisch ein for key: input
2019.07.16 23:10:54 5 : Parsed value: SetOnOff for key: intent


In der FHEM.cfg:

define SnipsMQTT MQTT 10.40.1.12:1883
setuuid SnipsMQTT 5d2df109-f33f-5b15-1e91-51616585c72f312c
define Snips SNIPS SnipsMQTT Zimmer_Michael
setuuid Snips 5d2df109-f33f-5b15-95c6-03d23d230c8813a4
attr Snips IODev SnipsMQTT
attr Snips verbose 5

define HUEDevice10 HUEDevice 10  IODev=HUEBRIDGE1
setuuid HUEDevice10 5d2df10d-f33f-5b15-3584-733e8bcbdfc520cd
attr HUEDevice10 IODev HUEBRIDGE1
attr HUEDevice10 room Snips,Zimmer Michael
attr HUEDevice10 snipsMapping SetOnOff=state,valueOff=off,cmdOn=on,cmdOff=off,GetOnOff=off,valueOff=on
attr HUEDevice10 snipsName Nachttisch
attr HUEDevice10 snipsRoom Zimmer Michael
attr HUEDevice10 subType colordimmer
attr HUEDevice10 webCmd hue:rgb:rgb ff0000:rgb 98FF23:rgb 0000ff:toggle:on:off



Also das Device scheint er korrekt zu erkennen sowie der Intent auch, aber im Log erscheint einfach nicht die Zeile "handleIntentSetOnOff called".
Das Gerät befindet sich im Raum "Snips".
Was mache ich falsch?


Schon mal danke im Voraus + Grüße aus Karlsruhe!

homespinner

So, "Problem" gelöst  8)

Ich vermute, es gibt noch einen kleinen "Bug" im Perl-Modul.
Sobald ich mehr als 1 Gerät in den Snips-Raum aufnehme, funktioniert die Steuerung von allen Geräten wunderbar!
Und ich teste mir den Wolf und wundere mich, warum es einfach nicht funktioniert  ;)
Ich bin bei Perl leider nicht so bewandert, ich denke ggf. findet der Author den Fehler.

Das Beispiel funktioniert also wunderbar.
Danke an den Author des Moduls für die super Arbeit!


Grüße aus Karlsruhe!

loriot

Hallo zusammen,

bin mir nicht sicher, ob ich falsch suche oder als einziger das Problem habe:

snips funktioniert soweit gut und die Integration snips fhem scheint auch zu gehen. Wenn ich snips ein Kommando für fhem gebe, kommt im Event Monitor auch alles einwandfrei an, am Ende heisst es aber immer, "da ist etwas schief gegangen:
2019-07-25 18:38:23 SNIPS Snips transmission-state: incoming publish received
2019-07-25 18:38:23 SNIPS Snips listening_wohnzimmer: 1
2019-07-25 18:38:29 SNIPS Snips transmission-state: incoming publish received
2019-07-25 18:38:29 SNIPS Snips transmission-state: incoming publish received
2019-07-25 18:38:29 SNIPS Snips transmission-state: incoming publish received
2019-07-25 18:38:29 SNIPS Snips lastIntentTopic: hermes/nlu/intentParsed
2019-07-25 18:38:29 SNIPS Snips lastIntentPayload: {"Device":"[b]entertain[/b]","Value":"[b]an[/b]","input":"schalte entertain an","intent":"SetOnOff","probability":1,"requestType":"voice","sessionId":"***","siteId":"default"}
2019-07-25 18:38:29 SNIPS Snips voiceResponse: Da ist etwas schief gegangen.
2019-07-25 18:38:32 SNIPS Snips transmission-state: incoming publish received
2019-07-25 18:38:32 SNIPS Snips listening_wohnzimmer: 0


Im SAM watch sieht es fast gut aus. Ich verstehe nur nicht, was snips mit dem schalte standardgerät an meint?

[18:38:29] [Nlu] detected intent Thyraz:SetOnOff with confidence score 1.000 for input "schalte entertain an"
              Slots ->
                 Device -> Entertain (confidence: 0.839)
                  Value -> an (confidence: 0.853)
[18:38:29] [Dialogue] New intent detected Thyraz:SetOnOff with confidence 1.000
              Slots ->
                 Device -> Entertain (confidence: 0.839)
                  Value -> an (confidence: 0.853)
[18:38:29] [Nlu] was asked to parse input "schalte standardgerät an"
[18:38:29] [Nlu] detected intent Thyraz:SetOnOff with confidence score 1.000 for input "schalte standardgerät an"
              Slots ->
                 Device -> Standardgerät
                  Value -> an


Die Konfiguration sollte eigentlich passen:

...
attr Entertain genericDeviceType switch
attr Entertain room 30_Wohnzimmer,Harmony,Homekit,Snips
attr Entertain snipsMapping setonoff:cmdOn=on,cmdOff=off
attr Entertain snipsName Entertain,TV,entertain
attr Entertain snipsRoom Wohnzimmer


Hat hier jemadn eine Idee?

Gruß
Andreas



homespinner

Hallo Andreas,

Hast du mal testweise noch ein weiteres Gerät in der Raum "Snips" aufgenommen?
Bei mir ging da bei nur einem Gerät nur nicht richtig, ab 2 Geräten haben sich alle wunderbar schalten lassen.

Das mit dem input "schalte standardgerät an" ist ganz normal, weil es in dem Intent für den Slot des Gerätenamens (Device) nur den Wert "Standardgerät" gesetzt hat.
Der "lastIntentPayload" ist aber das, was Snips bzw. der NLU wirklich verstanden hat, und in Text umgesetzt wurde.
Das wird dann zum Erkennen des richtigen Gerätes in FHEM durch das Modul verwendet.
Danach wird dann der Intent sowie das gelernte Sprachbeispiel ausgegeben, welcher zu der Anforderung passt, also "schalte standardgerät an".
Kann man schön nachvollziehen, wenn man die App auf der Snips Console forkt  ;)


Grüße aus Karlsruhe,
Michael

loriot

Hallo Michael,

Danke erst einmal für die schnelle Antwort. Ich habe 4 Geräte im Raum Snips, anscheinend ist es das nicht ;-)

Ich habe aber noch etwas mehr gesucht und ein Problem mit der Injection gefunden (meine ich zumindest). das sah dann so aus, wenn man updateModel aufruft:


$ sudo -u _snips snips-injection -v
[20:07:03.515659] DEBUG:snips_injection_lib::injectable: computing injections dirname from reference dir "/usr/share/snips/assistant"
[20:07:03.516130] ERROR:snips_injection_hermes         : Permission denied (os error 13)


Ich habe alle Dateien unterhalb /usr/share/snips/assistant nun dem _snips Benutzer gegeben (war vorher pi user) und nun sieht die Abarbeitung bei der Injection deutlich besser aus.... Es wundert mich trotzdem etwas. Habe noch einen 2. PI und da warne die Permissions auch alle für den pi User.

Das Problem ist leider dasselbe :-(
Ich suche mal weiter

Gruß
Andreas

loriot

Hallo zusammen, jetzt funktioniert es plötzlich und ich weiß nicht woran es liegt  ;)

drhirn

Snips ist ziemlich kritisch, was unterschiedliche Sprachen betrifft. Oder Aussprachen. Bei mir wurde z.B. der Computer erst eingeschaltet, als ich ihm die Namen "Kompjuta, Petse" gegeben habe ;). Es hat sich also bewährt, speziell englische Wörter (z.B. Entertain) so zu schreiben, wie ich sie ausspreche. In deinem Fall wär's dann wohl "Entertän, Entertäin, Entatäin" oder so.

lucca111

Auch bei mir war nach einer Assistant Aktualisierung keine Erkennung meiner Geräte oder Räume mehr möglich. Ich habe darauf hin Snips komplett neu installiert aber das hat auch nichts geholfen. Habe dann den Inhalt des injections Ordner komplett gelöscht und versucht mit updateModel neu zu füllen. Es wurde
aber nichts neues mehr angelegt. Dann habe ich alle Geräte in FHEM aus den Raum Snips entfernt und es erst einmal mit dem anlernen eines einzigen Gerätes versucht. Wieder nichts! Nachdem ich meine Shortcuts in Fhem gelöscht habe ging es dann endlich wieder. Nun habe ich meine gesicherte komplette fhem.cfg wieder eingespielt, einmal updateModel ausgeführt und siehe da... die Welt war wieder in Ordnung.
Die Shortcuts waren bei mir das Problem. Ich hoffe es hilft euch bei Problemen mit der Erkennung auch weiter.  :)