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

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

Vorheriges Thema - Nächstes Thema

Thyraz

Was ist Snips
Snips ist ein Sprachassistent ähnlich Siri oder Alexa.

Die Besonderheit an Snips ist, dass es nach der Installation komplett Offline betrieben wird.
Es wir also keine Sprache zur Erkennung an einen Server im Internet geschickt.

Die Anbindung weiterer Räume ist über sogenannte "Satelliten" möglich.
Dies kann z.B. ein Pi Zero mit Mikro und Lautsprecher sein.

https://snips.ai

Was ist mit dem Modul möglich
Mit von mir vorgefertigten Intents können:
- Geräte geschaltet werden
- der Status von Geräten abgefragt werden
- Stellwerte für Dimmer, Rollläden, Thermostate gesendet werden (oder was sich eben sonst auf einen numerischen Wert setzen lässt)
- Numerische Werte abgefragt werden wie z.B. Temperatur, Luftfeuchtigkeit, ...
- Multimedia Befehle (Play, Pause, ...) gesendet werden
- Wiedergabe oder Wechsel von Sendern / Favoriten / Kanälen / ...
- Lichtfarbe z.B. von HUE Lampen ändern

Dies wird über ein Attribut ähnlich dem von Homebridge und AlexaFhem bekannten homebridgeMapping gesteuert.

Zusätzlich gibt es die Möglichkeit,
eigene Intents einzubinden und dann die per Sprache übergebenen Parameter (z.B. Gerät, Wert, ...) an eigene Perl-Funktionen zu übergeben.
Dies entspricht mehr oder weniger den erweiterten Möglichkeiten im CustomSkill von AlexaFhem, womit sich auch ausgefallenere Wünsche realisieren lassen sollten.

Außerdem ist TextToSpeech möglich und bald auch die Wiedergabe von Audiodateien.

Was brauche ich für Hardware?
Snips lässt sich unter Linux bisher auf einem Raspberry mit Raspbian (Debian Stretch), oder auf x86 unter Debian Stretch nutzen.

https://snips.gitbook.io/documentation/installing-snips
https://snips.gitbook.io/documentation/advanced-configuration/advanced-solutions

Man braucht zusätzlich ein Mikrofon, nach Möglichkeit ein Mikrofon-Array / Far-Field Microphone wie z.B. das ReSpeaker Mic Array.
Als sehr gute Lösung für kleines Geld hat sich hier das "PS3 Eye" herausgestellt. Eine Webcam mit 4 Mikrofonen, welche unter Linux ohne extra Treiber als Micro erkannt wird. Ist bei Amazon für knappe 10€ erhältlich.
Zusätzlich noch einen Lautsprecher für die Sprachausgabe.

Installation in FHEM
Modul hier herunterladen:
https://github.com/Thyraz/Snips-Fhem

DIE README AUF GITHUB LESEN! ;)
Denn die erklärt was alles konfiguriert werden muss und wie.

Beispiele

Definition in FHEM (genauer erklärt in Readme auf Github):

define SnipsMQTT MQTT <ip-or-hostname-of-snips-machine>:1883
define Snips SNIPS SnipsMQTT Wohnzimmer


Attribut snipsMapping von einem Dimmer bei mir:

SetOnOff:cmdOn=on,cmdOff=off
GetOnOff:currentVal=state,valueOff=off
SetNumeric:currentVal=brightness,cmd=dim,step=20,type=Helligkeit
GetNumeric:currentVal=brightness,type=Helligkeit


Attribut snipsMapping von einem Thermometer bei mir:

GetNumeric:currentVal=temperature,type=Temperatur
GetNumeric:currentVal=humidity,type=Luftfeuchtigkeit
Status:response=Die Temperatur beträgt [ThermoWZ:temperature] Grad bei [ThermoWZ:humidity] Prozent Luftfeuchtigkeit.


Die einzelnen Intents, das zugehörige Mapping und dessen Optionen sind auch in der Readme auf Github erklärt.

Troubleshooting
Sollte das Ganze nicht wie gewollt funktionieren, empfiehlt es sich zuerst die Readings im Snips Device anzuschauen.
Hier sollte (nachdem ihr über Snips einen Befehl gesprochen habt) 2 Readings auftauchen:
- lastIntentTopic
- lastIntentPayload
Ansonsten bekommt man noch weitere Infos wenn man beim Snips Device Verbose 5 einstellt und schaut ob bei Sprachbefehlen etwas im Log auftaucht.

