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

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

Vorheriges Thema - Nächstes Thema

uwemicro

Hallo,
siehe Antwort #854, da habe ich einen Link gepostet unter dem Du ein ZIP File mit den Daten herunterladen kannst.

Viele Grüße
Uwe

s710


bart0190

Hi,
Zuerst einmal vielen Dank für die tolle Arbeit hier. Bei mir läuft ein Raspi 3 mit Snips drauf und es klappt, dass ich schon über eigenes Wake-Word Lichter ein und ausschalten kann. Auch höre ich im Lautsprecher den Quittierton, wenn er das Wake-Word erkennt bzw. den Befehl ausführt.
Was aber nicht klappt ist das TTS. Im "sam watch" zeigt er auch an, dass er was sagen will, tut es aber nicht. Wenn ich von FHEM einen Befehl schicke, dass er was sagen soll, hört man auch nichts. Muss man noch was extra installieren?

Mein sam status ist:
OS version ................... Raspbian GNU/Linux 9 (stretch)
Installed assistant .......... Isabella
Language ..................... de
Hotword ...................... hey_snips
ASR engine ................... snips
Status ....................... Live

Service status:

snips-analytics .............. (not running)
snips-asr .................... 0.63.3 (running)
snips-audio-server ........... 0.63.3 (running)
snips-dialogue ............... 0.63.3 (running)
snips-hotword ................ 0.63.3 (running)
snips-nlu .................... 0.63.3 (running)
snips-skill-server ........... 0.63.3 (not running)
snips-tts .................... 0.63.3 (running)


sam watch bringt:

[15:39:32] Watching on localhost:1883 (MQTT)
[15:39:37] [Hotword] detected on site default, for model hotword_jeanny
[15:39:37] [Asr] was asked to stop listening on site default
[15:39:37] [Hotword] was asked to toggle itself 'off' on site default
[15:39:37] [Dialogue] session with id '667c3ef6-4c8e-4c32-99c0-aa330d93ac75' was started on site default
[15:39:37] [AudioServer] was asked to play a wav of 41.1 kB with id '7c7df768-9149-4e56-a769-544f0eb93281' on site default
[15:39:38] [AudioServer] finished playing wav with id '7c7df768-9149-4e56-a769-544f0eb93281'
[15:39:38] [Asr] was asked to listen on site default
[15:39:42] [Asr] captured text "schalte das lus in der küche ein" in 4.0s
[15:39:42] [Asr] was asked to stop listening on site default
[15:39:42] [AudioServer] was asked to play a wav of 93.1 kB with id '1aedd342-cacd-4c67-ade0-7a6a5663ad24' on site default
[15:39:44] [AudioServer] finished playing wav with id '1aedd342-cacd-4c67-ade0-7a6a5663ad24'
[15:39:44] [Nlu] was asked to parse input "schalte das lus in der küche ein"
[15:39:44] [Nlu] detected intent bart0190:SetOnOff with confidence score 0.469 for input "schalte das lus in der küche ein"
              Slots ->
                 Device -> Lus (confidence: 0.891)
                   Room -> Küche (confidence: 1.000)
                  Value -> an (confidence: 0.737)
[15:39:44] [Dialogue] New intent detected bart0190:SetOnOff with confidence 0.469
              Slots ->
                 Device -> Lus (confidence: 0.891)
                   Room -> Küche (confidence: 1.000)
                  Value -> an (confidence: 0.737)
[15:39:44] [Nlu] was asked to parse input "schalte das standardgerät in der standardraum ein"
[15:39:44] [Nlu] detected intent bart0190:SetOnOff with confidence score 0.279 for input "schalte das standardgerät in der standardraum ein"
              Slots ->
                 Device -> Standardgerät
                   Room -> Standardraum
                  Value -> an
[15:39:44] [Dialogue] was ask to end session with id 667c3ef6-4c8e-4c32-99c0-aa330d93ac75 by saying 'Ok.'
[15:39:44] [Tts] was asked to say "Ok."
[15:39:44] [AudioServer] was asked to play a wav of 19.5 kB with id '140488c3-49d1-41fa-92a5-18a4cb99391e' on site default
[15:39:45] [AudioServer] finished playing wav with id '140488c3-49d1-41fa-92a5-18a4cb99391e'
[15:39:45] [Tts] finished speaking with id 'f2557658-83c9-4f89-ba6e-403c4414de81'
[15:39:45] [Dialogue] session with id '667c3ef6-4c8e-4c32-99c0-aa330d93ac75' was ended on site default. The session ended as expected
[15:39:45] [Asr] was asked to stop listening on site default
[15:39:45] [Hotword] was asked to toggle itself 'on' on site default


Was könnte ich probieren, damit es klappt?

lg
bart
Raspberry Pi 4 - FHEM, Homematic HM-CFG-LAN, ESP32 mit ePaper Display, Raspberry Pi 3 - BT Lokalisierung, PC - Squeezebox Server, Raspberry Pi 2 +HifiBerry - SB Player1, Raspberry Pi 2 +AVReceiver - SB Player2, nVidia Shield TV +AVReceiver - SB Player3, 2x Logitech Harmony Hub, echo dot Gen3

