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

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

Vorheriges Thema - Nächstes Thema

kud

Zitat von: jowe am 27 Juli 2018, 10:15:08
Eine Idee für die evtl. etwas fernere Zukunft hätte ich noch:
Der NLU-Teil von Snips kann soweit ich in der NLU-Doku richtig verstanden habe auch eigenständig genutzt werden (und ist mittlerweile sogar Open-Source). Es gibt das Modul Babble, das natürliche Spracheingaben in Befehle für FHEM umwandelt.
Super wäre es, wenn man den ja ohnehin schon eingelernten Snips-NLU ebenfalls für z.B. Befehle per Telegram nutzen könnte. Da das Snips-TTS ja im Snips-Modul schon zur Textausgabe genutzt werden kann vermute ich, dass dies in die andere Richtung ebenfalls relativ einfach möglich sein müsste, richtig? Also beliebigen Text über das Snips-Modul an Snips weiterreichen, entsprechend Aktionen in FHEM auszulösen und die Antworten statt per TTS z.B. über Telegram auszugeben.

Das verstehe ich nicht. Was hat die Spracheingabe mit TELEGRAM zu tun ???

Thyraz

@Jonas freut mich, dass es bei dir auch läuft. :)


@kud
NLU ist nicht die Spracheingabe selbst, sondern "Natural Language Understanding".
Das Modul ist hinter die Spracherkennung gehängt und zerlegt den erkannten Text in die Intents und Slots.

Das Problem dürfte sein, dass NLU eben auf die Daten aus dem Assistenten zurückgreift.
Man müsste alles was Telegram verstehen soll auch dort einpflegen.

Sprich dein Telegram kann dann nur das, was auch dein Snips kann.
Aber wenn das passt wäre das evtl. schon möglich.
Vorteil wäre eben nur eine Datenhaltung was Intents und zu verstehende Worte angeht.

Bin mir aber nicht sicher ob NLU wirklich reagiert, wenn die übergebene sessionID auf keine gerade in Snips aktive session verweist.
Ansonsten könntest du das schon jetzt nutzen.

Einfach mit den Standard MQTT Modulen von FHEM Messages auf den SnipsMQTT Server publishen.
Wie die Nachricht aussehen sollte sieht man hier.
https://snips.gitbook.io/documentation/ressources/hermes-protocol#nlu

Danach sollte man den geparsten Inhalt über MQTT sehen können.
Fhem und MariaDB auf NUC6i5SYH in Proxmox Container (Ubuntu)
Zwave, Conbee II, Hue, Harmony, Solo4k, LaMetric, Echo, Sonos, Roborock S5, Nuki, Prusa Mini, Doorbird, ...

jowe

ZitatSprich dein Telegram kann dann nur das, was auch dein Snips kann.
Ja, genau. Das ist natürlich so. Aber wie du schon schreibst ist der große Vorteil, dass ich die Devices/Intents etc. nur in Snips (ein)pflegen muss und dann mit der gleichen Logik entweder per Spracheingabe oder per Texteingabe (Telegram war ja nur ein Beispiel dafür) die gleichen Geräte steuern kann.

Das Auslesen des Textes aus Telegram sollte nicht so schwierig sein, aber das Weiterreichen des Textes per MQTT ist (für mich) schwieriger, da das dann auf die Perl-Ebene geht. Ich werde mir den Code deines Moduls anschauen, im Prinzip sollte die Logik ja die Gleiche sein, wie das Weiterreichen an das Snips-TTS. Vielleicht bekomme ich ja was zusammengebastelt.

Danke Gruß Jonas

Thyraz

#48
Ich muss sagen, der Gedanke den persönlichen Assistenten sowohl per Sprache als auch per Text steuern zu können gefällt mir durchaus. :)
Denn darauf läuft die Idee ja an sich hinaus, oder?

Man könnte das also viel weiter treiben als nur NLU herauszulösen.

