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

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

Vorheriges Thema - Nächstes Thema

Thyraz

@enno:

Klaro. :)

Bei mir ist das im Wohnzimmer ein Dummy der Logitech Harmony (Richtige Aktion starten damit die Geräte eingeschaltet und der AV-Reveiver auf den korrekten Kanal gestellt ist), Sonos (Mediensteuerung) und AV-Receiver (Lautstärke) vereint:


SetOnOff:cmdOn=Harmony01:activity Musik,cmdOff=Harmony01:off
GetOnOff:currentVal=Harmony01:activity,valueOn=Musik
SetNumeric:currentVal=AV_Receiver:volume,cmd=AV_Receiver:volume,step=5,type=Lautstärke
GetNumeric:currentVal=AV_Receiver:volume,type=Lautstärke
MediaControls:cmdPlay=Sonos_Wohnzimmer:Play,cmdPause=Sonos_Wohnzimmer:Pause,cmdStop=Sonos_Wohnzimmer:Stop,cmdFwd=Sonos_Wohnzimmer:Next,cmdBack=Sonos_Wohnzimmer:Previous


zusätzlich hab ich dann noch testweise ein paar snipsChannels angelegt:

SWR3=Sonos:StartFavourite SWR3%2095.5%20(Top%2040%2FPop)
SWR1=Sonos:StartFavourite SWR1%20Baden-W%C3%BCrttemberg%2094.7%20(Gemischtes%2FVielfalt)
Jazz Radio=Sonos:StartFavourite Jazz%20Radio
Akustik Covers=Sonos:StartFavourite Akustik-Covers
Sonntagsfrühstück=Sonos:StartFavourite Sonntagsfr%C3%BChst%C3%BCck


Dank GetOnOff weiß Snips ob Musik gerade an ist oder nicht.
Dadurch geht "lauter" oder "leiser" ohne den Gerätename.

Durch die Channelliste weiß Snips wiederum, welches Gerät im aktuellen Raum SWR3 spielen kann.
Es geht also auch "Spiele SWR3" ohne Gerätename.
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

@kud, erstmal die einfache Variante mit nur dem Auido-Server auf dem Satelliten.
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

Gerade gemerkt die Sprachausgabe über Amazon Polly (snips-tts-polly) ist noch nicht Multiroom-tauglich.
Spricht momentan immer in siteId default.

Hab aber schon gefunden wo ich das ändern muss.
Kommt auch die Tage ein Update dafür.
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

Ok, Update für Snips-TTS-Polly das dann auch die Sprachausgabe auf dem richtigen Satelliten unterstützt:
https://github.com/Thyraz/snips-tts-polly
Fhem und MariaDB auf NUC6i5SYH in Proxmox Container (Ubuntu)
Zwave, Conbee II, Hue, Harmony, Solo4k, LaMetric, Echo, Sonos, Roborock S5, Nuki, Prusa Mini, Doorbird, ...

noname41

Lieber Thyraz,

ich möchte mich für dieses Modul bedanken. Genau dieses Feature war der Baustein der mir noch zum optimalen Smart-Home gefehlt hat. Der Snips-Server funktioniert optimal und mit zwei kleinen notifys ist es sogar möglich das ganze über Telegram zu Steuern.

LG

Ma_Bo

Hallo Leute, ich hab mal ne Frage an die, die Snips schon nutzen.

Bekommt man den gesamten erkannten Text als Reading angezeigt?

Hintergrund der Sache ist, ich nutze Google z.Z. und bekomme über ein paar Umwege, den gesamten erkannten Text als Reading angezeigt und werte dann mit einer eigenen myutils alles was ich brauche aus.
Wenn Snips mir auch den gesamten Text anzeigt, dann brauch ich nicht viel umbauen.

Hat evtl. jemand nen Vergleich zur Erkennung zum Google Home?

Grüße Marcel
NUC mit FHEM, HM Heizungsthermostate, HM Wandthermostate, Intertechno Funksteckdosen, 10" Tablet als Wanddisplay, KeyMatic, Fensterkontakte, Fensterkontakte umgebaut als Wassermelder und Briefkastenmelder, Aussenthermostat, Anwesenheitssteuerung über Fritz Box, Google Home usw. usw.

Thyraz

Hallo Marcel,

im LastIntentPayload Reading ist es unter "input" drin.
Mit etwas Regex sollte das leicht als userReading zu extrahieren sein.

Probleme die ich sehe: Das Modul füttert Snips ja mit den Gerätenamen, damit die Spracherkennung die Wörter versteht.

