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

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

Vorheriges Thema - Nächstes Thema

enno

Zitat von: kud am 31 August 2018, 14:57:17
Ist zwar offtopic aber kann mal Jemand auf die Schnelle schauen warum das notify nicht reagiert ;-((
Snips:voiceResponse:.* {set LocalTTS tts $EVENT}

https://regex101.com/

wenn ich das dort teste, findet er auch nichts. Was sagt denn:

Snips:*.voiceResponse:.* {set LocalTTS tts $EVENT}
Einfacher FHEM Anwender auf Intel®NUC mit Proxmox und Debian

kud

OK. Mit diesem DEF läufts.
Snips:.*voiceResponse:.* {
my $ansage = ReadingsVal("Snips","voiceResponse","");
fhem("set LocalTTS tts $ansage")}


(mit $EVENT kommt immer "voiceResponse" in der Ausgabe davor, da ist ReadingsVal besser)

Diese Geschichte ist übrigens ein echter Mehrwert. Da klingt die Stimme mit allen FHEM-Sprachausgabe einheitlich und kommt über denselben Lautsprecher. Echt Klasse.

Neuhier

Habe den Eintrag vorgenommen, wie Thyraz ihn in #247 vorgeschlagen hat.
Da bekomme ich aber
{"Device":"draussen","input":"thermometer draussen","intent":"SetOnOff","probability":"0.794529","sessionId":"fhem.textCommand","siteId":null,"type":"text"}

Wobei ein "intent":"SetOnOff" nicht richtig sein kann.
Irgendwo hat sich ein Wurm versteckt...

Paar Versuche später: mehrfach Snips mit Update versorgt, fhem neu gestartet
Jetzt stimmt zwar der Intent, aber sonst gibt es wieder nur: Es ist etwas schiefgegangen.

Was ich auch noch nicht kapiert habe: wie übergibt Snips das an FHEM ?

Was mir noch auffällt: Snips hat Status ? ? ?. Ist das richtig so?
Installiert habe ich das komplett nach Anleitung aus dem GitHub und Snips-Howto.

enno

Moin Thyraz,

erst mal Danke für das Modul! Unsere Famile ist begeistert. Meine Frau wurde gestern überzeugt, als sie das Radio einschalten wollte und beide Hände im Kuchenteig steckten :)

Habe mir gerade ein Device gebastelt, das mir über Snips mitteilt, was gerade läuft.

"Hey Snips was läuft?"

defmod SnipsRadio_Info_Dummy dummy
attr SnipsRadio_Info_Dummy Snips
attr SnipsRadio_Info_Dummy snipsMapping Status:response=Es läuft [MPD:Title]
attr SnipsRadio_Info_Dummy snipsName Was
attr SnipsRadio_Info_Dummy snipsRoom läuft


Die Antwort "RUDIMENTAL - THESE DAYS (FEAT. JESS GLYNNE, MACKLEMORE" kommt auch, aber mit "deutscher" Aussprache. So gut wie nicht zu verstehen. Gibt es einen Trick das zu verbessern?

Ich würde bei bestimmten Ansagen auch gerne die Lautstärke hochdrehen, bei anderen leiser ausgeben. Geht das? Habe noch nichts gefunden.

Gruss
  Enno
Einfacher FHEM Anwender auf Intel®NUC mit Proxmox und Debian

Thyraz

Zitat von: Neuhier am 01 September 2018, 19:33:22
Paar Versuche später: mehrfach Snips mit Update versorgt, fhem neu gestartet
Jetzt stimmt zwar der Intent, aber sonst gibt es wieder nur: Es ist etwas schiefgegangen.
Ok, nachdem der Status nun stimmt:
Wie sieht sieht das lastIntentPayload im Modul nun aus?
Kannst du zusätzlich noch das snipsMapping vom Gerät zeigen, sowie was im Log von FHEM erscheint wenn du verbose 5 im Modul setzt und das Kommando einsprichst?

Zitat von: Neuhier am 01 September 2018, 19:33:22
Was ich auch noch nicht kapiert habe: wie übergibt Snips das an FHEM ?
Snips entscheidet anhand des Aufbaus des Befehls und der darin vorkommenden Slots welcher Intent wohl gemeint ist.
Es übergibt dann den Intentnamen und die Slotvalues an FHEM (bzw. Fhem greift die über MQTT ab).

Zitat von: Neuhier am 01 September 2018, 19:33:22
Was mir noch auffällt: Snips hat Status ? ? ?. Ist das richtig so?
Ich setzte den Status bisher noch nicht, da ich auch noch nicht so recht weiß, was da rein sollte.
FHEM scheint das mit 3 Fragezeichen zu quittieren. ;)
Fhem und MariaDB auf NUC6i5SYH in Proxmox Container (Ubuntu)
Zwave, Conbee II, Hue, Harmony, Solo4k, LaMetric, Echo, Sonos, Roborock S5, Nuki, Prusa Mini, Doorbird, ...

