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

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

Vorheriges Thema - Nächstes Thema

cschiffer

Eben habe ich mein Anliegen nochmal durchdacht. Da noch weitere Informationen in dem Attribut enthalten sind, welche in separaten Zeilen stehen, würde das Parsen stark erschwert. Außerdem wären feste Umbrüche je nach Browserfenstergröße nicht wirklich optimal.
Ein wesentlich besserer Ansatz, welcher sicher auch vielen anderen Nutzern helfen würde, wäre ein automatischer Zeilenumbruch in Abhängigkeit vom Browserfenster bei der Anzeige.
Für lange Readings ist dies bereits realisiert.
Eigentlich müsste das Verhalten nur für Attribute nachgezogen werden.
Jetzt ist nur die Frage, wen ich überreden muss diese Anpassung zu machen  :)



JensS

Wenn du in 10_SNIPS.pm, vor der Zeile 581 @mappings = split(/\n/, $mappingsString); eine Zeile mit dem Inhalt $mappingsString=~ s/<br>\n//g; einfügst, kannst du im Attribut snipsMapping mit <br> und Enter einen Umbruch einfügen. Vorausgesetzt, du hast "reload 10_SNIPS.pm" ausgeführt.

Gruß Jens
Debian auf APU2C4, HM-CFG-USB2, SIGNALduino, HM-ES-PMSw1-Pl, 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.

rakete123

Hallo zusammen,
ich hab beim Start von snips-injection folgendes Problem:

[09:19:11.936052] INFO :snips_injection_hermes: Launch with assistant "/usr/share/snips/assistant" and user dir "/var/lib/snips/"
[09:19:11.936251] ERROR:snips_injection       : g2p resources not specified


Ich denke mal das Problem ist eine Änderung seit 0.64.0:
https://forum.snips.ai/t/platform-update-1-3-0-0-64-0-02-10-2019/3732/3

Vermutlich muss die FHEM app angepasst werden.

Edit: Achso ein Downgrade auf 0.63.3 bzw. für snips-kaldi-atlas auf 0.24.2 hilt dann erstmal
Zwave: ZMEEUZB1 (Fibaro, Aeotec, diverse)
Zigbee: Conbee (HUE, Xiaomi, osram)
Homematic: HM-MOD-RPI-PCB + diverse HM-CC-RT-DN
Sonstiges: Harmony, Android, Netatmo, Jabber (talk2fhem)
https://resize2fs.de

cschiffer

@dirigent: Vielen lieben Dank! Das ist vielleicht nicht die allereleganteste Lösung auf Erden, aber ich bin sehr froh erstmal eine Lösung zu haben.

jowe

Zitat von: rakete123 am 06 Oktober 2019, 09:28:55
Hallo zusammen,
ich hab beim Start von snips-injection folgendes Problem:

[09:19:11.936052] INFO :snips_injection_hermes: Launch with assistant "/usr/share/snips/assistant" and user dir "/var/lib/snips/"
[09:19:11.936251] ERROR:snips_injection       : g2p resources not specified


Ich denke mal das Problem ist eine Änderung seit 0.64.0:
https://forum.snips.ai/t/platform-update-1-3-0-0-64-0-02-10-2019/3732/3

Vermutlich muss die FHEM app angepasst werden.

Edit: Achso ein Downgrade auf 0.63.3 bzw. für snips-kaldi-atlas auf 0.24.2 hilt dann erstmal

Also bei mir funktioniert die injection auch bei der neuen Snips Version. Bisher keine Probleme. Hast du deinen Assistent nach dem Update neu trainiert?

Che007

Hallo zusammen,

habe keinen Beitrag dazu gefunden. Setup ist ein Raspberry Pi 3B+ mit USB Lautsprecher.
Ich habe das Problem, dass bei jeder ersten Soundausgabe kurz ein Knacken kommt. Dies kommt bei jeder Soundausgabe am Anfang. Z.B.: beim Liedwechsel oder bei einer Snips Ansage.
Lt. kurzer Infromationssammlung scheint es am alsa Treiber zu liegen, der wiederrum in den Standby schaltet.
Dies kann wohl mit dem Pulse Treiber umgangen werden. Hat jemand das Snips Setup auf den Pulse Treiber umgemünzt und kann erläutern was geändert werden muss?

Vielen Dank.

Che007

Zitat von: ahlermi am 26 Oktober 2018, 07:25:07

$text = ["Das habe ich nicht verstanden!","Phuu das kann ich noch nicht!","Nein! Heute nicht.", "Wie bitte?"]->[rand(4)];


Das ist schon mal was für Zufall

Ist es eigentlich möglich, die o.g. Sätze als zufälligen Response zurückzugeben? Ich habe das mal eingetragen, aber Snips liest natürlich alles 1:1 vor mit Klammern etc.

jowe

Hallo zusammen,