Sollte auch hier nichts kommen, auch beim MQTT Server Device Verbose 5 einstellen und schauen ob da etwas im Log erscheint.
Wenn nicht, erstmal hier ansetzen und schauen warum das MQTT Device nicht funktioniert.

Wenn die Readings im Modul ankommen aber dennoch nichts passiert, hängt es höchstwahrscheinlich an der Konfiguration des zu schaltenden Geräts.
Hier nochmal kontrollieren ob es im Raum Snips ist und die Attribute snipsName, snipsRoom und snipsMapping passen.

Bei Fragen zum Mapping bitte ein list vom Snips Device und des nicht funktionierenden Geräts mit posten.

Versionsverlauf / Änderungen
03.09.2018: Neue Syntax say-Befehl. Möglichkeit Perl-Code in Commands und für Readings zu verwenden.
30.08.2018: Neuer Intent MediaChannels
29.08.2018: Neuer Intent MediaCommands
26.08.2018: Attribut errorResponse eingeführt ("disabled" deaktivert die Fehlerrückmeldungen)
26.08.2018: Unbekannte Intents werden ignoriert, damit sich das Modul nicht mit parallel installierten Snips-Apps beißt
24.08.2018: Cmds und Readings im Mapping können nun auch im Format Device:Reading bzw. Device:cmd auf andere Geräte verweisen.
23.08.2018: Readings "listening_*" hinzugefügt, damit man z.B. Musik muten kann während Snips lauscht
22.08.2018: Neuer Intent "Status"
18.08.2018: Neuer Set-Befehle "textCommand" um Snips über Text zu steuern (z.B. mit TelegramBot)
17.08.2018: Über Fhem automatisch eure Geräte- und Raumnamen in den Assistenten injizieren. Forken der App nicht mehr nötig.
17.08.2018: Neues snipsMapping Format. Siehe Github Readme und Beispiele in diesem Post
26.07.2018: Abfrage von numerischen Werten nur über Raum und Type ohne das Gerät explizit nennen zu müssen
25.07.2018: Custom Intents können nun in eigenen 99_myUtils Perl-Funktionen verarbeitet werden
23.07.2108: Die Intent-Option map und part funktionieren jetzt
21.07.2108: Erste Beta veröffentlich

Was in der aktuellen Version noch nicht geht
- Der Play Befehl zum Abspielen von Audiodateien geht bisher noch nicht (TextToSpeech geht aber schon)
Fhem und MariaDB auf NUC6i5SYH in Proxmox Container (Ubuntu)
Zwave, Conbee II, Hue, Harmony, Solo4k, LaMetric, Echo, Sonos, Roborock S5, Nuki, Prusa Mini, Doorbird, ...

borsti67

Das klingt ja höchst interessant! Wie viel "Power" muss des SNIPS-Server denn haben? Spracherkennung ist ja doch "etwas" aufwendiger, es fällt mir schwer zu glauben, dass da ein Pi o.ä. für reichen soll...
cu/2
Borsti
---
FHEM 5.8 auf Synology DS211j (bis 11/17) | FHEM 6.0 auf Raspi Zero W (bis 11/20) | FHEM 6.2 als VM in Synology DS1815+ (ab 11/20)

Thyraz

Bei mir läuft es auf dem NUC, daher kann ich nicht genau sagen.,
Aber da Snips das Maker-Kit mit einem Pi3 verkauft, sollte das schon problemlos laufen denke ich. 😉
Fhem und MariaDB auf NUC6i5SYH in Proxmox Container (Ubuntu)
Zwave, Conbee II, Hue, Harmony, Solo4k, LaMetric, Echo, Sonos, Roborock S5, Nuki, Prusa Mini, Doorbird, ...

mark79

#3
Das sollte locker auf ein Pi2/3 laufen, ich habe es auf ein Rock64 im Betrieb.
Die CPU Auslastung auf einen Core beträgt etwa 35% mit ca. 160 MB Ram Verbrauch.

Zu empfehlen ist derzeit wirklich ein Pi3 oder irgendwas anderes was auf armv7 basiert.
Aus dem Grund weil es ein Pyhton Paket nur für armv7 und mac gibt und die Standart Skills wie Wetter, Timer etc. dieses Python_Hermes Paket benötigt.

Das PS3 Eye Micro kann ich auch empfehlen.

Thyraz hat was wirklich was brauchbares hingezaubert mit einer super Dokumentation! :)

@Thyraz schau dir das mal an, das ist eine asound.conf für das PS3 Eye:
https://gist.github.com/AfzalivE/54214bf437ca1775b5b8e7934cc137db
https://me.m01.eu/blog/2014/07/an-asoundrc-alsa-config-for-the-ps3-eye/

