Der RasPi hört aufs Wort [1. Post edit, bessere Lösungen sind da]

Begonnen von Rince, 29 Mai 2013, 18:00:46

Vorheriges Thema - Nächstes Thema

Rince

Update:
Tobi macht gerade ein Modul aus der Geschichte, welches für die Sprachausgabe deulich mehr Features bietet.
http://forum.fhem.de/index.php/topic,18481.0.html
Schaut da mal vorbei, er freut sich sicher über Feedback. Es läuft auch parallel zu dieser Lösung wunderbar.


Dirk hat eine Android App, WebViewControl, gebaut, die zur Spracherkennung gleich die Google API nutzt.
Macht mehr Sinn als der Umweg über Singstar Mikrophone :)
http://forum.fhem.de/index.php/topic,10628.0.html


Kuzl schreibt gerade ein Modul, um universell Sprache zu verarbeiten. Ohne das man jeden einzelnen Befehl von Hand verdrahten muss.
http://forum.fhem.de/index.php/topic,17409.0.html



Noch ein Edit, die Links waren falsch. Danke an Franky.



Hi,

ist nix professionelles oder umwerfendes, aber es funktioniert (wenn auch langsam) und macht Spaß :)

In der c´t Hacks 2/2013 stand ein schöner Artikel über Sprachsteuerung mit dem Raspberry drin.
Ich beschreibe mal kurz die wesentlichen Schritte zur Installation:


Was man braucht:
Einen Raspberry (wobei wohl jeder Linux Rechner tut)
Passende Soundhardware (z.B. Singstar Mikros (das Blaue) => getestet, funktioniert)

Für die Softwareinstallation:

Unter SSH
sudo apt-get install sox mplayer ffmpeg

Wenn es eine Fehlermeldung gibt:
sudo apt-get update

und nochmaliges

sudo apt-get install sox mplayer ffmpeg


dann flutschts :)


in der mplayer.conf ( /etc/mplayer) folgende Zeile hinzufügen:
norlirc=yes
(sudo nano mplayer.conf)

Als nächstes benötigt man das sh Skript, welches die c´t unter der GPL veröffentlicht hat.
Quelle: www.ct.de/ch1302064

Das Skript ctvoice.sh fühlt sich im Verzeichnis
/opt/fhem/contrib
recht wohl, evtl. muss man noch mit chmod die Rechte anpassen.


Jetzt habe ich es ein kleines bisschen modifiziert:
(vermutlich hoffnungslos verschandelt, aber ich bin seit 12 Jahren aus Linux und seinen Skripten raus)

Mein Skript sieht jetzt so aus:
#!/bin/bash

# c't Hardware Hacks - Spracherkennung für den Raspberry Pi, GPL-Lizenz

count=1
lastsize=0
rec=0
first=1

# Der Soundchip des RPI erzeugt vor und nach der Wiedergabe ein Knacken. Deutlich bessere Ergebnisse liefert eine USB-Soundkarte, wie man sie bereits für rund fünf Euro bekommt. Damit mplayer die USB-Soundkarte benutzt, ändert man den Parameter "-ao alsa:device=hw=0.0" in "-ao alsa:device=hw=1.0".

function say {
mplayer -ao alsa:device=hw=0.0 -really-quiet -http-header-fields "User-Agent:Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/537.22 (KHTML, like Gecko) Chrome/25.0.1364.172 Safari/537.22m" "http://translate.google.com/translate_tts?tl=de&q=$1";
}

sox -t alsa hw:1,0 test.wav silence 1 0 0.5% -1 1.0 1% &
sox_pid=$!

while [ $count -le 9 ]
do
   
size=$(stat --printf="%s" test.wav)

if [ $size -gt $lastsize ]
then
if [ $first -eq 0 ]
then
echo "Aufnahme!"
rec=1
else
first=0
fi
else
if [ $rec -eq 1 ]
then
echo "Abschicken"
kill $sox_pid
ffmpeg -loglevel panic -y -i test.wav -ar 16000 -acodec flac file.flac
wget -q -U "Mozilla/5.0" --post-file file.flac --header "Content-Type: audio/x-flac; rate=16000" -O - "http://www.google.com/speech-api/v1/recognize?lang=de-de&client=chromium" | cut -d\" -f12 >stt.txt
cat stt.txt
say "$(cat stt.txt)"

if [[ $(cat stt.txt) =~ "Befehl" ]]
then
echo "Sprachbefehl erkannt!"
say "Sprachbefehl erkannt! Ich könnte jetzt einen beliebigen Shell-Befehl ausführen!"
# mach was
elif [[ $(cat stt.txt) =~ "Wetterbericht" ]]
then
echo "Wetterbericht erkannt!"
say "Ich würde Dir jetzt den Wetterbericht vorlesen! Bring es mir bei!"
# mach was
elif [[ $(cat stt.txt) =~ "Licht an" ]]
then
echo "Licht an"
say "Ich schalte das Licht an"
/opt/fhem/fhem.pl 7072 "set OG_wz_ws_LICHT on"

elif [[ $(cat stt.txt) =~ "Licht aus" ]]
then
echo "Licht aus"
say "Ich schalte das Licht aus"
/opt/fhem/fhem.pl 7072 "set OG_wz_ws_LICHT off"
else
echo "Kein Kommando erkannt..."
fi

sleep 1
bash ctvoice.sh
else
echo "Stille..."
fi
rec=0
fi

lastsize=$size

sleep 1

done




Was es jetzt kann:
Mit "Licht an" mein Wohnzimmerlicht einschalten oder mit "Licht aus" ausschalten :)
Ansonsten plappert es fröhlich alles nach, was man ihm sagt.

Gestartet wird es mit ./ctvoice.sh

Anmerkung:
Wenn man nix hört (alles was nach "say" kommt, sollte man hören), muss man auf dem Rapberry evtl. noch die Soundausgabe umstellen auf den analogen Ausgang:
sudo amixer cset numid=3 1
http://www.raspberrypi-spy.co.uk/2012/06/raspberry-pi-speakers-analog-sound-test/

Was man draus machen könnte:
Eine Perl Version die direkt von FHEM aus läuft, wäre schick.
Dann könnte man vielleicht über Attribute Sprachbefehle für einzelne Devices definieren.
Und man wäre nicht darauf angewiesen, den erkannten Text in eine Datei zu speichern. Sondern evtl. könnte man daraus direkt Befehle generieren...

Wo liegt jetzt der Sinn?
Ich glaube, es ist eine gute Ausgangsbasis für eigene Spielereien :)
Wer zu meinen Posts eine Frage schreibt und auf eine Antwort wartet, ist hiermit herzlich eingeladen mich per PN darauf aufmerksam zu machen. (Bitte mit Link zum betreffenden Thread)

Rince

Sodala.
Ich habe noch ein bisserl gespielt.

Ein großer Nachteil von obigem Skript ist, dass alles über die arme SD Karte abläuft. Das hat zwei Nachteile:
1. langsam
2. SD Karten sind nicht gebaut für unendlich viele Schreibzyklen

Lösung:
Wir brauchen eine RAMDISK

Bekommt man so:
in der /etc/fstab folgenden Eintrag hinzufügen (sudo nano /etc/fstab)

tmpfs           /tmp              tmpfs   defaults,noatime,mode=1777 0       0

Damit wird das /tmp Verzeichnis zukünftig auf eine Ramdisk gemounted.

Jetzt im Skript von oben folgende Anpassungen vornehmen:

Alles was als Datei gespeichert wird, um die Pfadangabe /tmp/ ergänzen:

Aus test.wav wird /tmp/test.wav
aus file.flac wird /tmp/file.flac
aus stt.txt wird /tmp/stt.txt

Überall wo das Zeug auftaucht...

=> Die Reaktion wird wesentlich schneller
=> unsere SD Karte wird nicht weiter belastet :)
Wer zu meinen Posts eine Frage schreibt und auf eine Antwort wartet, ist hiermit herzlich eingeladen mich per PN darauf aufmerksam zu machen. (Bitte mit Link zum betreffenden Thread)

Puschel74

Hallo,

auch wenn keine Reaktionen kommen - bleib bitte dran.
Ich verfolge den Beitrag weil ich den geinal finde - auch wenn es nur eine Spielerei ist ;-)

Grüße
Zotac BI323 als Server mit DBLog
CUNO für FHT80B, 3 HM-Lan per vCCU, RasPi mit CUL433 für Somfy-Rollo (F2F), RasPi mit I2C(LM75) (F2F), RasPi für Panstamp+Vegetronix +SONOS(F2F)
Ich beantworte keine Supportanfragen per PM! Bitte im Forum suchen oder einen Beitrag erstellen.

Rince

:)

Logisch :)
Wobei das Umsetzen als Perl Skript wohl länger dauert, wenn es überhaupt klappt :)

Ich muss mir mal näher ansehen, wie die Jungs von Asterisk das ganze gelöst haben mit den Frage / Antwort - spielchen
Ich denke, in Perl wäre es besser aufgehoben als in einem SH Skript.

Habe mir übrigens grade mal die CPU Auslastung angesehen:
SOX braucht so etwa 6% (der läuft quasi immer), der mplayer, wenn er mal läuft (passiert ja nur bei der Sprachausgabe), so um die 25%.


Als Zwischenfazit:
Was etwas stört, dass man nicht unbedingt weiß, was das Skript grade tut. Wenn es grade am Konvertieren / Upload / Download /Wiedergabe ist, reagiert es nicht auf die Spracheingabe. Ist ja logisch, wird ja SOX mit kill abgeschossen wenn es anspringt.
Bei fehlerhaftem Ansprechen von SOX (es meint also man sagt etwas, obwohl man das gar nicht tut) kann man sagen was man will, es wird nicht gehört. Ohne die Konsole im Fenster bekommt man es aber nicht mit.


Jedenfalls ist das blaue SingStar Mikrofon ziemlich gut geeignet.
=> es ist in Sekunden ein/ausgeschaltet
solange es aus ist, reagiert SOX ja auf nix :)


Lang die Rede, kurz der Sinn:
Man sollte mal versuchen, das Skript auf Perl zu portieren :)
Wer zu meinen Posts eine Frage schreibt und auf eine Antwort wartet, ist hiermit herzlich eingeladen mich per PN darauf aufmerksam zu machen. (Bitte mit Link zum betreffenden Thread)

Rince

Hi,

ich pfusche mich so weiter durch :)

Hab jetzt ein eigenes sh Skript gebastelt, welches sich say.sh nennt.

#!/bin/bash
mplayer -ao alsa:device=hw=0.0 -really-quiet -http-header-fields "User-Agent:Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/537.22 (KHTML, like Gecko) Chrome/25.0.1364.172 Safari/537.22m" "http://translate.google.com/translate_tts?tl=de&q=Test";


Wenn man dieses so aufruft, erzählt der mplayer brav "Test"

Wenn man das Test durch $1 ersetzt, kann man das Ding mit einem Parameter aufrufen, der vorgelesen wird:

./say.sh "Dieser Text wird jetzt vorgelesen"



Ob das irgend wem was nützt, kann ich nicht sagen.

Ich persönlich fände ja Sprachfeedbacks sehr angenehm. Jetzt muss ich einen Eintrag in die 99Utils basteln, der mir das Skript mit dem Parameter aufruft.
sub say($)
{
/opt/fhem/contrib/say.sh @_;
}


Ist es schon mal nicht :)
ZitatTransliteration pattern not terminated at ./FHEM/99_Utils.pm line 237.




Edit:
So gibts beim Speichern schon mal keine Fehlermeldung:
sub say($)
{
my ($Text) = @_;
"/opt/fhem/contrib/say.sh $Text";
}
Wer zu meinen Posts eine Frage schreibt und auf eine Antwort wartet, ist hiermit herzlich eingeladen mich per PN darauf aufmerksam zu machen. (Bitte mit Link zum betreffenden Thread)

Rince

Wieder einen Schritt weiter:

So wird das Skript zumindest ausgeführt:

sub say($)
{
my $Text = @_;
#sh /opt/fhem/contrib/say.sh;
`/opt/fhem/contrib/say.sh $Text`;
}


Was jetzt noch nicht geht, ist die Parameterübergabe.

Schlau wäre, wenn man FHEM sagen könnte:
say Irgend etwas

Das Irgend etwas muss dann in " " rein und als Parameter an das say.sh Skript übergeben werden:

/opt/fhem/contrib/say.sh "Irgend etwas"


