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()
|