#!/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()