Neues Modul: Text2Speech

Begonnen von Tobias, 07 Januar 2014, 12:57:23

Vorheriges Thema - Nächstes Thema

Tobias

jetzt ist erstmal der time() Fix ins SVN gewandert. Morgen per Update verfügbar.
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

Pfriemler

Einmal mehr stellt sich Linux als das benutzerunfreundliche Frickelsystem heraus für das ich es abgrundtief hasse ...  >:( wahrscheinlich wird sich das auch nie ändern, also was soll's ...

Liebe Leuts,
Text2Speech läuft bei mir jetzt prima, und seit ich bei real,- einen Minibrüllwürfel namens "Watson AX 2001B" für 15 Euronen mitgenommen habe, auch irgendwie laut genug, ohne alsamixer-Anpassung.

Nun die Kür:
Jetzt hat das Dingens ja auch Bluetooth. Mit dem Android-Handy klappt alles sofort ohne Gefummel. Die PIN ist 0000.
Also habe ich mich am WIKI entlanggehangelt und bin, nachdem ich 8. mit "sudo " gemeistert habe, bei 9. steckengeblieben.

ZitatJetzt sollte keine Fehlermeldung mehr kommen....
Leider doch: "Host down" (bzw. mit sudo "Connection refused").

Für Dummys wie meinereiner zum Mitmeißeln:
- wieso benötigt es rfcomm0 (inkl. Definition in 6.) - im Web lese ich im Zshg mit rfcomm nur "hci0" (was auch immer das heißen mag)?
- Tobias hat statt des default channel 1 den 3 genommen für seine Lautsprecher - hat das einen speziellen Grund?
- was könnte noch klemmen, weil rfcomm connect nicht funzt?
Hab auch schon reichlich gegoogelt, aber nix Gescheites gefunden - Tipps zum Nachlesen hochwillkommen.

Sonst jemand warme Hinweise, wie ich den %$&§"!(/) zum Laufen kriege? (RPi und Lautsprecher sind durch eine Geschoßdecke getrennt, ich habe keinen Bock auf Kabelziehen...)
Eilt nicht, bin die nächsten Tage sowieso FHEM-fern, leider ...

Sonst aber nochmal: Hut ab für das schöne Sprachmodul, ich bin wirklich begeistert darüber!
"Änd're nie in fhem.cfg, denn das tut hier allen weh!" *** Wheezy@Raspi(3), HMWLAN+HMUART, CUL868(SlowRF) für FHT+KS+FS20, miniCUL433, Rademacher DuoFern *** "... kaum macht man es richtig, funktioniert es ..."

eddie.euwen

#212
Hi versuche es mal mitt  bt-audio -c 00:10:61:00:4C:60
natürlich die adresse ändern


Den Bluetooth-Lautsprecher lokalisieren Den Lautsprecher in den Pairing-Modus versetzen. Erst Dadurch wird er im Scanning sichtbar

Bei problem unter /var/lib/bleutooth/(bt_addr) Löschen

hcitool scan

Scanning ...

     00:10:61:00:4C:60       AX2000B

     

    Pair with the soundbar. This step is only necessary if the 2 devices have never been "paired" before.
    To pair, run the bt-device command with the Bluetooth address from step 1 as the parameter.

     

    $ bt-device -c 00:10:61:00:4C:60

     

    Connecting to: 00:10:61:00:4C:60
    Agent registered
    Agent released
    Done

    You can verify the result by listing the paired devices:

     

    $ bt-device -l

     

    Added devices:
    AX2000B (00:10:61:00:4C:60)

     

    Connect audio output to soundbar.

     

    $ bt-audio -c 00:10:61:00:4C:60

     

    Connecting to an audio service
    Audio service is connected



Pfriemler

ZitatText2Speech läuft bei mir jetzt prima
Hm ... zu früh gefreut. Bei nun regelmäßiger Nutzung hängt sich der RPi immer wahrscheinlicher (laut Zeiten im Logbuch) unmittelbar im Zusammenhang mit einer Sprachausgabe auf und erfordert einen Vollreset. Habe das Modul jetzt disabled und seit Tagen ist wieder Stabilität, ohne sonstige Änderungen.

Wohlgemerkt ohne BT, direkt mit Kabel.

Hat etwa jemand ähnliche Erfahrungen oder läuft bei Euch alles stabil?

(kopfkratz)

@eddie.euwen: Verstehe ich (noch) nicht, morgen mehr.
"Änd're nie in fhem.cfg, denn das tut hier allen weh!" *** Wheezy@Raspi(3), HMWLAN+HMUART, CUL868(SlowRF) für FHT+KS+FS20, miniCUL433, Rademacher DuoFern *** "... kaum macht man es richtig, funktioniert es ..."

hexenmeister

Läuft stabil auf meinem CubieTruck.
Lasse mir jeden Morgen die AußenTemperatur und Wettervorhersage vorlesen, Dauer der Abwesenheit beim Zurückkommen etc.
Außerdem haben meine Kinder viel mit der Sprachausgabe gespielt. Mit Hilfe von Jabber-Client kann man meinem FHEM Befehle erteilen, unter anderem etwas sagen zu lassen.
Kein einziger Absturz. Wird wohl weniger mit dem Modul selbst zu tun haben, sondern mit dem Sound-Treiber Deines Pi.


Smooothy

Zitat von: Rince am 03 März 2014, 20:18:02
@TecCheck
Ich schreib dir ne PN. Schau da mal rein.

@Rince: Hast du deine Doku fertig? Ich bekomme es einfach nicht hin Variablen anzusagen. Wenn ich sowas in der Art in die fhem.cfg eingebe

my $val = ReadingsVal( "Telefon", "missed_call", "none" );
my $ts_buf = ReadingsTimestamp( "Telefon", "missed_call", "none" );
if ($val ne "none") {fhem("set MyTTS tts Anrufe in Abwesenheit. Letzter Anruf von ".$val." um ".$ts_buf)}

kommt beim Speichern der Fehler

"Unknown command my, try help."

Habe ich da ein Grundlegendes Verständnisproblem?
Danke für die Hilfe!
Christian

Pfriemler

Zitat von: Smooothy am 29 September 2014, 07:34:52
Wenn ich sowas in der Art in die fhem.cfg eingebe...
"Unknown command my, try help."
Habe ich da ein Grundlegendes Verständnisproblem?
Sollte das nicht Bestandteil einer eigenen Routine in 99_myUtils werden - in die fhem.cfg gehört gar nichts handeditiertes rein ... ?
"Änd're nie in fhem.cfg, denn das tut hier allen weh!" *** Wheezy@Raspi(3), HMWLAN+HMUART, CUL868(SlowRF) für FHT+KS+FS20, miniCUL433, Rademacher DuoFern *** "... kaum macht man es richtig, funktioniert es ..."

Smooothy

Ja, soweit hab ich es in den letzten Stunden verstanden ;) dennoch bekomme ich es nicht hin, mit über den Aufruf der Funktion in der config beispielsweise die Temperatur Ansagen zu lassen. Wenn jemand ein Beispiel hätte wäre ich sehr dankbar. Christian

