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

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

Vorheriges Thema - Nächstes Thema

Thyraz

@laberlaib: ja man kann einen Slot auch bei CustomIntents leer lassen.
Die Variable ist dann einfach ,,undef".

In Perl kann man das dann z.B. So abfragen:


if (defined($room)) {
  #Raum Variable benutzen
} else {
  # Ohoh, kein Raum angegeben
}



Wenn ich in 2 Wochen zurück bin, gibt es aber die andere Lösung, dass ihr immer einen room bekommt, sofern ihr einen Slot namens Room im CustomIntent habt.

Ich hab gestern noch etwas gegrübelt und muss mal schauen wie DOIF und andere Module das mit der Bereitstellung von ,,globalen" Variablen machen.
Dort gibt es dann ja auch Variablen wie $DEVICE $EVENT die innerhalb des Aufrufs vom Endnutzer abgefragt werden können.

Wenn ich das so hinbekomme, müsste man keine Sonderbehandlung bei den normal übergebenen Variablen machen.
Es gäbe einfach die Regel, dass man die Variablen $ROOM und $DEVICE innerhalb der Perl Funktionen verwenden kann.
Hat man keine Slots namens Room und Device im CustomIntent sind sie eben undef, sonst mit den passenden Werten belegt.

Hat man meinen Intent mit den Slots Room, Device und Value,
müsste man an sich auch nur Value an die Perl Funktion übergeben, Room und Device bekäme man ja frei Haus über die globalen Variablen:

MyCustomIntent=snipsCustomFunction(Value)


sub($) {
  my ($value) = @_;
 
  # do something with $ROOM, $DEVICE and $value

  return "blabla";
}


$ROOM wäre wie folgt belegt:
Ist der Slot ,,Room" vom Intent belegt, wird dieser Raumname verwendet.
Sonst kommt der Wert von siteId rein. Ist siteId ,,default" (Haupt-Device) wird stattdessen der Defaultroom aus eurer Snips-Device Definition genommen.

$DEVICE wäre der Inhalt vom Slot ,,Device" im Intent.
Dabei wird wie in der Reihenfolge gesucht:
- Gibt es ein Device mit dem passenden Namen in dem betreffenden Room
- Gibt es sonst ein Device mit dem passenden Namen in einem anderen Raum
Der Wert wäre dann auch nicht der snipsName, sonder der echte Device-Name, damit ihr den Namen nicht mehr selbst auflösen könnt.
Nur so könnt ihr dann ja auch set Befehle etc. ausführen.

Klingt das soweit gut?

Gedanken zu Multimedia folgen später, jetzt wird erstmal eine große Sandburg gebaut.  ;D

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

Sandburgen ftw!

Bestimmte Angaben einfach immer ermitteln weil es besser vorher funktioniert und zu 80% benötigt werden klingt für mich sehr gut, danke. Und warten kann ich gut, Hardware will ja auch gebaut werden.
--
Proxmox, Homematic, G-Tags, Zigbee2MQTT, Rhasspy Sprachsteuerung im Aufbau (beta)

Thyraz

So, zu Multimedia Steuerung:
Da hier viele verschiedene Funktionen zusammen kommen,
(welche auch sehr unterschiedlichen Beispielsätzen benötigen)
wird es hier ein paar Intents brauchen.

On/Off eines Players ist ja kein Problem und wird über den SetOnOff Intent abgedeckt.

Lautstärke ist auch heute schon als ein Type in SetNumeric integriert.

Das nächste was es braucht wären dann Befehle für Play/Pause/Stop/Forward/... mal sehen was das noch so abdecken sollte.
Der Intent könnte dann z.B. MediaControls heißen.
Optionen wären dann eben cmdplay, cmdPause usw. um möglichst flexibel zu bleiben.

Bei Channels bin ich nach wie vor nicht 100% sicher.
Synonyme werden da nicht helfen fürchte ich, da sie in die falsche Richtung funktionieren.
Sie machen aus mehreren gesprochenen Werten einen Hauptwert der an Fhem geschickt wird.

Wir bräuchten ja aber eher einen gesprochenen Wert (z.B. S.W.R.3) der dann im Fhem als verschiedene Werte an die Multimedia Player übergeben wird.
Snips kennt die Geräte aber ja gar nicht und weiß somit nicht was wann übergeben werden müsste.