Zumindest diesen Teil der Konfiguration (Attribut snipsName und snipsRoom) müsstet du dennoch machen.
Weiß auch nicht ob der Text wirklich ankommt, wenn Snips keinen der Intents aus der FHEM App erkennt.

Die Fehlermeldung die das Modul über Snips ausgibt kann man zumindest deaktivieren,
so dass du hier nichts ausgegeben bekommst.
Damit das Modul nicht dazwischenfunkt, musst du an sich einfach keine SnipsMappings festlegen,
dann kann das Modul nichts steuern.

Wie gut das funktioniert ist etwas schwer abzuschätzen...
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, habe sips-volume mal aktualisiert damit es auch auf dem Raspberry funktioniert:
https://github.com/Thyraz/snips-volume

Einfach die snips-volume.py mit der neuen überschreiben.


@enno ich hab es jetzt doch etwas simpler gelöst, da in dem Link von dir durch alle Soundkarten geloopt wird und dann der erste Treffer verwendet wird.

Falls bei einem Gerät die erste Soundkarte aber z.B. der HDMI Ausgang statt dem Audioausgang ist, führt das zu einem ungewollten Verhalten.
Wir haben durch die Snips Konfiguration ja aber eigentlich schon die richtige Soundkarte in der asound.conf als Default definiert.
Ich hab daher einfach einen Fallback auf PCM eingebaut, falls kein Master Mixer gefunden wird.

Hab im Netz nichts darüber gefunden, dass es noch mehr mögliche Benennungen für den Hauptregler gibt.
Hoffe also das klappt dann bei allen so.


try:
        mixer = alsaaudio.Mixer()
    except Exception:
        mixer = alsaaudio.Mixer('PCM')
        pass


Achja, der systemd Service läuft bei mir auf einem Pi2 ohne Probleme.
Müsstest evtl. doch nochmal schauen was bei dir da schief geht (systemd Logs etc.)
Fhem und MariaDB auf NUC6i5SYH in Proxmox Container (Ubuntu)
Zwave, Conbee II, Hue, Harmony, Solo4k, LaMetric, Echo, Sonos, Roborock S5, Nuki, Prusa Mini, Doorbird, ...

Roman

Hi,

ZitatAchja, der systemd Service läuft bei mir auf einem Pi2 ohne Probleme.
Müsstest evtl. doch nochmal schauen was bei dir da schief geht (systemd Logs etc.)
ich hatte auf dem PI das Problem, dass der snips-volume immer wieder neu gestartet wurde (Exec-Code 203)

Ursache waren fehlende Ausführungsrechte auf /opt/snips-volume/snips-volume.py nach dem 'git clone'
ein chmod 755 /opt/snips-volume/snips-volume.py
und alles wird gut :)


Gruß
Roman

kud

@Thyraz
Wäre es möglich das voiceresponse "Kein Wiedergabegerät aktiv" der Mediensteuerung zu deaktivieren?
Ich nutze keine Mediensteuerung und die einzigen "Fehlinterpretationen" kommen daher.

Thyraz

Zitat von: Roman am 09 September 2018, 18:53:35
Ursache waren fehlende Ausführungsrechte auf /opt/snips-volume/snips-volume.py nach dem 'git clone'

Danke für den Hinweis. :)
Habe mal ein chmod +x in die Doku eingefügt.
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: kud am 09 September 2018, 19:30:13
Wäre es möglich das voiceresponse "Kein Wiedergabegerät aktiv" der Mediensteuerung zu deaktivieren?

Ja, ist irgendwie die Frage wie man das konfigurierbar macht.
Wird ja sicher nicht bei den bisherige 2-3 Antworten bleiben.
Alles hart abschalten über das Attribut errorResponse ist aber auch etwas fies...

Evtl. eine Konfigurationsmöglichkeit in einem mehrzeiligen Attribut im SnipsDevice?
Jeder Response könnte man dann einen Identifier zuweisen über den man den Text setzen kann.

Etwa so:

DefaultConfirmation=Ok;Klaro;Mach ich;Schon passiert;Gerne doch
DefaultError=
NoActiveMediaDevice=Gerät zuerst einschalten wäre eine gute Idee.


Mit Semikolon könnte man dann mehrere Alternativen angeben, welche per Zufall gewählt werden.

Identifier die nicht angegeben werden, behalten ihren Standardwert.
Man müsste also nicht alle Identifier eintragen.
Fhem und MariaDB auf NUC6i5SYH in Proxmox Container (Ubuntu)
Zwave, Conbee II, Hue, Harmony, Solo4k, LaMetric, Echo, Sonos, Roborock S5, Nuki, Prusa Mini, Doorbird, ...

