mirror of
https://github.com/Nighthawk42/Qwen3-TTS-streaming.git
synced 2026-08-30 10:42:27 +00:00
142 lines
4.5 KiB
Python
142 lines
4.5 KiB
Python
#!/usr/bin/env python
|
|
"""
|
|
Startup script for Qwen3-TTS API and Gradio demo.
|
|
Runs both the FastAPI backend and Gradio frontend.
|
|
"""
|
|
|
|
import sys
|
|
import subprocess
|
|
import time
|
|
import webbrowser
|
|
from pathlib import Path
|
|
import argparse
|
|
|
|
|
|
def main():
|
|
parser = argparse.ArgumentParser(
|
|
description="Start Qwen3-TTS API and optional Gradio demo"
|
|
)
|
|
parser.add_argument(
|
|
"--no-demo",
|
|
action="store_true",
|
|
help="Run only the API server without Gradio demo"
|
|
)
|
|
parser.add_argument(
|
|
"--host",
|
|
default="0.0.0.0",
|
|
help="API host (default: 0.0.0.0)"
|
|
)
|
|
parser.add_argument(
|
|
"--port",
|
|
type=int,
|
|
default=8000,
|
|
help="API port (default: 8000)"
|
|
)
|
|
parser.add_argument(
|
|
"--demo-port",
|
|
type=int,
|
|
default=7860,
|
|
help="Gradio demo port (default: 7860)"
|
|
)
|
|
parser.add_argument(
|
|
"--no-browser",
|
|
action="store_true",
|
|
help="Don't open browser automatically"
|
|
)
|
|
|
|
args = parser.parse_args()
|
|
|
|
print("""
|
|
╔════════════════════════════════════════════════════════════════╗
|
|
║ Qwen3-TTS OpenAI-like API Server ║
|
|
║ Starting API and Gradio Demo... ║
|
|
╚════════════════════════════════════════════════════════════════╝
|
|
""")
|
|
|
|
# Start API server
|
|
print(f"\n📡 Starting API server on http://{args.host}:{args.port}")
|
|
print(" Docs: http://localhost:{}/docs".format(args.port))
|
|
|
|
api_cmd = [
|
|
sys.executable,
|
|
"-m",
|
|
"uvicorn",
|
|
"api.main:app",
|
|
"--host", args.host,
|
|
"--port", str(args.port),
|
|
"--log-level", "info",
|
|
]
|
|
|
|
api_process = subprocess.Popen(api_cmd)
|
|
|
|
# Give API time to start
|
|
time.sleep(5)
|
|
|
|
if not args.no_demo:
|
|
# Start Gradio demo in separate process
|
|
print(f"\n🎨 Starting Gradio demo on http://localhost:{args.demo_port}")
|
|
|
|
demo_cmd = [
|
|
sys.executable,
|
|
"-m",
|
|
"api.gradio_demo",
|
|
]
|
|
|
|
# Note: Gradio will bind to 0.0.0.0:7860 by default
|
|
# Modify api/gradio_demo.py if you need to change this
|
|
|
|
demo_process = subprocess.Popen(demo_cmd)
|
|
|
|
# Open browser if requested
|
|
if not args.no_browser:
|
|
time.sleep(3)
|
|
try:
|
|
webbrowser.open(f"http://localhost:{args.demo_port}")
|
|
except Exception as e:
|
|
print(f"Could not open browser: {e}")
|
|
|
|
print("""
|
|
╔════════════════════════════════════════════════════════════════╗
|
|
║ ✅ Services started successfully! ║
|
|
║ ║
|
|
║ API Server: http://localhost:{} ║
|
|
║ API Docs: http://localhost:{}/docs ║
|
|
║ Gradio Demo: http://localhost:{} ║
|
|
║ ║
|
|
║ Press Ctrl+C to stop all services ║
|
|
╚════════════════════════════════════════════════════════════════╝
|
|
""".format(args.port, args.port, args.demo_port))
|
|
|
|
try:
|
|
if not args.no_demo:
|
|
# Wait for both processes
|
|
api_process.wait()
|
|
demo_process.wait()
|
|
else:
|
|
# Wait for API process
|
|
api_process.wait()
|
|
except KeyboardInterrupt:
|
|
print("\n\n🛑 Shutting down...")
|
|
api_process.terminate()
|
|
if not args.no_demo:
|
|
demo_process.terminate()
|
|
|
|
# Wait for graceful shutdown
|
|
try:
|
|
api_process.wait(timeout=5)
|
|
except subprocess.TimeoutExpired:
|
|
api_process.kill()
|
|
|
|
if not args.no_demo:
|
|
try:
|
|
demo_process.wait(timeout=5)
|
|
except subprocess.TimeoutExpired:
|
|
demo_process.kill()
|
|
|
|
print("👋 Services stopped.")
|
|
sys.exit(0)
|
|
|
|
|
|
if __name__ == "__main__":
|
|
main()
|