Es könnte gut sein, das dass MIC durch slave.channels 4 noch besser wird. :)
Ich versuche das gerade einzubinden...

EDIT: So gehts bei mir:

cat /etc/asound.conf
pcm.!default {
  type asym
  playback.pcm {
    type plug
    slave.pcm "hw:1,0"
  }
  capture.pcm {
    type plug
    slave.pcm "hw:0,0"
    slave.channels 4
    ttable {
    0.0 30.0
    1.1 30.0
  }
}
}

Rock64 4GB mit Debian Strech, FHEM im LXC, Sonoff Switches/Touch, HM Thermostate, HMUART/Zigbee2MQTT@MapleCUN, ESP RGBWW Wifi Controller, ESP8266 Door Sensor/Briefkastenwächter, BT CSL Stick, BT iTags, Alexa, FireTV, RPi2 mit Kodi, Xiaomi Vacuum v1/Smarthome Komponenten

Thyraz

#4
Ok, werde das auch mal versuchen.

Bin mir aber nicht sicher, ob Snips die 4 Micros nicht automatisch nutzt.
Zumindest bei mit kann ich in der Eingabeaufforderung mit arecord nur dann was aufnehmen wenn ich die 4 Channels per Parameter angebe.

Ansonsten kommt gleich der Fehler falsche Anzahl Kanäle.
Kann also sein, dass Snips das selbst irgendwie erkennt.

edit: Bin mir mittlerweile eigentlich recht sicher, dass die Erkennung automatisch funktioniert.
Die Blogeinträge bei Snips zeigen das auch nie und da sind auch einige Beispiele für die asound.conf zu sehen.
Auch mit ReSpeaker oder PS3 Eye.
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

#5
Ich hab die "FHEM App" im Snips Store nochmal aktualisiert.

Habe bemerkt, dass man für die Intents keine verkürzten Beispielsätze verwenden sollte, die nur aus den einzelnen Slots bestehen.
Also für SetOnOff z.B. "Deckenlampe aus".

Wenn man sonst weitere eigene Intents erstellt und diese ebenfalls so kurz gehaltene Beispielsätze haben, verschluckt sich Snips scheinbar recht schnell.
Habe daher jetzt nur besser ausgeprägte Beispielsätze verwendet.

Die Kurzformen funktionieren im laufenden Betrieb nacher weiter problemlos,
sie sollten wohl nur nicht für die Sprachanalyse vom Assistenten verwendet werden.

Wer die App also schon bei sich drin hat, evtl nochmal neu importieren (davor euren Device-Slot exportieren und danach wieder importieren falls ihr schon eigene Geräte hinzugefügt habt).
Kann sein, dass ihr nicht nur die FHEM App löschen müsst, sondern auch den SetOnOff Intent wenn ihr den geforked habt.
(console.snips.ai -> Reiter "My Intents")
Fhem und MariaDB auf NUC6i5SYH in Proxmox Container (Ubuntu)
Zwave, Conbee II, Hue, Harmony, Solo4k, LaMetric, Echo, Sonos, Roborock S5, Nuki, Prusa Mini, Doorbird, ...

laberlaib

Ich finde das gerade beim durchsehen der Anleitung nicht (und wenn es nicht so ist, dann weise mich darauf hin, dann lösche ich das hier wieder):
Man muss nicht nur die App sondern auch die Intents "forken", da diese sonst weiterhin unter "Thyraz:xyz" laufen.
--
Proxmox, Homematic, G-Tags, Zigbee2MQTT, Rhasspy Sprachsteuerung im Aufbau (beta)

Thyraz

#7
Ich bin bisher immer davon ausgegangen, dass der Prefix immer der eigene Accountname ist.
Werde das nochmal testen ob das evtl. doch eine falsche Annahme war.

Oder hast du eine laufende Snips Installation und hattest schon das Problem, dass bei dir da Thyraz drin stand?

Wenn dem so sein sollte, nehme ich den Prefix doch wieder raus aus der Definition.
Dann schneide ich einfach den Anfang vom Intent bis einschließlich dem ersten Doppelpunkt ab und das Problem sollte beseitigt sein...

Warum man um das forken dennoch nicht herum kommen dürfte:
Anders kann man die SlotTypes nicht editieren. Und in dem Device Slot muss man ja seine Gerätebezeichnungen nachtragen damit die Wörter nachher erkannt werden.


