| """Inflect-Nano-v2 TTS CLI |
| |
| Usage: |
| python -m inflect_tts_sdk --text "Hello world" --output output.wav |
| python -m inflect_tts_sdk --text "Hello world" --output output.wav --speed 1.2 --variation 0.5 |
| """ |
| import argparse, sys, time |
| from pathlib import Path |
|
|
| def main(): |
| parser = argparse.ArgumentParser( |
| description="Inflect-Nano-v2 TTS CLI for AX650 NPU3", |
| formatter_class=argparse.RawDescriptionHelpFormatter, |
| epilog="""Examples: |
| python -m inflect_tts_sdk --text "Hello world" --output hello.wav |
| python -m inflect_tts_sdk --text "Hello!" --speed 1.5 --variation 0.3 |
| python -m inflect_tts_sdk --text "Hello!" --model-dir /path/to/models |
| """) |
| parser.add_argument("--text", required=True, help="Input text to synthesize") |
| parser.add_argument("--output", required=True, help="Output WAV file path") |
| parser.add_argument("--model-dir", default=None, |
| help="Model directory (default: auto-detect)") |
| parser.add_argument("--speed", type=float, default=1.0, |
| help="Playback speed 0.5-2.0 (default: 1.0)") |
| parser.add_argument("--variation", type=float, default=0.667, |
| help="Voice variation 0.0-1.0 (default: 0.667)") |
| parser.add_argument("--seed", type=int, default=0, |
| help="Random seed (default: 0)") |
| args = parser.parse_args() |
|
|
| print(f"π€ Text: {args.text}") |
| print(f"π Output: {args.output}") |
|
|
| sys.path.insert(0, str(Path(__file__).resolve().parent)) |
| from tts_engine import InflectTTSEngine |
|
|
| try: |
| engine = InflectTTSEngine(model_dir=args.model_dir) |
| except Exception as e: |
| print(f"β Failed to init engine: {e}") |
| print(" Make sure axmodels are at models/ or use --model-dir") |
| sys.exit(1) |
|
|
| t0 = time.perf_counter() |
| engine.save( |
| args.text, args.output, |
| speed=args.speed, |
| variation=args.variation, |
| seed=args.seed, |
| ) |
| elapsed = time.perf_counter() - t0 |
|
|
| import soundfile as sf |
| info = sf.info(args.output) |
| rtf = elapsed / info.duration if info.duration > 0 else 0 |
| print(f"β
Done! {info.duration:.2f}s audio, {elapsed:.2f}s wall, RTF={rtf:.3f}x") |
| print(f"π {args.output}") |
|
|
| if __name__ == "__main__": |
| main() |
|
|