Es müsste also schon über ein gerätespezifisches Mapping laufen.
snipsMapping würde schon passen, aber das kann je nach Anzahl der Senser schnell unübersichtlich werden.

Ein Beispiel wie das Mapping aussehen könnte:

MediaChannels=currentStation,cmd=favorite,channels=S.W.R.3:1|S.W.R.1:2

Bei einem ,,Schalte das Radio auf S.W.R.3 um" würde dann ein set <radio> favorite 1 ausgeführt werden.

Irgendwelche besseren Ideen dazu?
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

Ohne allzulange nachzudenken über Auswirkungen:
Man könnten, um die Portierbarkeit von snippsMapping zwischen den Geräten und die Übersichtlichkeit zu gewährleisten das Ganze u.U.  in ein Attribut auslagern:
MediaChannels=currentStation,cmd=favorite,channels="snipsSlotMapping"
und dann im Attribut snipsSlotMapping die Wertpaare
S.W.R.3:1
HR3:2

(alle Namen aus den Fingern gesaugt, und Trenn- und Erkennungszeichen ohne Rücksicht gewählt. Kommagetrennt, Zeilenweise o.ä. ist ja eher programmierabhängig).

Das könnte man dann auch relativ generisch einsetzen, z.B. falls noch weitere Slots dazukommen (playMode [Stereo/Syncron/Mono o.ä.], welche ebenfalls geräteabhängige Werte möchten. Ob man dann ein snipsSlotMapping pro Slot bräuchte oder einfach annimmt, diese werden sich schon nicht überschneiden und alle Wertpaare in ein Attribut reinhängt wäre egal.

Das bringt mich gleich auf den Gedanken was passiert, wenn es cmd-Befehle gibt, welche sich aus mehreren Slots und zusammensetzen bzw. nach dem eigentlichen Slot noch eine Angabe brauchen? Bespielsweise (<> sind Bezüge zu Slots).
set <device> play <channel> <playMode>
oder
set <device> play <channel> volume 30

Will man sowas berücksichtigen und dann evtl. in einem snipsCmdMapping unterbringen? Müssten in diesem dann alle Slots abgreifbar sein?
Gibt's die oben genannten Anwendungsfälle überhaupt?

Aber vielleicht hat man dann auch zu viele Stellschrauben und konfiguriert sich zwischen Snips, Snips-Console, Snips-Slots, CustomIntents und den zig snipsAttributen einen Wolf und weiß nicht mehr, wo man was eigentlich findet.
--
Proxmox, Homematic, G-Tags, Zigbee2MQTT, Rhasspy Sprachsteuerung im Aufbau (beta)

kud

Versuche gerade eine HUEGroup per Snips zu schalten/Dimmen/Farbe/Szene wechseln .
Bisher erfolglos. Hat schon Jemand dieses am Laufen?

Thyraz

@kud, kannst du mal ein list der Huegroup posten und dein aktuelles Mapping?

Und wie steuert man die Group per Fhem Kommandozeile an, so dass es funktioniert.
set <groupname> pct 50 oder so?
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

@laberlaib:

Ja, das Auslagern in ein extra Attribut habe ich mir auch schon überlegt.
Müsste man ja auch nicht im Intent benennen, sondern könnte einen festen Namen haben.
snipsMediaChannels oder so.

Würde ich aber ungern fest als weiteres globales Attribut in jedes FHEM Device zwingen.
Müsste man dann per Attribut userattr erstmal für die jeweiligen Devices anlegen.

Da bräuchte man dann auch keine anderen Trennzeichen sondern könnte wieder so etwas machen:
S.W.R.3=1,S.W.R.1=2


Zu den weiteren Fragen mit playmode etc:
Gibt es da ein Real-World Szenario wo man zum Channel-Wechsel was anderes mitgeben muss als Parameter?
Wenn es Senderspezifisch (also beim selben Sender auch immer gleich) wäre, könnte man das ja sogar im Mapping anhängen hinter die 1 oder 2 anhängen.

Oder meintest du wirklich einen anderen Slot den man mit spricht?
Ist die Frage ob das dann nicht eher ein weiterer Befehl wäre der getrennt gesprochen wird.
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

#82
Zitat von: kud am 03 August 2018, 15:04:44
Versuche gerade eine HUEGroup per Snips zu schalten/Dimmen/Farbe/Szene wechseln .
Bisher erfolglos. Hat schon Jemand dieses am Laufen?
Habs noch einmal recherchiert. Falls das auch noch Jemand braucht.
In der HueBridge das Attribut "createGroupReadings" auf 1 setzen dann erscheinen auch alle passenden Readings in der Gruppe und man kann via Snips analog Licht an/aus schalten.

Was könnte man denn noch und vor allem mit welchen Mappings mit der Lichtergruppe anstellen?

Thyraz

Das mit dem Sender wählen wird doch ganz hübsch glaube ich. :)

