File size: 4,171 Bytes
ecde958
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
#!/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()