Samlung von Sprachkomandos. Was habt ihr bereits Realisiert?

Begonnen von Markus, 09 Februar 2014, 11:58:15

Vorheriges Thema - Nächstes Thema

mediastudio

Hallo, das mit der Temperatur funktioniert nu super, aber ich habe da noch ein kleines Problem.
Ich schalte mein Smart TV Samsung auch über Sprache, funktioniert auch sehr Gut.
Nur bei Sender die einen gleichen Namen haben z. B.  Pro 7   oder "Pro 7 Maxx" dann schaltet er immer nur auf Pro 7.
Sprache wird richtig erkannt ProSieben Maxx oder ProSieben, wenn ich Pro 7 rausnehme dann reagiert er richtig und schaltet auch  Pro 7 Maxx. Hier mal meine define:

define speechRecognizer_ProSiebenMaxx_TV notify .*voiceRecognitionLastResult.*ProSieben Maxx.* set STV1 4 1 8  ;; set @ ttsSay auf ProSieben Maxx umgeschaltet
define speechRecognizer_PRO7_TV notify .*voiceRecognitionLastResult.*ProSieben.* set STV1 7 ;; set @ ttsSay auf Pro sieben umgeschaltet

Wie gesagt, von der Spracherkennung kommen das hier:

voiceRecognitionLastResult.*ProSieben Maxx
voiceRecognitionLastResult.*ProSieben

was könnte das sein?


Kuzl

In dem notify von Pro 7 suchst du nach allem was mit Pro 7 anfängt. Versuch mal das ".*" wegzulassen

mediastudio

es verhält sich zwar anders, wenn ich das so setze, dann reagiert "ProSieben" auch nur auf ProSieben,
ProSieben Maxx macht nichts mehr.
voiceRecognitionLastResult.*ProSieben Maxx
voiceRecognitionLastResult.*ProSieben

so geht nichts, auch nicht "ProSieben Maxx"
voiceRecognitionLastResult.*ProSieben Maxx.*
voiceRecognitionLastResult  ProSieben

so geht nichts
voiceRecognitionLastResult  ProSieben Maxx
voiceRecognitionLastResult  ProSieben



Kuzl

Versuchs bitte so, dass du NUR das .* hinter Pro 7 (ohne maxx) weglässt. Alles andere so lassen, höchstens vll ein x wegmachen weil ich nicht glaube dass das google wirklich mit zwei x schreibt :D

mediastudio

google schreibt Maxx tatsächlich so, habe jetzt folgende Kombination gemacht und nun funktioniert es.
beide Sprachbefehle werden so richtig umgesetz, Dein Tipp mit dem ".*" weglassen hat mich dann zum Erfolg gebracht.
 
voiceRecognitionLastResult.*ProSieben.*(ProSieben|Max|Maxx).*
voiceRecognitionLastResult.*ProSieben

Besten Dank für den Tipp.

dieda

off-Topic:

Aber wie bekommst du die Programme geschaltet? Meiner (UE46D6500) hat die aktuelle Firmware. Programme kann ich nicht schalten.
Komponenten:
Sensoren und Aktoren: FS20, Max!, Zigbee, Zwave
IODev:  Cul1101, MaxLan, ZWAVE, Deconz
Router: KD-Fritte (6360)
Sonstiges: Raspberries,  1x LMS,1 FHEM, 1 x zum Testen,  Logitech-Clients,  Onkyo, SamsungTV, Squeezebox, TabletUIs

mediastudio

ich habe folgendes in der cfg

# SAMSUNG Smart TV
define STV1 dummy
attr STV1 group TV
attr STV1 room TEST
attr STV1 webCmd REWIND:STOP:PLAY:FF:REWIND:REC:PAUSE:TOOLS:DISC_MENU:OPEN:DOOR:TV:HDMI:PCMODE:REWIND_:FF_

define n_STV notify STV.* { samsungtv($EVENT);; fhem("setstate $NAME .");; -1;;}

Die Sprachbefehle sehen bei mir so aus und hier z.B. die 1 ist der Kanal STV1 1
für Kanal Nr. 142 schreibt man  STV1 1 4 2 immer ein frei lassen zwischen den Zahlen.

define speechRecognizer_ARD_TV notify .*voiceRecognitionLastResult.*ARD set STV1 1 ;; set @ ttsSay auf ARD erste Programm umgeschaltet

Ich habe dazu schon einen Beitrag im Forum.

dieda

Komponenten:
Sensoren und Aktoren: FS20, Max!, Zigbee, Zwave
IODev:  Cul1101, MaxLan, ZWAVE, Deconz
Router: KD-Fritte (6360)
Sonstiges: Raspberries,  1x LMS,1 FHEM, 1 x zum Testen,  Logitech-Clients,  Onkyo, SamsungTV, Squeezebox, TabletUIs

herrmannj