Hab da noch ein wenig gegrübelt, da eines der Probleme für mich war wie man ,,Spiele S.W.R.3" dem richtigen Gerät zuordnet, wenn man mehr als 1 Gerät mit MediaChannels Intent in einem Raum hat.

Aber mit dem Attribut zur Channel-Konfiguration (wie von laberlaib angedacht) lässt sich das recht einfach lösen.
Per Copy & Paste aus meiner Todo List:

ZitatAttribut snipsMediaChannels muss über usrattr im Gerät zur Verfügung gestellt werden (textField-long).
Anhand der eingerichteten Channels kann das passende Gerät gefunden werden.
,,Spiele S.W.R.3" sucht dann nach einem Device, welches im aktuellen Raum sitzt und sowohl ein MediaChannels Mapping besitzt, als auch in snipsMediaChannels S.W.R.3 eingetragen hat.
Dadurch kann mit ,,Spiele S.W.R.3" und ,,Schalte zu Z.D.F." einmal das Radio und einmal der Fernseher adressiert werden ohne das Gerät nennen zu müssen.
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

#84
Habt ihr eigentlich keine Probleme mit dem PS3 Eye? Oder rebootet ihr nicht so oft? :D

Ich hatte zuerst Probleme auf dem Rock64 Board, das es mal lief und dann irgendwann nicht mehr. Dann hatte ich davon irgendwann die Schnauze voll.
Heute habe ich den Orange Pi Zero (armv7) erhalten, wo das PS3 Eye MIC auch rumgezickt hat.

Was ich jetzt herausgefunden habe, das wenn man das PS3 Eye MIC erst nach dem Systemstart anschließt funktioniert es.

Rebootet man jedoch mit angeschlossenen PS3 Eye MIC, geht das Micro nicht mehr.
Es ist keine Soundaufnahme Möglich. Weder mit arecord noch der snips-audio-server startet dann.

Jetzt wird es ganz bekloppt... Schaltet man den Orange PI Zero aus und nimmt ihm vom Strom und gibt ihm wieder Saft (mit angeschlossen USB PS3 Micro), geht das Micro nach dem Systemstart.
Das habe ich jetzt mehrfach ausprobiert.

Solche Probleme findet man auch im Netz:
https://www.raspberrypi.org/forums/viewtopic.php?f=66&t=14903
https://www.raspberrypi.org/forums/viewtopic.php?f=38&t=15851&p=160394#p160394

Ich habe versucht den USB Port zu resetten, aber das hat nicht geholfen: https://gist.github.com/zlot/1d867b7d941abde3f02636a54a1f8495

Würde mich mal interessieren ob das auf x86 Hardware oder Raspberry auch so ist?!

Ist bestimmt ein Kernel Problem, wobei mich stutzig macht, das wenn der Strom komplett getrennt wird, das es dann geht...
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

Da bei mir das System in einem Proxmox Container läuft, wird zumindest das Host System tatsächlich praktisch nie neu gebootet. Aber auch der Snips Container hat glaub noch keinen Reboot erlebt seit der Installation.

Kann daheim mal testen wie sich das verhält wenn ich ein Reboot des gesamten Systems mache.

Werde außerdem ja auch einen weiteren Satelliten auf einem Pi installieren.
Mal sehen ob das Problem dann auch auftritt.

Wobei ich das wahrscheinlich von mir aus so schnell nicht bemerkt hätte,
da man ein Linux System ja eigentlich so gut wie nie neu starten muss.
Und wenn ich es wegen Problemen doch mal machen muss, gehe ich meist den Weg das System auch kurz stromlos zu machen. (shutdown now -> neu einschalten.)
Fhem und MariaDB auf NUC6i5SYH in Proxmox Container (Ubuntu)
Zwave, Conbee II, Hue, Harmony, Solo4k, LaMetric, Echo, Sonos, Roborock S5, Nuki, Prusa Mini, Doorbird, ...

msommer

