1
0
mirror of https://github.com/fhem/fhem-mirror.git synced 2025-05-04 22:19:38 +00:00

- bugfix: 98_Text2Speech: - playing mp3files directly, eg: :ring.mp3:

- playing any mp3file only text



git-svn-id: https://svn.fhem.de/fhem/trunk@6290 2b470e98-0d58-463d-a4d8-8e2adae1ed80
This commit is contained in:
tobiasfaust 2014-07-21 06:38:23 +00:00
parent 0e761abcf5
commit e52caec168
2 changed files with 67 additions and 15 deletions

View File

@ -1,5 +1,7 @@
# Add changes at the top of the list. Keep it in ASCII, and 80-char wide. # Add changes at the top of the list. Keep it in ASCII, and 80-char wide.
# Do not insert empty lines here, update check depends on it. # Do not insert empty lines here, update check depends on it.
- bugfix: 98_Text2Speech: - playing mp3files directly, eg: :ring.mp3:
- playing any mp3file only text
- feature: FB_CALLMONITOR: new reading "direction" to differentiate - feature: FB_CALLMONITOR: new reading "direction" to differentiate
between incoming and outgoing call. between incoming and outgoing call.
- feature: FB_CALLMONITOR: all informational readings about a call will be - feature: FB_CALLMONITOR: all informational readings about a call will be

View File

