From edf15c03a09b8d777049c2bbd02d1351934a931f Mon Sep 17 00:00:00 2001 From: tobiasfaust <> Date: Fri, 17 Jan 2014 11:48:22 +0000 Subject: [PATCH] 98_Text2Speech.pm: Add new Attribute: TTS_SentenceAppendix To fix a Bug with a Bluetooth-AudioSink git-svn-id: https://svn.fhem.de/fhem/trunk@4674 2b470e98-0d58-463d-a4d8-8e2adae1ed80 --- fhem/FHEM/98_Text2Speech.pm | 90 ++++++++++++++++++++++++++----------- 1 file changed, 63 insertions(+), 27 deletions(-) diff --git a/fhem/FHEM/98_Text2Speech.pm b/fhem/FHEM/98_Text2Speech.pm index 22ac887d3..12f530183 100644 --- a/fhem/FHEM/98_Text2Speech.pm +++ b/fhem/FHEM/98_Text2Speech.pm @@ -1,6 +1,6 @@ ############################################## -# $Id$ +# $Id: $ # # 98_Text2Speech.pm # @@ -61,6 +61,7 @@ sub Text2Speech_Initialize($) " TTS_CacheFileDir". " TTS_UseMP3Wrap:0,1". " TTS_MplayerCall". + " TTS_SentenceAppendix". " ".$readingFnAttributes; } @@ -142,6 +143,32 @@ sub Text2Speech_Attr(@) { my @a = @_; my $do = 0; my $hash = $defs{$a[1]}; + my $value = $a[3]; + + if($a[2] eq "TTS_Delemiter" && $a[0] ne "del") { + return "wrong delemiter syntax: [+-]a[lfn]. \n". + " Example 1: +an~\n". + " Example 2: +al." if($value !~ m/^([+-]a[lfn]){0,1}(.){1}$/i); + return "This Attribute is only available in direct mode" if($hash->{MODE} ne "DIRECT"); + + } elsif ($a[2] eq "TTS_Ressource") { + return "This Attribute is only available in direct mode" if($hash->{MODE} ne "DIRECT"); + + } elsif ($a[2] eq "TTS_CacheFileDir") { + return "This Attribute is only available in direct mode" if($hash->{MODE} ne "DIRECT"); + + } elsif ($a[2] eq "TTS_UseMP3Wrap") { + return "This Attribute is only available in direct mode" if($hash->{MODE} ne "DIRECT"); + return "Attribute TTS_UseMP3Wrap is required by Attribute TTS_SentenceAppendix! Please delete it first." + if(AttrVal($hash->{NAME}, "TTS_SentenceAppendix", undef)); + + } elsif ($a[2] eq "TTS_SentenceAppendix") { + return "This Attribute is only available in direct mode" if($hash->{MODE} ne "DIRECT"); + return "Attribute TTS_UseMP3Wrap is required!" unless(AttrVal($hash->{NAME}, "TTS_UseMP3Wrap", undef)); + + my $file = AttrVal($hash->{NAME}, "TTS_CacheFileDir", "cache") ."/". $value; + return "File <".$file."> does not exists in CacheFileDir" if(! -e $file); + } if($a[0] eq "set" && $a[2] eq "disable") { $do = (!defined($a[3]) || $a[3]) ? 1 : 2; @@ -151,19 +178,6 @@ sub Text2Speech_Attr(@) { $hash->{STATE} = ($do == 1 ? "disabled" : "Initialized"); - if($a[2] eq "TTS_Delemiter") { - my $TTS_Delemiter = $a[3]; - return "wrong delemiter syntax: [+-]a[lfn]. \n". - " Example 1: +an~\n". - " Example 2: +al." if($TTS_Delemiter =~ m/^([+-]a[lfn]){0,1}(.){1}$/i); - return "This Attribute is only available in direct mode" if($hash->{MODE} ne "DIRECT"); - } elsif ($a[2] eq "TTS_Ressource") { - return "This Attribute is only available in direct mode" if($hash->{MODE} ne "DIRECT"); - } elsif ($a[2] eq "TTS_CacheFileDir") { - return "This Attribute is only available in direct mode" if($hash->{MODE} ne "DIRECT"); - } elsif ($a[2] eq "TTS_UseMP3Wrap") { - return "This Attribute is only available in direct mode" if($hash->{MODE} ne "DIRECT"); - } return undef; } @@ -446,15 +460,24 @@ sub Text2Speech_DoIt($) { # benutze das Tool MP3Wrap um bereits einzelne vorhandene Sprachdateien # zusammenzuführen. Ziel: sauberer Sprachfluss my @Mp3WrapArray; + my $Mp3WrapText = ""; + my $TTS_SentenceAppendix = AttrVal($hash->{NAME}, "TTS_SentenceAppendix", undef); #muss eine mp3-Datei sein, ohne Pfadangabe + undef($TTS_SentenceAppendix) if($TTS_SentenceAppendix && (! -e $TTS_CacheFileDir ."/".$TTS_SentenceAppendix)); + foreach my $t (@{$hash->{helper}{Text2Speech}}) { $filename = md5_hex($t) . ".mp3"; $file = $TTS_CacheFileDir."/".$filename; if(-e $file) { push(@Mp3WrapArray, $file); + $Mp3WrapText .= $t; } else {last;} } + push(@Mp3WrapArray, $TTS_CacheFileDir ."/".$TTS_SentenceAppendix) if($TTS_SentenceAppendix); + if(scalar(@Mp3WrapArray) >= 2) { + Log3 $hash->{NAME}, 4, "Text2Speech: Bearbeite per MP3Wrap jetzt den Text: ". $Mp3WrapText; + my $Mp3WrapPrefix = md5_hex(join("|", @Mp3WrapArray)); my $Mp3WrapFile = $TTS_CacheFileDir ."/". $Mp3WrapPrefix . "_MP3WRAP.mp3"; @@ -480,7 +503,7 @@ sub Text2Speech_DoIt($) { $filename = md5_hex($hash->{helper}{Text2Speech}[0]) . ".mp3"; $file = $TTS_CacheFileDir."/".$filename; - Log3 $hash->{NAME}, 4, "Text2Speech: Bearbeite jetzt String: ". $hash->{helper}{Text2Speech}[0]; + Log3 $hash->{NAME}, 4, "Text2Speech: Bearbeite jetzt den Text: ". $hash->{helper}{Text2Speech}[0]; if(! -e $file) { # Datei existiert noch nicht im Cache my $fh; @@ -629,7 +652,7 @@ sub Text2Speech_AbortFn($) { Attributes