Wie geht denn das jetzt???
Wer zu meinen Posts eine Frage schreibt und auf eine Antwort wartet, ist hiermit herzlich eingeladen mich per PN darauf aufmerksam zu machen. (Bitte mit Link zum betreffenden Thread)

Puschel74

Hallo,

evtl. muss noch ein sudo vorn dran wenn fhem nicht auf die audiohardware zugreifen darf und evtl. noch ein
system vorne dran.
Also evtl. so:
`system /opt/fhem/contrib/say.sh $Text`

Mal ohne sudo.

Grüße
Zotac BI323 als Server mit DBLog
CUNO für FHT80B, 3 HM-Lan per vCCU, RasPi mit CUL433 für Somfy-Rollo (F2F), RasPi mit I2C(LM75) (F2F), RasPi für Panstamp+Vegetronix +SONOS(F2F)
Ich beantworte keine Supportanfragen per PM! Bitte im Forum suchen oder einen Beitrag erstellen.

Rince

Danke Puschel,

das Problem mit der Audio Hardware habe ich so gelöst:

sudo gpasswd -a fhem audio
+ Neustart

=> Damit darf der User fhem die Audio Hardware benutzen :)


Also langsam zum Testen:
Wir lassen das say.sh Skript wie es ist (es erwartet als Parameter also den Text, der gesprochen werden soll; dieser muss in  " " stehen wenn es mehre Wörter sind)

in der 99 sieht es zum Testen so aus:
`/opt/fhem/contrib/say.sh Hallo`;      (<= das bedeutet, der Parameter wird ignoriert, es wird immer Hallo übergeben)

Tippt man in die FHEM Befehlszeile jetzt ein:
{say "huhu"}

dann kommt brav die Ansage Hallo aus den Lautsprechern :)


=> Das sh Skript prinzipiell läuft, sonst täte man nix hören :)



2ter Schritt:
Jetzt will ich den Text den ich als Parameter angebe, vorgelesen bekommen, der $ muss also ausgewertet werden.

Schreibe ich jetzt:
sub say($)
{
my $Text = @_;
`/opt/fhem/contrib/say.sh $Text`;
}


Und rufe es auf mit
Zitat{say "huhu"}

Dann spricht das Skript: EINS (???????)
Offenbar wird aus $Text in FHEM als Skriptparameter eine 1 ????


Wie bekomme ich jetzt diesen $Text wirklich 1:1 als Skriptparameter übernommen???
Wer zu meinen Posts eine Frage schreibt und auf eine Antwort wartet, ist hiermit herzlich eingeladen mich per PN darauf aufmerksam zu machen. (Bitte mit Link zum betreffenden Thread)

Puschel74

Hallo,

sub say($)
{
my $Text = @_;
`/opt/fhem/contrib/say.sh $Text`;
}


steht in @_ wirklich der Text?
Versuchs mal mit $EVTPART0 oder $EVTPART1 (ich hab grad nicht im Kopf was passt - evtl. mal loggen lassen)
Oder lass mal $Text loggen.

Die 1 (EINS) vermute ich mal ist der Rückgabewert der Funktion.

Grüße

Edith:
Die Übergabe einer Variable habe ich in meiner Sub so gelöst:
"sudo i2cget -y 1 ".$sensor." 0x00 w &"
Zotac BI323 als Server mit DBLog
CUNO für FHT80B, 3 HM-Lan per vCCU, RasPi mit CUL433 für Somfy-Rollo (F2F), RasPi mit I2C(LM75) (F2F), RasPi für Panstamp+Vegetronix +SONOS(F2F)
Ich beantworte keine Supportanfragen per PM! Bitte im Forum suchen oder einen Beitrag erstellen.

Rince

Danke für die Hilfe.
Der Tipp, dass @_ nicht den Inhalt der Variablen bekommt war völlig richtig.


So funktioniert es:
sub say($)
{
my $Text = @_;
`/opt/fhem/contrib/say.sh "@_"`;
}


Mit
{say "hier muss man den Text den man gesagt haben will reinschreiben"}
(in der FHEM Befehlszeile)
Plappert die Kiste jetzt los :)



Meinst du es lohnt sich, das in den Codeschnippseln zu posten?
Also mplayer installieren, Rechte setzen, die say.sh und den Eintrag in die 99 Utils?
Wer zu meinen Posts eine Frage schreibt und auf eine Antwort wartet, ist hiermit herzlich eingeladen mich per PN darauf aufmerksam zu machen. (Bitte mit Link zum betreffenden Thread)

Steffen

Hallo!

Habe mir das jetzt auch auf den pi installiert und "say" klappt über Pi und fhem gut, danke nochmal dafür.

Würde das gerne auch mit dem Singstar Mikro versuchen, aber bevor ich das jetzt irgendwo hole, wollte ich noch fragen wie man den Befehl dann aktiviert(bestimmter Satz) oder hört es immer zu??

Mfg Steffen

Rince

Also, prinzipiell hört es immer zu und wenn ein gewisser Schwellwert überschritten wird, zeichnet er auf. Das permanente Zuhören braucht etwas CPU Last, das habe ich irgendwo vorne gepostet glaube ich :)

Das eigentliche Problem ist, dass solange man das Skript aus SSH heraus startet, wenn man die SSH Konsole schließt das Teil im Hintergrund weiterläuft, aber wohl nicht mehr aktiv an der Hardware rumfummeln kann.

Vermutlich müsste man das ganze Skript direkt aus FHEM heraus lostreten, aber ich bin kein Linux Freak.

Probiere es einfach mal aus. Wenn du die Fstab modifizierst und das Skript mit meinen Änderungen benutzt, wird die Geschwindigkeit durchaus akzeptabel, da dann das ganze in einer RAMDisk läuft. Dürfte auch sehr viel schonender für die SD Karte sein, da es keine Schreib/Lesezugriffe mehr generiert.


Versuch es mal und schreib mir, wie es dir gefallen hat. Es funktioniert übrigens nur mit dem blauen Mikrofon! (Liegt daran, dass von den beiden Mikros eines nur links und eines nur rechts überträgt (jedes ist also mono) und Google nur 1 Kanal auswertet. Den vom blauen Mikro :)


Meine Idee, wenn es noch jemand anderen interessiert:
Im Moment ist das ganze ja hart verdrahtet. Jede Funktion braucht also einen Befehl, der genau so an FHEM übergeben wird, um ihn aus zu führen.


Das erscheint mir weitgehend umständlich.

Ich fände es wesentlich eleganter, wenn man die Textdatei mit Perl etwas intelligenter nach Schlagwörtern durchsuchen könnte :)
Also in etwa so:

Taucht in der Textdatei ein "mache", "schalte", "stelle" oder sowas auf, dann wird es prinzipiell ein "set" Befehl, der wird $1

Wenn das so ist, benötigen wir noch weitere Parameter:
Wo?
Welches Gerät?
Was ist damit zu tun?

Also Schlagwörter für wo:
"alle", überall", "Wohnzimmer", "Schlafzimmer" etc...

Welches Gerät Schlagwörter:
"Heizung", "Licht" etc...

Was:
"Grad" (dann den Zahlenwert davor nehmen), "an", "aus", "Prozent" (wieder Zahlenwert davor), "wärmer" (dann aktuellen Wert abfragen und um 10% erhöhen) (ebenso wie bei kälter, kauter, leiser, heller, dunkler etc...)



Ich denke, auf diese Weise müsste man einen FHEM Befehl erzeugen können.


set OG_wz_WS_LICHT on
=Obergeschoss_Wohnzimmer_Wandschalter_ LICHT

Mach das Licht im Wohnzimmer an

Mach im Wohnzimmer das Licht an

Mach bitte im Wohnzimmer das Licht an...

Bei fehlen von einem Parameter könnte man nachfragen lassen: Welches, welche...


Ich denke, dieser Weg sollte mit Perl gut beschreitbar sein :)



Nachtrag:
Auf diese Weise müsste auch ein Kommando ausgewertet werden können, um das ganze überhaupt auszulösen. Hat deine Haussteuerung schon einen Namen? Dann könntest du dir einen ausdenken :)

Was das imme rzuhören betrifft, das ist mit den Singstar Mikrofonen recht gut, da man die in Sekunden Aus/Eingeschaltet hat. So gibt es wenig Fehlalarme :)
Wer zu meinen Posts eine Frage schreibt und auf eine Antwort wartet, ist hiermit herzlich eingeladen mich per PN darauf aufmerksam zu machen. (Bitte mit Link zum betreffenden Thread)

Steffen

Ja das wäre eine gute Idee...aber ich würde die Befehle mit einem Start befehl absichern, man stelle sich vor bei einer Party wo der Kumpel erzählt wie es das "Licht aus" gemacht hatte und alle auf einmal im Dunkeln stehen ist auch nicht das wahre;-)

Aber ich finde das sehr sehr spannend vielleicht mal das Haus per Sprach befehl zu steuern.

Mfg Steffen

 

Rince

Deshalb ja die Frage, ob diene Haussteuerung schon einen Namen hat :)

"Computer" ist blöd, kommt viel zu oft vor :)

"Susi" oder so ist viel praktischer (wenn nicht zufällig Familienangehörige so heißen :) )

Das wäre quasi die Voraussetzung, damit überhaupt weiter die Sprache abgearbeitet wird.


Aber mach dir wegen der Party nicht zu viel Kopf, ich kann mir nicht vorstellen, dass bei dem Hintergrundlärm noch irgend etwas erkannt wird ;)



Der riesige Vorteil liegt aber darin, dass du so im Endeffekt Befehle definieren kannst, für die du keinen Schalter/Aktor brauchst (weil die sind ja meist eher teuer).

So ein:
"Ich fahre in den Urlaub, tschüss"

Ist dahingehend einfach billig :)
(und alle Verbraucher gehen aus, eine Anwesenheitssimulation läuft an, die Bewegungsmelder werden scharf...)
Wer zu meinen Posts eine Frage schreibt und auf eine Antwort wartet, ist hiermit herzlich eingeladen mich per PN darauf aufmerksam zu machen. (Bitte mit Link zum betreffenden Thread)

Steffen

Guten Morgen!

Komme da nicht weiter, wie bekomme ich das "say" in diesen Code:

define SteffenZuHause notify Steffen {\
  my $Steffen1 = ReadingsVal("Steffen","state","99");;\
  my $L1 = Value("SteffenHome");;\
  if((($Steffen1) eq "present") && (($L1) eq "off")){\
    fhem("set say "Hallo Steffen alles Online"");;\
    fhem("set SteffenHome on");;\
  }\
else {\
  if((($Steffen1) eq "absent") && (($L1) eq "on")){\
    fhem("set SteffenHome off");;\
  }\
}}


so funktioniert es leider nicht?

Mfg Steffen

Rince

Bin nicht zu Hause, ich schau mal heute Nacht.

Aber im Moment wird set nicht gehen, weil so wie ich es bis jetzt verstanden habe, die Sub nicht so angesprochen werden kann.
Dafür müssten wir also erst in der fhem.cfg ein Device anlegen, welches dann das say aufruft und als webCmd den Text übergibt.
Wenn ich da keinen gedanklichen Wurm drin habe jedenfalls.

Wie gesagt, ich schau mal heute Abend.
Wer zu meinen Posts eine Frage schreibt und auf eine Antwort wartet, ist hiermit herzlich eingeladen mich per PN darauf aufmerksam zu machen. (Bitte mit Link zum betreffenden Thread)

Rince

Erster Versuch:


In die fhem.cfg eingetragen

### Dummy für TTS
define TTS dummy
attr TTS webCmd
attr TTS room Wohnzimmer
define myTTS notify TTS { say($EVENT)};;


Jetzt kannst du bei dem Dummy TTS (bei mir dem Wohnzimmer zugeordnet)irgend einen Text reinschreiben, und schon quasselt die Dame wieder los :)

Beispiel:
Tippe in die Ausführungszeile von FHEM:
set TTS Hallo hier ist der vorzulesende Text, Gänsefüsschen braucht es dabei gar nicht
Wer zu meinen Posts eine Frage schreibt und auf eine Antwort wartet, ist hiermit herzlich eingeladen mich per PN darauf aufmerksam zu machen. (Bitte mit Link zum betreffenden Thread)

Steffen

Zitat von: Rince schrieb am So, 23 Juni 2013 18:53Erster Versuch:


In die fhem.cfg eingetragen