seit einigen Monaten läuft jetzt bei mir Snips im Wohnzimmer, klappt soweit auch ganz gut. Wir nutzen Snips hauptsächlich zur Lichtsteuerung und zum Starten von Musik.
Ich habe jetzt einen Satelllit mit Respeaker 2 und Pi0 meinem Setup hinzugefügt.
Allerdings stehe ich gerade auf dem Schlauch, wie ich dem Satellit in FHEM beibringe, in welchem Raum er sich befindet.
Beim default-device reicht es, "Musik an" zu sagen, damit im korrekten Raum die Musik gestartet wird. Das funktioniert aber mit dem Satellit nicht, da er nicht weiß in welchem Raum er sich befindet.
Habe ich in der Doku etwas überlesen oder geht das nicht? Hier im Thread gibt es ja einige posts von usern, die mehrere Satelliten haben. Wie habt ihr das gelöst?

drhirn

Hast du wohl überlesen. Steht hier: https://docs.snips.ai/articles/platform/satellites

Du musst in der /etc/snips.toml unter [snips-audio-server] das Binding einstellen. Also z.b.
bind = "schlafzimmer@mqtt"
Wobei schlafzimmer dann deine "SiteID" wäre.

Und in FHEM definierst du dann das Attribut snipsRoom dementsprechend.

jowe

Hi drhirn,

erstmal danke für die Antwort. Wie ich das in Snips einrichte ist mir klar, das funktioniert prinzipiell auch schon bei mir.
Das Problem ist, dass FHEM nicht weiß, in welchem Raum mein Satellit steht. Seit dem letzten release von Snips gibt es das feature "hotword coalescing". Das bedeutet, man kann mehrere Satelliten in einen Raum stellen und hat trotzdem keine Mehrfachdetektierung des hotwords. Nur der (im besten Fall am nächsten stehende) Satellit detektiert das hotword. Das funktioniert auch ganz gut, ich nutze das um unseren recht großen Wohn-/Ess-/Kochbereich abzudecken, ohne Snips durch den Raum anschreien zu müssen..
Das Problem ist, dass das FHEM-Snips Modul nur beim "default" device weiß, um welchen Raum es geht.
Das bedeutet, wenn das default-device das hotword erkennt und ich sage "Musik an", dann geht im Wohnzimmer die Musik an. Wenn aber ein Satellit das hotword erkennt, führt das Kommando ins leere, da das Snips-Modul nicht weiß, in welchem Raum die Musik an gemacht werden soll. Falls ich also näher an einem Satelliten stehe, müsste ich wissen dass der Satellit und nicht das default-device das hotword erkannt hat und sagen "Musik im Wohnzimmer an".
Das macht es ziemlich unintuitiv, Ich habe jetzt die Doku vom Modul mehrfach durchgeackert und habe keine Möglichkeit gefunden, einem Satelliten einen Raum zuzuweisen

drhirn

Verstehe ich jetzt nicht. Die Lösung habe ich doch geschrieben!?

Ach so, warte. Ich glaube, ich weiß, woran du scheiterst. Also nochmal, ich hab nämlich das selbe Setup wie du:

Du installierst dir x Satelliten. Jedem gibst du eine eigene SiteID. "Hotword Coalescing" lassen wir jetzt mal außer acht, das ändert nichts an der Konfiguration.
Ich hab z.b. zwei Satelliten im Wohnzimmer. Einer mit SiteID "wohnzimmer", einen mit SiteID "wohnzimmer2". Die beiden sollen jetzt eine Lampe schalten.
Der Trick dabei ist, die Lampe in zwei "Snips-Räume" zu stellen. In meinem Fall also:

attr lightSceneWz snipsName Lampe
attr lightSceneWz snipsRoom wohnzimmer,wohnzimmer2


Ob das vom Modul-Autor so geplant war, weiß ich nicht. Aber es funktioniert ;). SiteId und snipsRoom müssen halt identisch sein. (Was in deutsch manchmal blöd ist, wegen der Umlaute)

Hab ich dich jetzt richtig verstanden?