Nehmen wir an, ich füge dem Snips Modul ein Befehl "execute" hinzu, dem man einen beliebigen Text übergeben kann.
Den jagt das Modul dann über MQTT durch NLU und initiiert mit den Daten danach selbst ein Intent Publish auf MQTT wie das Snips normal macht nachdem der User was gesagt hat.

Als SessionID gebe ich dabei nicht einen Identifier an wie ihn Snips formatiert, sondern sowas wie fhem.<UniqueID>
Auf diesen Intent Reagiert das Fhem Snips-Modul dann wie auf jeden normalen Intent der von Snips kommt.
Also entweder mit den StandardIntents wie SetOnOff oder auch mit eigenen Custom Intents vom User.
Fhem würde also z.B. entweder Lampen schalten oder die aktuelle Temperatur in einem Raum bestimmen.

Am Ende habe ich im Modul dann ja immer eine Textantwort die ich an Snips zurück übergebe.
Hier könnte ich nochmal überprüfen ob die sessionID mit "fhem." beginnt.
In diesem Fall könnte ich den zurückgegebenen Text in ein Reading execResponse schreiben statt ihn an Snips zu übergeben.

Danach reicht an sich ein DOIF welches auf Events des Readings msgText vom TelegramBot lauscht.
Diesen Text würde man dann an set Snips execute ... übergeben.

Der DOELSIF Zweig würde wiederum auf Events vom Reading execResponse des Snips Device warten und den Inhalt dann mit Telegram als Antwort an den User schicken.

Der Assistent hätte also wirklich das selbe Verhalten über Text oder über Sprache.
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

#49
Ich will nicht dirket vom Modul ablenken, aber finde keine besseren Ort um euch meine Multiassistentenkonfiguration zu präsentieren:

07.08.2018: Edith sagt mir, dass irgendwas an der Anleitung unten Glück war - jetzt bekomme ich das so nicht mehr hin... Ich aktualisiere, sobald sich was tut.

tl;dr
Multiassistent mit mehreren Assistentenserver allerdings nur einem Mikrofon pro Raum per MQTT-Bridging der audioServer statt gemeinsamer Nutzung eines MQTT-Brokers.

Alles in einem Teststadium. Bei mir hat es mindestens 10 Minuten funkioniert, was allerdings nicht heisst, dass im Hintergrund irgendein Loop gerade Buffer volllaufen lässt und alles zusammenbricht.

Da meine Frau Spanierin ist und ich gerne ähnliche Apps auf unterschiedliche Assistenen verteilen würde (derzeit landet alles Unverständliche auf der Einkaufsliste da der Slot einen sehr umfangreichen Wortschatz besitzt), hätte ich gerne mehrere Assitenten ohne aber in jedem Zimmer zwei Satelliten zu installieren. Snips bewirbt das auch auf ihrere Webseite, allerdings ohne Beispiel (https://forum.fhem.de/index.php/topic,87897.msg819688.html#msg819688).

Ich hatte einfach mal alles auf einem MQTT-Broker zusammengeschalten, allerdings funktioniert das nicht, da der Hotworddetektor nur "los" sagt, die angeschlossenen Assistenten wohl nicht zwischen den Hotwords selbst unterscheiden (obwohl es sowas wie eine HotwordID gibt, die hatte bei mir allerdings keine Auswirkungen).

Ich hab das jetzt mit Linuxhalbwissen (copy&paste/"sudo apt-get..."), MQTT Anlesen und Hermes Studieren (https://snips.gitbook.io/documentation/ressources/hermes-protocol) folgendermaßen realisiert und es funktioniert in meiner Testinstallation (2 Assistenen auf 2 RPis und einem Satelliten auf einem RP0):
Da der Snips-Audio-Server einfach per MQTT das Mikrofon streamt sowie Audioinformationen über MQTT bezieht und abspielt habe ich die Audio-Server-Topics im MQTT gebridgt. Das Schöne ist, dass man diesen Servern per "bind" eine eigene ID geben kann (vgl. Anleitung zur Satellite-Konfiguration (https://snips.gitbook.io/documentation/advanced-configuration/platform-configuration#example-of-configuration-file-for-one-main-device-in-the-living-room-and-one-satellite-small-device-in-the-bedroom).

Zwei Assistenten parallel auf einem RPi beherrsche ich nicht und kenne auch die Leistungsfähigkeit nicht. U.U. könnte man sich ja einen Snips-Assistenten-Server mit virtuellen Instanzen aufbauen.

Also Schritt für Schritt:

1) Zwei Assistenen auf zwei PIs installieren und einem davon dann ein eigenes Hotword spendieren.
https://snips.gitbook.io/documentation/advanced-configuration/wakeword/personal-wakeword

2) Auf den Satelliteservern alle anderen Snips-Services ausschalten oder aber gar nicht installieren
sudo systemctl stop snips-*
sudo systemctl start snips-audio-server


3) Den Satellitenaudioservern per "bind" in der snips.toml eigene Namen geben.
https://snips.gitbook.io/documentation/advanced-configuration/platform-configuration#example-of-configuration-file-for-one-main-device-in-the-living-room-and-one-satellite-small-device-in-the-bedroom

4) Auf den Satelliten das MQTT-Audioservertopic an die Assistenen bridgen:
https://stackoverflow.com/questions/48982780/bridging-an-mqtt-broker-to-2-remote-mqtt-brokers-simultaneously
Bei mir heißt der Satellite noch aus der Testkonfiguration heraus "bedroom@mqtt", also habe ich eine private Kofigurationsdatei für mosquitto hinterlegt, welche ebenfalls geladen wird und die Bridges enthält:
sudo nano /etc/mosquitto/conf.d/conf_priv.conf
und darin dann:

# Privates Configfile für mosquitto auf dem Zero
connection Bridge2RP3
address 192.168.2.109:1883
topic hermes/audioServer/bedroom/# both

connection Bridge2RP2
address 192.168.2.104:1883
topic hermes/audioServer/bedroom/# both


(meine Assistenen laufen je auf einem RP2 und einem RP3, daher kommen die Namen für die Connections).

4a) ich musste immer den Satelliten neu starten, damit mosquitto die Änderungen übernommen hat, evtl. gehts auch mit systemctl restart o.ä.

5) auf den Assistenten mit
mosquitto_sub -v -h 127.0.0.1 -p 1883 -t hermes/audioServer/bedroom/#'
könnt Ihr Euch anzeigen lassen, was auf dem Topic dann so los ist. Da das ein Stream ist, sollte der Bildschirm nur so tanzen.

Wenn man jetzt mit
sam watch
das Geschehen beobachtet, dann bekommen zwar beide Assistenten mit, wenn das der andere aktiviert wird, da ja alles auf dem "bedroom-topic" am Ende bei beiden landet und der aktivierte Assistent ja Rückgabewerte schickt. Allerdings arbeitet der nicht aktivierte Assistent keine Abfragen ab.

Die Assistentenaudioserver werde ich dann auch per "bind" von default auf was anderes umstellen und dann auch bridgen.

Vielleicht geht das alles auch einfacher und man kann 2 Assistenten auf einer Maschine installieren, die Leistungs soll ja auch für Multiroom/Multidialog reichen, allerdings habe ich dazu keine Anleitung gefunden und bin nicht wissend genug, an anderen Stellschrauben rumzuspielen.
--
Proxmox, Homematic, G-Tags, Zigbee2MQTT, Rhasspy Sprachsteuerung im Aufbau (beta)

ChrisK

Zitat von: jowe am 27 Juli 2018, 10:15:08
...für mich kommt eine Amazon/Google/Apple Lösung dafür zu Hause nicht in Frage. Deshalb nochmal Danke für diese super Lösung!...
Dem kann ich mich erstmal nur anschließen (unabhängig davon ob es bei mir gehen wird oder nicht).

Ich habe fhem auf einem Ubuntu-HTPC installiert und dort soll es auch weiterhin laufen.
Jetzt stelle ich mir die Frage, ob ich Snips dort auch installiert kriege. Die Installation wird für Pi, Android, iOS und Debian beschrieben.
Wenn ich nach "snips.ai ubuntu" suche, finde ich auch nicht wirklich was.

Hat das jemand schon mal probiert?
Wenn es nicht geht, dann ist es so, würde aber trotzdem gerne rausfinden, ob ich schon aufgeben soll oder weiter suchen soll ;)

jowe

Zitat von: Thyraz am 27 Juli 2018, 12:09:40
Ich muss sagen, der Gedanke den persönlichen Assistenten sowohl per Sprache als auch per Text steuern zu können gefällt mir durchaus. :)
Denn darauf läuft die Idee ja an sich hinaus, oder?
....
Der Assistent hätte also wirklich das selbe Verhalten über Text oder über Sprache.

Ja, genau so hatte ich das gemeint. Das käme meiner Vorstellung eines digitalen Assistenten schon sehr nah.
Babble und Telegram ChatBot waren mir bisher zu großer Aufwand (insbesondere bei der Pflege), aber Snips mit vielleicht sogar Multi-Turn-Dialog scheint das auch alles abzudecken, und das auch noch (gefühlt) einfacher und flexibler. Dadurch hätte meiner Meinung nach FHEM einen enormen Komfortfaktor hinzugewonnen

Und wenn ich noch weiter träumen darf: ASR-Injection in Verbindung mit FHEM könnte (jedenfalls für mich) das ultimative Feature werden. In FHEM laufen alle Informationen zusammen: Kalender und  Kontakte über Nextcloud, Telefonie über Fritzbox, Filmdatenbank aus Kodi, Musikdatenbank in der Squeezebox, Wetterinformationen, RSS Feeds... Wenn sich diese Informationen gezielt abfragen lassen und zu Steuerungszwecken nutzen lassen, ist verdammt viel möglich.

@laberlaib: Das klingt sehr interessant. Langfristig gehe ich davon aus, dass jeder Bewohner einen eigenen Assistenten brauchen wird. Fragen wie "wann fährt mein Bus zur Arbeit?" z.B. müssen ja personenabhängig beantwortet werden.

@ChrisK: Ich habe mein FHEM auf einem Qnap-Nas als Docker-Image laufen und Snips auf einem PI3.
Da ich diverse Problemberichte über nicht funktionierende Snips-Installationen auf diversen Plattformen gelesen habe, habe ich mir einen PI3 und die Playstation-Kamera mit Mikrofon besorgt. FHEM verbindet sich ja über mqtt mit Snips, FHEM und Snips müssen also nicht auf dem gleichen Gerät laufen. Wenn das alles mal rund läuft werde ich mal schauen, ob ich für den Snips-Server ein Dockerimage auf meine Nas bekomme. Dann dient der Pi halt einfach als Satellit für Snips.
Aber da der PI mit Snips ohnehin nicht ausgelastet ist, ist die Frage ob sich das überhaupt lohnt ...

Thyraz

#52
Ubuntu könnte Probleme machen im Moment.
Die sind da einfach noch recht am Anfang ihrer Entwicklung. ;)
Denke mal das wird mit der Zeit auch auf mehr Linux Systemen laufen.

Dazu noch News zwecks Debian auf AMD64:
Mit der aktuellen Version haben die von Snips auf Stretch umgestellt.

Das aktuelle Update scheint in den Jessie Quellen gar nicht mehr drin zu sein.
Wer neu auf einer X86 Plattform installiert also jetzt Stretch und doch nicht Jessie verwenden.

Habe eben auch die Doku entsprechend 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, ...

ChrisK

Danke Euch beiden!
Dann gehe ich das eher mit einem Pi3 an und löse das Ganze vom Server.

Aber erstmal die Zeit finden... In der Zwischenzeit lese ich hier gespannt mit ;)

