97_SprinkleControl.pm 21 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628
  1. ##############################################
  2. # $Id: 97_SprinkleControl.pm 6159 2014-06-24 17:43:33Z tobiasfaust $
  3. #
  4. # 97_SprinkleControl.pm
  5. #
  6. # written by Tobias Faust 2013-10-23
  7. # e-mail: tobias dot faust at online dot de
  8. #
  9. ##############################################
  10. package main;
  11. use strict;
  12. use warnings;
  13. use Data::Dumper;
  14. use vars qw(%gets %sets %defs %attr);
  15. sub SprinkleControl_AllocateNewThread($@);
  16. sub SprinkleControl_DeallocateThread($@);
  17. sub UpdateSprinkleControlList($$);
  18. # SetParamName -> Anzahl Paramter
  19. my %sets = (
  20. "MaxParallel" => "1"
  21. );
  22. # These we may get on request
  23. my %gets = (
  24. "Threads" => "0"
  25. );
  26. ##########################
  27. sub SprinkleControl_Initialize($)
  28. {
  29. my ($hash) = @_;
  30. require "$main::attr{global}{modpath}/FHEM/98_Sprinkle.pm";
  31. $hash->{DefFn} = "SprinkleControl_Define";
  32. $hash->{SetFn} = "SprinkleControl_Set";
  33. $hash->{UndefFn} = "SprinkleControl_Undefine";
  34. $hash->{AttrFn} = "SprinkleControl_Attr";
  35. $hash->{AttrList} = "disable:0,1".
  36. " SprinkleControl_MaxParallel".
  37. " ".$readingFnAttributes;
  38. }
  39. ##########################
  40. # Define <SprinkleControl> SprinkleControl
  41. ##########################
  42. sub SprinkleControl_Define($$)
  43. {
  44. my ($hash, $def) = @_;
  45. my $me = $hash->{NAME};
  46. my @a = split("[ \t]+", $def);
  47. #$a[0]: Name
  48. #$a[1]: Type/Alias -> SprinkleControl
  49. if(int(@a) > 2) {
  50. my $msg = "wrong syntax: define <name> SprinkleControl";
  51. Log3 $hash, 2, $msg;
  52. return $msg;
  53. }
  54. if(!$attr{$me}) {
  55. #Attribute vorbelegen! Nur beim Define, kein Modify
  56. #$attr{$me}{webCmd} = "Auto:An:Aus:Toggle:Disable";
  57. $attr{$me}{SprinkleControl_MaxParallel} = 2;
  58. }
  59. UpdateSprinkleControlList($hash, "add");
  60. $hash->{MaxParallel} = $attr{$me}{SprinkleControl_MaxParallel};
  61. readingsSingleUpdate($hash, "state", "0/".$attr{$me}{SprinkleControl_MaxParallel}, 1);
  62. readingsSingleUpdate($hash, "CountThreads", 0, 1);
  63. return undef;
  64. }
  65. #####################################
  66. sub SprinkleControl_Undefine($$)
  67. {
  68. my ($hash, $arg) = @_;
  69. UpdateSprinkleControlList($hash, "del");
  70. return undef;
  71. }
  72. ###################################
  73. #
  74. ###################################
  75. sub SprinkleControl_Attr(@) {
  76. my @a = @_;
  77. my $do = 0;
  78. my $hash = $defs{$a[1]};
  79. my $command = $a[0];
  80. my $setter = $a[2];
  81. my $value = $a[3];
  82. my $threads = ReadingsVal($hash->{NAME}, "CountThreads",0);
  83. if($setter eq "SprinkleControl_MaxParallel" && $command ne "del") {
  84. return "Max Parallel Threads isn´t numeric or not > 0" if ($value !~ m/^(\d+)$/ || $value < 0);
  85. $hash->{MaxParallel} = $value;
  86. readingsSingleUpdate($hash, "state", $threads."/".$value, 1);
  87. } elsif($setter eq "disable"){
  88. # 1=disable; 2=enable
  89. if($command eq "set") {
  90. $do = (!defined($value) || $value) ? 1 : 2;
  91. }
  92. $do = 2 if($command eq "del");
  93. readingsSingleUpdate($hash, "state", ($do == 1 ? "disabled" : $threads."/".$hash->{MaxParallel}), 1);
  94. }
  95. return undef;
  96. }
  97. ###########################################################################
  98. sub SprinkleControl_Set($@)
  99. {
  100. my ($hash, @a) = @_;
  101. my $me = $hash->{NAME};
  102. return "no set argument specified" if(int(@a) < 2);
  103. my $cmd = $a[1]; # DevName
  104. my $value = $a[2];
  105. if(!defined($sets{$cmd})) {
  106. my $r = "Unknown argument $cmd, choose one of ".join(" ",sort keys %sets);
  107. return $r;
  108. }
  109. # Abbruch falls Disabled
  110. #return undef if(IsDisabled($hash->{NAME}));
  111. # return "$cmd needs $sets{$cmd} parameter(s)" if(@a-$sets{$cmd} != 0);
  112. my $threads = ReadingsVal($me, "CountThreads",0);
  113. if($cmd eq "Disable" && !IsDisabled($me)) {
  114. $attr{$me}{disable}=1;
  115. readingsSingleUpdate($hash, "state", "disabled", 1); # Deaktivieren
  116. return undef;
  117. } elsif($cmd eq "Disable" && IsDisabled($me)) {
  118. $attr{$me}{disable}=0;
  119. my $threads = ReadingsVal($hash->{NAME}, "CountThreads",0);
  120. readingsSingleUpdate($hash, "state", $threads."/".$hash->{MaxParallel}, 1);
  121. return undef;
  122. } elsif (IsDisabled($me)) { # mache nix da disabled
  123. return undef;
  124. } elsif($cmd eq "MaxParallel") {
  125. $hash->{MaxParallel} = $value;
  126. readingsSingleUpdate($hash, "state", $threads."/".$value, 1);
  127. }
  128. return undef;
  129. }
  130. ##########################################################
  131. # Allokiert einen neuen Thread
  132. # param1 : SprinkleControlDevice
  133. # param2 : anforderndes Device
  134. # param3 : Command
  135. # param4 : Priorität
  136. # 1->Ausführung sofort ->ToDo
  137. # 2->Ausführung als nächstes, Anfang der Queue
  138. # 3->Einreihung an das Ende der Queue
  139. ##########################################################
  140. sub SprinkleControl_AllocateNewThread($@) {
  141. my ($me, $dev, $cmd, $prio) = @_;
  142. my $hash = $defs{$me};
  143. Log3 $hash, 4, "$me: Anforderung Thread allokieren durch '$dev' mit comand '$cmd'";
  144. return 1 if(IsDisabled($me));
  145. my $threads = ReadingsVal($me, "CountThreads",0);
  146. my $max = $hash->{MaxParallel};
  147. $prio = 3 if(!defined($prio));
  148. my $present=0;
  149. $present = 1 if(defined($hash->{helper}{Queue}{$dev}));
  150. if($present == 0) {
  151. # noch nicht in der queue vorhanden
  152. Log3 $hash, 4, "$me: Füge Device '$dev' der Queue hinzu";
  153. $hash->{helper}{Queue}{$dev}{priority} = $prio;
  154. $hash->{helper}{Queue}{$dev}{command} = $cmd;
  155. } else {
  156. Log3 $hash, 4, "$me: Device '$dev' bereits in der Queue vorhanden";
  157. }
  158. if($present == 0 || ($present == 1 && $hash->{helper}{Queue}{$dev}{active} == 0)) {
  159. # schon in der Queue vorhanden aber in Wartestellung
  160. Log3 $hash, 4, "$me: Device '$dev' aktuell in der Queue vorhanden oder in Wartestellung, prüfe auf freien Thread";
  161. if($threads < $max) {
  162. Log3 $hash, 4, "$me: freier Thread vorhanden, gebe Thread frei für Device '$dev' und markiere als 'active'";
  163. $threads += 1;
  164. $hash->{helper}{Queue}{$dev}{active} = 1;
  165. readingsBeginUpdate($hash);
  166. readingsBulkUpdate($hash, "CountThreads", $threads);
  167. readingsBulkUpdate($hash, "state", $threads."/".$max);
  168. readingsEndUpdate($hash, 1);
  169. return $threads; # Rückgabe der Threadnummer
  170. } else {
  171. # abgelehnt da MAX erreicht, in queue gelegt
  172. Log3 $hash, 4, "$me: kein freier Thread vorhanden, MAXTHREADS wurde erreicht, markiere Device '$dev' in der Queue als 'inactive'";
  173. $hash->{helper}{Queue}{$dev}{active} = 0;
  174. return undef ;
  175. }
  176. } else {
  177. # Device ist bereits in der Queue vorhanden
  178. Log3 $hash, 4, "$me: Device '$dev' bereits in der Queue vorhanden, mache nichts";
  179. return undef;
  180. }
  181. }
  182. ############################################
  183. # Gibt einen Thread frei
  184. # param1 : SprinkleControlDevice
  185. # param2 : abgebendes Device
  186. ############################################
  187. sub SprinkleControl_DeallocateThread($@) {
  188. my ($me, $dev) = @_;
  189. my $hash = $defs{$me};
  190. Log3 $hash, 4, "$me: Anforderung Thread löschen durch '$dev'";
  191. my $threads = ReadingsVal($me, "CountThreads",0);
  192. my $max = $hash->{MaxParallel};
  193. if(defined($hash->{helper}{Queue}{$dev})) {
  194. Log3 $hash, 4, "$me: Device '$dev' in der Queue erkannt und gelöscht. Thread freigegeben";
  195. $threads -= 1;
  196. $threads = 0 if($threads<0);
  197. delete $hash->{helper}{Queue}{$dev};
  198. }
  199. readingsBeginUpdate($hash);
  200. readingsBulkUpdate($hash, "CountThreads", $threads);
  201. readingsBulkUpdate($hash, "state", ($threads)."/".$max);
  202. readingsEndUpdate($hash, 1);
  203. # den nächsten wartenden Thread aus der Queue starten
  204. #my %queue = %{$hash->{helper}{Queue}};
  205. my @queue = sort keys %{$hash->{helper}{Queue}};
  206. for(my $i=0; $i < @queue; $i++) {
  207. my $d = $queue[$i];
  208. Log3 $hash, 4, "$me: wartendes Device in der Queue erkannt: '$d'";
  209. if($hash->{helper}{Queue}{$d}{active} == 0) {
  210. Log3 $hash, 4, "$me: Starte wartendes Device, rufe DoIt für Device '$d' mit Command '".$hash->{helper}{Queue}{$d}{command}."'' auf";
  211. Sprinkle_DoIt($defs{$d}, $hash->{helper}{Queue}{$d}{command});
  212. last;
  213. }
  214. }
  215. return 1;
  216. }
  217. ############################################
  218. # Updatet die AttrListe im SprinkleModul
  219. ############################################
  220. sub UpdateSprinkleControlList($$) {
  221. my ($hash, $cmd) = @_;
  222. #List verfuegbarer SprinkleControls in den SprinkleModulen aktualisieren
  223. my $attrlist = $modules{Sprinkle}{AttrList};
  224. #Log3 $hash,3,"1. AttrList: ".$attrlist;
  225. #my $newlist = "SprinkleControl:";
  226. my @newlist;
  227. my $newlist1 = "";
  228. foreach my $d (sort keys %defs) {
  229. if($defs{$d}{TYPE} eq "SprinkleControl") {
  230. push(@newlist, $d) unless(defined($hash) && ($d eq $hash->{NAME}) && ($cmd eq "del"));
  231. }
  232. }
  233. if(@newlist > 0) {
  234. $newlist1 = "SprinkleControl:" . join(",", @newlist);
  235. }
  236. #if($attrlist) {
  237. #$attrlist =~ s/(SprinkleControl\:[^\ ]+)/$newlist1/i;
  238. $attrlist =~ s/SprinkleControl\:[^\ ]+/$newlist1/i;
  239. #Log3 $hash,3,"2. AttrList: ".$attrlist;
  240. $attrlist .= " ".$newlist1 if($attrlist !~ m/SprinkleControl/);
  241. #Log3 $hash,3,"3. AttrList: ".$attrlist;
  242. $modules{Sprinkle}{AttrList} = $attrlist;
  243. #}
  244. #Log3 $hash,3,"4. AttrList: ".$attrlist;
  245. }
  246. 1;
  247. =pod
  248. =begin html
  249. <a name="Sprinkle"></a>
  250. <h3>Sprinkle</h3>
  251. <ul>
  252. <br>
  253. <a name="Sprinkledefine"></a>
  254. <b>Define</b>
  255. <ul>
  256. <b>Local : </b><code>define &lt;name&gt; Sprinkle &lt;alsadevice&gt;</code><br>
  257. <b>Remote: </b><code>define &lt;name&gt; Sprinkle &lt;host&gt;[:&lt;portnr&gt;][:SSL] [portpassword]</code>
  258. <p>
  259. This module converts any text into speech with serveral possible providers. The Device can be defined as locally
  260. or remote device.
  261. </p>
  262. <li>
  263. <b>Local Device</b><br>
  264. <ul>
  265. The output will be send to any connected audiodevice. For example external speakers connected per jack
  266. or with bluetooth speakers - connected per bluetooth dongle. Its important to install mplayer.<br>
  267. <code>apt-get install mplayer</code><br>
  268. The given alsadevice has to be configured in <code>/etc/asound.conf</code>
  269. <p>
  270. <b>Special AlsaDevice: </b><i>none</i><br>
  271. The internal mplayer command will be without any audio directive if the given alsadevice is <i>none</i>.
  272. In this case mplayer is using the standard audiodevice.
  273. </p>
  274. <p>
  275. <b>Example:</b><br>
  276. <code>define MyTTS Sprinkle hw=0.0</code><br>
  277. <code>define MyTTS Sprinkle none</code>
  278. </p>
  279. </ul>
  280. </li>
  281. <li>
  282. <b>Remote Device</b><br>
  283. <ul>
  284. This module can configured as remote-device for client-server Environments. The Client has to be configured
  285. as local device.<br>
  286. Notice: the Name of the locally instance has to be the same!
  287. <ul>
  288. <li>Host: setting up IP-adress</li>
  289. <li>PortNr: setting up TelnetPort of FHEM; default: 7072</li>
  290. <li>SSL: setting up if connect over SSL; default: no SSL</li>
  291. <li>PortPassword: setting up the configured target telnet passwort</li>
  292. </ul>
  293. <p>
  294. <b>Example:</b><br>
  295. <code>define MyTTS Sprinkle 192.168.178.10:7072 fhempasswd</code>
  296. <code>define MyTTS Sprinkle 192.168.178.10</code>
  297. </p>
  298. </ul>
  299. </li>
  300. </ul>
  301. </ul>
  302. <a name="Sprinkleset"></a>
  303. <b>Set</b>
  304. <ul>
  305. <li><b>tts</b>:<br>
  306. Giving a text to translate into audio.
  307. </li>
  308. <li><b>volume</b>:<br>
  309. Setting up the volume audio response.<br>
  310. Notice: Only available in locally instances!
  311. </li>
  312. </ul><br>
  313. <a name="Sprinkleget"></a>
  314. <b>Get</b>
  315. <ul>N/A</ul><br>
  316. <a name="Sprinkleattr"></a>
  317. <b>Attributes</b>
  318. <ul>
  319. <li>TTS_Delemiter<br>
  320. optional: By using the google engine, its not possible to convert more than 100 characters in a single audio brick.
  321. With a delemiter the audio brick will be split at this character. A delemiter must be a single character.!<br>
  322. By default, ech audio brick will be split at sentence end. Is a single sentence longer than 100 characters,
  323. the sentence will be split additionally at comma, semicolon and the word <i>and</i>.<br>
  324. Notice: Only available in locally instances with Google engine!
  325. </li>
  326. <li>TTS_Ressource<br>
  327. optional: Selection of the Translator Engine<br>
  328. Notice: Only available in locally instances!
  329. <ul>
  330. <li>Google<br>
  331. Using the Google Engine. It´s nessessary to have internet access. This engine is the recommend engine
  332. because the quality is fantastic. This engine is using by default.
  333. </li>
  334. <li>ESpeak<br>
  335. Using the ESpeak Engine. Installation of the espeak sourcen is required.<br>
  336. <code>apt-get install espeak</code>
  337. </li>
  338. </ul>
  339. </li>
  340. <li>TTS_CacheFileDir<br>
  341. optional: The downloaded Goole audio bricks are saved in this folder for reusing.
  342. No automatically implemented deleting are available.<br>
  343. Default: <i>cache/</i><br>
  344. Notice: Only available in locally instances!
  345. </li>
  346. <li>TTS_UseMP3Wrap<br>
  347. optional: To become a liquid audio response its recommend to use the tool mp3wrap.
  348. Each downloaded audio bricks are concatinated to a single audio file to play with mplayer.<br>
  349. Installtion of the mp3wrap source is required.<br>
  350. <code>apt-get install mp3wrap</code><br>
  351. Notice: Only available in locally instances!
  352. </li>
  353. <li>TTS_MplayerCall<br>
  354. optional: Setting up the Mplayer system call. The following example is default.<br>
  355. Example: <code>sudo /usr/bin/mplayer</code>
  356. </li>
  357. <li>TTS_SentenceAppendix<br>
  358. Optional: Definition of one mp3-file to append each time of audio response.<br>
  359. Using of Mp3Wrap is required. The audio bricks has to be downloaded before into CacheFileDir.
  360. Example: <code>silence.mp3</code>
  361. </li>
  362. <li>TTS_FileMapping<br>
  363. Definition of mp3files with a custom templatedefinition. Separated by space.
  364. All templatedefinitions can used in audiobricks by i>tts</i>.
  365. The definition must begin and end with e colon.
  366. The mp3files must saved in the given directory by <i>TTS_FIleTemplateDir</i>.<br>
  367. <code>attr myTTS TTS_FileMapping ring:ringtone.mp3 beep:MyBeep.mp3</code><br>
  368. <code>set MyTTS tts Attention: This is my ringtone :ring: Its loud?</code>
  369. </li>
  370. <li>TTS_FileTemplateDir<br>
  371. Directory to save all mp3-files are defined in <i>TTS_FileMapping</i> und <i>TTS_SentenceAppendix</i><br>
  372. Optional, Default: <code>cache/templates</code>
  373. </li>
  374. <li><a href="#readingFnAttributes">readingFnAttributes</a></li><br>
  375. <li><a href="#disable">disable</a><br>
  376. If this attribute is activated, the soundoutput will be disabled.<br>
  377. Possible values: 0 => not disabled , 1 => disabled<br>
  378. Default Value is 0 (not disabled)<br><br>
  379. </li>
  380. <li><a href="#verbose">verbose</a><br>
  381. <b>4:</b> each step will be logged<br>
  382. <b>5:</b> Additionally the individual debug informations from mplayer and mp3wrap will be logged
  383. </li>
  384. </ul>
  385. =end html
  386. =begin html_DE
  387. <a name="Sprinkle"></a>
  388. <h3>Sprinkle</h3>
  389. <ul>
  390. <br>
  391. <a name="Sprinkledefine"></a>
  392. <b>Define</b>
  393. <ul>
  394. <b>Local : </b><code>define &lt;name&gt; Sprinkle &lt;alsadevice&gt;</code><br>
  395. <b>Remote: </b><code>define &lt;name&gt; Sprinkle &lt;host&gt;[:&lt;portnr&gt;][:SSL] [portpassword]</code>
  396. <p>
  397. Das Modul wandelt Text mittels verschiedener Provider/Ressourcen in Sprache um. Dabei kann das Device als
  398. Remote oder Lokales Device konfiguriert werden.
  399. </p>
  400. <li>
  401. <b>Local Device</b><br>
  402. <ul>
  403. Die Ausgabe erfolgt auf angeschlossenen Audiodevices, zb. Lautsprecher direkt am Ger&auml;t oder per
  404. Bluetooth-Lautsprecher per Mplayer. Dazu ist Mplayer zu installieren.<br>
  405. <code>apt-get install mplayer</code><br>
  406. Das angegebene Alsadevice ist in der <code>/etc/asound.conf</code> zu konfigurieren.
  407. <p>
  408. <b>Special AlsaDevice: </b><i>none</i><br>
  409. Ist als Alsa-Device <i>none</i> angegeben, so wird mplayer ohne eine Audiodevice Angabe aufgerufen.
  410. Dementsprechend verwendet mplayer das Standard Audio Ausgabedevice.
  411. </p>
  412. <p>
  413. <b>Beispiel:</b><br>
  414. <code>define MyTTS Sprinkle hw=0.0</code><br>
  415. <code>define MyTTS Sprinkle none</code>
  416. </p>
  417. </ul>
  418. </li>
  419. <li>
  420. <b>Remote Device</b><br>
  421. <ul>
  422. Das Modul ist Client-Server f&auml;as bedeutet, das auf der Haupt-FHEM Installation eine Sprinkle-Instanz
  423. als Remote definiert wird. Auf dem Client wird Sprinkle als Local definiert. Die Sprachausgabe erfolgt auf
  424. der lokalen Instanz.<br>
  425. Zu beachten ist, das die Sprinkle Instanz (Definition als local Device) auf dem Zieldevice identisch benannt ist.
  426. <ul>
  427. <li>Host: Angabe der IP-Adresse</li>
  428. <li>PortNr: Angabe des TelnetPorts von FHEM; default: 7072</li>
  429. <li>SSL: Angabe ob der der Zugriff per SSL erfolgen soll oder nicht; default: kein SSL</li>
  430. <li>PortPassword: Angabe des in der Ziel-FHEM-Installtion angegebene Telnet Portpasswort</li>
  431. </ul>
  432. <p>
  433. <b>Beispiel:</b><br>
  434. <code>define MyTTS Sprinkle 192.168.178.10:7072 fhempasswd</code>
  435. <code>define MyTTS Sprinkle 192.168.178.10</code>
  436. </p>
  437. </ul>
  438. </li>
  439. </ul>
  440. </ul>
  441. <a name="Sprinkleset"></a>
  442. <b>Set</b>
  443. <ul>
  444. <li><b>tts</b>:<br>
  445. Setzen eines Textes zur Sprachausgabe.
  446. </li>
  447. <li><b>volume</b>:<br>
  448. Setzen der Ausgabe Lautst&auml;rke.<br>
  449. Achtung: Nur bei einem lokal definierter Sprinkle Instanz m&ouml;glich!
  450. </li>
  451. </ul><br>
  452. <a name="Sprinkleget"></a>
  453. <b>Get</b>
  454. <ul>N/A</ul><br>
  455. <a name="Sprinkleattr"></a>
  456. <b>Attribute</b>
  457. <ul>
  458. <li>TTS_Delemiter<br>
  459. Optional: Wird ein Delemiter angegeben, so wird der Sprachbaustein an dieser Stelle geteilt.
  460. Als Delemiter ist nur ein einzelnes Zeichen zul&auml;ssig.
  461. Hintergrund ist die Tatsache, das die Google Sprachengine nur 100Zeichen zul&auml;sst.<br>
  462. Im Standard wird nach jedem Satzende geteilt. Ist ein einzelner Satz l&auml;nger als 100 Zeichen,
  463. so wird zus&auml;tzlich nach Kommata, Semikolon und dem Verbindungswort <i>und</i> geteilt.<br>
  464. Achtung: Nur bei einem lokal definierter Sprinkle Instanz m&ouml;glich und nur Nutzung der Google Sprachengine relevant!
  465. </li>
  466. <li>TTS_Ressource<br>
  467. Optional: Auswahl der Sprachengine<br>
  468. Achtung: Nur bei einem lokal definierter Sprinkle Instanz m&ouml;glich!
  469. <ul>
  470. <li>Google<br>
  471. Nutzung der GoogleSprachengine. Ein Internetzugriff ist notwendig! Aufgrund der Qualit&auml;t ist der
  472. Einsatz diese Engine zu empfehlen und der Standard.
  473. </li>
  474. <li>ESpeak<br>
  475. Nutzung der ESpeak Offline Sprachengine. Die Qualit&auml; ist schlechter als die Google Engine.
  476. ESpeak ist vor der Nutzung zu installieren.<br>
  477. <code>apt-get install espeak</code>
  478. </li>
  479. </ul>
  480. </li>
  481. <li>TTS_CacheFileDir<br>
  482. Optional: Die per Google geladenen Sprachbausteine werden in diesem Verzeichnis zur Wiedeverwendung abgelegt.
  483. Es findet zurZEit keine automatisierte L&ouml;schung statt.<br>
  484. Default: <i>cache/</i><br>
  485. Achtung: Nur bei einem lokal definierter Sprinkle Instanz m&ouml;glich!
  486. </li>
  487. <li>TTS_UseMP3Wrap<br>
  488. Optional: F&uuml;r eine fl&uuml;ssige Sprachausgabe ist es zu empfehlen, die einzelnen vorher per Google
  489. geladenen Sprachbausteine zu einem einzelnen Sprachbaustein zusammenfassen zu lassen bevor dieses per
  490. Mplayer ausgegeben werden. Dazu muss Mp3Wrap installiert werden.<br>
  491. <code>apt-get install mp3wrap</code><br>
  492. Achtung: Nur bei einem lokal definierter Sprinkle Instanz m&ouml;glich!
  493. </li>
  494. <li>TTS_MplayerCall<br>
  495. Optional: Angabe der Systemaufrufes zu Mplayer. Das folgende Beispiel ist der Standardaufruf.<br>
  496. Beispiel: <code>sudo /usr/bin/mplayer</code>
  497. </li>
  498. <li>TTS_SentenceAppendix<br>
  499. Optional: Angabe einer mp3-Datei die mit jeder Sprachausgabe am Ende ausgegeben wird.<br>
  500. Voraussetzung ist die Nutzung von MP3Wrap. Die Sprachbausteine müssen bereits als mp3 im
  501. CacheFileDir vorliegen.
  502. Beispiel: <code>silence.mp3</code>
  503. </li>
  504. <li>TTS_FileMapping<br>
  505. Angabe von m&ouml;glichen MP3-Dateien mit deren Templatedefinition. Getrennt duch Leerzeichen.
  506. Die Templatedefinitionen können in den per <i>tts</i> &uuml;bergebenen Sprachbausteinen verwendet werden
  507. und m&uuml;ssen mit einem beginnenden und endenden Doppelpunkt angegeben werden.
  508. Die Dateien müssen im Verzeichnis <i>TTS_FIleTemplateDir</i> gespeichert sein.<br>
  509. <code>attr myTTS TTS_FileMapping ring:ringtone.mp3 beep:MyBeep.mp3</code><br>
  510. <code>set MyTTS tts Achtung: hier kommt mein Klingelton :ring: War der laut?</code>
  511. </li>
  512. <li>TTS_FileTemplateDir<br>
  513. Verzeichnis, in dem die per <i>TTS_FileMapping</i> und <i>TTS_SentenceAppendix</i> definierten
  514. MP3-Dateien gespeichert sind.<br>
  515. Optional, Default: <code>cache/templates</code>
  516. </li>
  517. <li><a href="#readingFnAttributes">readingFnAttributes</a></li><br>
  518. <li><a href="#disable">disable</a><br>
  519. If this attribute is activated, the soundoutput will be disabled.<br>
  520. Possible values: 0 => not disabled , 1 => disabled<br>
  521. Default Value is 0 (not disabled)<br><br>
  522. </li>
  523. <li><a href="#verbose">verbose</a><br>
  524. <b>4:</b> Alle Zwischenschritte der Verarbeitung werden ausgegeben<br>
  525. <b>5:</b> Zus&auml;tzlich werden auch die Meldungen von Mplayer und Mp3Wrap ausgegeben
  526. </li>
  527. </ul>
  528. =end html_DE
  529. =cut