### Dummy für TTS
define TTS dummy
attr TTS webCmd
attr TTS room Wohnzimmer
define myTTS notify TTS { say($EVENT)};;


Jetzt kannst du bei dem Dummy TTS (bei mir dem Wohnzimmer zugeordnet)irgend einen Text reinschreiben, und schon quasselt die Dame wieder los :)

Beispiel:
Tippe in die Ausführungszeile von FHEM:
set TTS Hallo hier ist der vorzulesende Text, Gänsefüsschen braucht es dabei gar nicht

Hallo!

Erster versuch und gleich schiff versenkt;-)

Klappt genau so wie es soll...vielen dank dafür

Mfg Steffen

Stefan M.

Hallo zusammen,
irgendwie scheint bei mir was nicht zu funktionieren.
Es wird ein Text aufgenommen. das .wav File wird angelegt und hat auch den aufgenommenen Text als Inhalt, allerdings schneller als gesprochen. Wo kann ich die Geschwindigkeit einstellen ?
Ob das .flac File angelegt wird kann ich nicht sagen, ich finde es jedenfalls nicht im Verzeichnis. Das stt.txt File bleibt immer leer.

Habt Ihr eine Idee, wo ich suchen kann ?

lg
Stefan
 
FHEM auf 3 x RaspberryPi, 1 x Fritzbox,1 x Win. FS20 über CUL, HomeMatic über HMLan, 6 x  HM_CC_RT_DN,2 x HM_LC_BL1_FM,3 x HM_SEC_KEY,2 x HM_RC_Key4_2,7 x HM_SEC_SC,1 x HM_SEC_WDS,1 x HM_Sen_RD_O, 1x HM_Sen_Wa_Od,2 x HM_RC_Key4_2, 5 x HM-ES-PMSw1-Pl,1 x HM_LC_SW4_WM,1 x HM_SCI_3_FM

Stefan M.

Hallo zusammen

Danke für say() das funktioniert bei mir. Nach drücken einer Taste der Fernbedienung wird gesagt welche Taste gedrückt wird.

lg
Stefan
FHEM auf 3 x RaspberryPi, 1 x Fritzbox,1 x Win. FS20 über CUL, HomeMatic über HMLan, 6 x  HM_CC_RT_DN,2 x HM_LC_BL1_FM,3 x HM_SEC_KEY,2 x HM_RC_Key4_2,7 x HM_SEC_SC,1 x HM_SEC_WDS,1 x HM_Sen_RD_O, 1x HM_Sen_Wa_Od,2 x HM_RC_Key4_2, 5 x HM-ES-PMSw1-Pl,1 x HM_LC_SW4_WM,1 x HM_SCI_3_FM

Rince

Hi,

mit dem "say" meinst du den Eintrag in der 99_utils und dem Eintrag in der fhem.cfg?
Wärst du so lieb zu posten, wie du das mit der gesprochenen Zahl gelöst hast?



Was die Aufnahme angeht:
Soweit bin ich leider noch nicht :)

Das Skript aus der C´t ist ja zunächst ein Papagei. So gesehen von FHEM völlig losgelöst.

Hast du die Speicherorte für die Ramdisk überall geändert? Das wäre das erste, was mir einfällt.

Ich will aber mit dem Skript nicht viel weiter machen, da es überaus umständlich zu pflegen ist. Jeden möglichen Befehl händisch einbauen, das stelle ich mir lästig vor :(



Ich überlege zur Zeit, wie man das schlau integrieren kann ;)
Ein Modul zum Sprachverständnis sozusagen.

Um meine Gedanken mal zu posten (nicht erschrecken, als CSV speichern und in die Tabellenkalkulation damit):
Zitat"Schlüsselwort",,"susi",,,,,
,,,,,,,
"Ort","wo",,,,,,
"DG",,"dach","dachgeschoss","ganz oben",,,
"OG","default","oben","obergeschoss",,,,
"UG",,"unten","untergeschoss",,,,
"GH",,"im garten","draußen",,,,
"*",,"überall",,,,,
,,,,,,,
"room","in welchem zimmer",,,,,,
"bz",,"bad","badezimmer","toilette",,,
"wz",,"wohnzimmer",,,,,
"sz",,"schlafzimmer",,,,,
"ez",,"esszimmer",,,,,
"fl1",,"vorderer flur","vorderen flur",,,,
"fl2",,"hinterer flur","hinteren flur",,,,
"ab",,"büro","arbeitszimmer",,,,
"*",,"überall","in allen zimmern","in allen räumen",,,
,,,,,,,
"device","welches gerät",,,,,,
"TTS",,,,,,,
"WS",,"licht","lichter","lampe","lampen",,
"HZ",,"heizung","heizkörper","heizungen",,,
"*",,"alle",,,,,
,,,,,,,
,,,,,,,
,,,,,,,
,,,,,,,
"command","was soll ich tun",,,,,,
"set",,"schalte","stelle","mach","mache","dreh","drehe"
,,,,,,,
,,,,,,,
,,,,,,,
,,,,,,,
"on",,"an","ein",,,,
"off",,"aus",,,,,
,,,,,,,
"on-for-timer",,"für",,,,,
,,,,,,,
"off-for-timer",,"in",,,,,


Eine CSV Datei:
ganz links steht der passende FHEM Code, dann folgen einfach die Wörter, die ihn entsprechend triggern.
Unterteilt in Räume, Devices etc. Daneben steht noch die Frage, die die Haussteuerung stellen soll, wenn der Wert fehlt (so in etwa jedenfalls) :)

Das sieht hier etwas unübersichtlich aus, einfach mal als csv speichern und in der Tabellenkalkulation des eigenen Vertrauens laden, dann wird das schön übersichtlich.


Das ganze soll dann in einem Perl Modul entsprechend aufbereitet werden, um einen passenden Befehl für FHEM zu generieren.

Nachdem es nur eine CSV Datei ist, die sich mit jeder Tabellenkalkulation bequem bearbeiten lässt, sollte diese gut an die persönlichen Bedürfnisse anpassbar sein.

Es ist auch nur ein erster Versuch, so Sachen wie Fragen sind noch nicht berücksichtigt :)


Und überflüssig zu erwähnen, dass ich noch keine Zeile Perl geschreiben habe :)
(Aber ich weiß mittlerweile, wie aus Text einen Text machen kann, der nur Kleinbuchstaben enthält :)


Frage:
Zum Aufnehmen von Text muss ja "sox" im Hintergrund vor sich hin werkeln.

Von der Rechenleistung her ist es kein großes Problem für den Raspi, aber evtl. mag sich der ein oder andere gestört davon fühlen (und ich weiß auch noch nicht, wie ich dieses Sox im Hintergrund von FHEM aus laufen lassen kann)

Ist es schlauer, dass Ding immer gestartet zu haben, oder ist es besser, wenn eine bestimmte Taste gedrückt wird das Teil anzuwerfen?
Wer zu meinen Posts eine Frage schreibt und auf eine Antwort wartet, ist hiermit herzlich eingeladen mich per PN darauf aufmerksam zu machen. (Bitte mit Link zum betreffenden Thread)

Stefan M.

Hallo
ich hab mir es etwas einfach gemacht



### Dummy für TTS
define TTS dummy
attr TTS room System
attr TTS webCmd 1
define myTTS notify TTS { say($EVENT)};;


define No_Voice_on_1 notify FS20_ab1c00:on.* { fhem("set TTS Taste 1 Ein")   }
attr No_Voice_on_1 room Notify
define No_Voice_off_1 notify FS20_ab1c00:off.* { fhem("set TTS Taste 1 Aus")   }
attr No_Voice_off_1 room Notify

define No_Voice_on_2 notify FS20_ab1c01:on.* { fhem("set TTS Taste 2 Ein")   }
attr No_Voice_on_2 room Notify
define No_Voice_off_2 notify FS20_ab1c01:off.* { fhem("set TTS Taste 2 Aus")   }
attr No_Voice_off_2 room Notify



Die RAMDisk habe ich nicht zum laufen bekommen. Hast Du da nochmal eine genaue Anleitung dazu ?
Dafür habe ich mir heute die SD Karte geschossen.

lg
Stefan

FHEM auf 3 x RaspberryPi, 1 x Fritzbox,1 x Win. FS20 über CUL, HomeMatic über HMLan, 6 x  HM_CC_RT_DN,2 x HM_LC_BL1_FM,3 x HM_SEC_KEY,2 x HM_RC_Key4_2,7 x HM_SEC_SC,1 x HM_SEC_WDS,1 x HM_Sen_RD_O, 1x HM_Sen_Wa_Od,2 x HM_RC_Key4_2, 5 x HM-ES-PMSw1-Pl,1 x HM_LC_SW4_WM,1 x HM_SCI_3_FM

Rince

Ah, ok :-)
Ich war neugierig, ob das Teil auch Variablen vorlesen kann. Muss es wohl selber ausprobieren wie man die maskieren muss :-)

Das mit der SD Karte tut mir leid.


Was an der Anleitung
Link
hat denn nicht geklappt?

Mit dem fstab Eintrag wir ne Ramdisk erzeugt, die im Verzeichnis /tmp gemountet wird.

Holla,
es kann sein, dass das Verzeichnis leer sein muss!

Ob es funktioniert hat, kann man recht leicht nachprüfen: wenn der Rechner gebootet hat mit den fstab Einträgen, dann leg darin ne Datei an.
Anschließend neu booten.
Nun sollte das Verzeichnis wieder leer sein :-)
Wer zu meinen Posts eine Frage schreibt und auf eine Antwort wartet, ist hiermit herzlich eingeladen mich per PN darauf aufmerksam zu machen. (Bitte mit Link zum betreffenden Thread)

Steffen

Zitat von: Rince schrieb am Mo, 24 Juni 2013 23:39Ah, ok :-)
Ich war neugierig, ob das Teil auch Variablen vorlesen kann. Muss es wohl selber ausprobieren wie man die maskieren muss :-)

Das mit der SD Karte tut mir leid.


Was an der Anleitung
Link
hat denn nicht geklappt?

Mit dem fstab Eintrag wir ne Ramdisk erzeugt, die im Verzeichnis /tmp gemountet wird.

Holla,
es kann sein, dass das Verzeichnis leer sein muss!

Ob es funktioniert hat, kann man recht leicht nachprüfen: wenn der Rechner gebootet hat mit den fstab Einträgen, dann leg darin ne Datei an.
Anschließend neu booten.
Nun sollte das Verzeichnis wieder leer sein :-)

aber kann es sein das das neue Skript "say.sh", nicht mehr /tmp nutzt denn beim "ctvoice" musste man ja die Pfade zu /tmp ändern oder verstehe ich da was Falsch?

Mfg Steffen

Rince

Das einzelne say.sh speichert nicht zwischen. Es ruft den mplayer mit einer etwas längeren Befehlszeile auf. Die veranlasst den mplayer die Seite Google translate aufzurufen, einen Text zu übergeben, um Sprachsynthese zu bitten und diese Sprache dann gleich direkt abzuspielen :-)
Wer zu meinen Posts eine Frage schreibt und auf eine Antwort wartet, ist hiermit herzlich eingeladen mich per PN darauf aufmerksam zu machen. (Bitte mit Link zum betreffenden Thread)

Tobias

Hi,
wenn ich auf der Raspi-Console die mplayer Zeile aufrufe, kommst statt "Test" nur ein "T" aus dem Lautsprecher. Eigentlich fehlt jedem Satz die letzte Silbe. Ist das bei Euch nicht so?
mplayer -ao alsa:device=bluetooth -http-header-fields "User-Agent:Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/537.22 (KHTML, like Gecko) Chrome/25.0.1364.172 Safari/537.22m" "[url]http://translate.google.com/translate_tts?tl=de&q=Test[/url]";]

Mein Raspi plappert nicht direkt, sondern per Bluetooth-Stick und Bluetooth-Lautsprecher "Creative D80".
Maintainer: Text2Speech, TrashCal, MediaList

Meine Projekte: https://github.com/tobiasfaust
* PumpControl v2: allround Bewässerungssteuerung mit ESP und FHEM
* Ein Modbus RS485 zu MQTT Gateway für SolarWechselrichter

Trebor5

Hallo,

ich habe mich jetzt schon x mal durch diesen Thread durchgelesen aber leider kommt aus Fhem kein Ton .

Wenn ich auf der Raspconsole