Thyraz

Zitat von: enno am 03 September 2018, 10:45:35
erst mal Danke für das Modul! Unsere Famile ist begeistert.
Freut mich. :)

Zitat von: enno am 03 September 2018, 10:45:35
Die Antwort "RUDIMENTAL - THESE DAYS (FEAT. JESS GLYNNE, MACKLEMORE" kommt auch, aber mit "deutscher" Aussprache. So gut wie nicht zu verstehen. Gibt es einen Trick das zu verbessern?
Gute Frage. Ausgabe von Medieninformationen dürfte schon die Königsdiziplin sein. ;)
Ich wette Alexa und Siri wissen über Zugriff auf die Mediendaten welche Sprache sie zum aussprechen verwenden müssen.
Mit einem Offline-Assistent wird das schwer.

Klar könnte man dem Say Befehl noch die Sprache als Parameter mitgeben. Eine neue Syntax bei der man Optionen setzen kann ist ja eh geplant.
Aber wie entscheidet FHEM mit welcher Sprache es sprechen müsste? ;)

Ob man besserer Ergebnisse erhält, wenn man Amazon Polly oder Google TTS als Sprachausgabe für Snips verwendet müsste man mal testen.
Evtl. gibt es hier eine Intelligenz, welche die Sprache zu erkennen versucht...

Zitat von: enno am 03 September 2018, 10:45:35
Ich würde bei bestimmten Ansagen auch gerne die Lautstärke hochdrehen, bei anderen leiser ausgeben. Geht das? Habe noch nichts gefunden.

Ich hab geplant, einen volume Befehl hinzuzufügen.

Braucht dann aber einen extra Service den man auf dem Snips Rechner installieren muss, welcher die MQTT Nachrichten empfängt und die Systemlautstärke ändert.

Kommt hoffentlich im Laufe der nächsten Woche.
Fhem und MariaDB auf NUC6i5SYH in Proxmox Container (Ubuntu)
Zwave, Conbee II, Hue, Harmony, Solo4k, LaMetric, Echo, Sonos, Roborock S5, Nuki, Prusa Mini, Doorbird, ...

Thyraz

So, das Thema war übrigens unabsichtlich geschlossen, als Entschädigung gibt es erstmal eine neue Version. :P

- Zum einen gibt es jetzt die neue say Syntax:

set <snipsDevice> say siteId="default" text="Dies ist ein Test"

Die alte Syntax ohne Angabe einer siteId funktioniert weiterhin. Wird dann bei siteId default ausgegeben.

- Zweite Änderung ist, dass ihr eigenen PERL-Code in geschweiften Klammern als CMDs oder Readings im Mapping angeben könnt.
Da ein Mapping immer nur eine Zeile lang sein darf, sollte komplexer Code am Besten in eine 99_myUtils Funktion ausgelagert werden.
Im Code innerhalb der geschweiften Klammern ist die Variable $DEVICE mit dem aktuellen Gerätenamen belegt.
Bei der cmd-Option von SetNumeric kann außerdem über $VALUE auf den zu setzenden Wert zugegriffen werden.