hexenmeister

#218
Hallo Smooothy,

ich benutze unter anderem die Temperatur- und Wetteransagen, geöffnete Fensterwarnungen etc. Mit einem Beispiel tue ich mich dennoch etwas schwer - ich muss die Teile aus dem Ganzem herausreißen. Ich kopiere die relevanten Teile und hoffe, dass ich nichts dabei vergessen habe... Musst dich ggf. melden.
Du musst auch etwas noch an Deine Gerätschaften anpassen:

Mein Text2Speak-Device heißt 'tts'
Mein Temperatur/Feuchte-Sensor heißt 'GSD_1.4'
Mein Weather-Modul heißt 'Wetter'

Methoden zum Aufrufen für Dich: speakWetterDaten() und speakWetterVorhersage()



use constant {
  DEVICE_NAME_TTS    => "tts",
  DEVICE_NAME_TH      => "GSD_1.4",
  DEVICE_NAME_WEATHER => "Wetter",
};

###############################################################################
# Sagt Wetterdaten an
#  Param: Art: Variante der Aussage:
#         0: Kurzansage, 1: Normal
###############################################################################
sub speakWetterDaten(;$) {
my($art)=@_;
if(!defined($art)){$art=1;}
# TODO: Sauber / Abstraktionslayer erstellen
my $temp = prepareNumToSpeak(rundeZahl0(ReadingsVal(+DEVICE_NAME_TH,"temperature","unbekannt")));
my $humi = prepareNumToSpeak(rundeZahl0(ReadingsVal(+DEVICE_NAME_TH,"humidity","unbekannt")));
if($art==0) {
    #speak("Aussentemperatur ".$temp." Grad. Feuchtigkeit ".$humi." Prozent.",0);
    speak($temp." Grad. Feuchtigkeit ".$humi." Prozent.",0);
  }
  if($art==1) {
    #speak("Die Aussentemperatur betraegt ".$temp." Grad. Die Luftfeuchtigkeit liegt bei ".$humi." Prozent.",0);
    speak("Temperatur ".$temp." Grad. Luftfeuchtigkeit ".$humi." Prozent.",0);
  }
}