edit: Hab es gerade getestet, du hast recht.
Das wirft aber auch die nächste Frage auf:
Wenn ihr z.B. nur den SetOnOff Intent forked und die Geräteliste dort anpasst, wirkt sich das auch auf die anderen Intents aus?
Oder müsst ihr alle Intents forken damit die wieder den gleichen (euren lokalen) Slottype verwenden?

Verwirrrend. ;)

Werde ich ein wenig mit rumspielen müssen und die Anleitung anpassen.
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

#8
Ok, der Prefix wird nicht mehr benötigt:

Neues Modul von Github laden, Fhem neu starten oder Modul neu laden mit reload.
Dann Definition vom Snips Device in Fhem anpassen:

Alte Def:

define Snips SNIPS <MQTTDevice> <Prefix> <DefaultRoom>


Neue Def:

define Snips SNIPS <MQTTDevice> <DefaultRoom>


Doku auf Github ist auch angepasst.
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

#9
Hmm. So richtig klappt das noch nicht.
Habe folgendes eingerichtet.
define SnipsMQTT MQTT 192.168.1.139:1883
define Snips SNIPS 192.168.1.139 Snips

Bei dem Tempsensor welcher das Reading temperature liefert
habe ich die Attribute
room Snips, Temperaturen
snipsMapping GetNumeric=temperature,type=Temperatur
snipsname garten
snipsroom Garten

gesetzt.

Sam watch gibt folgendes aus.

[Asr] captured text "wie ist die temperatur im garten" in 3.0s
[14:36:16] [Asr] was asked to stop listening on site default
[14:36:16] [AudioServer] was asked to play a wav of 93.1 kB with id 'e0069cbc-0255-4d51-90e9-9251566b6f0b' on site default
[14:36:17] [AudioServer] finished playing wav with id 'e0069cbc-0255-4d51-90e9-9251566b6f0b'
[14:36:17] [Nlu] was asked to parse input wie ist die temperatur im garten
[14:36:17] [Nlu] detected intent Thyraz:GetNumeric with probability 1.000 for input "wie ist die temperatur im garten"
              Slots ->
                 Type -> Temperatur
                 Room -> Garten
[14:36:17] [Dialogue] New intent detected Thyraz:GetNumeric with probability 1.000
              Slots ->
                 Type -> Temperatur
                 Room -> Garten
[14:36:23] [Dialogue] session with id '18b48dfa-c58c-48c6-9f08-5eda2dfc517b' was ended on site default. The session was ended because one of the component didn't respond in a timely manner

Das wars kein Wort zu hören.

Hab ich irgend etwas vergessen oder nicht richtig umgesetzt?

Jetzt habe ich mal die Snips Definition geändert

define Snips SNIPS SnipsMQTT Snips

Ergebnis sam watch:

[Asr] captured text "wie ist die temperatur im garten" in 3.0s
[14:54:23] [Asr] was asked to stop listening on site default
[14:54:23] [AudioServer] was asked to play a wav of 93.1 kB with id '595e46dc-1689-4068-a648-d5f152b40ea3' on site default
[14:54:24] [AudioServer] finished playing wav with id '595e46dc-1689-4068-a648-d5f152b40ea3'
[14:54:24] [Nlu] was asked to parse input wie ist die temperatur im garten
[14:54:24] [Nlu] detected intent Thyraz:GetNumeric with probability 1.000 for input "wie ist die temperatur im garten"
              Slots ->
                 Type -> Temperatur
                 Room -> Garten
[14:54:24] [Dialogue] New intent detected Thyraz:GetNumeric with probability 1.000
              Slots ->
                 Type -> Temperatur
                 Room -> Garten
[14:54:24] [Dialogue] was ask to end session with id 884735f4-d579-4b31-82bf-6c95032cbc3d by saying 'Da ist etwas schief gegangen.'
[14:54:24] [Tts] was asked to say "Da ist etwas schief gegangen."


Thyraz

#10
Also die untere Definition vom Snips Modul sieht besser aus.
Nur der DefaultRoom sollte nicht Snips lauten, sondern so wie der Raum in dem das Mikro steht.

Wenn du keinen Raum dazu sagst (und es mehrere Treffer gibt) geht Snips davon aus, dass der gemeint ist in dem gesprochen wird.
https://github.com/Thyraz/Snips-Fhem/blob/master/README.md#modul-installation
Dazu braucht es eben die Info wo Snips denn eigentlich steht.

Es sollte also etwa so aussehen:
Zitat
define Snips SNIPS SnipsMQTT Wohnzimmer

