NEWS
Projekt Sprachsteuerung mit mac / vis Widget / Chrome
-
Hallo,
in http://forum.iobroker.net/viewtopic.php?f=24&t=3737 wird über die Sprachsteuerung mit Amazon Alexa gesprochen. Eigentlich nicht schlecht, aber ich will kein weiteres Gerät dafür in die Wohnung stellen.
Deshalb habe ich nach einer Lösung für die Spracheingabe ohne Knopfdruck mit Bordmitteln von ioBroker gesucht.
<u>Ist-Zustand:</u>
mac mini im Wohnzimmer (ioBroker Server, kein Monitor angeschlossen, Wartung über Screensharing vom iMac im Arbeitszimmer, USB Webcam angeschlossen
Wandtablet im Flur (iPad Air mit Mobile Safari Browser zur Steuerung und Sprachausgabe)
iPhones
<u>Wunsch:</u>
Sprachsteuerung vor allem im Wohnzimmer. Im Flur kann man das Tablet verwenden. Die Küche ist kaum automatisiert (außer Sonos).
Ich habe lange mit der Spracheingabe via Siri und homekit (-Adapter) herumprobiert, kam aber zu keinem guten Ergebnis. Die Befehle sind festgelegt, die Verbindung trennt sich immer wieder, die Steuerung ist alles in allem unzuverlässig und die gesprochene Antwort kommt nur aus dem ursprünglichen (iOS) Eingabegerät.
Die Lösung war Bluefox neues Speech2Text-Widget in VIS. Leider funktioniert das nich in (Mobile) Safari, da Apple keine Mikrofon-Eingaben im Browser zulässt. Man bräuchte eine App dazu. Doch Google Chrome funktioniert da bestens. Ich haben den Browser so konfiguriert, dass nur Webseiten vom localhost für Mikrofon-Eingaben zugelassen sind (Chrome/Einstellungen/Erweiterte Einstellungen/Mikrofon).
Da der ioBroker-Server (mac mini) schon im Wohnzimmer steht und an eine USB-Webcam angeschlossen ist (XEOMA Videoüberwachung), konnte ich deren Mikrofon zur Spracheingabe verwenden.
Schließlich habe ich für VIS ein eigenes Projekt zur Sprachsteuerung erstellt. Eine schlichte View mit nur zwei Widgets.
-
Spracheingabe Widget
-
HTML Widget mit HTML Metabefehl refresh
Der Refresh ist nötig, da auch das Widget (konfiguriert auf "hört immer zu") gelegentlich leider nicht mehr zuhört. Deshalb läd die Seite alle 120s neu.
Die Sprachbefehle (mit Schlüsselwort) landen natürlich alle im text2command-Adapter und werden dort ausgewertet. Ein sehr praktischer Adapter, leider noch etwas unübersichtlich.
Teils werden Informationen abgefragt, teils Aktionen gestartet. Um Aktionen zu starten nutze ich ausgiebig die scriptEnabled Funktion des Javascript-Adapters. Um zB die Rollläden zu schließen, starte ich ein Skript, das die Befehle ausführt. Die direkte Eingabe des Ziellevels im Homepilot-Adapter funktioniert nicht, vom Skript aus geht es.
Für die Ausgabe der billigsten Tankstelle wird ebenfalls ein Skript gestartet und nach Ablauf wieder auf inaktiv gesetzt. Denn die Ausgabe des Skriptes soll nicht nur den Namen, sondern auch den Preis enthalten. Das sind zwei Werte, die der text2command-Adapter in der Antwort nicht zulässt. Weiterhin kann man auch dynamische Antworten (abhängig zB von Zeit und oder Wetter zusammensetzen)
Alle Sprachausgaben erfolgen auf dem Wandtablet im Flur.
<u>Ausblick:</u>
Es sind doch einige Skripte und Kommandos, die zusammenkommen. Wenn ich noch Licht (pro Raum, pro Lampe) mit einbaue, kann es unübersichtlich werden. Daher ist eine gute Organisation und Benennung wichtig.
Um die Sprachsteuerung auch aus der Küche zu starten bräuchte ich dort ein Eingabegerät. Vielleicht reicht ein Raspi mit dem Browser und einem Mikrofon aus. Durch die Verwendung eines zweiten Widgets mit anderem Schlüsselwort könnte man das Ziel der Eingabe auf eine weitere Text2Command Instanz lenken und diese schließlich auf eine andere Sayit-Instanz (Sonos in der Küche).
Pro Raum eine Eingabe-Hardware könnte auch die Eingabe vereinfachen. In der Küche stehend kann ich dann "Licht an" sagen, statt "Küche Licht an".
<u>Hier ein paar Screenshots und Skriptbeispiele:</u>
!
HTML-Widget mit Reload:[{"tpl":"tplHtml","data":{"g_fixed":false,"g_visibility":false,"g_css_font_text":true,"g_css_background":false,"g_css_shadow_padding":true,"g_css_border":true,"g_gestures":false,"g_signals":false,"visibility-cond":"==","visibility-val":1,"refreshInterval":"0","signals-cond-0":"==","signals-val-0":true,"signals-icon-0":"/vis/signals/lowbattery.png","signals-icon-size-0":0,"signals-blink-0":false,"signals-horz-0":0,"signals-vert-0":0,"signals-hide-edit-0":false,"signals-cond-1":"==","signals-val-1":true,"signals-icon-1":"/vis/signals/lowbattery.png","signals-icon-size-1":0,"signals-blink-1":false,"signals-horz-1":0,"signals-vert-1":0,"signals-hide-edit-1":false,"signals-cond-2":"==","signals-val-2":true,"signals-icon-2":"/vis/signals/lowbattery.png","signals-icon-size-2":0,"signals-blink-2":false,"signals-horz-2":0,"signals-vert-2":0,"signals-hide-edit-2":false,"html":"\nView lädt alle 120s neu"},"style":{"left":"7px","top":"115px","border-width":"3px","border-style":"dashed","border-color":"yellow","border-radius":"20px","color":"yellow","padding":"20px","width":"auto","height":"auto"},"widgetSet":"basic"}]
Skript billigste Tankstelle
/* Billigste Tankstelle mit Preis ausgeben >! ACHTUNG: Bei Änderung des Namens in Text->Kommandos Adapter Namen anpassen >! Skript wird durch text2command-Adapter aktiviert >! setzt tankerkoenig-Adapter voraus erstellt 11.10.2016 */ >! // Sprachausgabe bauen function aktion () { nachricht = 'Den günstigsten Diesel gibt es in der ' + getState("tankerkoenig.0.stations.cheapest.diesel.name"/*Name*/).val + ' für ' + getState("tankerkoenig.0.stations.cheapest.diesel.short"/*Günstigste Diesel Tankstelle short*/).val + ' Euro'; setState("sayit.0.tts.text"/*Text to speech*/, nachricht); } >! // bei Skriptstart ausführen aktion(); // selbständig Skript wieder anhalten setStateDelayed('javascript.' + instance + '.scriptEnabled.' + name.slice(10), false, 5*1000); >! ```` Vielleicht hilft der Thread mit ein paar Ideen bei der Umsetzung einer eigenen Lösung. Bitte spart nicht mit Feedback! Dank an Bluefox für den tollen text2command-Adapter und das super Widget! Gruß Pix
-
-
Das ist ein interessanter Ansatz. In dem Alexa Thread kamen Bedenken auf, dass ein Tablet oder anderes Gerät nicht besonders gut reagiert, wenn man nicht direkt davor steht. Wie ist das denn bei Dir, wenn im WZ der Fernseher an ist oder andere Hintergrundgeräusche oder Gespräche da sind? ("Seid mal alle leise, ich will mit meinem Haus sprechen" :lol: )
Klarer Vorteil Deiner Lösung ist, dass man keine Cloud braucht und dass Du insgesamt eine bessere Kontrolle über das System hast.
-
Von unterwegs:
Wenn aus dem Fernseher mein Schlüsselwort kommt, wirds lustig.
Ich würde gern die Ansage "ich verstehe xxxx nicht" durch einen Ton ersetzen (Basso oder Mööp), denn die Wiederholung des falschen Befehls führt zu einer Schleife.
Leider startet der text2command Adapter manchmal mehrmals. Dann geht gar nix mehr.
Werde mal sehen, ob ein besseres Mikro die Verständigung noch weiter verbessert.
Unsicher bin ich, ob nicht die Engine trotzdem die gesprochenen Befehle zur Erkennung durch die Cloud schickt. Die Erkennung ist schon ziemlich hoch (tippe auf 80%). Ganz offline wär mir am liebsten. Wenn das ein Raspi kann würde ich ihn als Slave einsetzen und ihm den Internetzugang sperren. Pro Raum einen Raspi.
Pix
-
Hi Pix,
danke für die ausführliche Schilderung.
Ich bin z.Z. auch am überlegen in die Richtung zu gehen.
Bevor ich dies angehe, aber zwei Fragen dazu:
-
1 1/2 Jahre später - ist es immer noch der Weg, den man gehen sollte oder gibt es inzwischen Andere?
-
Wie sind Deine Erfahrungen? Nutzt Du es noch? Gab es größere Probleme?
Gruß
BB
-
-
Hallo BlueBook,
dieser Thread ist recht langsam unterwegs, aber er ist unterwegs
Erstmal: Welchen Weg man gehen sollte, sollte jeder selbst entscheiden.
Ich habe mich lange gegen die Hardware Sprachassistenten ausgesprochen, da ich Datenschutzbedenken hatte. Allerdings habe ich meine Meinung geändert, als mir klar wurde, dass ich mit meinem iPhone ständig einen Sprachassistenten mit mir herumtrage. Er kann sogar viel mehr als ein Echo oder ein Google Home. Es ist immer dabei und hat auch noch zwei Kameras, GPS, Beschleunigungssensoren, etc. Natürlich kann ich das Smartphone abschalten, wenn ich meine Ruhe will. Aber selbst das ist keine 100% sichere Lösung. Die Sprachassisten für zu Hause (zumindest Google Home und Alexa) kann mann leicht vom Strom trennen. Dann ist Ruhe. Für "Smarthomer" sollte das auch fernsteuerbar mit Zwischenstecker realisierbar sein.
Fazit: Ich habe nun zwei Echo Dots in meiner Wohnung (Küche und Wohnzimmer). Sie sind vor allem in Verbindung mit Sonos für die Musik zuständig. Und natürlich nutze ich auch den ioBroker Skill, war aber mit den Eigenarten von Alexa nicht so zufrieden. Das System erwartet ein bestimmtes Muster in der Grammatik und kann auch nicht alle Vokabeln. Über den Umweg IFTTT habe dann auch einen Google Home (Flur) angebunden. Den gab es mal richtig günstig (mit Gutscheinen für 18€), da konnte ich nichts falsch machen. Google ist sehr viel "gelassener" bei der Spracherkennung. Ausserdem lässt sich der Google Home in Sayit-Adapter direkt als Ausgabegerät auswählen.
Jetzt hat Alexa nachgezogen. Dank apollon's Arbeit (und natürlich soef's Vorarbeit) ist auch auf Echos die Sprachausgabe möglich. Überhaupt ermöglich der neue Alexa2 Adapter viele neue Möglichkeiten. Ich kann weiterhin meine Text2Command-Einstellungen verwenden. Oder ich nutze den Umstand, dass der Adapter den Standort des Echos in der Wohnung kennt, von dem das letzte Kommando kam. So kann man sich zB die Raumangabe bei Kommandos an mit Echos versorgten Räumen sparen. Statt in der Küche zu sagen "schalte das Licht in der Küche an" reicht nun ein "Licht an". Sage ich das im Wohnzimmer, geht nur dort das Licht an. Die Verlockung ist groß, in jeden Raum so ein Ding zu stellen…
Es ist gut zu wissen, dass die im Eröffnungsthread beschriebene Möglichkeit funktioniert, zumindest auf verbreiteten Betriebssystemen und bei gutem Mikrofon. So kann man Sprachsteuerung unabhängig von amazon realisieren. Allerdings sollte man wirklich direkt vor dem Mikrofon sprechen.
Gruß
Pix
-
Hi !
Weiß jemand wie man bei dem Alexa2 Adapter auch Alexa sagen kann, dass sie zwischen den Sätzen zb. eine Sekunde Pause lässt. ?
Danke
-
Hi !
Weiß jemand wie man bei dem Alexa2 Adapter auch Alexa sagen kann, dass sie zwischen den Sätzen zb. eine Sekunde Pause lässt. ?
Danke ` ne Sekunde weiß ich nicht, aber ein simples Komma also , lässt sie kurz "pausieren"