Zitat von: mediastudio am 26 Februar 2014, 17:32:11
google schreibt Maxx tatsächlich so, habe jetzt folgende Kombination gemacht und nun funktioniert es.
beide Sprachbefehle werden so richtig umgesetz, Dein Tipp mit dem ".*" weglassen hat mich dann zum Erfolg gebracht.
 
voiceRecognitionLastResult.*ProSieben.*(ProSieben|Max|Maxx).*
voiceRecognitionLastResult.*ProSieben

Besten Dank für den Tipp.

so als Nachtrag: in den regex ganz oben war das "space" das Problem, in "regexesisch" ist das ein "\s". Generell macht es sich auch sehr gut die Regex möglichst spezifisch (genau) zu formulieren, sprich ein .* wirklich nur mit Bedacht einzusetzen. Das ".*" hat Nebenwirkungen, solche wie oben, aber auch in Bezug auf die Geschwindigkeit weil die regex engine bei längerem input weiter versucht "treffer" zu bekommen.

Passt nicht ganz, zeigt aber welche Spaßbremse in Bezug auf performance eine "unglückliche" regex sein kann: http://www.regular-expressions.info/catastrophic.html

vg
Jörg

nabbl

Ich blicke bei dem Thread nicht mehr so ganz durch.

Funktioniert "Hotwording"? (Sowas wie "XBOX" bei der XBOX One)
Wenn ja, welches Modul?
Geht sowas dann auch mit Raummikrofonen?

Kuzl

Sowas geht beim Handy leider nur mit Tasker unter sehr starkem Akkuentzug :D
Rice hat mal ein kleines Script für Linux (auch Raspi) vorgestellt, das in der ct drin war, das konnte das.
Alternative ist voicecommand 3.

Geht dann auch mit Raummikrofonen, falls die saubere Signale liefern.

Agamemnon

Hallo,
ich weiß, dieser Thread ist schon älter, aber ich dachte hier passt es am besten rein.
Ich versuche per Sprachkommande die Tmeperatur vorgelesen zu bekommen und nutze dazu WebControlView.
Grundsätzlich funktioniert das, ich kann zum Beispiel meine Thermostate steuern.
Bei der Ausgabe der Temperatur stell ich mich aber irgendwie an.
So sieht mein notify aus:

.*voiceRecognitionLastResult.*Temperatur.*Wohnzimmer.* set @ ttsSay ("Die aktuelle Temperatur im Wohnzimmer ist " . str_replace('\.',' komma ',ReadingsVal("LaCrosse_Wohnzimmer","temperature","Fehler"))." Grad")


Leider wird aber weder der str_replace noch das ReadingsVal ausgeführt sondern der gesammte String einfach nur vorgelesen.
Habe das ganze auch schon in {} gepackt gehabt, aber dann passiert gar nichts.
Kann mir jemand einen Tipp geben?

Gruß
Matze
Raspberry Pi / CULV3 und JeeLinkLaCrosse
MAX Thermostat
LaCrosse TX29DTH

dieda

Probier es mal so:
Zitat.*voiceRecognitionLastResult.*wie.*warm.*ist.*es.*(draußen|außen).* {my $temp=ReadingsVal("T_Auszen", "temperature", "0");{fhem("set androidTablet ttsSay die Außentemperatur betraegt $temp Grad") } }

Erst die Variable definieren, dann den Text.

Du hast innerhalb des TTS-Befehls die Variable definiert.
Komponenten:
Sensoren und Aktoren: FS20, Max!, Zigbee, Zwave
IODev:  Cul1101, MaxLan, ZWAVE, Deconz
Router: KD-Fritte (6360)
Sonstiges: Raspberries,  1x LMS,1 FHEM, 1 x zum Testen,  Logitech-Clients,  Onkyo, SamsungTV, Squeezebox, TabletUIs

Agamemnon

Vielen Dank für die schnelle Antwort!
Werde das heute Abend mal testen.
Verstehen tu ich das aber immer noch nicht so ganz mit den notifies und den verschiedenen Klammern.
Laut Hilfe:
ZitatIf <command> is enclosed in {}, then it is a perl expression, if it is enclosed in "", then it is a shell command, else it is a "plain" fhem.pl command (chain).
Nach deinem Beispiel wäre dann aber der ReadingsVal Befehl eine "perl expression", müsste aber doch ein fhem Befehl sein, oder?
Wäre wirklich super, wenn mir das mit den Klammern noch mal ganz kurz jemand erklären kann.
Vielen Dank!

Gruß
Matze
Raspberry Pi / CULV3 und JeeLinkLaCrosse
MAX Thermostat
LaCrosse TX29DTH

dieda

Komponenten:
Sensoren und Aktoren: FS20, Max!, Zigbee, Zwave
IODev:  Cul1101, MaxLan, ZWAVE, Deconz
Router: KD-Fritte (6360)
Sonstiges: Raspberries,  1x LMS,1 FHEM, 1 x zum Testen,  Logitech-Clients,  Onkyo, SamsungTV, Squeezebox, TabletUIs