Subversion Repositories Projects

Rev

Go to most recent revision | Details | Last modification | View Log | RSS feed

Rev Author Line No. Line
550 rain-er 1
#!/usr/bin/perl
2
#!/usr/bin/perl -d:ptkdb
3
 
4
###############################################################################
5
#
6
# tts.pl -  Text To Speech
7
#
8
# Copyright (C) 2009  Rainer Walther  (rainerwalther-mail@web.de)
9
#
10
# Creative Commons Lizenz mit den Zusaetzen (by, nc, sa)
11
#
12
# Es ist Ihnen gestattet: 
13
#     * das Werk vervielfältigen, verbreiten und öffentlich zugänglich machen
14
#     * Abwandlungen bzw. Bearbeitungen des Inhaltes anfertigen
15
# 
16
# Zu den folgenden Bedingungen:
17
#     * Namensnennung.
18
#       Sie müssen den Namen des Autors/Rechteinhabers in der von ihm festgelegten Weise nennen.
19
#     * Keine kommerzielle Nutzung.
20
#       Dieses Werk darf nicht für kommerzielle Zwecke verwendet werden.
21
#     * Weitergabe unter gleichen Bedingungen.
22
#       Wenn Sie den lizenzierten Inhalt bearbeiten oder in anderer Weise umgestalten,
23
#       verändern oder als Grundlage für einen anderen Inhalt verwenden,
24
#       dürfen Sie den neu entstandenen Inhalt nur unter Verwendung von Lizenzbedingungen
25
#       weitergeben, die mit denen dieses Lizenzvertrages identisch oder vergleichbar sind.
26
# 
27
# Im Falle einer Verbreitung müssen Sie anderen die Lizenzbedingungen, unter welche dieses
28
# Werk fällt, mitteilen. Am Einfachsten ist es, einen Link auf diese Seite einzubinden.
29
# 
30
# Jede der vorgenannten Bedingungen kann aufgehoben werden, sofern Sie die Einwilligung
31
# des Rechteinhabers dazu erhalten.
32
# 
33
# Diese Lizenz lässt die Urheberpersönlichkeitsrechte unberührt.
34
# 
35
# Weitere Details zur Lizenzbestimmung gibt es hier:
36
#   Kurzform: http://creativecommons.org/licenses/by-nc-sa/3.0/de/
37
#   Komplett: http://creativecommons.org/licenses/by-nc-sa/3.0/de/legalcode
38
#
39
###############################################################################
40
# 2009-08-08 0.0.1 rw created
41
#
42
###############################################################################
43
 
44
$Version{'tts.pl'} = "0.0.1 - 2009-08-08";
45
 
46
# Packages
47
use threads;                # http://search.cpan.org/~jdhedden/threads-1.72/threads.pm
48
                            # http://perldoc.perl.org/threads.html
49
use threads::shared;        # http://search.cpan.org/~jdhedden/threads-shared-1.28/shared.pm
50
use Thread::Queue;          # http://search.cpan.org/dist/Thread-Queue-2.11/lib/Thread/Queue.pm
51
use Time::HiRes qw(usleep); # http://search.cpan.org/~jhi/Time-HiRes-1.9719/HiRes.pm
52
 
53
# eSpeak software required, download from: http://espeak.sourceforge.net/
54
 
55
# Queues for Sending Mesages to TTS Thread
56
$TtsSendQueueLow    = Thread::Queue->new(); # for low prio messages
57
$TtsSendQueueMedium = Thread::Queue->new(); # for medium prio messages
58
$TtsSendQueueHigh   = Thread::Queue->new(); # for high prio messages
59
 
60
$TtsMute = 0;   # Mute audio switch
61
 
62
# Main loop, never ending
63
sub TtsLoop()
64
    {
65
 
66
    # say hello
67
 
68
    # Parameter
69
    local $Program = $Cfg->{'tts'}->{'Program'}  || "C:/Program Files/eSpeak/command_line/espeak.exe";
70
    local $Options = $Cfg->{'tts'}->{'Options'}  || "-v de -a 200 -b";
71
    local $Welcome = $Cfg->{'tts'}->{'Welcome'}  || "Starte Mischn Kockpit";  
72
 
73
    if ( ! -f $Program )
74
        {
75
        print "TTS: Program \"$Program\" does not exist. Exit\n";
76
        return;
77
        }
78
 
79
    # say hello
80
    &TtsCall ($Welcome);
81
 
82
    while ( 1 )
83
        {      
84
        # process all High prio Messages
85
        while ( $TtsSendQueueHigh->pending() > 0 )
86
            {
87
            my $Text = $TtsSendQueueHigh->dequeue(1);
88
            &TtsCall($Text);
89
            }
90
 
91
        # process all Medium prio Messages
92
        while ( $TtsSendQueueMedium->pending() > 0  and
93
                $TtsSendQueueHigh->pending() == 0 )
94
            {
95
            my $Text = $TtsSendQueueMedium->dequeue(1);
96
            &TtsCall($Text);
97
            }
98
 
99
        # Check Low prio Messages one by one
100
        if ( $TtsSendQueueLow->pending() > 0  and
101
             $TtsSendQueueMedium->pending() == 0  and
102
             $TtsSendQueueHigh->pending() == 0 )
103
            {
104
            my $Text = $TtsSendQueueLow->dequeue(1);
105
            &TtsCall($Text);
106
            }
107
 
108
        usleep (100000); # 100ms
109
        }
110
    }
111
 
112
 
113
# call TTS program
114
sub TtsCall()
115
    {
116
    my ($Text) = @_;
117
 
118
    my $Cmd = "\"$Program\" $Options \"$Text\"";
119
    system $Cmd;
120
    }
121
 
122
 
123
# Add Text to TTS-Queue
124
sub TtsSpeak ()
125
    {
126
    my ($Prio, $Text) = @_;
127
 
128
    if ( ! $TtsMute  and  $Cfg->{'tts'}->{'Active'} =~ /y/i )
129
        {
130
        if ( $Prio eq 'HIGH' )
131
            {
132
            $TtsSendQueueHigh->enqueue( $Text);
133
            }
134
        elsif ( $Prio eq 'MEDIUM' )
135
            {
136
            $TtsSendQueueMedium->enqueue( $Text);
137
            }
138
        else
139
            {
140
            $TtsSendQueueLow->enqueue( $Text);
141
            }
142
        }
143
    }
144
 
145
 
146
# Clear pending Messages
147
sub TtsClear ()
148
    {
149
    my  ($Prio) = @_;
150
 
151
    while ($Prio eq 'HIGH'  and  $TtsSendQueueHigh->pending() >0 )
152
        {
153
        $TtsSendQueueHigh->dequeue();
154
        }
155
    while ($Prio eq 'MEDIUM' and $TtsSendQueueMedium->pending() >0 )
156
        {
157
        $TtsSendQueueMedium->dequeue();
158
        }
159
    while ($Prio eq 'LOW' and $TtsSendQueueLow->pending() >0 )
160
        {
161
        $TtsSendQueueLow->dequeue();
162
        }
163
    }
164
 
165
 
166
#
167
# Hauptprgramm
168
#       
169
 
170
if ( $0 =~ /tts.pl$/i )
171
    {
172
    # Program wurde direkt aufgerufen
173
    &TtsLoop();
174
 
175
    # should never exit
176
    }
177
 
178
1;
179
 
180
__END__