Ich hab das Modul jetzt auf einem Pi mit einem alten Jabra Speak 410 seit einer Woche laufen und muss sagen das kommt meiner Vorstellung von einer flexiblen Smarthome Sprachsteuerung mit FHEM bis jetzt am nächsten. Definitiv flexibler als Google Home oder Alexa und dabei auch noch ohne Cloud-zwang  :)

Was mir am Snips Modul im Moment am meisten fehlt ist ein Feedback, das über "OK" und "da ist etwas schief gegangen"  hinaus geht. Also die Information ob Snips mich nicht nur verstanden, sondern auch richtig verstanden hat.
Ich hab hier testweise bei mir schon ein bischen gebastelt, aber das Problem ist dass der SetNumeric Intent Mapping keinen "type" hat wie bei GetNumeric. Daher klingen meine Antworten noch recht dämlich.
Mein Vorschlag wäre den "type" ganz aus dem GetNumeric Mapping rauszunehmen und dafür ein zusätzliches "snipsType" Attribut einzuführen. Das könte man dann an mehreren Stellen nutzen.

Was noch cool wäre... Für Fehler die auf fehlende Werte (zB room) zurückzuführen sind, wäre es nett Snips beim User einfach nach dem Wert nachfragen zu lassen. Theoretisch müsste das über die "continueSession" Funktion von Snips funktionieren.

jowe

@mark79: Also ich habe bisher etliche Neustarts hinter mir und habe mit einem Pi3 in Verbindung mit PS3eye keine Probleme gehabt.
@msommer: Fehlende Werte kann man meiner Meinung nach doch mit dem Schalter "Slot required" im Intent-Fenster abfragen lassen. Bei aktiviertem Schalter kann man dort eine Frage formulieren, die kommt wenn dem Slot kein Wert zugewiesen wurde. Habe aber ehrlich gesagt nie geprüft, ob die Nachfrage tatsächlich kommt. Kann ich evtl. heute Abend mal ausprobieren.

Mein Problem ist derzeit die Soundausgabe am Pi: beim Anschließen eines Lautsprechers über Klinke habe ich ein extremes Brummen, Audioausgabe über Bluetooth per Bluez-Alsa wollte bei mir noch nicht funktionieren und mein Hifiberry läuft leider nicht mit dem Pi3..
Mein Versuch, einen PI1 B+ mit Hifiberry als Satellit zu verwenden ist leider auch gescheitert, da irgendwie die Hotword-Erkennung nicht funktioniert hat.
Hat jemand von euch schon einen Satellit erfolgreich eingerichtet oder den Snips-Sound über Bluetooth ausgegeben?
Die Satellit-Einrichtung sollte ja eigentlich recht einfach anhand der Anleitung von hier
https://www.smb-tec.com/blog/is-it-google-aiy-nah-its-snips
gehen. Funktioniert halt leider bei mir so nicht...

laberlaib

#88
Zitat von: mark79 am 07 August 2018, 23:29:55
Habt ihr eigentlich keine Probleme mit dem PS3 Eye? Oder rebootet ihr nicht so oft? :D
Ich habe ein PS3 Eye am RP3 und keine Probleme.
Nix besonderes gemacht, werde bald mal die o.g. Channeleinstellung versuchen.

Aber ich hab jetzt mal Motion-Project installiert sowie einen squeezelite-client. Jetzt hab ich im Wohnzimmer auf einem Pi fas alles, was ich brauche.

ZitatDie Satellit-Einrichtung sollte ja eigentlich recht einfach anhand der Anleitung von hier
https://www.smb-tec.com/blog/is-it-google-aiy-nah-its-snips
gehen. Funktioniert halt leider bei mir so nicht...
Da gibt's auch einen Link auf snips.ai, weiter oben im Thread. Man muss ja eigentlich nur die beiden snips.tomls editieren, die audio-Server bind'en, Hotworderkennung auf beide Devices anpassen und den MQTT-Server beim Satellite umstellen. Bei mir hat das geklappt.

Aber ich will den intent weiterleiten, so dass ich einen Satelliten an mehrere Assistenten anbinden kann, das klappt leider gerade nicht so, wie ich es oben mal beschrieben hatte.
--
Proxmox, Homematic, G-Tags, Zigbee2MQTT, Rhasspy Sprachsteuerung im Aufbau (beta)

tomster

Das klingt ziiiiemlich interessant! Ich häng mich hier Mal rein...