mplayer -ao alsa:device=hw=0.0 -really-quiet -http-header-fields "User-Agent:Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/537.22 (KHTML, like Gecko) Chrome/25.0.1364.172 Safari/537.22m" "http://translate.google.com/translate_tts?tl=de&q=Test";

eingebe kommt "Test" aus denn Lautsprechern.

Habe folgendes gemacht :

sudo apt-get install sox mplayer ffmpeg
sudo apt-get update
sudo apt-get install sox mplayer ffmpeg
in der mplayer.conf ( /etc/mplayer) folgende Zeile hinzugefügt irgendwo rein  :  norlirc=yes
http://www.ct.de/ch1302064 script runtergeladen und nach /opt/fhem/contrib kopiert

kompletten inhalt gegen

#!/bin/bash

# c't Hardware Hacks - Spracherkennung für den Raspberry Pi, GPL-Lizenz

count=1
lastsize=0
rec=0
first=1

# Der Soundchip des RPI erzeugt vor und nach der Wiedergabe ein Knacken. Deutlich bessere Ergebnisse liefert eine USB-Soundkarte, wie man sie bereits für rund fünf Euro bekommt. Damit mplayer die USB-Soundkarte benutzt, ändert man den Parameter "-ao alsa:device=hw=0.0" in "-ao alsa:device=hw=1.0".

function say {
mplayer -ao alsa:device=hw=0.0 -really-quiet -http-header-fields "User-Agent:Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/537.22 (KHTML, like Gecko) Chrome/25.0.1364.172 Safari/537.22m" "http://translate.google.com/translate_tts?tl=de&q=$1";
}

sox -t alsa hw:1,0 test.wav silence 1 0 0.5% -1 1.0 1% &
sox_pid=$!

while [ $count -le 9 ]
do
   
size=$(stat --printf="%s" test.wav)

if [ $size -gt $lastsize ]
then
if [ $first -eq 0 ]
then
echo "Aufnahme!"
rec=1
else
first=0
fi
else
if [ $rec -eq 1 ]
then
echo "Abschicken"
kill $sox_pid
ffmpeg -loglevel panic -y -i test.wav -ar 16000 -acodec flac file.flac
wget -q -U "Mozilla/5.0" --post-file file.flac --header "Content-Type: audio/x-flac; rate=16000" -O - "http://www.google.com/speech-api/v1/recognize?lang=de-de&client=chromium" | cut -d\" -f12 >stt.txt
cat stt.txt
say "$(cat stt.txt)"

if [[ $(cat stt.txt) =~ "Befehl" ]]
then
echo "Sprachbefehl erkannt!"
say "Sprachbefehl erkannt! Ich könnte jetzt einen beliebigen Shell-Befehl ausführen!"
# mach was
elif [[ $(cat stt.txt) =~ "Wetterbericht" ]]
then
echo "Wetterbericht erkannt!"
say "Ich würde Dir jetzt den Wetterbericht vorlesen! Bring es mir bei!"
# mach was
elif [[ $(cat stt.txt) =~ "Licht an" ]]
then
echo "Licht an"
say "Ich schalte das Licht an"
/opt/fhem/fhem.pl 7072 "set OG_wz_ws_LICHT on"

elif [[ $(cat stt.txt) =~ "Licht aus" ]]
then
echo "Licht aus"
say "Ich schalte das Licht aus"
/opt/fhem/fhem.pl 7072 "set OG_wz_ws_LICHT off"
else
echo "Kein Kommando erkannt..."
fi

sleep 1
bash ctvoice.sh
else
echo "Stille..."
fi
rec=0
fi

lastsize=$size

sleep 1

done


ausgetauscht.

sudo amixer cset numid=3 1

Test unter http://www.raspberrypi-spy.co.uk/2012/06/raspberry-pi-speakers-analog-sound-test/ gemacht alles gut auf der Raspberry Console.

in der /etc/fstab ganz nach oben folgenden Eintrag hinzufügen

tmpfs           /tmp              tmpfs   defaults,noatime,mode=1777 0       0

eine Datei in denn Ordner tmp kopiert danach neustart die Datei ist weg also funzt die Ramdisk.


Also

Aus test.wav wird /tmp/test.wav
aus file.flac wird /tmp/file.flac
aus stt.txt wird /tmp/stt.txt

CTvoice.sh so abgeändert


#!/bin/bash

# c't Hardware Hacks - Spracherkennung für den Raspberry Pi, GPL-Lizenz

count=1
lastsize=0
rec=0
first=1

# Der Soundchip des RPI erzeugt vor und nach der Wiedergabe ein Knacken. Deutlich bessere Ergebnisse liefert eine USB-Soundkarte, wie man sie bereits für rund fünf Euro bekommt. Damit mplayer die USB-Soundkarte benutzt, ändert man den Parameter "-ao alsa:device=hw=0.0" in "-ao alsa:device=hw=1.0".

function say {
mplayer -ao alsa:device=hw=0.0 -really-quiet -http-header-fields "User-Agent:Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/537.22 (KHTML, like Gecko) Chrome/25.0.1364.172 Safari/537.22m" "http://translate.google.com/translate_tts?tl=de&q=$1";
}

sox -t alsa hw:1,0 /tmp/test.wav silence 1 0 0.5% -1 1.0 1% &
sox_pid=$!

while [ $count -le 9 ]
do
   
size=$(stat --printf="%s" /tmp/test.wav)

if [ $size -gt $lastsize ]
then
if [ $first -eq 0 ]
then
echo "Aufnahme!"
rec=1
else
first=0
fi
else
if [ $rec -eq 1 ]
then
echo "Abschicken"
kill $sox_pid
ffmpeg -loglevel panic -y -i /tmp/test.wav -ar 16000 -acodec flac /tmp/file.flac
wget -q -U "Mozilla/5.0" --post-file /tmp/file.flac --header "Content-Type: audio/x-flac; rate=16000" -O - "http://www.google.com/speech-api/v1/recognize?lang=de-de&client=chromium" | cut -d\" -f12 >/tmp/stt.txt
cat /tmp/stt.txt
say "$(cat /tmp/stt.txt)"

if [[ $(cat /tmp/stt.txt) =~ "Befehl" ]]
then
echo "Sprachbefehl erkannt!"
say "Sprachbefehl erkannt! Ich könnte jetzt einen beliebigen Shell-Befehl ausführen!"
# mach was
elif [[ $(cat /tmp/stt.txt) =~ "Wetterbericht" ]]
then
echo "Wetterbericht erkannt!"
say "Ich würde Dir jetzt den Wetterbericht vorlesen! Bring es mir bei!"
# mach was
elif [[ $(cat /tmp/stt.txt) =~ "Licht an" ]]
then
echo "Licht an"
say "Ich schalte das Licht an"
/opt/fhem/fhem.pl 7072 "set OG_wz_ws_LICHT on"

elif [[ $(cat /tmp/stt.txt) =~ "Licht aus" ]]
then
echo "Licht aus"
say "Ich schalte das Licht aus"
/opt/fhem/fhem.pl 7072 "set OG_wz_ws_LICHT off"
else
echo "Kein Kommando erkannt..."
fi

sleep 1
bash ctvoice.sh
else
echo "Stille..."
fi
rec=0
fi

lastsize=$size

sleep 1

done



Als nächstes die ctvoice kopiert und in say .sh umbennant.

Diese Zeile ausgetauscht in :
mplayer -ao alsa:device=hw=0.0 -really-quiet -http-header-fields "User-Agent:Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/537.22 (KHTML, like Gecko) Chrome/25.0.1364.172 Safari/537.22m" "http://translate.google.com/translate_tts?tl=de&q=Test";


Eintrag ganz ans ende der 99_myUtils.pm

sub say($)
{
my $Text = @_;
#sh /opt/fhem/contrib/say.sh;
`/opt/fhem/contrib/say.sh $Text`;
}

1;

Dann : sudo gpasswd -a fhem audio + Neustart


{say "huhu"} in der Fhem console bezweckt rein gar nichts !!!!!!!!!!!!!

Könnte man nicht mal die kompletten Codeschnippsel zusammentragen, die Funktionieren ?


Odroid N2,Hauptsensoren Homematic + 1 Wire + 8Kanal Homematic auf Relay Schaltung. Forum Beiträge sind meine letzte Hoffnung nach Stundenlangen erfolglosen suchen und probieren.

Rince

Oh,

ich glaube das ist insgesamt nen Tick anders gelöst.
Ich habe noch einen Befehl dafür definiert.

Bitte um Entschuldigung für das Sprachchaos.


Hier ein Beispiel aus meiner fhem.cfg
## Warnung Bewegung Hof
define Bewegung_Hofeinfahrt notify CUL_HM_HM_Sen_MDIR_O_1A8306:motion { \
fhem ("set TTS jemand ist in der hof einfahrt");;\
}


und, wichtig:
Zitat### Dummy für TTS
define TTS dummy
attr TTS room Wohnzimmer
attr TTS webCmd 1
define myTTS notify TTS { say($EVENT)};;

In der 99myUtils steht folgendes:
#### Sprachausgabe
#### Ruft den Mplayer auf f�r die Sprachausgabe von Google Translate
sub say($)
{
my $Text = @_;
`/opt/fhem/contrib/say.sh "@_"`;
}



So funktioniert das bei mir.

Frage jetzt aber bitte nicht:
Wie kann man Variablennamen ausgeben kann (keine Ahnung wie man die maskieren muss, wenn es mit obiger Lösung überhaupt klappt)

Ich poste auch gerne die Skripte, wenn du willst.

Habe mich darum im Moment nicht gekümmert, da FHEM einfach läuft *tschuldigung*


PS:
Hab im Moment net viel Zeit. Wenn du Fragen hast, schick mir am besten ne PM, das ich es mitbekomme :)
Wer zu meinen Posts eine Frage schreibt und auf eine Antwort wartet, ist hiermit herzlich eingeladen mich per PN darauf aufmerksam zu machen. (Bitte mit Link zum betreffenden Thread)

Hyco

Ich raufe mir gerade die Haare aus....
Über das Terminal per ./say.sh spricht der PI brav alle Texte.
Ich habe in die 99_Utils.pm folgende Code eingegeben:
# start with your own functions below this line
sub say($)
{
my $Text = @_;
`/opt/fhem/contrib/say.sh "@_"`;
}
1;
# behind your last function, we need the following
1;


Wenn ich nun {say "Hallo"} in die FHEM-Konsole eingebe, erhalte ich folgende Meldung von FHEM:
syntax error at (eval 26) line 1, near "say "Hallo""

Ich habe es in vielen verschiedenen Variationen ausprobiert und finde den Fehler leider nicht. Habt Ihr eine Idee, warum FHEM den Befehl nicht richtig interpretiert?

Hyco

OK, ich habe meinen Fehler gefunden. Ich habe die 99_myUtils.pm nicht richtig angelegt. Nun läufst!!!!!

Rince

#30
Freut mich :)

Vielleicht sollte man da doch mal ein FHEM Modul draus basteln?

Das könnte vielleicht dem Ein oder Anderen helfen?

Letztlich ist es ja echt nur ein Mplayer Aufruf. Damit sollte es unter Windows und Linux gut laufen, bei der Fritzbox sehe ich eher schwarz.

Oder man geht nen ganz anderen Weg und bastelt ne Umleitung der Sprachausgabe über DLNA render Devices.
Das böte natürlich gleich die Möglichkeit, bei mehreren Lautsprechern in der Wohnung bestimmte Lautsprecher anzusteuern.  Damit wäre die Fritte auch wieder im Rennen, obgleich das vermutlich etwas Zeit kosten wird, bis die Soundausgabe losläuft. Und vermutlich muss man zwischenspeichern.


Könntet ihr dazu bitte ein kurzes Feedback geben?

Mercy

Rince

Nachtrag:
pDLNA könnte evtl weiterhelfen?
Wer zu meinen Posts eine Frage schreibt und auf eine Antwort wartet, ist hiermit herzlich eingeladen mich per PN darauf aufmerksam zu machen. (Bitte mit Link zum betreffenden Thread)

Hyco

Das ist eine super Idee!
Mein PI meldet jetzt zum Beispiel, dass die Zimmerluft-Qualität schlecht ist und man besser lüften sollte. Die Kinder laufen dann immer schnell zur Terassentür und lassen frische Luft hinein.
Ich möchte nun einen FS20-Bewegungsmelder im Flur installieren. Wenn man daran vorbei geht, sollen einem wichtige Daten des Hauses mitgeteilt werden (z.B. Temperaturen). Kann ich solche Werte irgendwie in Variablen speichern und in einem "say-Block" vorlesen lassen?

