0,0 → 1,180 |
#!/usr/bin/perl |
#!/usr/bin/perl -d:ptkdb |
|
############################################################################### |
# |
# tts.pl - Text To Speech |
# |
# Copyright (C) 2009 Rainer Walther (rainerwalther-mail@web.de) |
# |
# Creative Commons Lizenz mit den Zusaetzen (by, nc, sa) |
# |
# Es ist Ihnen gestattet: |
# * das Werk vervielfältigen, verbreiten und öffentlich zugänglich machen |
# * Abwandlungen bzw. Bearbeitungen des Inhaltes anfertigen |
# |
# Zu den folgenden Bedingungen: |
# * Namensnennung. |
# Sie müssen den Namen des Autors/Rechteinhabers in der von ihm festgelegten Weise nennen. |
# * Keine kommerzielle Nutzung. |
# Dieses Werk darf nicht für kommerzielle Zwecke verwendet werden. |
# * Weitergabe unter gleichen Bedingungen. |
# Wenn Sie den lizenzierten Inhalt bearbeiten oder in anderer Weise umgestalten, |
# verändern oder als Grundlage für einen anderen Inhalt verwenden, |
# dürfen Sie den neu entstandenen Inhalt nur unter Verwendung von Lizenzbedingungen |
# weitergeben, die mit denen dieses Lizenzvertrages identisch oder vergleichbar sind. |
# |
# Im Falle einer Verbreitung müssen Sie anderen die Lizenzbedingungen, unter welche dieses |
# Werk fällt, mitteilen. Am Einfachsten ist es, einen Link auf diese Seite einzubinden. |
# |
# Jede der vorgenannten Bedingungen kann aufgehoben werden, sofern Sie die Einwilligung |
# des Rechteinhabers dazu erhalten. |
# |
# Diese Lizenz lässt die Urheberpersönlichkeitsrechte unberührt. |
# |
# Weitere Details zur Lizenzbestimmung gibt es hier: |
# Kurzform: http://creativecommons.org/licenses/by-nc-sa/3.0/de/ |
# Komplett: http://creativecommons.org/licenses/by-nc-sa/3.0/de/legalcode |
# |
############################################################################### |
# 2009-08-08 0.0.1 rw created |
# |
############################################################################### |
|
$Version{'tts.pl'} = "0.0.1 - 2009-08-08"; |
|
# Packages |
use threads; # http://search.cpan.org/~jdhedden/threads-1.72/threads.pm |
# http://perldoc.perl.org/threads.html |
use threads::shared; # http://search.cpan.org/~jdhedden/threads-shared-1.28/shared.pm |
use Thread::Queue; # http://search.cpan.org/dist/Thread-Queue-2.11/lib/Thread/Queue.pm |
use Time::HiRes qw(usleep); # http://search.cpan.org/~jhi/Time-HiRes-1.9719/HiRes.pm |
|
# eSpeak software required, download from: http://espeak.sourceforge.net/ |
|
# Queues for Sending Mesages to TTS Thread |
$TtsSendQueueLow = Thread::Queue->new(); # for low prio messages |
$TtsSendQueueMedium = Thread::Queue->new(); # for medium prio messages |
$TtsSendQueueHigh = Thread::Queue->new(); # for high prio messages |
|
$TtsMute = 0; # Mute audio switch |
|
# Main loop, never ending |
sub TtsLoop() |
{ |
|
# say hello |
|
# Parameter |
local $Program = $Cfg->{'tts'}->{'Program'} || "C:/Program Files/eSpeak/command_line/espeak.exe"; |
local $Options = $Cfg->{'tts'}->{'Options'} || "-v de -a 200 -b"; |
local $Welcome = $Cfg->{'tts'}->{'Welcome'} || "Starte Mischn Kockpit"; |
|
if ( ! -f $Program ) |
{ |
print "TTS: Program \"$Program\" does not exist. Exit\n"; |
return; |
} |
|
# say hello |
&TtsCall ($Welcome); |
|
while ( 1 ) |
{ |
# process all High prio Messages |
while ( $TtsSendQueueHigh->pending() > 0 ) |
{ |
my $Text = $TtsSendQueueHigh->dequeue(1); |
&TtsCall($Text); |
} |
|
# process all Medium prio Messages |
while ( $TtsSendQueueMedium->pending() > 0 and |
$TtsSendQueueHigh->pending() == 0 ) |
{ |
my $Text = $TtsSendQueueMedium->dequeue(1); |
&TtsCall($Text); |
} |
|
# Check Low prio Messages one by one |
if ( $TtsSendQueueLow->pending() > 0 and |
$TtsSendQueueMedium->pending() == 0 and |
$TtsSendQueueHigh->pending() == 0 ) |
{ |
my $Text = $TtsSendQueueLow->dequeue(1); |
&TtsCall($Text); |
} |
|
usleep (100000); # 100ms |
} |
} |
|
|
# call TTS program |
sub TtsCall() |
{ |
my ($Text) = @_; |
|
my $Cmd = "\"$Program\" $Options \"$Text\""; |
system $Cmd; |
} |
|
|
# Add Text to TTS-Queue |
sub TtsSpeak () |
{ |
my ($Prio, $Text) = @_; |
|
if ( ! $TtsMute and $Cfg->{'tts'}->{'Active'} =~ /y/i ) |
{ |
if ( $Prio eq 'HIGH' ) |
{ |
$TtsSendQueueHigh->enqueue( $Text); |
} |
elsif ( $Prio eq 'MEDIUM' ) |
{ |
$TtsSendQueueMedium->enqueue( $Text); |
} |
else |
{ |
$TtsSendQueueLow->enqueue( $Text); |
} |
} |
} |
|
|
# Clear pending Messages |
sub TtsClear () |
{ |
my ($Prio) = @_; |
|
while ($Prio eq 'HIGH' and $TtsSendQueueHigh->pending() >0 ) |
{ |
$TtsSendQueueHigh->dequeue(); |
} |
while ($Prio eq 'MEDIUM' and $TtsSendQueueMedium->pending() >0 ) |
{ |
$TtsSendQueueMedium->dequeue(); |
} |
while ($Prio eq 'LOW' and $TtsSendQueueLow->pending() >0 ) |
{ |
$TtsSendQueueLow->dequeue(); |
} |
} |
|
|
# |
# Hauptprgramm |
# |
|
if ( $0 =~ /tts.pl$/i ) |
{ |
# Program wurde direkt aufgerufen |
&TtsLoop(); |
|
# should never exit |
} |
|
1; |
|
__END__ |