###############################################################################
# Sagt Wettervorhersage an.
#  Parameter: Tag: Zahl 1-5 (1-heute, 2-morgen,...) Defaul=2
###############################################################################
sub speakWetterVorhersage(;$) {
my ($day) = @_;
if(!defined($day)) {$day=2;}

# TODO: Sauber / Abstraktionslayer erstellen
my $t1= ReadingsVal(+DEVICE_NAME_WEATHER,"fc".$day."_condition",undef);
my $t2= ReadingsVal(+DEVICE_NAME_WEATHER,"fc".$day."_low_c",undef);
my $t3= ReadingsVal(+DEVICE_NAME_WEATHER,"fc".$day."_high_c",undef);

my $text = "";
if($day==1) {
#$text = "Wetter heute ";
$text = "Heute ";
}
if($day==2) {
$text = "Morgen ";
}
if($day==3) {
$text = "Uebermorgen ";
}
if($day>3) {
$text = "Wetter in ".($day-1)." Tagen ";
}
if(defined($t1) && defined($t2) && defined($t3)) {
  $text.=$t1.". ";
  $text.="Temperatur von ".$t2." bis ".$t3." Grad.";
  if($day==1) {
  # gefuehlte Temperatur
  my $tg= ReadingsVal(+DEVICE_NAME_WEATHER,"wind_chill",undef);
  #$text.="Gefuehlte Temperatur aktuell ".$tg." Grad.";
  $text.="Gefuehlte ".$tg." Grad.";
  my $tw= ReadingsVal(+DEVICE_NAME_WEATHER,"wind_speed",undef);
  #$text.="Windgeschwindigkeit ".$tw." Kilometer pro Stunde.";
  $text.="Wind ".$tw." Kilometer pro Stunde.";
  }
} else {
$text="Leider keine Vorhersage verfuegbar.";
}

speak($text,0);
}

###############################################################################
# Bereitet Zahlen zur Ansage auf.
# Ersetzt Kommas und Punkte durch das Wort 'Komma'.
###############################################################################
sub prepareNumToSpeak($) {
my($text) = @_;
$text =~ s/\./Komma/g;
  $text =~ s/,/Komma/g;
return $text;
}

# Rundet eine Zahl ohne Nachkommastellen
sub rundeZahl0($) {
my($val)=@_;
# Prüfen, ob numerisch
if(int($val)>0) {
$val = int($val+0.5);
}
return $val;
}

# Rundet eine Zahl mit 1-er Nachkommastelle
sub rundeZahl1($) {
my($val)=@_;
# Prüfen, ob numerisch
if(int($val)>0) {
$val = int(10*$val+0.5)/10;
}
return $val;
}