Diese Kommandos machen also das selbe:

# CMD
# Bereits bisher existierende Syntax ohne Perl:
SetOnOff:cmdOn=on,cmdOff=off
# Derselbe Aufruf über Perl
SetOnOff:cmdOn={fhem("set $DEVICE on")},cmdOff={fhem("set $DEVICE off")}

# READING
# Bereits bisher existierende Syntax ohne Perl:
GetNumeric:currentVal=temperature,part=1,type=Temperatur
# Derselbe Aufruf über Perl
GetNumeric:currentVal={my @tokens = split(" ",ReadingsVal($DEVICE,"volume",0)); return $tokens[1]},type=Temperatur


Die Beispiele machen natürlich wenig Sinn, da das Snips Modul die Funktionalität wie gesagt schon beherrscht. ;)
Sollte aber verständlich machen was da passiert.
Aber evtl. müsst ihr irgendwo currentVal aus mehreren Werten berechnen, oder ihr müsst mehrere Befehle auf einmal absetzen.


Ein Beispiel von mir das ich aktuell beim Mapping für die MediaChannels verwende:
Ich wollte bei Spiele SWR3 erreichen, dass der AV-Receiver vor dem Senderwechsel eingeschaltet wird (falls er aus ist).

Dazu habe ich mir eine Hilfsfunktion in der 99_myUtils.pm erstellt, da das zuviel Code für die einzeiligen Mappings ist.

# Senderwechsel über Snips
sub snipsSetChannel($$) {
my ($device, $channel) = @_;
my $cmd = "";

# Anlage im Wohnzimmer
if ($device eq "AvReceiver") {
my $power = ReadingsVal($device, "power", "off");
$cmd = "set $device on; sleep 5; " if ($state eq "off");
$cmd = $cmd . "set $device favorite $channel";
}

# Befehl ausführen
fhem($cmd);
}


Diese Funktion wird dann beim Sender-Mapping im Attribut snipsChannels verwendet:

SWR3={snipsSetChannel("AvReceiver","swr3")}
Das Ding={snipsSetChannel("AvReceiver","dasding")}
BigFM={snipsSetChannel("AvReceiver","dasding")}



Und täglich grüßt das Murmeltier:
- Assistent von console.snips.ai herunterladen und installieren (oder über sam install assistant) damit ihr die neuste FHEM App habt.
- Neues Snips Modul von Github einspielen
- Fhem neu starten
- set <snipsDevice> updateModel ausführen
Fhem und MariaDB auf NUC6i5SYH in Proxmox Container (Ubuntu)
Zwave, Conbee II, Hue, Harmony, Solo4k, LaMetric, Echo, Sonos, Roborock S5, Nuki, Prusa Mini, Doorbird, ...

Thyraz

Zitat von: enno am 03 September 2018, 10:45:35
Die Antwort "RUDIMENTAL - THESE DAYS (FEAT. JESS GLYNNE, MACKLEMORE" kommt auch, aber mit "deutscher" Aussprache. So gut wie nicht zu verstehen. Gibt es einen Trick das zu verbessern?

Hi Enno,

ich hab das gerade mal durch Amzon Polly gejagt.
Das Ergebnis hängt als Anhang an.

Eingegebener Text war: RUDIMENTAL THESE DAYS FEAT. JESS GLYNNE, MACKLEMORE
Er hat hier automatisch "featuring" daraus gemacht und die Aussprache hört sich gut an.

Hab mir dann noch schnell einen Titel von der MTV Charts Homepage gesucht.
Hier sieht man eindeutig, dass Amazon die Künstler und Songs zu erkennen scheint.
Es kommt problemlos "Maroon Five" statt "Marron Fünf" bei dem Satz "es läuft  Girls like you feat. Cardi B von Maroon 5" heraus.

Ist auch als MP3 im Anhang.

