VoiceAPI / src /cli.py
Harshil748's picture
Initial HF Spaces deployment - downloads models at runtime
ecde958
#!/usr/bin/env python
"""
CLI for Voice Tech for All TTS System
"""
import argparse
import sys
import os
def main():
parser = argparse.ArgumentParser(
description="Voice Tech for All - Multi-lingual TTS System",
formatter_class=argparse.RawDescriptionHelpFormatter,
epilog="""
Examples:
# Download Hindi models
python -m src.cli download --lang hi
# Download all models
python -m src.cli download --all
# Synthesize text
python -m src.cli synthesize --text "नमस्ते" --voice hi_male --output hello.wav
# Start API server
python -m src.cli serve --port 8000
# List available voices
python -m src.cli list
""",
)
subparsers = parser.add_subparsers(dest="command", help="Commands")
# Download command
download_parser = subparsers.add_parser("download", help="Download TTS models")
download_parser.add_argument("--voice", type=str, help="Specific voice to download")
download_parser.add_argument(
"--lang", type=str, help="Download all voices for a language"
)
download_parser.add_argument(
"--all", action="store_true", help="Download all models"
)
download_parser.add_argument(
"--force", action="store_true", help="Force re-download"
)
# Synthesize command
synth_parser = subparsers.add_parser("synthesize", help="Synthesize text to speech")
synth_parser.add_argument(
"--text", "-t", type=str, required=True, help="Text to synthesize"
)
synth_parser.add_argument(
"--voice", "-v", type=str, default="hi_male", help="Voice to use"
)
synth_parser.add_argument(
"--output", "-o", type=str, default="output.wav", help="Output file"
)
synth_parser.add_argument(
"--speed", "-s", type=float, default=1.0, help="Speech speed"
)
# Serve command
serve_parser = subparsers.add_parser("serve", help="Start API server")
serve_parser.add_argument(
"--host", type=str, default="0.0.0.0", help="Host to bind"
)
serve_parser.add_argument(
"--port", "-p", type=int, default=8000, help="Port to bind"
)
serve_parser.add_argument(
"--reload", action="store_true", help="Enable auto-reload"
)
# List command
list_parser = subparsers.add_parser("list", help="List available voices")
args = parser.parse_args()
if args.command == "download":
from src.downloader import ModelDownloader
downloader = ModelDownloader()
if args.voice:
downloader.download_model(args.voice, force=args.force)
elif args.lang:
downloader.download_language(args.lang, force=args.force)
elif args.all:
downloader.download_all_models(force=args.force)
else:
download_parser.print_help()
elif args.command == "synthesize":
from src.engine import TTSEngine
engine = TTSEngine()
print(f"Synthesizing: {args.text}")
print(f"Voice: {args.voice}")
output_path = engine.synthesize_to_file(
text=args.text, output_path=args.output, voice=args.voice, speed=args.speed
)
print(f"Saved to: {output_path}")
elif args.command == "serve":
from src.api import start_server
print(f"Starting server on {args.host}:{args.port}")
start_server(host=args.host, port=args.port, reload=args.reload)
elif args.command == "list":
from src.config import LANGUAGE_CONFIGS
from src.downloader import ModelDownloader
downloader = ModelDownloader()
print("\n📢 Available TTS Voices:\n")
print(f"{'Voice Key':<15} {'Language':<15} {'Gender':<10} {'Downloaded':<12}")
print("-" * 55)
for key, config in LANGUAGE_CONFIGS.items():
downloaded = "✓" if downloader.get_model_path(key) else "✗"
gender = "Male" if "male" in key else "Female"
print(f"{key:<15} {config.name:<15} {gender:<10} {downloaded:<12}")
print(f"\nTotal: {len(LANGUAGE_CONFIGS)} voices")
else:
parser.print_help()
if __name__ == "__main__":
main()