der-Lolo

Hier wurde ja schon gefragt ob man die Soundausgabe auch umleiten kann...
Klar, die quittierungs und Signal Töne brauchen einen Speaker am Pi - wenn aber eine antwort als Text kommt kann man dann auf anderen geräten wiedergeben? Sonos z.b.

MadMax-FHEM

#55
So ich hab ja im "alten Thread" schon fleißig mitgelesen und nun auch in diesem!

Klingt super!

Lokal wär mir auch lieber...
...wobei ich mich aktuell bereits für Alexa und gegen Google entschieden hatte... ;)

Hatte da auch einen längeren Test laufen...

Ich bin ja schon vor diesem Modul/dieser Möglichkeit über diverse Dinge gestolpert, z.B.:

https://www.minidsp.com/applications/usb-mic-array/uma-8-rpi-diy-amazon-echo

oder:

https://www.matrix.one/products/creator

bzw. eher das hier:

https://www.matrix.one/products/voice

Ich weiß vom Preis her total teuer (verglichen mit dem PS3-Eye etc.) aber trotzdem die Frage:

würden solche "Supermikrophone" auch funktionieren?

Das hier sollte ja problemlos gehen!?

https://www.seeedstudio.com/ReSpeaker-6-Mic-Circular-Array-Kit-for-Raspberry-Pi-p-3067.html

Tja und wenn ich dann mal wieder (viel) Zeit hab werde ich einen Test aufsetzen: Alexa "gegen" das Modul hier ;)

Danke schon mal, Joachim
FHEM PI3B+ Bullseye: HM-CFG-USB, 40x HM, ZWave-USB, 13x ZWave, EnOcean-PI, 15x EnOcean, HUE/deCONZ, CO2, ESP-Multisensor, Shelly, alexa-fhem, ...
FHEM PI2 Buster: HM-CFG-USB, 25x HM, ZWave-USB, 4x ZWave, EnOcean-PI, 3x EnOcean, Shelly, ha-bridge, ...
FHEM PI3 Buster (Test)

Thyraz

https://medium.com/snips-ai/benchmarking-microphone-arrays-respeaker-conexant-microsemi-acuedge-matrix-creator-minidsp-950de8876fda

Hier haben die von Snips diverse Mikrofone getestet die wohl auch liefen.
Matrix Voice ist wohl etwas speziell hat pah mal erwähnt, da es nicht als Standard-Micro erkannt wird, sondern irgendwie anders erkannt wird.

Im Test sieht man aber, dass das PS3 Eye mit seinen 4 Micros gar nicht so schlecht abschneidet...
Fhem und MariaDB auf NUC6i5SYH in Proxmox Container (Ubuntu)
Zwave, Conbee II, Hue, Harmony, Solo4k, LaMetric, Echo, Sonos, Roborock S5, Nuki, Prusa Mini, Doorbird, ...

MadMax-FHEM

FHEM PI3B+ Bullseye: HM-CFG-USB, 40x HM, ZWave-USB, 13x ZWave, EnOcean-PI, 15x EnOcean, HUE/deCONZ, CO2, ESP-Multisensor, Shelly, alexa-fhem, ...
FHEM PI2 Buster: HM-CFG-USB, 25x HM, ZWave-USB, 4x ZWave, EnOcean-PI, 3x EnOcean, Shelly, ha-bridge, ...
FHEM PI3 Buster (Test)

mark79

#58
Hallo Thyraz,

kannst du bitte noch mal helfen. :) Das mit dem Abfallkalender will nicht funktionieren.

Ich habe snips nun so weit gebracht, das er auf die 99_myUtils.pm zu zugreifen scheint.
Allerdings beantwortet er jeden Satz mit "wann wird das Altpapier abgeholt, geleert etc." mit: "Das kann ich leider nicht beantworten".

Ich vermute der Fehler liegt in der 99_myUtils.pm. Weil er das Reading des Abfall Device nicht auslesen kann.