Amazon Polly lohnt hier also durchaus, wenn man solche Features nutzen will.
Da das so gut funktioniert, könnte CurrentlyPlaying durchaus ein Standard-Intent im Modul werden. ;)

Fhem und MariaDB auf NUC6i5SYH in Proxmox Container (Ubuntu)
Zwave, Conbee II, Hue, Harmony, Solo4k, LaMetric, Echo, Sonos, Roborock S5, Nuki, Prusa Mini, Doorbird, ...

Neuhier

So, mal paar Angaben.

lastIntentPayload

{"Device":"thermometer","Room":"aussen","input":"sage thermometer aussen","intent":"GetNumeric","probability":"1","sessionId":"fhem.textCommand","siteId":null,"type":"text"}


2018.09.03 17:37:56 5: set textCommand - value: sage thermometer aussen
2018.09.03 17:37:56 5: Parsed value: sage thermometer aussen for key: input
2018.09.03 17:37:56 5: Parsed value:  for key: probability
2018.09.03 17:37:56 5: Parsed value:  for key: siteId
2018.09.03 17:37:56 5: Parsed value:  for key: intent
2018.09.03 17:37:56 5: Parsed value:  for key: sessionId
2018.09.03 17:37:56 5: sending message to NLU: {"id":"{\u0022Device\u0022:null,\u0022Room\u0022:null,\u0022input\u0022:\u0022sage thermometer aussen\u0022,\u0022sessionId\u0022:null,\u0022siteId\u0022:null}","input":"sage thermometer aussen","sessionId":"fhem.textCommand"}
2018.09.03 17:37:56 5: publish received for hermes/nlu/intentParsed, {"id":"{\"Device\":null,\"Room\":null,\"input\":\"sage thermometer aussen\",\"sessionId\":null,\"siteId\":null}","input":"sage thermometer aussen","intent":{"intentName":"blubber:GetNumeric","probability":1.0},"slots":[{"rawValue":"thermometer","value":{"kind":"Custom","value":"thermometer"},"range":{"start":5,"end":16},"entity":"de.fhem.Device","slotName":"Device"},{"rawValue":"aussen","value":{"kind":"Custom","value":"aussen"},"range":{"start":17,"end":23},"entity":"de.fhem.Room","slotName":"Room"}],"sessionId":"fhem.textCommand"}
2018.09.03 17:37:56 5: Parsed value: sage thermometer aussen for key: input
2018.09.03 17:37:56 5: Parsed value: thermometer for key: Device
2018.09.03 17:37:56 5: Parsed value: aussen for key: Room
2018.09.03 17:37:56 5: Parsed value: fhem.textCommand for key: sessionId
2018.09.03 17:37:56 5: Parsed value: 1 for key: probability
2018.09.03 17:37:56 5: Parsed value:  for key: siteId
2018.09.03 17:37:56 5: Parsed value: GetNumeric for key: intent
2018.09.03 17:37:56 5: handleIntentGetNumeric called


Internals:
   DEF        SnipsMQTT WZ
   IODev      SnipsMQTT
   MODULE_VERSION 0.2
   NAME       Snips
   NOTIFYDEV  SnipsMQTT WZ
   NR         260
   STATE      ???
   TYPE       SNIPS
   READINGS:
     2018-09-03 17:37:56   lastIntentPayload {"Device":"thermometer","Room":"aussen","input":"sage thermometer aussen","intent":"GetNumeric","probability":"1","sessionId":"fhem.textCommand","siteId":null,"type":"text"}
     2018-09-03 17:37:56   lastIntentTopic hermes/nlu/intentParsed
     2018-09-03 17:37:56   textResponse    Da ist etwas schief gegangen.
     2018-09-03 17:37:56   transmission-state incoming publish received
     2018-09-03 17:35:33   voiceResponse   Da ist etwas schief gegangen.
   helper:
     defaultRoom WZ
   message_ids:
   subscribe:
     hermes/intent/+
     hermes/nlu/intentParsed
   subscribeExpr:
     ^hermes\/intent\/([^/]+)$
     ^hermes\/nlu\/intentParsed$
   subscribeQos:
     hermes/intent/+ 0
     hermes/nlu/intentParsed 0