s710

Das ist ja seltsam. Insb. weil Audio-Playback an sich ja funktioniert.

Was sagt denn sam test speaker?

Und installier doch mal ne andere App in deinem Assistenten, die nichts mit FHEM zu tun hat, ob die etwas abspielen kann.

bart0190

Hallo,
Danke für die schnelle Antwort. Der Speaker Test sagt das "front left right rear ..." (oder so ähnlich), was ja passen sollte.
Das mit der App werde ich mal versuchen.

Lg
bart
Raspberry Pi 4 - FHEM, Homematic HM-CFG-LAN, ESP32 mit ePaper Display, Raspberry Pi 3 - BT Lokalisierung, PC - Squeezebox Server, Raspberry Pi 2 +HifiBerry - SB Player1, Raspberry Pi 2 +AVReceiver - SB Player2, nVidia Shield TV +AVReceiver - SB Player3, 2x Logitech Harmony Hub, echo dot Gen3

r_knipp

Hallo zusammen,

ich versuche gerade snips zum Laufen zu bringen.
Ich habe es einmal als Server auf meinem NAS installiert. Als Satelliten nutze ich einen Raspi Zero mit einer PS3 Eye.
Verbunden ist alles über mosquitto auf meinem FHEM-Server. Es wird das persönliche Hotword erkannt und ich kann auch über Textcommand schalten. Das sehe ich in snips-watch und das Licht geht an und aus.
Allerdings wird der gesprochene Befehl nach dem Hotword nicht erkannt. Da tut sich einfach garnichts.
ASR und NLU laufen auf dem Server. Ich weiß leider nicht mehr wo ich noch einen Fehler suchen soll.
Hoffe ihr könnt mir weiterhelfen.

Viele Grüße
Robert