Schreibe ich {snipsAbfall("Restmuell")}; in die Fhem Commandozeile kommt das hier:
Das kann ich leider nicht beantworten

Das gleiche bei {snipsAbfall("Altpapier")};
Das kann ich leider nicht beantworten

Das "Abfall" Device ist im Room "Snips"
Reading:
USBAbfuhrBlau-Altpapier_days 12
USBAbfuhrGrau-Restmuell_days 2


Das "Snips" Device:
snipsIntents Abfallkalender=snipsAbfall(Abfall)

99_myUtils.pm
# Abfall Intent
sub snipsAbfall($) {
    # Übergebene Parameter in Variablen speichern
    my $type = @_;

    # Standardantwort festlegen
    my $response = "Das kann ich leider nicht beantworten";

    if ($type eq "Restmuell") {
        # Wert aus Reading lesen
        my $days = ReadingsVal("Abfall","USBAbfuhrGrau-Restmuell_days", undef);
        # Antwort überschreiben mit dem Ergebnis
        $response = "Der Restmuell wird in $days abgeholt";
    }
    elsif ($type eq "Altpapier") {
        # Wert aus Reading lesen
        my $days = ReadingsVal("Abfall","USBAbfuhrBlau-Altpapier_days", undef);
        # Antwort überschreiben mit dem Ergebnis
        $response = "Das Altpapier wird in $days abgeholt";
    }
   
    # Antwort an das Snipsmodul zurück geben
    return $response;
}


snips-watch:
[16:32:42] [Dialogue] New intent detected mark79:Abfallkalender with probability 1.000
              Slots ->
                 Tonne -> Altpapier


Event Monitor:
2018-07-29 16:32:42 SNIPS Snips transmission-state: incoming publish received
2018-07-29 16:32:42 SNIPS Snips lastIntentTopic: hermes/intent/mark79:Abfallkalender
2018-07-29 16:32:42 SNIPS Snips lastIntentPayload: {"sessionId":"78cca138-c096-4da8-8ad8-921c1b5d4ab8","customData":null,"siteId":"default","input":"wann wird das altpapier abgeholt","intent":{"intentName":"mark79:Abfallkalender","probability":1.0},"slots":[{"rawValue":"altpapier","value":{"kind":"Custom","value":"Altpapier"},"range":{"start":14,"end":23},"entity":"Abfall","slotName":"Tonne"}]}


Viele Grüße
Mark
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

mark79

#59
Mit dem Code funktioniert das, es fehlte die "[ 0 ]" nach dem $type
# Abfall Intent
sub snipsAbfall($) {
    # Übergebene Parameter in Variablen speichern
    my @type = @_;
    # Standardantwort festlegen
    my $response = "Das kann ich leider nicht beantworten";

    if ($type[0] eq "Restmuell")
    {
        # Wert aus Reading lesen
        my $days = ReadingsVal("Abfall","USBAbfuhrGrau-Restmuell_days", undef);
        #my $days = "12"; # debug
        # Antwort überschreiben mit dem Ergebnis
        $response = "Der Restmuell wird in $days Tagen abgeholt";
    }
    elsif ($type[0] eq "Altpapier") {
        # Wert aus Reading lesen
        my $days = ReadingsVal("Abfall","USBAbfuhrBlau-Altpapier_days", undef);
        #my $days = "11"; # debug
        # Antwort überschreiben mit dem Ergebnis
        $response = "Das Altpapier wird in $days Tagen abgeholt";
    }
   
    # Antwort an das Snipsmodul zurück geben
    return $response;
}


Der Dank geht an Gerd, er hat das ganze ausgefuchst.
Noch mal vielen Dank!!! :)

Testen kann ich das gerade leider nicht, weil das Micro derzeit nicht funktioniert.

Die Abfrage via fhem cmd funktioniert jedoch:
{snipsAbfall("Restmuell")};
Der Restmuell wird in 2 Tagen abgeholt
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