@ -64,7 +64,7 @@ sub Text2Speech_Initialize($)
" TTS_SentenceAppendix". " TTS_SentenceAppendix".
" TTS_FileMapping". " TTS_FileMapping".
" TTS_FileTemplateDir". " TTS_FileTemplateDir".
" TTS_VolumeAdjust". " TTS_VolumeAdjust".
" ".$readingFnAttributes; " ".$readingFnAttributes;
} }
@ -183,6 +183,7 @@ sub Text2Speech_Attr(@) {
} }
} elsif ($a[2] eq "TTS_FileMapping") { } elsif ($a[2] eq "TTS_FileMapping") {
#Bsp: silence:silence.mp3 pling:mypling,mp3
#ueberpruefen, ob mp3 Template existiert #ueberpruefen, ob mp3 Template existiert
my @FileTpl = split(" ", $TTS_FileMapping); my @FileTpl = split(" ", $TTS_FileMapping);
for(my $j=0; $j<(@FileTpl); $j++) { for(my $j=0; $j<(@FileTpl); $j++) {
@ -338,6 +339,7 @@ sub Text2Speech_Set($@)
##################################### #####################################
sub Text2Speech_PrepareSpeech($$) { sub Text2Speech_PrepareSpeech($$) {
my ($hash, $t) = @_; my ($hash, $t) = @_;
my $me = $hash->{NAME};
my $TTS_Ressource = AttrVal($hash->{NAME}, "TTS_Ressource", "Google"); my $TTS_Ressource = AttrVal($hash->{NAME}, "TTS_Ressource", "Google");
my $TTS_Delemiter = AttrVal($hash->{NAME}, "TTS_Delemiter", undef); my $TTS_Delemiter = AttrVal($hash->{NAME}, "TTS_Delemiter", undef);
@ -364,6 +366,7 @@ sub Text2Speech_PrepareSpeech($$) {
if($TTS_Ressource eq "Google") { if($TTS_Ressource eq "Google") {
my @text; my @text;
# ersetze Sonderzeichen die Google nicht auflösen kann
$t =~ s/ä/ae/g; $t =~ s/ä/ae/g;
$t =~ s/ö/oe/g; $t =~ s/ö/oe/g;
$t =~ s/ü/ue/g; $t =~ s/ü/ue/g;
@ -372,15 +375,32 @@ sub Text2Speech_PrepareSpeech($$) {
$t =~ s/Ü/Ue/g; $t =~ s/Ü/Ue/g;
$t =~ s/ß/ss/g; $t =~ s/ß/ss/g;
@text = $hash->{helper}{Text2Speech} if($hash->{helper}{Text2Speech}[0]); @text = $hash->{helper}{Text2Speech} if($hash->{helper}{Text2Speech}[0]); #vorhandene Queue, neuen Sprachbaustein hinten anfuegen
push(@text, $t); push(@text, $t);
# hole alle Filetemplates
my @FileTpl = split(" ", $TTS_FileTpl); my @FileTpl = split(" ", $TTS_FileTpl);
my @FileTplPc; my @FileTplPc;
for(my $i=0; $i<(@FileTpl); $i++) {
#splitte bei jedem Template auf # bei Angabe direkter MP3-Files wird hier ein temporäres Template vergeben
@FileTplPc = split(/:/, $FileTpl[$i]); for(my $i=0; $i<(@text); $i++) {
@text = Text2Speech_SplitString(\@text, 100, ":".$FileTplPc[0].":", 1, "as"); # splitte bei bspw: :ring: @FileTplPc = ($text[$i] =~ /:([^:]+):/g);
for(my $j=0; $j<(@FileTplPc); $j++) {
my $tpl = "FileTpl_".time()."_#".$i; #eindeutige Templatedefinition schaffen
Log3 $hash, 4, "$me: Angabe einer direkten MP3-Datei gefunden: $FileTplPc[$i] => $tpl";
push(@FileTpl, $tpl.":".$FileTplPc[$j]); #zb: FileTpl_123645875_#0:/ring.mp3
$text[$i] =~ s/$FileTplPc[$j]/$tpl/g; # Ersetze die DateiDefinition gegen ein Template
}
}
#iteriere durch die Sprachbausteine und splitte den Text bei den Filetemplates auf
for(my $i=0; $i<(@text); $i++) {
my $cutter = '#!#'; #eindeutigen Cutter als Delemiter bei den Filetemplates vergeben
@FileTplPc = ($text[$i] =~ /:([^:]+):/g);
for(my $j=0; $j<(@FileTplPc); $j++) {
$text[$i] =~ s/:$FileTplPc[$j]:/$cutter$FileTplPc[$j]$cutter/g;
}
@text = Text2Speech_SplitString(\@text, 0, $cutter, 1, "");
} }
@text = Text2Speech_SplitString(\@text, 100, $TTS_Delemiter, $TTS_ForceSplit, $TTS_AddDelemiter); @text = Text2Speech_SplitString(\@text, 100, $TTS_Delemiter, $TTS_ForceSplit, $TTS_AddDelemiter);
@ -389,14 +409,16 @@ sub Text2Speech_PrepareSpeech($$) {
@text = Text2Speech_SplitString(\@text, 100, ";", 0, "al"); @text = Text2Speech_SplitString(\@text, 100, ";", 0, "al");
@text = Text2Speech_SplitString(\@text, 100, "und", 0, "af"); @text = Text2Speech_SplitString(\@text, 100, "und", 0, "af");
Log3 $hash, 4, "$me: Auflistung der Textbausteine nach Aufbereitung:";
for(my $i=0; $i<(@text); $i++) { for(my $i=0; $i<(@text); $i++) {
# entferne führende und abschließende Leerzeichen aus jedem Textbaustein
$text[$i] =~ s/^\s+|\s+$//g;
for(my $j=0; $j<(@FileTpl); $j++) { for(my $j=0; $j<(@FileTpl); $j++) {
# entferne führende und abschließende Leerzeichen aus jedem Textbaustein # ersetze die FileTemplates mit den echten MP3-Files
$text[$i] =~ s/^\s+|\s+$//g;
# ersetze die FileTemplates
@FileTplPc = split(/:/, $FileTpl[$j]); @FileTplPc = split(/:/, $FileTpl[$j]);
$text[$i] = $TTS_FileTemplateDir ."/". $FileTplPc[1] if($text[$i] eq ":".$FileTplPc[0].":") $text[$i] = $TTS_FileTemplateDir ."/". $FileTplPc[1] if($text[$i] eq $FileTplPc[0]);
} }
Log3 $hash, 4, "$me: $i => ".$text[$i];
} }
@{$hash->{helper}{Text2Speech}} = @text; @{$hash->{helper}{Text2Speech}} = @text;
@ -412,7 +434,7 @@ sub Text2Speech_PrepareSpeech($$) {
# param3: string: Delemiter # param3: string: Delemiter
# param4: int : 1 -> es wird am Delemiter gesplittet # param4: int : 1 -> es wird am Delemiter gesplittet
# 0 -> es wird nur gesplittet, wenn Stringlänge länger als MaxChar # 0 -> es wird nur gesplittet, wenn Stringlänge länger als MaxChar
# param5: string: Add Delemiter to String? [al|af|as|<empty>] (AddLast/AddFirst/AddSingle) # param5: string: Add Delemiter to String? [al|af|<empty>] (AddLast/AddFirst)
# #
# Splittet die Texte aus $hash->{helper}->{Text2Speech} anhand des # Splittet die Texte aus $hash->{helper}->{Text2Speech} anhand des
# Delemiters, wenn die Stringlänge MaxChars übersteigt. # Delemiters, wenn die Stringlänge MaxChars übersteigt.
@ -437,7 +459,6 @@ sub Text2Speech_SplitString(@$$$$){
for(my $j=0; $j<(@b); $j++) { for(my $j=0; $j<(@b); $j++) {
$b[$j] = $b[$j] . $Delemiter if($AddDelemiter eq "al"); # Am Satzende wieder hinzufügen. $b[$j] = $b[$j] . $Delemiter if($AddDelemiter eq "al"); # Am Satzende wieder hinzufügen.
$b[$j+1] = $Delemiter . $b[$j+1] if(($AddDelemiter eq "af") && ($b[$j+1])); # Am Satzanfang des nächsten Satzes wieder hinzufügen. $b[$j+1] = $Delemiter . $b[$j+1] if(($AddDelemiter eq "af") && ($b[$j+1])); # Am Satzanfang des nächsten Satzes wieder hinzufügen.
push(@newText, $Delemiter) if($AddDelemiter eq "as" && $j>0); # AddSingle: füge Delemiter als EinzelSatz hinzu. Zb. bei FileTemplates
push(@newText, $b[$j]); push(@newText, $b[$j]);
} }
} }
@ -751,7 +772,9 @@ sub Text2Speech_WriteStats($$$$){
<b>Set</b> <b>Set</b>
<ul> <ul>
<li><b>tts</b>:<br> <li><b>tts</b>:<br>
Giving a text to translate into audio. Giving a text to translate into audio. You play set mp3-files directly. In this case you have to enclosure them with a single colon before and after the declaration.
The files must save under the directory of given <i>TTS_FileTemplateDir</i>.
Please note: The text doesn´t have any colons itself.
</li> </li>
<li><b>volume</b>:<br> <li><b>volume</b>:<br>
Setting up the volume audio response.<br> Setting up the volume audio response.<br>
@ -842,6 +865,15 @@ sub Text2Speech_WriteStats($$$$){
<b>5:</b> Additionally the individual debug informations from mplayer and mp3wrap will be logged <b>5:</b> Additionally the individual debug informations from mplayer and mp3wrap will be logged
</li> </li>
</ul><br>
<a name="Text2SpeechExamples"></a>
<b>Beispiele</b>
<ul>
<code>define MyTTS Text2Speech hw=0.0</code><br>
<code>set MyTTS tts Die Alarmanlage ist bereit.</code><br>
<code>set MyTTS tts :beep.mp3:</code><br>
<code>set MyTTS tts :mytemplates/alarm.mp3:Die Alarmanlage ist bereit.:ring.mp3:</code><br>
</ul> </ul>
=end html =end html
@ -909,7 +941,9 @@ sub Text2Speech_WriteStats($$$$){
<b>Set</b> <b>Set</b>
<ul> <ul>
<li><b>tts</b>:<br> <li><b>tts</b>:<br>
Setzen eines Textes zur Sprachausgabe. Setzen eines Textes zur Sprachausgabe. Um mp3-Dateien direkt auszugeben, müssen diese mit f&uuml;hrenden
und schließenden Doppelpunkten angegebenen sein. Die MP3-Dateien müssen unterhalb des Verzeichnisses <i>TTS_FileTemplateDir</i> gespeichert sein.<br>
Der Text selbst darf deshalb selbst keine Doppelpunte beinhalten. Siehe Beispiele.
</li> </li>
<li><b>volume</b>:<br> <li><b>volume</b>:<br>
Setzen der Ausgabe Lautst&auml;rke.<br> Setzen der Ausgabe Lautst&auml;rke.<br>
@ -980,7 +1014,7 @@ sub Text2Speech_WriteStats($$$$){
Angabe von m&ouml;glichen MP3-Dateien mit deren Templatedefinition. Getrennt duch Leerzeichen. Angabe von m&ouml;glichen MP3-Dateien mit deren Templatedefinition. Getrennt duch Leerzeichen.
Die Templatedefinitionen können in den per <i>tts</i> &uuml;bergebenen Sprachbausteinen verwendet werden Die Templatedefinitionen können in den per <i>tts</i> &uuml;bergebenen Sprachbausteinen verwendet werden
und m&uuml;ssen mit einem beginnenden und endenden Doppelpunkt angegeben werden. und m&uuml;ssen mit einem beginnenden und endenden Doppelpunkt angegeben werden.
Die Dateien müssen im Verzeichnis <i>TTS_FIleTemplateDir</i> gespeichert sein.<br> Die Dateien müssen im Verzeichnis <i>TTS_FileTemplateDir</i> gespeichert sein.<br>
<code>attr myTTS TTS_FileMapping ring:ringtone.mp3 beep:MyBeep.mp3</code><br> <code>attr myTTS TTS_FileMapping ring:ringtone.mp3 beep:MyBeep.mp3</code><br>
<code>set MyTTS tts Achtung: hier kommt mein Klingelton :ring: War der laut?</code> <code>set MyTTS tts Achtung: hier kommt mein Klingelton :ring: War der laut?</code>
</li> </li>
@ -991,6 +1025,12 @@ sub Text2Speech_WriteStats($$$$){
Optional, Default: <code>cache/templates</code> Optional, Default: <code>cache/templates</code>
</li> </li>
<li>TTS_VolumeAdjust<br>
Anhebung der Grundlautstärke zur Anpassung an die angeschlossenen Lautsprecher. <br>
Default: 110<br>
<code>attr myTTS TTS_VolumeAdjust 400</code><br>
</li>
<li><a href="#readingFnAttributes">readingFnAttributes</a></li><br> <li><a href="#readingFnAttributes">readingFnAttributes</a></li><br>
<li><a href="#disable">disable</a><br> <li><a href="#disable">disable</a><br>
@ -1004,7 +1044,17 @@ sub Text2Speech_WriteStats($$$$){
<b>5:</b> Zus&auml;tzlich werden auch die Meldungen von Mplayer und Mp3Wrap ausgegeben <b>5:</b> Zus&auml;tzlich werden auch die Meldungen von Mplayer und Mp3Wrap ausgegeben
</li> </li>
</ul><br>
<a name="Text2SpeechExamples"></a>
<b>Beispiele</b>
<ul>
<code>define MyTTS Text2Speech hw=0.0</code><br>
<code>set MyTTS tts Die Alarmanlage ist bereit.</code><br>
<code>set MyTTS tts :beep.mp3:</code><br>
<code>set MyTTS tts :mytemplates/alarm.mp3:Die Alarmanlage ist bereit.:ring.mp3:</code><br>
</ul> </ul>
=end html_DE =end html_DE
=cut =cut