Rince

Dank Hyco:

Man kann sich auch den Inhalt von Variablen vorlesen lassen.

Anbei ein Beispiel von Hyco:

define FritzBox FB_CALLMONITOR 192.168.xxx.xxx
attr FritzBox room System
## Jemand ruft mich an
define TelefonAN notify FritzBox:event:.ring { \
  my $number=(ReadingsVal("FritzBox","external_number",""));;\
  my $telname=(ReadingsVal("FritzBox","external_name",""));;\
  if ($number != 1234567)  { fhem("set TTS Achtung ein Anruf von $telname $number");;} \
}


Klappt :)
Wer zu meinen Posts eine Frage schreibt und auf eine Antwort wartet, ist hiermit herzlich eingeladen mich per PN darauf aufmerksam zu machen. (Bitte mit Link zum betreffenden Thread)

koldomon

Mal ne Frage,

ich bin da ein wenig Datenschutz Paranoid und hab da meine Bedenken, dass Google die Texte online übersetzt. Gibts sowas auch als "offline" Lösung? oder sprengt das den PI?
OdroidC1 -> fhem
CUNO -> FS20
CUL -> HomeMatic
TCM310 -> enOcean
DUOFERN -> rademacher

Rince

Lasse zur Zeit nur vorlesen, bis ich menschl. Sprache parsen kann :)

Es gibt TTS Engines, die auf dem Raspi laufen.

Das Problem ist eher, eine gute kostenlose Lösung zu finden. Google hat halt die svox Engine lizensiert, die ist ziemlich gut. Für Spracherkennung böte sich PocketSphinx an. Aber schneller als Google ist das auf dem RasPi wohl nicht.

Ich such aber nochmal, es gab da mal eine richtig geile TTS, die mit Steuerzeichen wunderschön betonen konnte.

Die Lösung hier im Thread hat halt den Charme, ohne zusätzliche Software zu funktionieren.
Wer zu meinen Posts eine Frage schreibt und auf eine Antwort wartet, ist hiermit herzlich eingeladen mich per PN darauf aufmerksam zu machen. (Bitte mit Link zum betreffenden Thread)

Rince

#35
Also:
Eine Engine wäre diese:
http://mary.dfki.de/

Hat den Charme, als Netzwerkdienst bereit zu stehen und open Source zu sein

Leider ist diese Stimme zwar weit weg vom schlimmsten was ich je gehört habe, aber qualitativ auch ebenso weit weg von gut :(


Wer mal etwas umwerfendes hören will:
http://www.nuance.de/for-business/by-solution/customer-service-solutions/solutions-services/inbound-solutions/loquendo-small-business-bundle/tts-demo/german/index.htm

Offenbar braucht das aber Feintuning, siehe hier, zum selber ausprobieren:
http://www.nuance.de/for-business/by-solution/customer-service-solutions/solutions-services/inbound-solutions/loquendo-small-business-bundle/interactive-tts-demo/index.htm



Ansonsten gäbe es noch:
http://www.nuance.com/vocalizer5/flash/index.html



Und, wir sind mit dem Problem keinesfalls alleine:
http://ubuntuforums.org/showthread.php?t=2111436



Leider sind aber bis auf Mary alle TTS-Programme kostenpflichtig. Vermutlich haben die Entwickler keinen Bock drauf, ein open Source Projekt zu unterstützen.


Erschwerend kommt hinzu, dass beispielsweise Loquendo wohl von Nuance gekauft worden ist, die an der Vermarktung der Loquendo Stimmen wohl kein großes Interesse haben.
Jedenfalls gibt es wenig Webseiten die so kunden unfreundlich gestaltet sind.

Offenbar wollen die alle in das ganz große Geschäft im Gesundheitsbereich, Callcentern und so...



Wer noch etwas weiter lesen will:
http://wiki.ubuntuusers.de/Sprachausgabe
Wer zu meinen Posts eine Frage schreibt und auf eine Antwort wartet, ist hiermit herzlich eingeladen mich per PN darauf aufmerksam zu machen. (Bitte mit Link zum betreffenden Thread)

Hyco

#36
Mein RasPi quasselt nun schon zwei Wochen alles mögliche. Nun möchte ich die Sprachausgabe gern etwas optimieren. Leider habe ich den Syntax in der fhem.cfg noch nicht ganz verstanden. Folgendes möchte ich machen:
Wenn meine Netatmo einen Co2-Gehalt in der Raumluft misst, sagt mir der RasPi direkt, wenn die Konzentration zu hoch ist und gelüftet werden sollte
define Co2_Notify_1000 notify NETATMO_INDOOR { if (%EVTPART3 >= "1000") {fhem("set TTS Achtung Achtung Achtung Die Raumluft ist sehr schlecht Bitte frische Luft reinlassen Bitte Lüften");;\
my $coco="1";;\
} }

Das funktioniert soweit gut.
Nun hätte ich gern, wenn die CO2-Konzentration zu hoch war und nun wieder normal ist, dass der RasPi dies dann ansagt (aber nur dann einmal).
define Co2_Notify_OK notify NETATMO_INDOOR { if (%EVTPART3 < "1000" && $coco != "1") {fhem("set TTS Die Raumluft ist wieder gut ");;\
my $coco="0";;\
} }

Meine Idee war, wenn der Wert zu hoch ist, kommt die Ansage + die Variable $coco wird auf 1 gestetzt. Sinkt die Konzentration unter 1000 ppm und die Variable $coco ist auf dem Wert "1", soll die Ansage "Die Raumluft ist wieder gut " getätigt werden und die Variable $coco auf "0" gesetzt werden. Damit käme die Ansage dann nur einmal.
Leider führt er das zweite Skript nicht aus. Kann mir jemand sagen, wo der Fehler liegt??

Rince

Deine Variable $coco kannst du nicht so von einem Notify zu einem anderen schubsen.
Weil dein 2tes Notify also die $coco nicht sieht, kann die auch nie 1 sein :)

Lege dir ein Dummy Device an. Diesem kannst du beliebig Werte zuweisen.

Das ist sozusagen die FHEM Variante einer systemweiten Variable :)
Wer zu meinen Posts eine Frage schreibt und auf eine Antwort wartet, ist hiermit herzlich eingeladen mich per PN darauf aufmerksam zu machen. (Bitte mit Link zum betreffenden Thread)

Rince

Oh, aber weils mir grad einfällt:
Schau dir mal in der commandref das helper Modul sequence an.

Das könnte das vermutlich auch und zwar deutlich schneller :)
Wer zu meinen Posts eine Frage schreibt und auf eine Antwort wartet, ist hiermit herzlich eingeladen mich per PN darauf aufmerksam zu machen. (Bitte mit Link zum betreffenden Thread)

Hyco

Super- ich habe das jetzt mit dem Dummy erfolgreich hinbekommen:
##CO2-Melder##########################
define CO2Alarm dummy
attr CO2Alarm room Wohnzimmer
attr CO2Alarm webCmd on:off
define Co2_Notify_1000 notify NETATMO_INDOOR { if (%EVTPART3 >= "1000") {fhem("set TTS Achtung Achtung Achtung Die Raumluft ist sehr schlecht Bitte frische Luft reinlassen Bitte Lüften;;\
set CO2Alarm on")\
} }
define Co2_Notify_OK notify NETATMO_INDOOR { if (%EVTPART3 < "1000" && "%" ne "on") {fhem("set TTS Gut Die Raumluft ist wieder OK;;\
set CO2Alarm off")\
} }

Danke noch mal!

Kuzl

Mal ne Frage läuft das ganze auch auf der Fritzbox? Das Problem ist natürlich das fehlen von Lautsprechern aber es ist ja möglich das auf andere Lautsprecher zu senden. Cool wäre eine DLNA-Integration, die das ganze direkt z.b. an den TV streamt, so wie das Smartphone. Damit meine ich dass der TV dann gleich umschaltetet, die Datei abspielt und gleich wieder zurück.

Eine andere Idee wäre, dass das mit dem Remote auch umgekehrt funktioniert. D.h. der Remoteserver nimmt beispielsweise eine Stimme auf, wandelt diese mithilfe von Google o.ä in einen Text um und schickt den Text an Fhem, welches dann entsprechend reagieren kann (Text auswerten , per TTS ausgeben)

Rince

Tobias bastelt grade ein Modul draus :)
http://forum.fhem.de/index.php/topic,18481.0.html

Das kann schon von FHEM auf einem anderen FHEM spielen. Fritte auf RasPi.

Cachen kann es auch schon.

Schau dir das an, Tobi freut sich bestimmt über Feedback und Interesse!


Was DLNA betrifft, das wird so schnell wohl nix. Prinzipiell bräuchtest du einen sogenannten SOAP. Das würde bedeuten, ein DLNA Server sagt einem DLNA Render Device, dass es doch bitte folgende Datei abspielen sollte...

Das kann FHEM nicht.

Mehr Erfolg hast du vermutlich, wenn du dir die Sprachausgabe speicherst, und dich dann selber darum kümmerst sie wo abzuspielen.

Bluetooth Lautsprecher oder so.

Denkbar wäre auch, z.B. mit dem XBMC Modul die Audio Datei an einen RasPi mit XBMC zu schicken, oder evtl. an ein Listenlive Gerät mit dem Listenlive Modul (letzteres ist aber noch Zukunftsmusik, die Listenlive Firmware ist grade erst als Beta raus gekommen, mit der Aktuellen ist es eher umständlich, und die neue Firmware wird ein noch nicht geschriebenes Modul brauchen)



Spracherkennung:
Schau dir mal von Dirk die WebViewControll an:
http://forum.fhem.de/index.php/topic,18481.0.html

Damit kannst du Sprache aufnehmen lassen und bekommst sie als Text an FHEM zurück.

Habe selber noch nicht viel Zeit damit verbracht, aber letztlich ist es vermutlich eleganter als die Singstar Mikrophone. Nutzt die Google API dafür. Obige Lösung hier macht das quasi zu Fuß.
Wer zu meinen Posts eine Frage schreibt und auf eine Antwort wartet, ist hiermit herzlich eingeladen mich per PN darauf aufmerksam zu machen. (Bitte mit Link zum betreffenden Thread)

Kuzl

Okay dann schreib ich da mal rein :)
Von der App hab ich auch schon gelesen, ist aber für mich als Sprachsteuerung eher nicht das was ich will, ich möchte eher eine vom Handy unabhängige Sprachsteuerung mit einem Raummikrofon, das z.B. durch ein Schlüsselwort oder durch einen Druck auf eine Taste o.ä zuhört.
okay das mit DLNA wusste ich nicht, hab mich mit der Funktion dahinter noch nicht so befasst :D

Rince

Ok,
dann ist das Erkennungsskript evtl. nicht ungeeignet :)
Es basiert noch auf der Idee, die Befehle hart mit Textanweisungen zu verdrahten. Das ist etwas oldschool. Aber probiere es ruhig mal aus :)
Ich empfehle, wie beschrieben, dringend den Einsatz einer Ramdisk. Macht die Sache erheblich fixer und belastet die SD Karte nicht.
Wer zu meinen Posts eine Frage schreibt und auf eine Antwort wartet, ist hiermit herzlich eingeladen mich per PN darauf aufmerksam zu machen. (Bitte mit Link zum betreffenden Thread)

Kuzl


Sirphunk

Ich möchte mal folgende Lösung vorstellen:
http://stevenhickson.blogspot.de/2013/06/voice-command-v30-for-raspberry-pi.html

Darüber lasse ich einfach per Sprachkommando und wget den Link vom jeweiligen Device öffnen.

Habe auch ein kleines Youtube Video von meinen Tests gemacht:
http://www.youtube.com/watch?v=9XHWhhEDJs0

Die Qualität des Mikrofons ist wohl entscheidend. Das Schlagwort "Computer" wird häufig schlecht erkannt. Danach folgt der eigentliche Befehl der dann immer sehr gut erkannt wird.

Für den Produktiveinsatz ist mir das noch zu ungenau....

Kuzl

Klingt echt intressant :)

Wodurch passiert bei dir die Auswertung des Textes und Umwandlung in einen FHEM-Befehl bzw. in eine Adresse?

Wir sind Hier gerade dabei die Auswerdung des Textes etwas "smarter" zu machen, allerdings henge ich etwas und habe auch nicht so viel Zeit :D
http://forum.fhem.de/index.php/topic,17409.0.html

