File: HTTPSpeaker.py

package info (click to toggle)
emacspeak 29.0-9
  • links: PTS
  • area: main
  • in suites: wheezy
  • size: 12,904 kB
  • sloc: xml: 55,354; lisp: 48,335; cpp: 2,321; tcl: 1,500; makefile: 936; python: 836; sh: 785; perl: 459; ansic: 241
file content (116 lines) | stat: -rwxr-xr-x 3,359 bytes parent folder | download | duplicates (2)
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
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
#!/usr/bin/python2.4

"""HTTP wrapper around Emacspeak speech server.

Speech server is launched on HTTP server startup.

Speech commands are invoked via URLs:

http://host:port/cmd?arg

calls speaker.cmd(arg)

"""

__id__ = "$Id: HTTPSpeaker.py 5584 2008-05-20 00:49:13Z tv.raman.tv $"
__author__ = "$Author: tv.raman.tv $"
__version__ = "$Revision: 5584 $"
__date__ = "$Date: 2008-05-19 17:49:13 -0700 (Mon, 19 May 2008) $"
__copyright__ = "Copyright (c) 2005 T. V. Raman"
__license__ = "LGPL"


from speaker import Speaker
from BaseHTTPServer import HTTPServer, BaseHTTPRequestHandler
import sys
import urllib

class HTTPSpeaker (HTTPServer):

    """Speech server via HTTP."""

    def __init__(self, address, handler,
                 engine='outloud',
                 rate = 75):
        """Initialize HTTP listener."""
        HTTPServer.__init__(self, address, handler)
        self.speaker = Speaker(engine,
                               'localhost',
                               {'punctuations' : 'some',
                                'rate' : rate})

class SpeakHTTPRequestHandler(BaseHTTPRequestHandler):

    """Handle HTTP Speak requests."""
    handlers = ['say',
                'speak',
                'letter',
                'addText',
                'silence',
                'tone',
                'stop',
                'punctuation',
                'rate',
                'allcaps',
                'capitalize',
                'splitcaps',
                'reset',
                'shutdown',
                'version'             ]

    def do_GET(self):
        """Produce speech."""
        #cmd = None
        #arg = None
        if hasattr(self.server.speaker, cmd):
            method = getattr(self.server.speaker, cmd)
            if arg is None:
                method()
            else:
                method(urllib.unquote(arg))
            self.send_response(200, self.path)
        else: self.send_error(501, "Speaker error")

    def do_POST(self):
        """Handle speech request in a POST message. """
        contentLength = self.headers.getheader('content-length')
        if contentLength:
            contentLength = int(contentLength)
            inputBody = self.rfile.read(contentLength)
            if inputBody.startswith("speak:"):
                text = inputBody[6:]
                self.server.speaker.speak(text )
                self.send_response(200, 'OK')
            elif inputBody == "stop":
                self.server.speaker.stop()
                self.send_response(200, 'OK')
            elif inputBody == "isSpeaking":
                self.send_response(200, 'OK')
                self.send_header("Content-type", "text/html")
                self.end_headers()
                self.wfile.write("0")
            else:
                self.send_error(501, 'Unknown POST message ' + inputBody)
    
def start():
    if sys.argv[1:]:
        engine = sys.argv[1]
    else:
        engine='outloud'
    if sys.argv[2:]:
        port = int(sys.argv[2])
    else:
        port = 8000
    if sys.argv[3:]:
        rate = int(sys.argv[3])
    else:
        rate = 75
    server_address = ('', port)
    server_address = ('', port)
    httpd = HTTPSpeaker  (server_address,
    SpeakHTTPRequestHandler, engine, rate)
    httpd.serve_forever()


if __name__ == '__main__':
    start()