###############################################################################
# Bereitet Texte zur Ansage auf.
# Ersetzt Umlaute (ä=ae etc.)
###############################################################################
sub prepareTextToSpeak($) {
my($text) = @_;
# TODO
return $text;
}

######################################################
# Sprachausgabe ueber Text2Speak Modul
#  Parameter:
#   - text: Auszugebender Text
#   - volume (optional) - Lautstaerke
#     (wenn nicht vorhaneden: wird aktuell gesetzte
#      Lautstaerke benutzt,
#      wenn 1 oder groesser: dieser Wert wird benutzt,
#      wenn 0: adaptiv gesetzt je nach Fageszeit
#              (also Nachts wesentlich leiser)
#       (ggf. spaeter adaptiv durch ermitteln der Zimmerlautstaerke)
######################################################
sub speak($;$) {
my($text,$volume)=@_;
if(defined ($volume)) {
if(int($volume) >=1) {
      fhem("set ".+DEVICE_NAME_TTS." volume ".$volume);
    } else {
    if(int($volume) == 0) {
    # Adaptiv
    my ($sec,$min,$hour,$mday,$month,$year,$wday,$yday,$isdst) = localtime;
    # 5 - sehr leise
    # 10 - ok
    # 50 - gut hoerbar
    # 100 - default / gut laut
    #
    # 20:00 - 22:00 => 10
    # 22:00 - 05:00 =>  5
    # 05:00 - 07:00 => 10
    # 07:00 - 08:00 => 50
    # 08:00 - 20:00 => 100
    if ($hour>=20 && $hour<22) {$volume=18}
    if ($hour>=22 || $hour<5)  {$volume=8}
    if ($hour>=5  && $hour<7)  {$volume=15}
    if ($hour>=7  && $hour<8)  {$volume=40}
    if ($hour>=8  && $hour<20)  {$volume=100}
   
    fhem("set ".+DEVICE_NAME_TTS." volume ".$volume);
      }
    }
  }
fhem("set ".+DEVICE_NAME_TTS." tts ".prepareTextToSpeak($text));
}



Viel Spaß ;)

Rince

Zitat@Rince: Hast du deine Doku fertig?


Nein, aber der Teil mit dem Kommatausch ist richtig und funktioniert.

Ganz ohne etwas in den my99Utils. Allerdings steht da nirgends drin, das man die fhem.cfg editieren sollte!

Ein Notify anlegen, und mit DEF (zum anklicken, sind auch Screenshots drin) bearbeiten.


Hast du den Link zu meiner Anleitung?
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)

Smooothy

Zitat von: Rince am 29 September 2014, 22:44:41
Hast du den Link zu meiner Anleitung?

Erstmal danke für die Anregungen! Super Community hier.

Den Link habe ich nicht.

Christian

Rince

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)

coolice

könnte mir einer dabei helfen?
ZitatDanach den Mplayer für alle aufrufbar machen
EDITOR=nano
visudo
Dort an letzter Stelle eintragen:
ALL     ALL = NOPASSWD: /usr/bin/mplayer
Wie mache ich das. bin per ssh auf dem Raspi. Muss ich einfach EDITOR=nano visudo eingeben?
und wie mache ich das? ALL     ALL = NOPASSWD: /usr/bin/mplayer[

Danke für eure Hilfe

marvin78

EDITOR=nano<Enter>
visudo<Enter>


Dann wird ein Editor mit einer Datei zum editieren geöffnet. Hier sollst du am Ende

ALL     ALL = NOPASSWD: /usr/bin/mplayer

eintragen und die Datei speichern, den Editor wieder verlassen (STRG+O, STRG+X).

coolice

Das seiht bei mir dann so aus
Zitatpi@raspberrypi ~ $ EDITOR=nano
pi@raspberrypi ~ $ visudo
visudo: /etc/sudoers: Permission denied
visudo: /etc/sudoers: Permission denied
pi@raspberrypi ~ $