Ich bin gespannt auf deine Lösung, bin mir nicht richtig ob ich den richtigen Ansatz gewählt habe ;)

viele Grüße
Kuzl

Sirphunk

Hallo Kuzl.

Das ist nicht direkt "meine" Lösung bzw. mein Programm ;-)

Das Programm heißt "Voice Command V3.0 for RaspberryPi"und ist ziemlich universell einsetzbar.
Es wird einfach auf vorher festgelegte Sprachkommandos ein Bash-Befehl ausgeführt.

Die Software lauscht die ganze Zeit mit. Fällt das Schlagwort, was ich hier "Computer" genannt habe, dann wird nach Bestätigung, in meinem Fall "Was soll ich tun?" auf den Sprachbefehl gewartet.

Die Kommandos sind in der Config natürlich frei definierbar.

So führt ein
~Licht aus==wget http://fritz.box/fhem/LINKzUMaUSSCHALTEN
dazu, dass das Sprachkommando "Licht aus", oder auch "Schalte das Licht aus" den Bashbefehl "wget http://usw.." ausführt.
Dadurch lasse ich einfach den jeweiligen WEBCMD Link vom Device aufrufen und zack, wird geschaltet.

Lässt man die "~" vor dem Kommando weg, wird nur auf den direkten Befehl reagiert. Also führt ein "Licht aus" zum Ergebnis, ein "Schalte das Licht aus" aber nicht...

Das ganze funktioniert über die Google-Api. Sowohl für Sprachein- als auch -ausgabe.
Ist mit Sicherheit noch ausbaufähig, oder ich bräuchte mal ein besseres Mikro. :)

Kuzl

Sehr interessante Lösung :)
wenn ich mich nicht irre, ist das ~ Regex also, dass es auch übereinstimmt, wenn außer dem Befehl noch andere Worte vorhanden sind, z.b. würde auch "Kannst du bitte das Licht ausschalten" funktionieren, da "Licht aus" genau so enthalten ist.
Allerdings funktioniert das natürlich nur solange es auch genau so enthalten ist. Nicht gehen würde z.b. "Kannst du das Licht bitte ausschalten"

Genau das wollen wir mit der Funktion in dem Thread ändern :) ich könnte mir vorstellen, dass man den Text mit "Voice Command" komplett an FHEM übergeben kann, wenn ich daraus mal ein Modul gebastelt habe :D dann kann man in FHEM auch beliebig reagieren und kann alles schön übers Webinterface einstellen :)

Das ist natürlich mega geil, dass erst ein Schlüsselwort genannt werden muss, und dann zugehört wird  8)
Da lässt sich über die Google API natürlich streiten :D - für mich allerdings kein Problem.

Ich sehe schon das ganze lässt sich mit dem Modul Text2Speach und... wenn ichs hinkrieg meinem Modul wunderbar in FHEM integrieren :)

Gruß
Kuzl

Steffen

Das hört sich ja sehr sehr interessant an, besonders mit dem Schlagwort.
Habe ja noch ein pi zum testen aber welches mikro benutzt man dafür am Besten?

Mfg Steffen

Rince

Mittelfristig evtl. ein Android Handy :)

Habe es damals mit Singstar Mikros ausprobiert (die ersten Postings in dem Thread), das hat prinzipiell funktioniert, aber her  ein Proof of Concept. Nicht für den Alltagsgebrauch geeignet.
Wer zu meinen Posts eine Frage schreibt und auf eine Antwort wartet, ist hiermit herzlich eingeladen mich per PN darauf aufmerksam zu machen. (Bitte mit Link zum betreffenden Thread)

fh168

also die singstars mit dem usb-anschluss? gibt es bessere mics? muss man dafür eine usb soundkarte, zb. die 2 euro version aus china dranbauen?
Hue, Lacrosse, PCA301, MySensors, V 1.67 CUL 868 V3.4, Lacrosse-WLAN-Gateway, Tasmota RF-

Rince

Ich bin kein Tontechniker. Aber ich wette, es gibt viele viel bessere Mikros :)

Ich hab die Singstars genommen, weil es dazu ein USB Kästchen gab, womit die drahtlos Mikros gehen (also 1 von den beiden, warum, steht am Anfang vom Thread).

Das Problem ist:
Jedes Mikro hat eine Richtcharakteristik. Und je nach dieser richtet sich die Position des Sprechers.

Du willst ja langfristig nicht mit einem Mikro um den Hals oder einem Headset rumlaufen, nur um FHEM nach der Uhrzeit zu fragen oder zu bitten, das Licht jetzt zu dimmen.

Und hier kommen wir in einen Bereich, der technisch komplex wird. Das bedeutet vor allem: teuer.
Drei oder vier Mikros im Raum verteilt, um einerseits deine Sprache optimal zu verstehen, andererseits Hintergrundgeräsche zu filtern...

Vereinfacht hast du das mittlerweile bei besseren Webcams oder auch der Kinect.

Da aber das noch Zukunftsmusik ist, tendiere ich zur Zeit zum Smartphone. Hat ein Mikro eingebaut, an das reinsprechen hat man sich gewohnt, drahtlos ist es auch noch und meist ist die Position Smartphone-Sprecher recht gut :)
Wer zu meinen Posts eine Frage schreibt und auf eine Antwort wartet, ist hiermit herzlich eingeladen mich per PN darauf aufmerksam zu machen. (Bitte mit Link zum betreffenden Thread)


fh168

ok, die Singstar kosten ja nicht die Welt, aber sowas wie dem UBI schwebt mir mit Fhem schon vor.
Und ob wir einen UBI oder einen RPi mit einem Mic in die Steckdose stecken, welche untereinander vernetzt sind, da liegen wir preislich sicherlich was drunter.

Aber Voicecommand mit Singstar und Fhem wären ja schon mal ein guter Anfang.

Robin
Hue, Lacrosse, PCA301, MySensors, V 1.67 CUL 868 V3.4, Lacrosse-WLAN-Gateway, Tasmota RF-

Steffen

Hallo!

Habe gerade von meiner Tochter, ihre Wii Mikrophone(Speedlink) mit Klinke auf Usb Adapter(Rot/Blau) gefunden.

Kann mir jemand bitte vielleicht sagen, wie ich Testen kann auf der Pi console ob sie erkannt werden und Funktionieren???


Mfg Steffen

Kuzl

Hallo Steffen,

ich bin mir nicht ganz sicher aber ich glaube das geht mit lsusb ;)

@Rest:
Also ich kann aus Erfahrung (Anfänge mit der Band) sagen, dass bei den Singstar-Micros noch SEEEEEHR viel platz nach oben ist :D
die sind kurz gesagt für die eigendliche Tonaufnahme fast nicht geeignet :D da gibts allerdings für 40€ schon für unseren Zweck brauchbare Micros, die dann auch locker auf eine Entfernung von 1 Meter ganz akzeptable Ergebnisse liefern, und wenn man so eins einfach mal dort, wo man sich am meisten aufhält, platziert ist das doch was :) Mal sehen was daraus noch so wird :)

Fürs Android Handy kann ich nur die App Tasker empfehlen. Dafür gibt es ein FHEM-plugin, welches dann Zustände von FHEM abfragen kann und auch Befehle senden kann. Ich hab damit auch eine kleine Sprachsteuerung gebastelt (Regex ist auch möglich). Allerdings ist das von uns angestrebte gramatikunabhängige Erkennen leider nicht möglich.

Viele Grüße
Kuzl

Steffen

Hallo!

So habe es mal versucht Voicecommand zu installieren, aber es scheitert an zwei stellen...
1. First I'm going to say something and see if you hear it Did you hear anything? (y/n) da höre ich leider nichts,
obwohl die Ausgabe von Audio zum Test bei "sudo /usr/bin/mplayer -ao alsa:device=hw=0.0  -nolirc -noconsolecontrols "http://translate.google.com/translate_tts?tl=de&q=test nochmal" habe.
2.Do you want to set up and check the speech recognition options? (y/n)
y
First I'm going to make sure you have the correct hardware device
I couldn't find a hardware device. You don't have a valid microphone


Auch hier: pi@PiAudio ~ $ lsusb
Bus 001 Device 002: ID 0424:9512 Standard Microsystems Corp.
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
Bus 001 Device 003: ID 0424:ec00 Standard Microsystems Corp.
Bus 001 Device 004: ID 05e3:0606 Genesys Logic, Inc. USB 2.0 Hub / D-Link DUB-H4 USB 2.0 Hub
Bus 001 Device 005: ID 046d:0a03 Logitech, Inc. Logitech USB Microphone
Bus 001 Device 009: ID 03f0:0024 Hewlett-Packard KU-0316 Keyboard
Bus 001 Device 010: ID 046d:0a03 Logitech, Inc. Logitech USB Microphone
Bus 001 Device 008: ID 1bcf:0007 Sunplus Innovation Technology Inc. Optical Mouse


vielleicht hatte ja jemand genau die gleiche Probleme???

Mfg Steffen

Steffen

Hallo!

Ich habe nun auch schon mit usb-soundcard versucht, auch mit einer ps3cam doch er zeigt mir immer bei der Config(voicecomand -s) kurz vor schluss  das er keine Hardware erkennt.
Woran könnte das liegen, muss man erst dem Pi irgendwo sagen welche Hardware er erkennen muss?
Hat einer von euch schon Voicecomander installiert? Wenn ja welche Hardware, welches System?
Hoffe und bitte um Hilfe...

Mfg Steffen

dieda

Bitte bleib dran, das Ganze ist interessant und macht nicht nur für den Sehenden User Sinn. Nur als Basis für die Sprachkomandos sollte man dann auch ein Iphone mit Voice Over in Betracht ziehen. Die Dinger sind die einzigen wirklich guten Blindentelefone https://www.apple.com/de/accessibility/ios/
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

Steffen

Zitat von: Steffen am 01 Februar 2014, 11:33:39
Hallo!

Ich habe nun auch schon mit usb-soundcard versucht, auch mit einer ps3cam doch er zeigt mir immer bei der Config(voicecomand -s) kurz vor schluss  das er keine Hardware erkennt.
Woran könnte das liegen, muss man erst dem Pi irgendwo sagen welche Hardware er erkennen muss?
Hat einer von euch schon Voicecomander installiert? Wenn ja welche Hardware, welches System?
Hoffe und bitte um Hilfe...

Mfg Steffen

Leider komme ich einfach nicht weiter, habe es nun mit fast allen Pi-Systemen versucht, auch mit zwei anderen Mikros,
doch immer das Gleiche:
Do you want to set up and check the speech recognition options? (y/n)
y
First I'm going to make sure you have the correct hardware device
I couldn't find a hardware device. You don't have a valid microphone

Da ist doch irgendwie noch ein Fehler, den ich einfach nicht finde :-\
Vielleicht kann mir ja doch jemand helfen oder hat eine Idee woran es liegt!?!

Mfg Steffen

Kuzl

Hallo :)
Hast du denn das mic richtig installiert und ausgewählt?
Probier mal ob es bei anderen programmen funktioniert.

Gruß
Kuzl

Steffen

Zitat von: Kuzl am 09 Februar 2014, 12:26:41
Hallo :)
Hast du denn das mic richtig installiert und ausgewählt?
Probier mal ob es bei anderen programmen funktioniert.

Gruß
Kuzl

Ich denke ja auch das ich dem Pi erstmal sagen muss, welches Mikro er erkennen soll.
Weiß nur nicht wo und wie???

Mfg Steffen

Rince

Der AlsaMixer ist dein Freund.
Wie es genau geht, mußt du die Suchmaschine deines geringsten Mißtrauens fragen. Das ist immer etwas unterschiedlich, aber eigentlich recht einfach.
Wer zu meinen Posts eine Frage schreibt und auf eine Antwort wartet, ist hiermit herzlich eingeladen mich per PN darauf aufmerksam zu machen. (Bitte mit Link zum betreffenden Thread)

Steffen

Zitat von: Rince am 09 Februar 2014, 20:23:13
Der AlsaMixer ist dein Freund.
Wie es genau geht, mußt du die Suchmaschine deines geringsten Mißtrauens fragen. Das ist immer etwas unterschiedlich, aber eigentlich recht einfach.

Hallo!

Danke für den Tip, aber bekomme es irgendwie nicht hin!

