Files
morshu-tts-server/server.py
T

64 lines
2.1 KiB
Python

#!/usr/bin/env python3
"""
Morshu TTS Server - standalone HTTP API for MorshuTalk engine.
Runs on port 33002. GET /say?text=... returns WAV audio.
"""
import os
import sys
import io
from pathlib import Path
from http.server import HTTPServer, BaseHTTPRequestHandler
from urllib.parse import urlparse, parse_qs
# Engine lives alongside this server (self-contained)
SCRIPT_DIR = Path(__file__).resolve().parent
sys.path.insert(0, str(SCRIPT_DIR))
from morshutalk_engine import Morshu
morshu = Morshu()
PORT = int(os.environ.get("PORT", 33002))
class Handler(BaseHTTPRequestHandler):
def do_GET(self):
parsed = urlparse(self.path)
if parsed.path == "/say":
params = parse_qs(parsed.query)
text = params.get("text", [""])[0]
if not text:
self.send_error(400, "Missing 'text' parameter")
return
try:
audio = morshu.load_text(text)
if audio is False or len(audio) == 0:
self.send_error(500, "Failed to generate audio")
return
buf = io.BytesIO()
audio.export(buf, format="wav")
wav_bytes = buf.getvalue()
self.send_response(200)
self.send_header("Content-Type", "audio/wav")
self.send_header("Content-Length", str(len(wav_bytes)))
self.end_headers()
self.wfile.write(wav_bytes)
except Exception as e:
self.send_error(500, str(e))
elif parsed.path == "/health":
self.send_response(200)
self.send_header("Content-Type", "text/plain")
self.end_headers()
self.wfile.write(b"ok")
else:
self.send_error(404)
def log_message(self, format, *args):
print(f"[Morshu] {args[0]}")
if __name__ == "__main__":
print(f"[Morshu] Starting server on port {PORT}...")
server = HTTPServer(("0.0.0.0", PORT), Handler)
print(f"[Morshu] Ready - http://127.0.0.1:{PORT}/say?text=hello")
server.serve_forever()