Neues Modul: Text2Speech

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

Vorheriges Thema - Nächstes Thema

Von-XS1-Nach-FHEM

Ich arbeite schon Jahren mit TTS Programmierung mit viel erfolg.

Habe aber leider kein tiefe Kenntnis von das FHEM systeem aber vielleicht konnte jemanden mich ein Tip geben in die richtige Richtung.

Ich habe nämlich zwei Probleme die ich nicht gelost bekomme auch nicht durch es durchforschen von das forum.

1) TTS aussprachen bsw bestehende gespeicherte MP3 Dateien werden verzögert ausgegeben von MYTTS , Ich lese das auch im forum das mann da Abhilfe geschaft hast aber ich verstehe es nicht wie ich das umsetzen kann mit der info im forum.


2) Sprach ausgaben sollten meine Radio stream stoppen oder mixen mit dem radio stream beide bekomme ich aber nicht reibungslos hin.  das habe ich bis jetzt gemacht auf diese weiße: Zusatzfunktion Radiowiedergabe bei Text to Speech- Meldungen unterbrechen (zu finden:https://wiki.fhem.de/wiki/Modul_StreamRadio_Einrichtungshilfe

[table]
[tr]
[td]# Bei TTS- Meldung Radio unterbrechen, Lautstärke hochfahren,
# nach Ansage Radio wieder einschalten, Lautstärke auf alten Wert fahren.
define Func_VolAut_N notify myTTS { \
\
  my $Radio = (Value("SRadio"));;\
  my $Station = ReadingsVal("SRadio", "StreamURL", "");;\
  my $Old_Vol = (OldValue("Dum_Volume_D"));;\
\
  if ($Radio eq "playing") { \
        fhem("set SRadio STOP ;; set Dum_Volume_D 99");;\
        fhem("define Radio_Comeback_A at +00:00:10 set SRadio PLAY $Station;;;; set Dum_Volume_D $Old_Vol");;\
  } \
  if ($Radio eq "stopped") { \
        fhem("set Dum_Volume_D 99");;\
    fhem("define Vol_Res_A at +00:00:10 set Dum_Volume_D $Old_Vol");;\
  } \
}
attr Func_VolAut_N room Radio[/td]
[/tr]
[/table]




Das problem ist hier das zwei audio dateien nicht gleichzeitig zu hören sind oder bei dem link wie ich das jetzt gelöst habe das die Sprachausgaben länger sind wie die feste Einstellung und dies von der zeit lange nicht hilfreich ist. Hat jemanden da noch andere Vorschlag wie ich das machen kann?


td

Hallo Von-XS1-Nach-FHEM,

zu dem zweiten Punkt kann ich leider nichts sagen, aber das Problem unter eins hatte ich auch; bei mir wurde der Text mit bis zu 20 s Verzögerung ausgegeben. Ein Debugging ergab, das mplayer die Ursache war (jahrelang funktionierte es damit problemlos, es muß wohl durch ein mplayer-Update entstanden sein.
Ich bin daher auf einen anderen player ausgewichen:
attr <tts-device> TTS_MplayerCall AUDIODEV={device} /usr/bin/play -q -v $(({volume}*{volumeadjust}/10000)).$(({volume}*{volumeadjust}%10000)) {file} -t alsa
Damit funktioniert es (wieder) einwandfrei.

Prof. Dr. Peter Henning

Für den MPlayer gibt es aber ein Perl-Interface. Mit dem steuere ich das Ding, geht wunderbar.



use Audio::Play::MPlayer;
...
#############################################################################
#
#  MPlayer routines
#
#############################################################################


sub mplay_loadlist{
  my ($self,$list) = @_;
  $self->command( qq{loadlist "$list"} );
  $self->{state} = 1;
  $playstate = 1;
}

sub mplay_loadfile{
  my ($self,$file) = @_;
  $self->command( qq{loadfile "$file"} );
  $self->{state} = 1;
  $playstate = 1;
}

sub mplay_stop{
  my ($self) = @_;
  $self->command( 'quit' )
    if(defined($self));
  $playstate = 0;
  undef $self;
}

sub mplay_forward{
  my ($self) = @_;
  $self->command( qq{pt_step 1} )
    if(defined($self));
}

sub mplay_back{
  my ($self) = @_;
  $self->command( qq{pt_step -1} )
    if(defined($self));
}

sub mplay_poller{
  my ($self) = @_;
  #-- check if playdev is RpiAudio.DG or RpiAudio.Meson
  my $playdev = ( ReadingsVal("RpiAudio.DG","state",undef) )?"RpiAudio.DG":"RpiAudio.Meson";
  if( defined($self) && (ReadingsVal($playdev,"state","") ne "off") ){
    $self->poll(0);
    if( $self->state != 0 ){
      my ($trk,$art,$ret194,$ret90);
      if( ReadingsVal($playdev,"origin","") !~ /SWR/ ){
        $trk = $self->title;
        $art = $self->artist;
        $ret194 = "playing <i>".$trk."</i><br>by <i>".$art."</i>";
        $ret90  = "<i>".$trk."</i><br>von <i>".$art."</i>";
      }else{
        $ret194 = "playing <i>SWR3</i><br>";
        $ret90  = "<i>SWR3</i>";
      }
      fhem("setreading $playdev playinfo $ret194");
      fhem("setreading $playdev playinfo2 $ret90");
      $playstate = 1;
      InternalTimer(time()+5, "mplay_poller", $self,0);
    }elsif( ($self->state == 0) && ($playstate == 1) ){
      $playstate = 0;
      InternalTimer(time()+2, "mplay_poller", $self,0);
    }else{
      Log 1,"state=0";
      mplay_stop($self);
      fhem("set $playdev off");
      fhem("setreading $playdev playinfo stopped");
      fhem("setreading $playdev playinfo2 stopped");
    }
  }else{
  }
}


LG

pah

Von-XS1-Nach-FHEM

#1098
Danke td !
Das ist doch schon mal ein besserer Anfang für mich.
Aber da habe ich noch Probleme mit dem Volume das denn viel zu leise ist?

Wie verhalt sich das hier zu einander in meine Attributes mit dem code in Mplayercall? Was muss ich andern in dem code beim Mplayercall damit das volume lauter wird? Sollte ich dann TTS_VolumeAdjust entfernen oder die wert andern?



Attributes
TTS_MplayerCall AUDIODEV={device} /usr/bin/play -q -v $(({volume}*{volumeadjust}/10000)).$(({volume}*{volumeadjust}%10000)) {file} -t alsa
TTS_Ressource Google
TTS_UseMP3Wrap 1
TTS_VolumeAdjust 3200


ZitatFür den MPlayer gibt es aber ein Perl-Interface. Mit dem steuere ich das Ding, geht wunderbar.

Wow das ware auch toll zu benutzen wenn ich Halt fündig wurde wie ich Das benutzen soll? Gibt es da eine Erklärung wie ich das einbauen kann statt was ich jetzt habe? Ist diese code schon ein teil meine FHEM software oder soll ich die irgendwo einfügen? Ich kenne mich da leider noch nicht so aus  :o

LG WH

Otto123

Gib doch bitte mal ein komplettes list.

@pah mplayer läuft auf einigen Systemen einfach mit ätzender Startverzögerung. Da dürfte ein Aufruf aus Perl heraus nichts ändern.

VolumAdjust 3200 klingt irgendwie komisch, leider ist der Parameter nicht in der Doku.  :-[
Viele Grüße aus Leipzig  ⇉  nächster Stammtisch an der Lindennaundorfer Mühle
RaspberryPi B B+ B2 B3 B3+ ZeroW,HMLAN,HMUART,Homematic,Fritz!Box 7590,WRT3200ACS-OpenWrt,Sonos,VU+,Arduino nano,ESP8266,MQTT,Zigbee,deconz

Von-XS1-Nach-FHEM

Was meinst du mit eine komplettes list?

Das hier zum beispiel?

Zitat
2020.05.11 19:42:42 4: MyTTS: MaxChar = 100, Delimiter = (?<=[\.!?])\s*, ForceSplit = 0, AddDelimiter =
2020.05.11 19:42:42 4: MyTTS: Auflistung der Textbausteine nach Aufbereitung:
2020.05.11 19:42:42 4: MyTTS: 0 => Hallo da höre ich nichts
2020.05.11 19:42:43 4: MyTTS: Verwende TTS Spracheinstellung: Deutsch
2020.05.11 19:42:43 4: MyTTS: Textbaustein ist keine direkte MP3 Datei, ermittle MD5 CacheNamen: 087d7e5197bed09789d1ff0760fe6cf7.mp3
2020.05.11 19:42:43 4: MyTTS: Verwende Google Resource zur TTS-Generierung
2020.05.11 19:42:43 4: MyTTS: Hole URL: http://translate.google.com/translate_tts?tl=de&client=tw-ob&ie=UTF-8&q=Hallo%20da%20h%C3%B6re%20ich%20nichts
2020.05.11 19:42:43 4: MyTTS: Schreibe mp3 in die Datei cache/087d7e5197bed09789d1ff0760fe6cf7.mp3 mit 9120 Bytes
2020.05.11 19:42:43 4: MyTTS: Bearbeite per MP3Wrap jetzt den Text: Hallo da höre ich nichts
2020.05.11 19:42:43 4: MyTTS: cache/087d7e5197bed09789d1ff0760fe6cf7.mp3 hat eine Länge von 2 Sekunden.
2020.05.11 19:42:43 4: MyTTS: AUDIODEV=hw=1.0 /usr/bin/play -q -v $((100*10000/10000)).$((100*10000%10000)) cache/087d7e5197bed09789d1ff0760fe6cf7.mp3 -t alsa >/dev/null
2020.05.11 19:42:44 3: define Vol_Res_B at +00:00:21 set Dum_Volume_D 40 : Vol_Res_B already defined, delete it first
2020.05.11 19:42:44 3: Func_VolAut_N return value: Vol_Res_B already defined, delete it first
2020.05.11 19:42:44 3: FS20 set Kelder_Stem on-for-timer 40
ALSA lib pcm.c:2239:(snd_pcm_open_noupdate) Unknown PCM hw=1.0
/usr/bin/play FAIL formats: can't open output file `hw=1.0': snd_pcm_open error: No such file or directory
Zitat

td

Hier einmal meine vollständige Definition:
defmod wstts Text2Speech hw:1,0
attr wstts TTS_CacheFileDir /opt/fhem/cache
attr wstts TTS_FileTemplateDir /opt/fhem/cache/templates
attr wstts TTS_MplayerCall AUDIODEV={device} /usr/bin/play -q -v $(({volume}*{volumeadjust}/10000)).$(({volume}*{volumeadjust}%10000)) {file} -t alsa
attr wstts TTS_UseMP3Wrap 1
attr wstts TTS_VolumeAdjust 100
attr wstts verbose 4

setstate wstts 2020-05-11 18:44:57 duration 3
setstate wstts 2020-05-11 18:44:57 endTime 00:00:00
setstate wstts 2020-05-11 18:45:00 lastFilename /opt/fhem/cache/f92b45a9232ee8761f72711774c44b28.mp3
setstate wstts 2020-05-11 18:45:00 playing 0


Damit habe ich eine befriedigende Lautstärke. Evtl. musst du die Lautstärke für Dein Sound-Device auch einmal manuell (z. B. per alsa-mixer) einstellen.

Otto123

#1102
Viele Grüße aus Leipzig  ⇉  nächster Stammtisch an der Lindennaundorfer Mühle
RaspberryPi B B+ B2 B3 B3+ ZeroW,HMLAN,HMUART,Homematic,Fritz!Box 7590,WRT3200ACS-OpenWrt,Sonos,VU+,Arduino nano,ESP8266,MQTT,Zigbee,deconz

Von-XS1-Nach-FHEM

Aha da habe ich wieder was gelernt  ::)

Ich war schon ein paar Jahr nicht aktiv hier in forum aber die info ist sehr hilfreich danke  8)

Von-XS1-Nach-FHEM

#1104
Danke td jetzt habe ich festgestellt das
DEF hw=1.0 bei dir hw:1,0 ist.

Das hat der Fehler behoben.

Ich verstehe aber nicht wieso hw=1.0 jetzt hier auf einmal nicht mehr (benutze dies schon Jahren) geht aber wie auch immer es funktioniert jetzt danke!

Otto123

Weil der syntax dafür bei mplayer und play unterschiedlich ist  :-X
Viele Grüße aus Leipzig  ⇉  nächster Stammtisch an der Lindennaundorfer Mühle
RaspberryPi B B+ B2 B3 B3+ ZeroW,HMLAN,HMUART,Homematic,Fritz!Box 7590,WRT3200ACS-OpenWrt,Sonos,VU+,Arduino nano,ESP8266,MQTT,Zigbee,deconz

Von-XS1-Nach-FHEM

#1106
Aha das erklärt doch wieder alles. Das ist dann wieder ein Nachteil wenn mann kein Profi ist dann verpasst mann solche sachen.

Dann noch ein andere frage.

Nachdem Ich eine update durchgeführt habe funktioniert MyTTS nur noch separat wenn ich keine andere Audiodateien laufend habe in FHEM.

Im Vergangenheit konnte während mann seine audio stream laufen hat auf StreamRadio  - MYTTS Meldungen hören als zweite input durch dem livestream. Jetzt geht das bei mir nicht mehr und muss mann erst dem livestream stoppen damit der audio Ausgabe von MyTTS dann gesendet werden kann und abzuhören ist.

Hat jemanden da nich ein 💡 wie ich das wiederherstellen kann damit mann Livestream jnd MyTTS meldungen wieder gleichzeitig hören kannst?

LG
Wh

pjakobs

ich hab mal einen (vorerst noch hässlichen) Hack eingebaut, um das ganze besser mit ESpeak harmonieren zu lassen.

170d169
<                        " TTS_EspeakParameters".
375,376d373
<   } elsif ($a[2] eq "TTS_EspeakParameters"){
<         return "This Attribute is only available with TTS_Ressource *ESpeak*"  if(AttrVal($hash->{NAME},"TTS_Ressource","")ne "ESpeak");
588,589d584
<   my $TTS_EspeakParameters=AttrVal($hash->{NAME}, "TTS_EspeakParameters", "");
<
669a665
>   @text = Text2Speech_SplitString(\@text, $ttsMaxChar{$TTS_Ressource}, ",", 0, "al");
670a667
>   @text = Text2Speech_SplitString(\@text, $ttsMaxChar{$TTS_Ressource}, "und", 0, "af");
673,675d669
<   if ($TTS_Ressource ne "ESpeak"){
<   @text = Text2Speech_SplitString(\@text, $ttsMaxChar{$TTS_Ressource}, "und", 0, "af");
<   @text = Text2Speech_SplitString(\@text, $ttsMaxChar{$TTS_Ressource}, ",", 0, "al");
677c671
< }
---
>
901,904c895
<
<     my $TTS_EspeakParameters=AttrVal($hash->{NAME}, "TTS_EspeakParameters", "");
<     $cmd = "sudo espeak ".$TTS_EspeakParameters."  \"" . $text . "\" -w \"" . $FileWav . "\"";
<     
---
>     $cmd = "sudo espeak -vde+f3 -k5 -s150 \"" . $text . "\" -w \"" . $FileWav . "\"";


Eigentlich sind das zwei Hacks:

1. die Einführung des Attributs TTS_EspeakParameters - die werden einfach ohne Änderung in die ESpeak Kommandozeile übernommen. Damit lassen sich z.B. die deutlich besseren MBROLA voices verwenden (-v mb-de2 etwa)

2. und das ist gerade noch ganz hässlich, ist das Ergebnis mit Espeak wesentlich besser, wenn die Sätze nicht zerlegt, sondern als ganzes gesprochen werden. Vorteilhaft ist da, dass ESpeak keine, oder keine zu enge, Zeichenbegrenzung hat. Ich habe nur auf die Schnelle ein paar der SplitStrings für TTS_Ressource=ESpeak übersprungen - nicht schön, aber nützlich.

Grüße

pj

Von-XS1-Nach-FHEM

Hallo,

Ich mochte gerne eine Verzögerung einstellen mit dieses Modul damit ich einige Sekunden zeit bekomme die Stereoanlage ein zu schalten wenn sich ein Aktor meldet.

Ich habe da TTS_TimeOut gefunden; aber was ich da auch eingebe es bringt mir nicht die Ausgabe Verzögerung von dieses Modul. Die text wird gleich ausgegeben.

Was mache ich da falsch oder wofür ist TTS_TimeOut ? ich konnte da keine weitere info finden leider.






Otto123

Hi,

ich weiß auch nicht was TTS_TimeOut macht, es gibt keine Doku darüber.
Aber klingt auch nicht nach Verzögerung :)

Ich denke was Du willst macht das Modul selbst nicht, das muss Du da machen wo die Ausgabe angestossen wird. Was bedeutet bei Dir " wenn sich ein Aktor meldet "?

Gruß otto
Viele Grüße aus Leipzig  ⇉  nächster Stammtisch an der Lindennaundorfer Mühle
RaspberryPi B B+ B2 B3 B3+ ZeroW,HMLAN,HMUART,Homematic,Fritz!Box 7590,WRT3200ACS-OpenWrt,Sonos,VU+,Arduino nano,ESP8266,MQTT,Zigbee,deconz