Habe nun auch mit AlsaMixer gespielt;-) wo er auch das Mikro sieht:
pi@raspberrypi ~ $ cat /proc/asound/cards
0 [Microphone     ]: USB-Audio - USB Microphone
                      Logitech USB Microphone at usb-bcm2708_usb-1.2, full speed
1 [ALSA           ]: BRCM bcm2835 ALSbcm2835 ALSA - bcm2835 ALSA
                      bcm2835 ALSA


aber bekomme trotzdem:
First I'm going to make sure you have the correct hardware device
I couldn't find a hardware device. You don't have a valid microphone


hier auch mal meine config:
[codeGerät: USB Microphone                                                                                                         F1:  Hilfe                │
│    Chip: USB Mixer                                                                                                              F2:  System-Informationen │
│ Ansicht: F3: Wiedergabe  F4:[Aufnahme] F5: Alle                                                                                 F6:  Soundkarte auswählen │
│ Element: Mic [dB-Änderung: 31,00]                                                                                               Esc: Beenden              │
│                                                                                                                                                           │
│                                                                                                                                                           │
│                                                                                                                                                           │
│                                                                                                                                                           │
│                                                                                                                                                           │
│                                                                                                                                                           │
│                                                                                                                                                           │
│                                                                                                                                                           │
│                                                                                                                                                           │
│                                                                                                                                                           │
│                                                                                                                                                           │
│                                                                           ┌──┐                                                                            │
│                                                                           │▒▒│                                                                            │
│                                                                           │▒▒│                                                                            │
│                                                                           │▒▒│                                                                            │
│                                                                           │▒▒│                                                                            │
│                                                                           │▒▒│                                                                            │
│                                                                           │▒▒│                                                                            │
│                                                                           │▒▒│                                                                            │
│                                                                           │▒▒│                                                                            │
│                                                                           │▒▒│                                                                            │
│                                                                           │▒▒│                                                                            │
│                                                                           │▒▒│                                                                            │
│                                                                           │▒▒│                                                                            │
│                                                                           │▒▒│                                                                            │
│                                                                           │▒▒│                                                                            │
│                                                                           │▒▒│                                                                            │
│                                                                           │▒▒│                                                                            │
│                                                                           │▒▒│                                                                            │
│                                                                           │▒▒│                                                                            │
│                                                                           │▒▒│                                                                            │
│                                                                           │▒▒│                                                                            │
│                                                                           │▒▒│                                                                            │
│                                                                           │▒▒│                                                                            │
│                                                                           │▒▒│                                                                            │
│                                                                           │▒▒│                                                                            │
│                                                                           │▒▒│                                                                            │
│                                                                           │▒▒│                                                                            │
│                                                                           │▒▒│                                                                            │
│                                                                           │▒▒│                                                                            │
│                                                                           │▒▒│                                                                            │
│                                                                           │▒▒│                                                                            │
│                                                                          L└──┘R                                                                           │
│                                                                         AUFNAHME                                                                          │
│                                                                           100                                                                             │
│                                                                        <  Mic   >                             ][/code]

# autoloader aliases
install sound-slot-0 /sbin/modprobe snd-card-0
install sound-slot-1 /sbin/modprobe snd-card-1
install sound-slot-2 /sbin/modprobe snd-card-2
install sound-slot-3 /sbin/modprobe snd-card-3
install sound-slot-4 /sbin/modprobe snd-card-4
install sound-slot-5 /sbin/modprobe snd-card-5
install sound-slot-6 /sbin/modprobe snd-card-6
install sound-slot-7 /sbin/modprobe snd-card-7
# Cause optional modules to be loaded above generic modules
install snd /sbin/modprobe --ignore-install snd && { /sbin/modprobe --quiet snd-ioctl32 ; /sbin/modprobe --quiet snd-seq ; : ; }
install snd-rawmidi /sbin/modprobe --ignore-install snd-rawmidi && { /sbin/modprobe --quiet snd-seq-midi ; : ; }
install snd-emu10k1 /sbin/modprobe --ignore-install snd-emu10k1 && { /sbin/modprobe --quiet snd-emu10k1-synth ; : ; }
# Keep snd-pcsp from beeing loaded as first soundcard
#options snd-pcsp index=-2
# Keep snd-usb-audio from beeing loaded as first soundcard
options snd-usb-audio index=-1
# Prevent abnormal drivers from grabbing index 0
options bt87x index=-2
options cx88_alsa index=-2
options snd-atiixp-modem index=-2
options snd-intel8x0m index=-2
options snd-via82xx-modem index=-2


Vielleicht ist ja da der Fehler??

Mfg Steffen

franky08

@Rince
Hallo, der Link im 1. Beitrag im Threat zeigt auf eine Floorplan"geschichte. Stimmt vieleicht der Link nichtmehr ?

VG
Frank
Debian Wheezy auf ZBOX nano/ Debian Bullseye auf 2.ter ZBOX nano F2F an 2x RaspiB
22Zoll ViewSonic als Infodislay (WVC)
3xHMLAN mit vccu ,fhem5.8, CCU2,
ECMD an AVR-NET-IO mit DAC u. ADC an Junkers Stetigregelung, Siemens LOGO!8, JeeLink uvm...

Rince

Das kommt davon wenn man mit nem Tab und 64KBit surft...

Ich habs ausgebessert. Danke :)
Wer zu meinen Posts eine Frage schreibt und auf eine Antwort wartet, ist hiermit herzlich eingeladen mich per PN darauf aufmerksam zu machen. (Bitte mit Link zum betreffenden Thread)

franky08

#67
Hab mir das ctvoice Skript heute mal vorgenommen aber leider bekomme ich eine Fehlermeldung bezüglich der Hardware:
frank3@debian2:/opt/fhem/contrib$ ./ctvoice.sh
ALSA lib pcm_hw.c:1401:(_snd_pcm_hw_open) Invalid value for card
sox FAIL formats: can't open input  `hw:0.0': snd_pcm_open error: No such device


Hardwaremäßig ist folgendes vorhanden:

**** Liste der Hardware-Geräte (CAPTURE) ****
Karte 0: Intel [HDA Intel], Gerät 0: ALC268 Analog [ALC268 Analog]
  Sub-Geräte: 1/1
  Sub-Gerät #0: subdevice #0
Karte 0: Intel [HDA Intel], Gerät 2: ALC268 Analog [ALC268 Analog]
  Sub-Geräte: 1/1
  Sub-Gerät #0: subdevice #0
Karte 1: UA4FX [UA-4FX], Gerät 0: USB Audio [USB Audio]
  Sub-Geräte: 1/1
  Sub-Gerät #0: subdevice #0


Komisch ist das ALC268 analog 2mal aufgelistet ist.

P.S. Oder kann das mit dem Text2Speech Modul zusammenhängen? Das habe ich bei meiner Installation auch im Einsatz.

VG
Frank
Debian Wheezy auf ZBOX nano/ Debian Bullseye auf 2.ter ZBOX nano F2F an 2x RaspiB
22Zoll ViewSonic als Infodislay (WVC)
3xHMLAN mit vccu ,fhem5.8, CCU2,
ECMD an AVR-NET-IO mit DAC u. ADC an Junkers Stetigregelung, Siemens LOGO!8, JeeLink uvm...

Kuzl

Hallo franky ;)

Hm ich bin jetzt nicht so fit mit dem raspi habe meinen auch noch nicht so lange :D
aber kann es sein, dass du im Skript das falsche device öffnen willst?
Zitatsox FAIL formats: can't open input  `hw:0.0': snd_pcm_open error: No such device
da steht hw:0.0 aber dein input müsste doch hw:1.0 sein oder?

Mit analog kann ich mir jetzt auch nicht erklären... evtl wegen Stereo? - keine ahnung :D
Bin auch interessiert daran das zu verwenden :)

Natürlich kannst du das zusammen mit dem Text2Speech Modul verwenden, eingebaut wird es darin allerdings nicht, das es ja nicht Text2Speech ist sondern andersrum  8)

franky08

Das ganze läuft bei mir auf einem Debian Laptop. Das das device 2x aufgeführt ist hängt wahrscheinlich mit den 2 Eingängen zusammen (Line-in und Mic-in).

Probiere jetzt mal alle Einstellungen durch
VG
Frank
Debian Wheezy auf ZBOX nano/ Debian Bullseye auf 2.ter ZBOX nano F2F an 2x RaspiB
22Zoll ViewSonic als Infodislay (WVC)
3xHMLAN mit vccu ,fhem5.8, CCU2,
ECMD an AVR-NET-IO mit DAC u. ADC an Junkers Stetigregelung, Siemens LOGO!8, JeeLink uvm...

Kuzl

Achsooooo hab gedacht das ist auf einem Pi :D
das klingt natürlich logisch :D ist auch die selbe Karte nur einmal Gerät 0 und einmal Gerät 2

Bin gespannt :)

franky08

Also, jetzt hab ich alle 4 Varianten durch und der Fehler bleibt immer der gleiche. Mit 0.0 1.0 0.1 und mit 1.1 immer

Zitatsox FAIL formats: can't open input  `hw:0.0': snd_pcm_open error: No such device

Werde mal weitersuchen.         
Debian Wheezy auf ZBOX nano/ Debian Bullseye auf 2.ter ZBOX nano F2F an 2x RaspiB
22Zoll ViewSonic als Infodislay (WVC)
3xHMLAN mit vccu ,fhem5.8, CCU2,
ECMD an AVR-NET-IO mit DAC u. ADC an Junkers Stetigregelung, Siemens LOGO!8, JeeLink uvm...

Kuzl

hm eigenartig...
ich gehe mal davon aus dass nicht immer "hw:0.0" in der Fehlermeldung steht oder? :D
ich kanns leider im Moment nicht ausprobieren, da ich keine USB-Soundkarte oder ähnliches besitze.

franky08

Nee, jenachdem wie ich die ctvoice.sh Konfiguriere 0.0 nicht ok 0.1 nicht ok 1.0 nicht ok und 1.1 ebenfalls nicht ok  :-\
Debian Wheezy auf ZBOX nano/ Debian Bullseye auf 2.ter ZBOX nano F2F an 2x RaspiB
22Zoll ViewSonic als Infodislay (WVC)
3xHMLAN mit vccu ,fhem5.8, CCU2,
ECMD an AVR-NET-IO mit DAC u. ADC an Junkers Stetigregelung, Siemens LOGO!8, JeeLink uvm...

Kuzl

Probier mal 0.2 da ja das 2. Analogdevice nicht 0.1 sondern 0.2 ist.
Das ist das letzte was mir jetzt noch einfällt evtl weis Rince noch weiter

franky08

So, bin jetzt einen Schritt weiter. Hatte dummerweise die falsche Zeile editiert. Aufnahme geht jetzt:

Input File     : 'hw:1,0' (alsa)
Channels       : 2
Sample Rate    : 44100
Precision      : 24-bit
Sample Encoding: 24-bit Signed Integer PCM

In:0.00% 00:00:00.84 [00:00:00.00] Out:0     [      |      ]        Clip:0    Stille...
In:0.00% 00:00:01.86 [00:00:00.00] Out:0     [      |      ]        Clip:0    Stille...
In:0.00% 00:00:02.79 [00:00:00.00] Out:5.73k [   ===|===   ]        Clip:0    Aufnahme!
In:0.00% 00:00:03.81 [00:00:00.00] Out:21.3k [      |      ]        Clip:0    Aufnahme!
In:0.00% 00:00:04.92 [00:00:00.00] Out:21.3k [      |      ]        Clip:0    Abschicken
In:0.00% 00:00:05.02 [00:00:00.00] Out:21.3k [      |      ]        Clip:0   
Aborted.
Stream mapping:
  Stream #0.0 -> #0.0
Press ctrl-c to stop encoding
Warning, using s16 intermediate sample format for resampling
size=      17kB time=0.50 bitrate= 284.3kbits/s   
video:0kB audio:9kB global headers:0kB muxing overhead 85.368377%

mplayer: could not connect to socket
mplayer: No such file or directory
Kein Kommando erkannt...
sox WARN alsa: can't encode 16-bit Signed Integer PCM


Jetzt stimmt mit dem mplayer noch etwas nicht.

VG
Frank
Debian Wheezy auf ZBOX nano/ Debian Bullseye auf 2.ter ZBOX nano F2F an 2x RaspiB
22Zoll ViewSonic als Infodislay (WVC)
3xHMLAN mit vccu ,fhem5.8, CCU2,
ECMD an AVR-NET-IO mit DAC u. ADC an Junkers Stetigregelung, Siemens LOGO!8, JeeLink uvm...