Attributes:
   IODev      SnipsMQTT
   room       Ansagen
   verbose    5

   
Das sagt die Konsole :
OS version ................... Raspbian GNU/Linux 9 (stretch)
Installed assistant .......... fhem
Language ..................... de
Hotword ...................... hey_snips
ASR engine ................... snips
Status ....................... Live

Service status:

snips-analytics .............. 0.58.3 (not running)
snips-asr .................... 0.58.3 (running)
snips-audio-server ........... 0.58.3 (running)
snips-dialogue ............... 0.58.3 (running)
snips-hotword ................ 0.58.3 (running)
snips-nlu .................... 0.58.3 (running)
snips-skill-server ........... 0.58.3 (not running)
snips-tts .................... 0.58.3 (not running)



Und als Abschluß
snipsMapping         GetNumeric:currentVal=temperature,type=Temperatur,part=1
snipsName thermometer
snipsRoom draussen,aussen

enno

Zitat von: Thyraz am 03 September 2018, 15:58:12
Amazon Polly lohnt hier also durchaus, wenn man solche Features nutzen will.
Da das so gut funktioniert, könnte CurrentlyPlaying durchaus ein Standard-Intent im Modul werden. ;)

ok, überzeugt :) Ich habe mir jetzt auch "Polly"  installiert. Deutliche Verbesserung. Allerdings spricht mir die Dame manchmal zu schnell.... irgendetwas ist ja immer.., Die Aussprache klappt! Dieses Problem ist gelöst.

Gruss
  Enno
Einfacher FHEM Anwender auf Intel®NUC mit Proxmox und Debian

Thyraz

@Neuhier scheint einen Bug zu geben, wenn kein Type im gesprochenen Satz von GetNumeric erkannt wird.
Schaue ich mir Morgen mal an.

Als Workaround könnte ,,Hey Snips, Temperatur Thermometer außen" funktionieren.
Fhem und MariaDB auf NUC6i5SYH in Proxmox Container (Ubuntu)
Zwave, Conbee II, Hue, Harmony, Solo4k, LaMetric, Echo, Sonos, Roborock S5, Nuki, Prusa Mini, Doorbird, ...

kud

Je mehr Devices in die APP eingefügt wurden umso schlechter ist die Erkennung.
"Draussen" = "Pause"
"Starten"="Garten"
Also ohne die Mediasteuerung (welche ich zB. nicht benötige) war die Erkennungsrate viel besser.
Und natürlich gibts die (nicht)passende Wiedergabe von "Kein Wiedergabegerät aktiv".

tomster

Zitat von: kud am 04 September 2018, 10:33:25
Je mehr Devices in die APP eingefügt wurden umso schlechter ist die Erkennung.
"Draussen" = "Pause"
"Starten"="Garten"
Also ohne die Mediasteuerung (welche ich zB. nicht benötige) war die Erkennungsrate viel besser.
Und natürlich gibts die (nicht)passende Wiedergabe von "Kein Wiedergabegerät aktiv".

Welches Mikrophon/ Device benutzt Du und wie weit stehst Du vor dem Mikrophon? Hast Du viele Hintergrundgeräusche?

Neuhier

@Thyraz: keine Änderung mit Deinem Vorschlag.

Was mich wundert: nicht mal bei Texteingabe, reagiert irgendwas im FHEM.
Habe die neuesten Files gezogen und installiert ( ... und täglich grüßt das Murmeltier ... ).
Jetzt erscheint im Log, als letzter Eintrag von Snips:  5: Device selected:
Dahinter steht aber nix.

kud

Das PS3 Micro , Entfernung ca. 3-4 Meter.
Habe das Ganze mal umgestellt. Zurück ins Büro. Da klappt es viel besser.
Mir kommt es vor als ob die PS3 mit "hallenden" oder großen Räumen Probleme hat.