#!/usr/bin/env python3 """ Morshu TTS Server — standalone HTTP API for MorshuTalk engine. Runs on port 3002. GET /say?text=... returns WAV audio. """ import sys import io from pathlib import Path from http.server import HTTPServer, BaseHTTPRequestHandler from urllib.parse import urlparse, parse_qs # Add ttstoy to path so we can import the engine sys.path.insert(0, str(Path(__file__).parent.parent)) from morshutalk_engine import Morshu morshu = Morshu() PORT = 3002 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()