Kuzl

das ist ja schon mal was :)

ich müsste mir jetzt das Skript mal ansehen - mach ich morgen mal.
Scheint als funktioniert die Aufnahme, allerdings das encoden in eine Datei nicht

ansonsten könnte es sein, dass evtl irgendwelche Rechte fehlen oder so...

vg
Kuzl

franky08

Ich denke mal das es mit dem Text2Speech Modul zusammenhängt. Das benutzt ja auch mplayer und zwei Instanzen können wahrscheinlich nicht auf das gleiche Device zugreifen.

VG
Frank
Debian Wheezy auf ZBOX nano/ Debian Bullseye auf 2.ter ZBOX nano F2F an 2x RaspiB
22Zoll ViewSonic als Infodislay (WVC)
3xHMLAN mit vccu ,fhem5.8, CCU2,
ECMD an AVR-NET-IO mit DAC u. ADC an Junkers Stetigregelung, Siemens LOGO!8, JeeLink uvm...

Kuzl

Kann ich mir ehrlich gesagt nicht vorstellen man kann ja auch gleichzeitig mit 2 Instanzen 2 mp3s abspielen.
Kann man allerdings einfach durch kurzzeitiges auskommentiern/ausschalten von FHEM herausfinden ;)

franky08

#79
So, nachdem ich den Fehler in der mplayer.conf gefunden habe (norlirc geschrieben, statt nolirc=yes) funktioniert das ganze bis auf das der mplayer keine Audioausgabe macht. Gesprochene Befehle werden erkannt und ausgeführt aber "echo ... " bringt keine Ausgabe, eine ins Verzeichnis kopierte Test.wav wird auch nicht wiedergegeben. Da ich Text2Speech ebenfalls laufen habe, kommt die Audioausgabe darüber.

ZitatStream mapping:
  Stream #0.0 -> #0.0
Press ctrl-c to stop encoding
Warning, using s16 intermediate sample format for resampling
size=      23kB time=0.72 bitrate= 260.6kbits/s   
video:0kB audio:15kB global headers:0kB muxing overhead 54.265605%
Licht aus
Licht aus
sox WARN alsa: can't encode 16-bit Signed Integer PCM

Input File     : 'hw:1,0' (alsa)
Channels       : 2
Sample Rate    : 44100
Precision      : 24-bit
Sample Encoding: 24-bit Signed Integer PCM

VG
Frank
Debian Wheezy auf ZBOX nano/ Debian Bullseye auf 2.ter ZBOX nano F2F an 2x RaspiB
22Zoll ViewSonic als Infodislay (WVC)
3xHMLAN mit vccu ,fhem5.8, CCU2,
ECMD an AVR-NET-IO mit DAC u. ADC an Junkers Stetigregelung, Siemens LOGO!8, JeeLink uvm...

Kuzl

Ok dann hast du ja dein Ziel schon erreicht :) ich glaub ich brauch das auch :D

Mit welchen Parametern wird denn der MPlayer beim abspielen aufgerufen?
zur Not kannst du das loglevel von Text2Speech auf 5 setzen und dann den Befehl aus dem log in das Skript kopieren

franky08

#81
Hallo, war ein Rechte Problem ! So geht es jetzt ersteinmal:
#!/bin/bash

# c't Hardware Hacks - Spracherkennung für den Raspberry Pi, GPL-Lizenz

count=1
lastsize=0
rec=0
first=1

# Der Soundchip des RPI erzeugt vor und nach der Wiedergabe ein Knacken. Deutlich bessere Ergebnisse liefert eine USB-Soundkarte, wie man sie bereits für rund fünf Euro bekommt. Damit mplayer die USB-Soundkarte benutzt, ändert man den Parameter "-ao alsa:device=hw=0.0" in "-ao alsa:device=hw=1.0".

function say {
sudo /usr/bin/mplayer -ao alsa:device=hw=0.0 -really-quiet -nolirc -http-header-fields "User-Agent:Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/537.22 (KHTML, like Gecko) Chrome/25.0.1364.172 Safari/537.22m" "http://translate.google.com/translate_tts?tl=de&q=$1";
}

sox -t alsa hw:1,0 test.wav silence 1 0 0.5% -1 1.0 1% &
sox_pid=$!


Leider hängt fhem, wenn ich das ganze über ein dummy oder von der Kommandozeile mit:
Spracherkennung:on {system('sudo /opt/fhem/contrib/ctvoice.sh&');;}

starte.
Hab das jetzt erstmal auf Eis gelegt, vieleicht gibt es ja in nächster Zeit mal ein Modul, so das es einfach in fhem eingebunden werden kann.

VG
Frank

Debian Wheezy auf ZBOX nano/ Debian Bullseye auf 2.ter ZBOX nano F2F an 2x RaspiB
22Zoll ViewSonic als Infodislay (WVC)
3xHMLAN mit vccu ,fhem5.8, CCU2,
ECMD an AVR-NET-IO mit DAC u. ADC an Junkers Stetigregelung, Siemens LOGO!8, JeeLink uvm...

Rince

Na ja, das hängt weil der Aufruf keinerlei Non-Blocking Mechanismen einsetzt.

Im Text2Speech Modul könnte man vielleicht abgucken, wie das gelöst wird. Dort wird der mplayer mit Non-Blocking genutzt.
Wer zu meinen Posts eine Frage schreibt und auf eine Antwort wartet, ist hiermit herzlich eingeladen mich per PN darauf aufmerksam zu machen. (Bitte mit Link zum betreffenden Thread)

Zephyr

Zitat von: koldomon am 04 Januar 2014, 15:42:48
Mal ne Frage,

ich bin da ein wenig Datenschutz Paranoid und hab da meine Bedenken, dass Google die Texte online übersetzt. Gibts sowas auch als "offline" Lösung? oder sprengt das den PI?

SEHR WICHTIGER Punkt!

Macht Japser jasperproject.github.io das vielleicht offline?
FHEM 5.5 auf Fritz!Box 7390 und Beagle Bone black mit RFXtrx433

Rince

Jasper nutzt Pocketsphinx.
Das ist eine Offline Spracherkennung. Für Pocketsphinx würde es sich glatt lohnen, ein Modul für fhem zu basteln.
Aber ich möchte im Vorfeld anmerken, dass Pocketsphinx ein komplexes Programm ist, welches durchaus konfiguriert werden will.
So schnell mal ein get und ein make in die Kommandozeile tippen reicht nicht ;)
Wer zu meinen Posts eine Frage schreibt und auf eine Antwort wartet, ist hiermit herzlich eingeladen mich per PN darauf aufmerksam zu machen. (Bitte mit Link zum betreffenden Thread)

Kuzl

Oh ja das wär mal sehr interessant :)
dann könnte man auch mal eine "vernünftige" von handy und co. unabhängige sprachsteuerung machen :D

Rince

Pocketsphinx?
Vermutlich. Wobei vor 1 Jahr war es noch unsäglich langsam. Vielleicht ist es ja mittlerweile schneller.

Die Installationsanleitung findet sich bei Jasper. Was noch fehlt, ist die Grammatik für Deutsch. Das ist ein Pocketsphinx Ding. Es gibt wohl auch ein Modell zum Download irgendwo, aber das basiert auf 16KHz Daten, da muss man mit seiner Mikrofonkonfiguration aufpassen. Sonst geht es in die Hose.

Kuzl, magst du einen Thread aufmachen wo wir Pocketsphinx Sachen zusammen tragen können mit dem Ziel, ein fhem Modul draus zu basteln?
Du bist da eindeutig besser als ich :)
Wer zu meinen Posts eine Frage schreibt und auf eine Antwort wartet, ist hiermit herzlich eingeladen mich per PN darauf aufmerksam zu machen. (Bitte mit Link zum betreffenden Thread)


forum-merlin

Hallo Fhem-Freunde!

Ich habe mich auch seit ein paar Tagen mit voicecommand von Steven Hickson befasst. Und gerade eben denke ich, habe ich das Problem lokalisert.
Ich hatte auch Probleme dass der SetupTeil fehlgeschlagen war. Das Setup sagte immer, ich hätte kein Mikrofon.

Zitat"I couldn't find a hardware device. You don't have a valid microphone

Ich hatte folgende Hardware ausprobiert:
1) uralte logitech quickcam communicate stx
2) JABRA USB Headset (relativ neu)
3) Logitech C510 HD Webcam (relativ neu)

Ich hatte es bei allen drei Devices geschafft, dass ich sie per arecord -l und arecord -L sehe.
Ich hatte es auch bei allen drei Devices geschafft, dass ich etwas aufnehmen konnte, und dann per aplay abspielen konnte.
Ich musste allerdings immer mit der Option -D und dann her HEX Device ID arbeiten.
Ausgabe also über die 3,5er Klinke und "Eingabe" per USB Device.


Wenn ich dann in der .commands.conf mit einem Editor oder per voicecommand -e die Config angepasst hatte, bin ich trotzdem immer daran gescheitert, dass voicecommand der Meinung war, dass ich kein richtiges valides Mic habe.

Ich habe mir dann mal alle Files angeschaut die zu voicecommand gehören.

Ich bin echt absolut kein Coder, Scripter, Programmierer und verzweifle auch sofort bei PERL.
aaaaber... Ich habe mir mal die voicecommand.cpp Datei in einem Editor wie Notepad++ oder ContextEDITOR angeschaut.
Habe die Highlighter für C++/C# eingeschaltet, und habe einfach mal geschaut ob ich da irgendwo eine Section finde wo die Hardware geprüft wird.

Hier der Teil den ich dann gefunden habe:

    printf("Do you want to set up and check the speech recognition options? (y/n)\n");
    scanf("%s",buffer);
    if(buffer[0] == 'y') {
        printf("First I'm going to make sure you have the correct hardware device\n");
        FILE *cmd;
        int card = -1,device = -1;
        cmd = popen("arecord -l | awk '/^card [0-9]/ {print $2}'","r");
        fscanf(cmd, "%d:",&card);
        cmd = popen("arecord -l | grep -o 'device [0-9]:' | grep -o  '[0-9]:'","r");
        fscanf(cmd, "%d:",&device);
        if(card == -1 || device == -1) {
            printf("I couldn't find a hardware device. You don't have a valid microphone\n");
            exit(-1);
        } else if(card != 1 || device != 0) {
            printf("I detected that you have a different audio card then I located, would you like me to fix that in the config file? (y/n)\n");
            scanf("%s",buffer);
            if(buffer[0] == 'y') {
                stringstream tmp;
                tmp << "plughw:";
                tmp << card;
                tmp << ",";
                tmp << device;
                recordHW = tmp.str();
                differentHW = true;
                write += "!hardware==";
                write += recordHW;
                write += "\n";
            }


Und siehe da...
Da wird doch tatsächlich ein
cmd = popen("arecord -l | awk '/^card [0-9]/ {print $2}'","r");
ausgeführt.
Wenn man jetzt auf seinem eigenen System mit Deutscher Sprachumgebung das arecord -l ausführt, dann kommt da KARTE zurück und nicht CARD. Und bei DEVICES kommt bei uns natürlich GERÄTE zurück.
Ich denke genau das ist der Fehler hier.
Was mich aber wundert ist, dass die .commands.conf die im User Home liegt garnicht richtig berücksichtigt wird.


Ich hatte schon probiert, die .cpp Datei anzupassen und dann mit DE weiterzumachen, aber ich habe es nicht hinbekommen.
Ich habe dann einfach meine DE Sprache deinstalliert und nun läuft voicecommand auch.

Jetzt muss ich nur noch mit der Konfiguration weiter rumspielen damit meine "Lucy" künftig auch in DE mit mir spricht.
Das sollte nämlich trotzdem weiterhin möglich sein.


Hoffe es hilft jemandem.

Gruß

der Merlin.
FHEM 5.8 auf RasPi3; CULv3-868; RFXtrx433; HM-Sec-SC-2; HM-CFG-LAN; HM-LC-Bl1-FM; HM-CC-RT-DN; HM-ES-PMSw1-Pl; HM-LC-Sw4-DR; Hunter Ventile; 8ch Relais; ENIGMA2; ONKYO_AVR; SONOS; Harmony; telegram; HM-PB-6-WM55; GPIO; HM-Sen-MDIR-O; HM-SEC-SD; HM-LC-Dim1L-Pl-3;