Bei deinem zweiten Quote siehst du dann, dass er den Garten als Room interpretiert und den Type als Temperatur.
FHEM hat das auch mitbekommen und geantwortet: "Da ist etwas schief gegangen." ist schon eine Antwort vom Modul.

Was dann passiert, fehlte hier noch oben unter Was in der aktuellen Beta noch nicht geht.
Hatte das im anderen Snips Thread erwähnt, aber hier dann vergessen.

Man kann aktuell noch nicht den Status zu einem Raum abfragen ohne das Gerät explizit zu nennen.
Du müsstest das also so anpassen:
Zitatroom Snips, Temperaturen
snipsMapping GetNumeric=temperature,type=Temperatur
snipsname Thermometer
snipsroom Garten

Und dann fragen: Wie ist die Temperatur vom Thermometer im Garten?

Die vereinfachte Form "Wie ist die Temperatur im Garten" kommt bald.
Hier muss ich noch einbauen in diesem Fall alle Mappings von Geräten mit snipsName "Garten" nach einem type=Temperatur zu durchsuchen und dann diesen Wert zurückzuliefern.
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

#11
Jetzt höre ich die korrekte Ausgabe  :)

Die Definition von Snips wie folgt geändert.

define Snips SNIPS SnipsMQTT Wohnzimmer

Nicht mit IP angeben, da Snips ja wahrscheinlich mit dem MQTT-Device korrespondiert.


You make my Day ! 8)

Thyraz

Ohje, sorry da hab ich dich ja total auf den falschen Dampfer geschickt.
Hab die falsche Zeile von oben kopiert gehabt und es gar nicht gemerkt.  :-X

Ja, Snips ist ein Client-Modul für das FHEM MQTT Modul.
Es verarbeitet und sendet also nur darüber die MQTT Nachrichten.
Daher ist auch das MQTT Device nötig.

Zu den zwei Werten:
An sich sollte das gehen. Das war auch mit ein Grund für die "type" Option im Mapping.

Erweitere mal das snipsMapping von dem Gerät so:

GetNumeric=temperature,type=Temperatur
GetNumeric=humidity,type=Luftfeuchtigkeit


Dann sollte an sich mit Wie ist die Luftfeuchtigkeit vom Thermometer im Garten die Feuchte herauszubekommen sein.
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

#13
Da warst Du schneller als ich....
Habs gerade rausbekommen .. ;-)

Ich freu mich auf die weitere Entwicklung. Top.

Spiele gerade mit dem Snips Namen. Also "Thermometer" funktioniert immer.
Wenn ich diesen in "Sensor" umbenenne erkennt Snips "Senne sofa" ;-((
...und ich habe versucht ohne Akzent und langsam zu sprechen?

Thyraz

Das liegt daran, dass die möglichen Einträge für den Slot "Device" im Intent "GetNumeric" Snips bekannt sein müssen.
Snips erlaubt für die Slots nur Wörter die es dafür kennt.

Dies ist bei anderen "Assistenten" ja auch so. Damit die Erkennung für die SmartHome Geschichten so gut klappt, sind die Namen bekannt.
Bei Alexa kennt der Assistent z.B. die Geräte weil man sie bei ihm anlernt.

Dies macht man bei Snips ja so direkt nicht, weswegen wir die Geräteliste aktuell händisch erweiteren müssen.
Sofa ist bereits als ein Synonym für Bogenlampe/Stehlampe/Sofalampe im Device Slot eingetragen.
Daher kommt das dann zustande. ;)

Daher in der Readme der Hinweis, dass man beim Erstellen des Assistenten die Geräteliste um die eigenen Gerätenamen erweitern kann:
https://github.com/Thyraz/Snips-Fhem#assistent-erstellen
Sprich App und Intent forken und dann die Namen dort eintragen.

Sollte ich evtl. so umformulieren, dass man dies nicht nur kann, sondern auch wirklich tun sollte. ;)
Und ebenfalls im später folgenden Kapitel wie man die Geräte zu konfigurieren hat (z.B. mit snipsName), nochmal darauf hinweisen,
dass der Name im Device Slot hinzugefügt werden muss, damit Snips ihn dann auch versteht.

Der Slot Device wird übrigens von allen Intents (SetOnOff, GetOnOff, SetNumeric, GetNumeric) geshared.
Es reicht also die Liste bei einem der Intents zu öffnen und den neuen Wert hinzuzufügen.
Fhem und MariaDB auf NUC6i5SYH in Proxmox Container (Ubuntu)
Zwave, Conbee II, Hue, Harmony, Solo4k, LaMetric, Echo, Sonos, Roborock S5, Nuki, Prusa Mini, Doorbird, ...