jowe

 :-[ Verdammt. Also siteId in Snips.toml gleich benennen wie den snipsRoom? Autsch, da hatte ich dann wohl mehr als eine Tomate vor den Augen.  Unfassbar, wie lang ich damit rumgemacht habe. Wollte schon die 10_SNIPS.pm anpassen... Werde das dann mal so ausprobieren. Vielen Dank!
Ich schreibe dann mal, wenn es bei mir funktioniert hat. Ich hoffe ich komme heute Abend dazu

Gruß Jonas

tomster

Oh Mann! Danke für diesen Tipp! So einfach und doch nicht selber draufgekommen...

jowe

Hallo zusammen,
ich habe es dank drhirn's Tipp gestern hin bekommen, nach ersten Tests kann ich sagen dass es einwandfrei funktioniert!
Ich habe die entsprechende Stelle im Modul-code auch gefunden (Zeile 380) und würde das Modul gerne so anpassen, dass die siteId immer vor einer Zahl "abgeschnitten" wird und in $room geschrieben wird. Aktuell wird einfach nach Schreiben der siteId geprüft, ob die siteId=default ist und dann durch den defaut-Raumname ersetzt:

 
        $room = $data->{'siteId'};
        $room = $defaultRoom if ($room eq 'default' || !(length $room));


Im Prinzip müsste man ja "nur" eine Zeile dazwischen einfügen, in der in $room der gekürzte Name der siteId geschrieben wird.
Beispiel: Ich habe mehrere Snips-Satelliten mit den Namen Wohnzimmer1, Wohnzimmer2, Wohnzimmer3 usw. oder Wohnzimmer_1, ... und will als $room immer nur "Wohnzimmer" haben. Vielleicht ist hier ja jemand mit ausreichenden perl-Kenntnissen unterwegs, der mir da helfen kann. Wie müsste der Code dann aussehen? Vermutlich mit split und regex? Oder bin ich da vollkommen verkehrt unterwegs?

 
$room = $data->{'siteId'};
$room = split(/.+[^-_\d]/, $room);
$room = $defaultRoom if ($room eq 'default' || !(length $room));

Che007

Hallo zusammen,

wie in dem Beitrag oben beschrieben, habe ich das Problem gehabt, dass bei Soundausgaben immer einen Knacken am Anfang zu hören war. Da ich den Raspi mit Snips auch fürs Radio und als Spotify Wiedergabegerät verwende, war das extrem störend wenn bei Letzterem zwischen 2 Lieder ein Knacken zu hören war.

Das Problem ist wohl bekannt bei Raspi mit dem Alsa Treiber. Abhilfe schafft der PulseAudio Treiber. Diesen habe ich installiert, konnte aber diesen in Snips und MPD nicht richtig einbinden, da dieser unter dem MPD Konto läuft. Letzendlich habe ich mit Hilfe des Snips Forums den Treiber systemweit eingerichtet und es läuft nun ohne Probleme und Knacken. Anbei die Einrichtungsschritte für Rapi-Stretch.

# prüfen ob das Mikrofon angezeigt wirdn
arecord -L

aplay -L
# das Ausgabegerät sollte mit in der Liste sein

# prüfen, ob die Lautstärke min. 50% ist
alsamixer

# testen, ob überhaupt ein Ton ausgegeben wird
speaker-test -c2 -twav


Nur weitermachen , wenn bis hierhin alles funktionierte

# PulseAudio installieren
sudo apt install -y pulseaudio
pactl list short sinks
# Die Ausgabegeräte sollten angezeigt werden

pactl list short sources
# Listet die Mikrofone


PulseAudio systemweit einrichten



# Dienstdatei einrichten
sudo nano /etc/systemd/system/pulseaudio.service

Inhalt:
[Unit]
Description=PulseAudio system-wide server
# network only required for remote sinks
After=network-online.target
Wants=network-online.target

[Service]
Type=forking
PIDFile=/var/run/pulse/pid
ExecStart=/usr/bin/pulseaudio --daemonize --system --realtime --log-target=journal
ExecStop=/usr/bin/pulseaudio -k

[Install]
WantedBy=multi-user.target

#EOF


# PulseAudio in Usermodes deaktivieren
sudo systemctl --global disable pulseaudio.service pulseaudio.socket

# Systemmodus aktivieren
sudo systemctl enable pulseaudio
sudo systemctl start pulseaudio
systemctl --system status pulseaudio.service

# User hinzufügen
sudo usermod -G pulse-access -a pi
sudo usermod -G pulse-access -a _snips
sudo systemctl restart snips-audio-server


# Standardmikrofon wählen
pactl list short sources
0       alsa_output.usb-Generic_USB2.0_Device_20130100ph0-00.analog-stereo.monitor      module-alsa-card.c      s16le 2ch 48000Hz       SUSPENDED
1       alsa_output.platform-soc_audio.analog-stereo.monitor    module-alsa-card.c      s16le 2ch 44100Hz       SUSPENDED
2       alsa_input.platform-soc_sound.multichannel-input        module-alsa-card.c      s32le 4ch 48000Hz       RUNNING


# In meinem Fall ist es der Respeaker Hat 4-Array - Nummer 2
pactl set-default-source 2

# Standard Wiedergabegerät wählen
pactl list short sinks
0       alsa_output.usb-Generic_USB2.0_Device_20130100ph0-00.analog-stereo      module-alsa-card.c      s16le 2ch 48000Hz       SUSPENDED
1       alsa_output.platform-soc_audio.analog-stereo    module-alsa-card.c      s16le 2ch 44100Hz       SUSPENDED


# Bei mir USB Lautsprecher - Nummer 0
pactl set-default-sink 0

# Wiedergabe testen
speaker-test -c2 -twav


Beim Starten des Service erhielt ich eine Fehlermeldung, dass die Berechtigung nicht stimmten, kann mich nicht genau an die Meldung erinnern. Ich musste zusätzlich in der Datei folgendes abändern:
sudo nano /etc/pulse/system.pa
auth-anonymous=1 hinzufügen:
load-module module-native-protocol-unix auth-anonymous=1

Ein Neustart und danach lief alles.