CBSnake

    Zitat von: martin-s am 20 September 2018, 08:09:13

    • Multi-Turn-Dialog. Das braucht eine etwas ausführlichere Erklärung
    Mit dem Multi-Turn-Dialog kann man (bei Custom Intents) jetzt Rückfragen stellen.
    Nicht sehr sinnvolles Beispiel:

    [/list]
    sub
    my_snips_good_morning()
    {
            my $text="Ebenfalls einen guten Morgen. Soll ich den Rollo öffnen?";
            return { 'text' => $text, 'topic' => 'continueSession', 'intentFilter' => [ 'my-intent:yes','my-intent:no', 'my-intent:abort' ], 'sessionData' => { 'intent' => 'good_morning'} };
    }


    Damit wird auf den Custom Intent "Guten Morgen" eine Antwort gegeben und eine Frage gestellt.
    Aufgrund 'continueSession' geht Snips sofort wieder in den ASR-Modus und erwartet einen Intent aus der angegebenen Liste.
    sessionData wird dabei dem neuen Intent in "data" übergeben (so wie das momentan ist werden die Daten allerdings nie frei gegeben falls der Dialog durch einen Fehler abbricht).


    sub
    my_snips_yes($)
    {
            my ($data)=@_;
            if ($data->{sessionData}{intent} eq 'good_morning') {
                    fhem("set rollo up");
                    return "Alles klar";
            }
            return "Ich verstehe den Zusammenhang nicht";
    }


    Ciao,

    Martin

    Hi,

    was wurden denn aus dem möglichen Dialog? hab mich eben durch den kompletten Thread gearbeitet, hab`s evtl übersehen.
    Ich füttere talk2fhem aus Telegram und Snips, (ganz ohne intents etc. ich schieb die erkannten Wörter einfach zu Talk2fhem) und sobald es zu einem Dialog kommt kann ich den zwar per Snips anschupsen muss dann aber übers Handy weitermachen ;-)
    Beispiel:

    Hey Snips...schalte den Geschirrspüler an   bzw  Telegram: schalte den Geschirrspüler an
    -> Snips say bzw Telegram Antwort: ich habe den Geschirrspüler angeschaltet
    liegt der Anteil erneuerbarer Energie im Strom Mix nun aber zu niedrig fragt FHEM nach:
    CO2 arm spülen? und das kann aktuell nur über Telegram

    Grüße
    Achim
    FHEM auf Debian 10, HM-Wlan, JeeLink-Wlan, Wlanduino, ConBee, TP-Link Steckdose, GHoma Steckdosen, Shelly Steckdosen

    s710

    Zitat von: r_knipp am 18 September 2019, 17:12:47
    Hallo zusammen,

    ich versuche gerade snips zum Laufen zu bringen.
    Ich habe es einmal als Server auf meinem NAS installiert. Als Satelliten nutze ich einen Raspi Zero mit einer PS3 Eye.
    Verbunden ist alles über mosquitto auf meinem FHEM-Server. Es wird das persönliche Hotword erkannt und ich kann auch über Textcommand schalten. Das sehe ich in snips-watch und das Licht geht an und aus.
    Allerdings wird der gesprochene Befehl nach dem Hotword nicht erkannt. Da tut sich einfach garnichts.
    ASR und NLU laufen auf dem Server. Ich weiß leider nicht mehr wo ich noch einen Fehler suchen soll.
    Hoffe ihr könnt mir weiterhelfen.

    Viele Grüße
    Robert

    Erkennt er den den gesprochenen Text vollständig? Einen Assistenten mit entsprechenden Apps/Skills hast du installiert?

    r_knipp

    Nein, den Text erkennt er nicht. Ich sehe ja in snips-watch, dass er das Hotword erkennt, aber den Befehl danach erkennt er nicht.
    Assistent mit FHEM-Skill ist installiert. Wie gesagt, per Textcommand aus FHEM heraus funktioniert es auch.

    JensS

    [snips-common]
    mqtt = "Server-IP:1883"
    audio = "Satelliten-IP@mqtt"

    [snips-audio-server]
    bind = "Satelliten-IP@mqtt"

    [snips-hotword]
    audio = ["Satelliten-IP@mqtt"]


    Eventuell hilft es.

    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.

    cschiffer

    Hallo!
    Zunächst möchte ich erwähnen, dass ich das SNIPS-Modul prima finde. Vielen Dank an alle Beteiligten!
    Ich habe die SNIPS-FHEM-Anbindung seit einigen Tagen erfolgreich im Betrieb. Zu meinem Glück fehlt mir jedoch noch die Möglichkeit den Wert des Attributes snipsMapping mit Zeilenumbrüchen versehen zu können oder auszublenden.
    Wenn der Code in dem Attribut sehr lang ist, verschiebt sich das Statussymbol und die WebCommand Buttons sehr weit nach rechts (siehe Anhang).
    Folgende Ansätze habe ich bereits erfolglos probiert:
    Status:response={my $responseText="Der Status der Waschmaschine kann nicht ermittelt werden"; \ my $currentPower=sprintf("%.0f",ReadingsVal("...
    Status:response={my $responseText="Der Status der Waschmaschine kann nicht ermittelt werden"; \n my $currentPower=sprintf("%.0f",ReadingsVal("...
    Status:response={my $responseText="Der Status der Waschmaschine kann nicht ermittelt werden"; <nicht sichbarer Zeilenumbruch durch Betätigen der Enter-Taste> my $currentPower=sprintf("%.0f",ReadingsVal("...

    Wie muss die Maskierung hier erfolgen?
    Gibt es eine generelle Einstellung, um einen dynamischen Umbruch zu erreichen?

    JensS

    Pack doch den ganzen Schmus in 99_myUtils.pm.
    Dann könntest du alle adäquaten Geräte mit zwei Übergabeparametern abfragen.
    Status:response={SnipsStatus("Die Waschmaschine","SonoffPow3")}

    sub SnipsStatus($$){
    my ($NameSNIPS, $DeviceSNIPS) = @_;
    ...
    }


    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.

    cschiffer

    Hallo dirigent,
    vielen Dank für hilfreiche deine Antwort. Um bei mehreren Geräten Antworten nach dem selben Schema zu verschicken ist das sicher ein sehr guter Ansatz. Das Konzept, die spezifische Antwort für die Geräte in dem dazugehörigen Attribut festlegen zu können, gefiel mir sehr gut, da ich viele sehr unterschiedliche Geräte habe.
    Gibt es denn wohl wirklich keine Möglichkeit einen Zeilenumbruch einzufügen?

    JensS

    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.

    cschiffer

    Hier ist ein Auszug aus dem Modul 10_SNIPS.pm:
    # Wert über Format 'reading', 'device:reading' oder '{<perlcode}' lesen
    sub getValue($$$;$$) {
        my ($hash, $device, $getString, $val, $siteId) = @_;
        my $value;

        # Perl Command? -> Umleiten zu runCmd

    # [cschiffer]: Abfrage erweitern??? ->
        if ($getString =~ m/^\s*{.*}\s*$/) {
           
    # [cschiffer]: Hier müssten evtl. die Zeilenumbrüche entfernt werden!
    $getString = $getString ???

            # Wert lesen
            $value = runCmd($hash, $device, $getString, $val, $siteId);
        }


    Wenn ich das richtig sehe, ist das die richtige Stelle um Zeilenumbrüche verarbeiten zu können. Ob es reicht die if Abfrage anzupassen oder anschließend auch die Zeilenumbrüche entfernt werden müssen weis ich nicht. Ein Entfernen wäre wahrscheinlich am sichersten.

    Ich würde die Anpassung gerne probieren, tue mich aber mit Regulären Ausdrücken recht schwer.
    Kann mir wohl jemand dabei helfen?

    Hier ein Beispiel für einen gültigen Wert:
    {my $measuredTemp=sprintf("%.0f",ReadingsVal("Thermostat.Wohnzimmer_Clima","measured-temp","99"));
    my $desiredTemp=sprintf("%.0f",ReadingsVal("Thermostat.Wohnzimmer_Clima","desired-temp","99"));
    return "Die aktuelle Temperatur im Esszimmer beträgt $measuredTemp Grad und das Thermostat ist eingestellt auf $desiredTemp Grad";}