Merge pull request #1 from adefaria/DEV
[clearscm.git] / lib / Speak.pm
1 =pod
2
3 =head1 NAME $RCSfile: Speak.pm,v $
4
5 Convert text to speach using Google's engine and play it on speakers
6
7 =head1 VERSION
8
9 =over
10
11 =item Author
12
13 Andrew DeFaria <Andrew@DeFaria.com>
14
15 =item Revision
16
17 $Revision: 1.0 $
18
19 =item Created
20
21 Wed 24 Feb 2021 11:05:36 AM PST
22
23 =item Modified
24
25
26 =back
27
28 =head1 SYNOPSIS
29
30 This module offers subroutines to convert text into speach and speak them.
31
32 =head2 DESCRIPTION
33
34 This module exports subroutines to process text to speach and speak them.
35
36 =head1 ROUTINES
37
38 The following routines are exported:
39
40 =cut
41
42 package Speak;
43
44 use strict;
45 use warnings;
46
47 use base 'Exporter';
48
49 use FindBin;
50 use Clipboard;
51
52 use lib "$FindBin::Bin/../lib";
53
54 use Display;
55 use Logger;
56 use Utils;
57
58 our @EXPORT = qw(speak);
59
60 sub speak (;$$) {
61   my ($msg, $log) = @_;
62
63 =pod
64
65 =head2 speak($msg, $log)
66
67 Convert $msg to speach.
68
69 Note this currently uses an external script to do the conversion. I intend to
70 re-write that into Perl here eventually.
71
72 Parameters:
73
74 =for html <blockquote>
75
76 =over
77
78 =item $msg:
79
80 Message to speak. If $msg is defined and scalar then that is the message
81 to speak. If it is a file handle then the text will be read from that file.
82 Otherwise the text in the clipboard will be used.
83
84 =item $log
85
86 If provided, errors and messages will be logged to the logfile, otherwise stdout
87
88 =back
89
90 =for html </blockquote>
91
92 Returns:
93
94 =for html <blockquote>
95
96 =over
97
98 =item Nothing
99
100 =back
101
102 =for html </blockquote>
103
104 =cut
105
106   if (-f "$FindBin::Bin/shh") {
107     $msg .= ' [silent]';
108     if ($log) {
109       $log->msg($msg);
110     } else {
111       verbose $msg;
112     } # if
113
114     return;
115   } # if
116
117   # Handle the case where $msg is not passed in. Then use the clipboard;
118   $msg = Clipboard->paste unless $msg;
119
120   # Handle the case where $msg is a filehandle
121   $msg = <$msg> if ref $msg eq 'GLOB';
122
123   # We can't have two speakers going at the same time so if we have an error
124   # backoff a little and try again.
125   my $attempts   = 0;
126   my $maxretries = 3;
127
128   my ($status, @output);
129
130   # Log message to log file if $log was passed in.
131   $log->msg($msg) if $log;
132
133   while ($attempts++ < $maxretries) {
134     ($status, @output) = Execute "/usr/local/bin/gt \"$msg\"";
135
136     if ($status) {
137       my $errmsg = "Unable to speak (Status: $status) - " . join "\n", @output;
138
139       if ($log) {
140         $log->err($errmsg);
141       } else {
142         error $errmsg;
143       } # if
144
145       sleep int rand 10;
146     } else {
147       return;
148     } # if
149   } # while
150
151   my $errmsg = 'Maximum retries exceeded - terminating';
152
153   if ($log) {
154     $log->err($errmsg, $status);
155   } else {
156     error $errmsg, $status;
157   } # if
158
159   return;
160 } # speak
161
162 1;
163
164 =pod
165
166 =head1 CONFIGURATION AND ENVIRONMENT
167
168 DEBUG: If set then $debug is set to this level.
169
170 VERBOSE: If set then $verbose is set to this level.
171
172 TRACE: If set then $trace is set to this level.
173
174 =head1 DEPENDENCIES
175
176 =head2 Perl Modules
177
178 L<File::Spec|File::Spec>
179
180 L<Term::ANSIColor|Term::ANSIColor>
181
182 =head1 INCOMPATABILITIES
183
184 None yet...
185
186 =head1 BUGS AND LIMITATIONS
187
188 There are no known bugs in this module.
189
190 Please report problems to Andrew DeFaria <Andrew@ClearSCM.com>.
191
192 =head1 LICENSE AND COPYRIGHT
193
194 This Perl Module is freely available; you can redistribute it and/or
195 modify it under the terms of the GNU General Public License as
196 published by the Free Software Foundation; either version 2 of the
197 License, or (at your option) any later version.
198
199 This Perl Module is distributed in the hope that it will be useful,
200 but WITHOUT ANY WARRANTY; without even the implied warranty of
201 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
202 General Public License (L<http://www.gnu.org/copyleft/gpl.html>) for more
203 details.
204
205 You should have received a copy of the GNU General Public License
206 along with this Perl Module; if not, write to the Free Software Foundation,
207 Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
208 reserved.
209
210 =cut