e61a320499
Self-contained HTTP service with engine, data, start script, systemd unit, and documentation. Runs independently of the Discord bot on its fixed port.
64 lines
2.1 KiB
Python
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()
|