] (AddLast/AddFirst)
#
# Splittet die Texte aus $hash->{helper}->{Text2Speech} anhand des
-# Delemiters, wenn die Stringlänge MaxChars übersteigt.
-# Ist "AddDelemiter" angegeben, so wird der Delemiter an den
+# Delimiters, wenn die Stringlänge MaxChars übersteigt.
+# Ist "AddDelimiter" angegeben, so wird der Delimiter an den
# String wieder angefügt
#####################################
sub Text2Speech_SplitString($$$$$){
my @text = @{shift()};
my $MaxChar = shift;
- my $Delemiter = shift;
+ my $Delimiter = shift;
my $ForceSplit = shift;
- my $AddDelemiter = shift;
+ my $AddDelimiter = shift;
my @newText;
for(my $i=0; $i<(@text); $i++) {
@@ -603,20 +649,43 @@ sub Text2Speech_SplitString($$$$$){
next;
}
- my @b = split(/$Delemiter/, $text[$i]);
- for(my $j=0; $j<(@b); $j++) {
- $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.
- push(@newText, $b[$j]);
+ my @b;
+ if($Delimiter =~/^ $/) {
+ @b = split(' ', $text[$i]);
}
+ else {
+ @b = split(/$Delimiter/, $text[$i]);
+ }
+ if((@b)>1) {
+ # setze zu kleine Textbausteine wieder zusammen bis MaxChar erreicht ist
+ if(length($Delimiter)==1) {
+ for(my $k=0; $k<(@b); ) {
+ if($k+1<(@b) && length($b[$k])+length($b[$k+1]) <= $MaxChar) {
+ $b[$k] = join($Delimiter, $b[$k], $b[$k+1]);
+ splice(@b, $k+1, 1);
+ }
+ else {
+ $k++;
+ }
+ }
+ }
+ for(my $j=0; $j<(@b); $j++) {
+ (my $boundaryDelimiter = $Delimiter) =~ s/^\\b(.+)\\b$/$1/g;
+ $b[$j] = $b[$j] . $boundaryDelimiter if($AddDelimiter eq "al"); # Am Satzende wieder hinzufügen.
+ $b[$j+1] = $boundaryDelimiter . $b[$j+1] if(($AddDelimiter eq "af") && ($b[$j+1])); # Am Satzanfang des nächsten Satzes wieder hinzufügen.
+ push(@newText, $b[$j]);
+ }
+ }
+ elsif((@b)==1) {
+ push(@newText, $text[$i]);
+ }
}
return @newText;
}
#####################################
# param1: hash : Hash
-# param2: string: Typ (mplayer oder mp3wrap oder ....)
-# param3: string: Datei
+# param2: string: Datei
#
# Erstellt den Commandstring für den Systemaufruf
#####################################
@@ -638,18 +707,21 @@ sub Text2Speech_BuildMplayerCmdString($$) {
$mplayerAudioOpts = "";
}
- # anstatt mplayer wird ein anderer Player verwendet
- if ($TTS_MplayerCall !~ m/mplayer/) {
- $AlsaDevice = "";
- $mplayerAudioOpts = "";
- $mplayerNoDebug = "";
- $mplayerOpts = "";
- }
-
my $NoDebug = $mplayerNoDebug;
$NoDebug = "" if($verbose >= 5);
- $cmd = $TTS_MplayerCall . " " . $mplayerAudioOpts . $AlsaDevice . " " .$NoDebug. " " . $mplayerOpts . " " . $file;
+ # anstatt mplayer wird ein anderer Player verwendet
+ if ($TTS_MplayerCall !~ m/mplayer/) {
+ $TTS_MplayerCall =~ s/{device}/$AlsaDevice/g;
+ $TTS_MplayerCall =~ s/{volume}/$hash->{VOLUME}/g;
+ $TTS_MplayerCall =~ s/{volumeadjust}/$TTS_VolumeAdjust/g;
+ $TTS_MplayerCall =~ s/{file}/$file/g;
+
+ $cmd = $TTS_MplayerCall;
+ } else {
+ $cmd = $TTS_MplayerCall . " " . $mplayerAudioOpts . $AlsaDevice . " " .$NoDebug. " " . $mplayerOpts . " " . $file;
+ }
+
my $mp3Duration = Text2Speech_CalcMP3Duration($hash, $file);
BlockingInformParent("Text2Speech_readingsSingleUpdateByName", [$hash->{NAME}, "duration", "$mp3Duration"], 0);
@@ -664,8 +736,8 @@ sub Text2Speech_BuildMplayerCmdString($$) {
sub Text2Speech_readingsSingleUpdateByName($$$) {
my ($devName, $readingName, $readingVal) = @_;
my $hash = $defs{$devName};
- #Log3 $hash, 4, "Text2Speech_readingsSingleUpdateByName: Dev:$devName Reading:$readingName Val:$readingVal";
- readingsSingleUpdate($defs{$devName}, $readingName, $readingVal, 1);
+ Log3 $hash, 5, $hash->{NAME}.": readingsSingleUpdateByName: Dev:$devName Reading:$readingName Val:$readingVal";
+ readingsSingleUpdate($hash, $readingName, $readingVal, 1);
}
#####################################
@@ -707,7 +779,7 @@ sub Text2Speech_Download($$$) {
my $TTS_Ressource = AttrVal($hash->{NAME}, "TTS_Ressource", "Google");
my $TTS_User = AttrVal($hash->{NAME}, "TTS_User", "");
my $TTS_APIKey = AttrVal($hash->{NAME}, "TTS_APIKey", "");
- my $TTS_Language = AttrVal($hash->{NAME}, "TTS_Language", "Deutsch");
+ my $TTS_Language = AttrVal($hash->{NAME}, "TTS_Language_Custom", $language{$TTS_Ressource}{AttrVal($hash->{NAME}, "TTS_Language", "Deutsch")});
my $TTS_Quality = AttrVal($hash->{NAME}, "TTS_Quality", "");
my $TTS_Speed = AttrVal($hash->{NAME}, "TTS_Speed", "");
my $cmd;
@@ -718,8 +790,7 @@ sub Text2Speech_Download($$$) {
my $fh;
my $url = "http://" . $ttsHost{$TTS_Ressource} . $ttsPath{$TTS_Ressource};
- $url .= $ttsLang{$TTS_Ressource};
- $url .= $language{$TTS_Ressource}{$TTS_Language};
+ $url .= $ttsLang{$TTS_Ressource} . $TTS_Language;
$url .= "&" . $ttsAddon{$TTS_Ressource} if(length($ttsAddon{$TTS_Ressource})>0);
$url .= "&" . $ttsUser{$TTS_Ressource} . $TTS_User if(length($ttsUser{$TTS_Ressource})>0);
$url .= "&" . $ttsAPIKey{$TTS_Ressource} . $TTS_APIKey if(length($ttsAPIKey{$TTS_Ressource})>0);
@@ -729,7 +800,7 @@ sub Text2Speech_Download($$$) {
Log3 $hash->{NAME}, 4, $hash->{NAME}.": Verwende ".$TTS_Ressource." OnlineResource zum Download";
Log3 $hash->{NAME}, 4, $hash->{NAME}.": Hole URL: ". $url;
- #$HttpResponse = GetHttpFile($ttsHost, $ttsPath . $ttsLang . $language{$TTS_Ressource}{$TTS_Language} . "&" . $ttsQuery . uri_escape($text));
+ #$HttpResponse = GetHttpFile($ttsHost, $ttsPath . $ttsLang . $TTS_Language . "&" . $ttsQuery . uri_escape($text));
my $param = {
url => $url,
timeout => 5,
@@ -755,21 +826,23 @@ sub Text2Speech_Download($$$) {
$fh->print($HttpResponse);
Log3 $hash->{NAME}, 4, $hash->{NAME}.": Schreibe mp3 in die Datei $file mit ".length($HttpResponse)." Bytes";
close($fh);
- } elsif ($TTS_Ressource eq "ESpeak") {
+ }
+ elsif ($TTS_Ressource eq "ESpeak") {
+ my $FileWav = $file . ".wav";
+
+ $cmd = "sudo espeak -vde+f3 -k5 -s150 \"" . $text . "\" -w \"" . $FileWav . "\"";
+ Log3 $hash, 4, $hash->{NAME}.":" .$cmd;
+ system($cmd);
+
+ $cmd = "lame \"" . $FileWav . "\" \"" . $file . "\"";
+ Log3 $hash, 4, $hash->{NAME}.":" .$cmd;
+ system($cmd);
+ unlink $FileWav;
+ }
+ elsif ($TTS_Ressource eq "SVOX-pico") {
my $FileWav = $file . ".wav";
- $cmd = "sudo espeak -vde+f3 -k5 -s150 \"" . $text . "\">\"" . $FileWav . "\"";
- Log3 $hash, 4, $hash->{NAME}.":" .$cmd;
- system($cmd);
-
- $cmd = "lame \"" . $FileWav . "\" \"" . $file . "\"";
- Log3 $hash, 4, $hash->{NAME}.":" .$cmd;
- system($cmd);
- unlink $FileWav;
- } elsif ($TTS_Ressource eq "SVOX-pico") {
- my $FileWav = $file . ".wav";
-
- $cmd = "pico2wave --lang=" . $language{$TTS_Ressource}{$TTS_Language} . " --wave=\"" . $FileWav . "\" \"" . $text . "\"";
+ $cmd = "pico2wave --lang=" . $TTS_Language . " --wave=\"" . $FileWav . "\" \"" . $text . "\"";
Log3 $hash, 4, $hash->{NAME}.":" .$cmd;
system($cmd);
@@ -778,6 +851,30 @@ sub Text2Speech_Download($$$) {
system($cmd);
unlink $FileWav;
}
+ elsif ($TTS_Ressource eq "Amazon-Polly") {
+ # with awscli
+ # aws polly synthesize-speech --output-format mp3 --voice-id Marlene --text '%text%' abc.mp3
+ #$cmd = "aws polly synthesize-speech --output-format json --speech-mark-types='[\"viseme\"]' --voice-id " . $TTS_Language . " --text '" . $text . "' " . $file;
+ #Log3 $hash, 4, $hash->{NAME}.":" .$cmd;
+ #system($cmd);
+ my $fh;
+ my $polly = Paws->service('Polly', region => 'eu-central-1');
+ my $res = $polly->SynthesizeSpeech(
+ VoiceId => $TTS_Language,
+ Text => $text,
+ OutputFormat => 'mp3',
+ );
+
+ $fh = new IO::File ">$file";
+ if(!defined($fh)) {
+ Log3 $hash->{NAME}, 2, $hash->{NAME}.": mp3 Datei <$file> konnte nicht angelegt werden.";
+ return undef;
+ }
+
+ $fh->print($res->AudioStream);
+ Log3 $hash->{NAME}, 4, $hash->{NAME}.": Schreibe mp3 in die Datei $file mit ". $res->RequestCharacters ." Chars";
+ close($fh);
+ }
}
#####################################
@@ -789,6 +886,7 @@ sub Text2Speech_DoIt($) {
my $TTS_Language = AttrVal($hash->{NAME}, "TTS_Language", "Deutsch");
my $TTS_SentenceAppendix = AttrVal($hash->{NAME}, "TTS_SentenceAppendix", undef); #muss eine mp3-Datei sein, ohne Pfadangabe
my $TTS_FileTemplateDir = AttrVal($hash->{NAME}, "TTS_FileTemplateDir", "templates");
+ my $TTS_OutputFile = AttrVal($hash->{NAME}, "TTS_OutputFile", undef);
my $myFileTemplateDir;
if($TTS_FileTemplateDir =~ m/^\/.*/) { $myFileTemplateDir = $TTS_FileTemplateDir; } else { $myFileTemplateDir = $TTS_CacheFileDir ."/". $TTS_FileTemplateDir;}
@@ -814,6 +912,7 @@ sub Text2Speech_DoIt($) {
undef($TTS_SentenceAppendix) if($TTS_SentenceAppendix && (! -e $TTS_SentenceAppendix));
#Abspielliste erstellen
+ my $AnzahlDownloads = 0;
foreach my $t (@{$hash->{helper}{Text2Speech}}) {
if(-e $t) {
# falls eine bestimmte mp3-Datei mit absolutem Pfad gespielt werden soll
@@ -836,8 +935,10 @@ sub Text2Speech_DoIt($) {
push(@Mp3WrapText, $t);
} else {
# es befindet sich noch Text zum Download in der Queue
- if (AttrVal($hash->{NAME}, "TTS_SpeakAsFastAsPossible", 0) == 0) {
+ if (AttrVal($hash->{NAME}, "TTS_SpeakAsFastAsPossible", 0) == 0 || (AttrVal($hash->{NAME}, "TTS_SpeakAsFastAsPossible", 0) == 1 && $AnzahlDownloads == 0)) {
+ # nur Download wenn kein TTS_SpeakAsFastAsPossible gesetzt ist oder der erste Download erfolgen soll
Text2Speech_Download($hash, $file, $t);
+ $AnzahlDownloads ++;
if(-e $file) {
push(@Mp3WrapFiles, $file);
push(@Mp3WrapText, $t);
@@ -853,32 +954,57 @@ sub Text2Speech_DoIt($) {
push(@Mp3WrapFiles, $TTS_SentenceAppendix) if($TTS_SentenceAppendix);
- if(scalar(@Mp3WrapFiles) >= 2 && AttrVal($hash->{NAME}, "TTS_UseMP3Wrap", 0) == 1) {
+ if (AttrVal($hash->{NAME}, "TTS_UseMP3Wrap", 0) == 1) {
# benutze das Tool MP3Wrap um bereits einzelne vorhandene Sprachdateien
# zusammenzuführen. Ziel: sauberer Sprachfluss
Log3 $hash->{NAME}, 4, $hash->{NAME}.": Bearbeite per MP3Wrap jetzt den Text: ". join(" ", @Mp3WrapText);
- my $Mp3WrapPrefix = md5_hex(join("|", @Mp3WrapFiles));
- my $Mp3WrapFile = $TTS_CacheFileDir ."/". $Mp3WrapPrefix . "_MP3WRAP.mp3";
+ my $Mp3WrapFile;
+ my $Mp3WrapPrefix;
+ $Mp3WrapPrefix = md5_hex(join("|", @Mp3WrapFiles));
- if(! -e $Mp3WrapFile) {
- $cmd = "mp3wrap " .$TTS_CacheFileDir. "/" .$Mp3WrapPrefix. ".mp3 " .join(" ", @Mp3WrapFiles);
+ if ($TTS_OutputFile) {
+ if ($TTS_OutputFile !~ m/^\//) {
+ $TTS_OutputFile = $TTS_CacheFileDir ."/".$TTS_OutputFile;
+ }
+ Log3 $hash->{NAME}, 4, $hash->{NAME}.": Verwende fixen Dateinamen: $TTS_OutputFile";
+ $Mp3WrapFile = $TTS_OutputFile;
+ unlink($Mp3WrapFile);
+ } else {
+ $Mp3WrapFile = $TTS_CacheFileDir ."/". $Mp3WrapPrefix . ".mp3";
+ }
+
+ if (scalar(@Mp3WrapFiles) == 1) {
+ # wenn nur eine Datei, dann wird diese genutzt
+ $Mp3WrapFile = $Mp3WrapFiles[0];
+ } elsif(! -e $Mp3WrapFile) {
+ $cmd = "mp3wrap " .$Mp3WrapFile. " " .join(" ", @Mp3WrapFiles);
$cmd .= " >/dev/null" if($verbose < 5);
Log3 $hash->{NAME}, 4, $hash->{NAME}.": " .$cmd;
system($cmd);
+
+ my $t = substr($Mp3WrapFile, 0, length($Mp3WrapFile)-4)."_MP3WRAP.mp3";
+ Log3 $hash->{NAME}, 4, $hash->{NAME}.": Benenne Datei um von <".$t."> nach <".$Mp3WrapFile.">";
+ rename($t, $Mp3WrapFile);
+ }
+
+ if ($TTS_OutputFile && $TTS_OutputFile ne $Mp3WrapFile) {
+ Log3 $hash->{NAME}, 4, $hash->{NAME}.": Benenne Datei um von <".$Mp3WrapFile."> nach <".$TTS_OutputFile.">";
+ rename($Mp3WrapFile, $TTS_OutputFile);
+ $Mp3WrapFile = $TTS_OutputFile;
}
if ($hash->{MODE} ne "SERVER") {
- # im Falls Server, nicht die Datei abspielen
+ # im Server Mode, nicht die Datei abspielen
if(-e $Mp3WrapFile) {
$cmd = Text2Speech_BuildMplayerCmdString($hash, $Mp3WrapFile);
$cmd .= " >/dev/null" if($verbose < 5);
- Log3 $hash->{NAME}, 4, $hash->{NAME}.":" .$cmd;
+ Log3 $hash->{NAME}, 4, $hash->{NAME}.": " .$cmd;
system($cmd);
} else {
- Log3 $hash->{NAME}, 2, $hash->{NAME}.": Mp3Wrap Datei konnte nicht angelegt werden.";
+ Log3 $hash->{NAME}, 2, $hash->{NAME}.": Mp3Wrap Datei konnte nicht gefunden werden.";
}
}
@@ -1010,7 +1136,7 @@ sub Text2Speech_WriteStats($$$$){
=pod
=item helper
=item summary speaks given text via loudspeaker
-=item summary_DE wandelt uebergebenen Text um fuer Ausgabe auf Lautsprecher
+=item summary_DE wandelt Text in Sprache um zur Ausgabe auf Lautsprecher
=begin html
@@ -1100,9 +1226,9 @@ sub Text2Speech_WriteStats($$$$){
Attributes
- - TTS_Delemiter
+ - TTS_Delimiter
optional: By using the google engine, its not possible to convert more than 100 characters in a single audio brick.
- With a delemiter the audio brick will be split at this character. A delemiter must be a single character.!
+ With a Delimiter the audio brick will be split at this character. A Delimiter must be a single character.!
By default, ech audio brick will be split at sentence end. Is a single sentence longer than 100 characters,
the sentence will be split additionally at comma, semicolon and the word and.
Notice: Only available in locally instances with Google engine!
@@ -1136,9 +1262,29 @@ sub Text2Speech_WriteStats($$$$){
wget http://www.dr-bischoff.de/raspi/pico2wave.deb
sudo dpkg --install pico2wave.deb
+ - Amazon-Polly
+ Using the Amazon Polly engine, the same as Amazon Alexa.
+ The perl package Paws is required. An AWS Access and Polly Aws User is required too
+ cpan paws
+ The credentials to your AWS Polly are expected at ~/.aws/credentials
+ [default]
+ aws_secret_access_key = xxxxxxxxxxxxxxxxxxxxxx
+ aws_access_key_id = xxxxxxxxxxxxxxx
+
+
+ TTS_Language
+ Selection of different languages
+
+
+ TTS_Language_Custom
+ if you want another engine and speech of default languages, you can insert this here.
+ The definition is dependent of used engine. This attribute overrides an TTS_Language attribute.
+ Please refer the specific API reference.
+
+
TTS_APIKey
An APIKey its needed if you want to use VoiceRSS. You have to register at the following page:
http://www.voicerss.org/registration.aspx
@@ -1293,6 +1439,10 @@ sub Text2Speech_WriteStats($$$$){
hier das Attribut TTS_speakAsFastAsPossible zu verwenden. Die Verwendung des Attributes TTS_useMP3Wrap wird dringend empfohlen.
Ansonsten wird hier nur der letzte Teiltext als mp3 Datei im Reading dargestellt.
+
+ Beispiel:
+ define MyTTS Text2Speech none
+
@@ -1319,13 +1469,22 @@ sub Text2Speech_WriteStats($$$$){
Attribute
- - TTS_Delemiter
- Optional: Wird ein Delemiter angegeben, so wird der Sprachbaustein an dieser Stelle geteilt.
- Als Delemiter ist nur ein einzelnes Zeichen zulässig.
- Hintergrund ist die Tatsache, das die Google Sprachengine nur 100Zeichen zulässt.
+ - TTS_Delimiter
+ Optional: Wird ein Delimiter angegeben, so wird der Sprachbaustein an dieser Stelle geteilt.
+ Als Delimiter ist nur ein einzelnes Zeichen zulässig.
+ Hintergrund ist die Tatsache, das die einige Sprachengines nur eine bestimmt Anzahl an Zeichen (zb. Google nur 100Zeichen) zulässt.
Im Standard wird nach jedem Satzende geteilt. Ist ein einzelner Satz länger als 100 Zeichen,
so wird zusätzlich nach Kommata, Semikolon und dem Verbindungswort und geteilt.
- Achtung: Nur bei einem lokal definierter Text2Speech Instanz möglich und nur bei Nutzung der Google Sprachengine relevant!
+ Achtung: Nur bei einem lokal definierter Text2Speech Instanz möglich!
+ Notation
+ + -> erzwinge das Trennen, auch wenn Textbaustein < x Zeichen
+ - -> Trenne nur wenn Textbaustein > x Zeichen
+ af -> add first -> füge den Delimiter am Satzanfang wieder hinzu
+ al -> add last -> füge den Delimiter am Satzende wieder hinzu
+ an -> add nothing -> Delimiter nicht wieder hinzufügen
+ ~ -> der Delimiter
+ Beispiel
+ attr myTTS TTS_Delimiter -al.
- TTS_Ressource
@@ -1340,7 +1499,7 @@ sub Text2Speech_WriteStats($$$$){
Nutzung der VoiceRSS Sprachengine. Die Nutzung ist frei bis zu 350 Anfragen pro Tag.
Wenn mehr benötigt werden ist ein Bezahlmodell wählbar. Ein Internetzugriff ist notwendig!
Aufgrund der Qualität ist der Einsatz diese Engine ebenfalls zu empfehlen.
- Wenn diese Engine benutzt wird, ist ein APIKey notwendig (siehe TTXS_APIKey)
+ Wenn diese Engine benutzt wird, ist ein APIKey notwendig (siehe TTS_APIKey)
- ESpeak
Nutzung der ESpeak Offline Sprachengine. Die Qualitä ist schlechter als die Google Engine.
@@ -1358,9 +1517,29 @@ sub Text2Speech_WriteStats($$$$){
wget http://www.dr-bischoff.de/raspi/pico2wave.deb
sudo dpkg --install pico2wave.deb
+ - Amazon-Polly
+ Nutzung der Amazon Polly Sprachengine, dieselbe Engine wie für Amazon Alexa verwendet wird.
+ Es muss das Perl Package Paws installiert sowie ein AWS Konto und ein Polly AWS User verfügbar sein
+ cpan paws
+ Die Zugangsdaten zum eigenen AWS Konto müssen unter ~/.aws/credentials liegen.
+ [default]
+ aws_secret_access_key = xxxxxxxxxxxxxxxxxxxxxx
+ aws_access_key_id = xxxxxxxxxxxxxxx
+
+
-
+
+ TTS_Language
+ Auswahl verschiendener Standardsprachen
+
+
+ TTS_Language_Custom
+ Möchte man eine Spreche und Stimme abweichend der Standardspreachen verwenden, so kann man diese hier eintragen.
+ Die Definition ist abhängig der verwendeten Sprachengine. Diesea Attribut überschreibt ein ev. vorhandenes TTS_Langugae Attribut.
+ Siehe in die jeweilige API Referenz
+
+
TTS_APIKey
Wenn VoiceRSS genutzt wird, ist ein APIKey notwendig. Um diesen zu erhalten ist eine vorherige
Registrierung notwendig. Anschließend erhält man den APIKey
@@ -1373,13 +1552,13 @@ sub Text2Speech_WriteStats($$$$){
TTS_CacheFileDir
Optional: Die per Google geladenen Sprachbausteine werden in diesem Verzeichnis zur Wiedeverwendung abgelegt.
- Es findet zurZEit keine automatisierte Löschung statt.
+ Es findet zurZeit keine automatisierte Löschung statt.
Default: cache/
Achtung: Nur bei einem lokal definierter Text2Speech Instanz möglich!
TTS_UseMP3Wrap
- Optional: Für eine flüssige Sprachausgabe ist es zu empfehlen, die einzelnen vorher per Google
+ Optional: Für eine flüssige Sprachausgabe ist es zu empfehlen, die einzelnen vorher
geladenen Sprachbausteine zu einem einzelnen Sprachbaustein zusammenfassen zu lassen bevor dieses per
Mplayer ausgegeben werden. Dazu muss Mp3Wrap installiert werden.
apt-get install mp3wrap
@@ -1387,8 +1566,17 @@ sub Text2Speech_WriteStats($$$$){
TTS_MplayerCall
- Optional: Angabe der Systemaufrufes zu Mplayer. Das folgende Beispiel ist der Standardaufruf.
- Beispiel: sudo /usr/bin/mplayer
+ Optional: Angabe des Systemaufrufes zu Mplayer oder einem anderem Tool. Wird ein anderes Tool als mplayer
+ dort verwendet gelten folgende Templates:
+
+ - {device}
+ - {volume}
+ - {volumeadjust}
+ - {file}
+
+ Beispiele:
+ attr myTTS TTS_MplayerCall sudo /usr/bin/mplayer
+ attr myTTS TTS_MplayerCall AUDIODEV={device} play -q -v {volume} {file}
TTS_SentenceAppendix
@@ -1432,6 +1620,15 @@ sub Text2Speech_WriteStats($$$$){
Attribut nur verfügbar bei einer lokalen oder Server Instanz
+ TTS_OutputFile
+ Angabe eines fixen Dateinamens als mp3 Output. Das Attribut ist nur relevant in Verbindung mit TTS_UseMP3Wrap.
+ Wenn ein Dateinamen angegeben wird, so wird zusätzlich TTS_CacheFileDir beachtet. Bei einer absoluten Pfadangabe
+ muss der Dateipfad durch FHEM schreibbar sein.
+ attr myTTS TTS_OutputFile output.mp3
+ attr myTTS TTS_OutputFile /media/miniDLNA/output.mp3
+
+
+
readingFnAttributes
@@ -1451,6 +1648,12 @@ sub Text2Speech_WriteStats($$$$){
Beispiele
+ define TTS_EG_WZ Text2Speech hw=/dev/snd/controlC3
+ attr TTS_EG_WZ TTS_Language Deutsch
+ attr TTS_EG_WZ TTS_MplayerCall /usr/bin/mplayer
+ attr TTS_EG_WZ TTS_Ressource Amazon-Polly
+ attr TTS_EG_WZ TTS_UseMP3Wrap 1
+
define MyTTS Text2Speech hw=0.0
set MyTTS tts Die Alarmanlage ist bereit.
set MyTTS tts :beep.mp3: