1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
|
# -*- coding: utf-8
# This file is part of Cicero TTS.
# Cicero TTS: A Small, Fast and Free Text-To-Speech Engine.
# Copyright (C) 2003-2008 Nicolas Pitre <nico@cam.org>
# Copyright (C) 2003-2008 Stéphane Doyon <s.doyon@videotron.ca>
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License version 2.
# See the accompanying COPYING file for more details.
#
# This program comes with ABSOLUTELY NO WARRANTY.
# This module handles a simplisticshell-like interface to TTS.
# Text received on stdin is spoken out. Each word is written back
# to stdout after it has been spoken.
# An empty line causes a shutup/mute command.
# EOF causes the tts program to exit.
# This interface is meant to be simple, not feature-full.
import os, sys, fcntl, errno
import setencoding
import tracing
def trace(msg):
mod = 'shell'
tracing.trace(mod+': '+msg)
class AppFeed:
def __init__(self):
sys.stdin = os.fdopen(sys.stdin.fileno(), 'r', 0)
fcntl.fcntl(sys.stdin, fcntl.F_SETFL, os.O_NONBLOCK)
sys.stdout = os.fdopen(sys.stdout.fileno(), 'w', 0)
sys.stderr = os.fdopen(sys.stderr.fileno(), 'w', 0)
setencoding.stdfilesEncoding()
self.pendingTxt = ''
self.processedTxt = ''
self.lastInx = 0
def selectfd(self):
return sys.stdin
def sendIndex(self, inx):
n = inx-self.lastInx
if n>0 and self.processedTxt:
self.lastInx = inx
sys.stdout.write(self.processedTxt[:n])
sys.stdout.flush()
self.processedTxt = self.processedTxt[n:]
if not self.processedTxt:
self.lastInx = 0
sys.stdout.write('\n')
def handle(self):
if self.pendingTxt:
input = self.pendingTxt
self.pendingTxt = ''
else:
try:
input = sys.stdin.read()
except IOError, x:
if x.errno == errno.EAGAIN:
return 'M',None
raise
if input == '':
trace('Exiting on EOF')
sys.exit(0)
if input[0] == '\n':
trace('Got empty line: muting')
self.pendingTxt = input[1:]
self.processedTxt = ''
self.lastInx = 0
sys.stdout.write('\n')
return 'M',None
self.processedTxt += input
return 'S',input
def gotMore(self):
return not not self.pendingTxt
|