ahlermi

Zitat von: Thyraz am 10 September 2018, 09:17:04
Evtl. eine Konfigurationsmöglichkeit in einem mehrzeiligen Attribut im SnipsDevice?

Eigentlich müsste das eher was pro Gerät sein, aller "Die Rollade fährt", "Bringe den Sateliten in Stellung", "Habe deine Temperatur angepasst"

Optimalerweise mit der Möglichkeit Perl Code zu verwenden.

{"Habe deine Wunschtemperatur auf" . ReadingsVal($name, "desiredTemperature", "unbestimmt") . " geändert"}

Gruß Michael
PI4 FHEM, PI3 FHEM, 6 x Echo mit talk2fhem, Siri, SNIPS auf PI3 mit Samson UB1, YeeLight, Homematic, MAX!, 433Mhz, LaCross, Xiaomi Vacuum V1, ESPEasy, Gardena, Telegram, FLOORPLAN, HEOS, Xiaomi Aqara, Sonoff, SolvisMax, SolvisClient, HUE, ESPEasy für Bayernlüfter, Harmony, Tasmota, JKBMS, EASUN

kud

Vielleicht ein Attribut pro Geräteklasse.
Bei einem Lichtschalter mit "ok" zu antworten ist nicht notwendig da ich es sehe ;-)
Bei Lautstärkeänderungen höre ich das Ergebnis.
Bei Thermostaten wäre die Anwort schon wichtiger.

Thyraz

Puh, das gibt aber einen ziemlichen Aufwand wenn man wirklich alle Antworten die Snips ausgeben kann (auch Antworten auf Abfragen) so definieren will.
Nicht nur für mich, auch für den User würde das ein recht komplexes System geben.

Es gibt auch Unterschiede in den Antworten z.B. je nachdem ob nach einem Raum oder Gerät gefragt wurde.
Also je nachdem welche der möglichen Slots in einem Satz belegt sind.
Spätestens da wird die Konfigurierbarkeit nicht mehr so einfach.

Wie genau würde man jetzt ein Attribut aufbauen um zu erlauben auf GetNumeric zu antworten?
Und zwar verschieden, je nachdem welche Kombination an Slots gefüllt ist und welcher Type belegt?
Das selbe dann für Rückmeldungen bei SetNumeric.
Selbst bei einem Attribut pro Device wird das schwierig, da man auch hier verschiedene GetNumerics mit unterschiedlichen Types haben kann.

Und wer will diese Konfigurationorgie wirklich leisten?
Es gab da mal einen netten Artikel über Feature Requests, dass man sich vor komplexen Erweiterungen die Frage stellen sollte wie viel Prozent der User das später wirklich nutzen. :P
Bei einer Konfiguration pro Device bin ich noch etwas kritisch ob wir da über einen niedrigen einstelligen Bereich heraus kommen. ;)
Dieses Feature hat das Potential mich recht lange zu beschäftigen und den Code des Moduls zwar nicht zu verdoppeln, aber doch ziemlich aufzublähen...
Es würde mal zumindest nicht sonderlich weit oben auf der Todo-Liste landen.


Attribute pro Geräteklasse sind auch nicht sooo einfach umzusetzen.
Man kann Snips wohl schon z.B. bei GetNumeric über den Type mitteilen, wofür ein Mapping gedacht ist.
Ich werde aber nicht gezwungen den Type zu setzen.

Snips unterscheidet über die Intents ja eher anhand des Aufbaus eines Satzes und nicht anhand eines Gerättyps (Wie das z.B. bei Siri/Homekit der Fall ist).
Liegt einfach daran, dass Snips selbst keine Ahnung hat wofür wir es einsetzen.
Es weiß nichts von SmartHome und erst recht nichts von FHEM und euren Geräten.

Dadurch ist der Code des Moduls nicht nicht in Gerätetypen, sondern in Intenttypen aufgeteilt.

Ist die Möglichkeit z.B. auf ein kurzes "Ok" zu verzichten oder "Die Temperatur von Thermometer beträgt xx Grad" durch einen eigenen Satz ersetzen zu können ein wirklicher Mehrgewinn?
Fhem und MariaDB auf NUC6i5SYH in Proxmox Container (Ubuntu)
Zwave, Conbee II, Hue, Harmony, Solo4k, LaMetric, Echo, Sonos, Roborock S5, Nuki, Prusa Mini, Doorbird, ...