#!/usr/bin/env python3 """CuteTTS (AX650) command line demo. python3 demo.py --model-dir models --text "hello" --reference ref.wav --output out.wav """ import argparse import os import sys import numpy as np sys.path.insert(0, os.path.dirname(os.path.abspath(__file__))) from cutetts_ax import CuteTTSAX # noqa: E402 from cutetts_ax import audio as A # noqa: E402 def main(): ap = argparse.ArgumentParser() ap.add_argument("--model-dir", default=os.environ.get("CUTETTS_MODEL_DIR", "models")) ap.add_argument("--assets", default=os.path.join(os.path.dirname(os.path.abspath(__file__)), "assets")) ap.add_argument("--engine", default="ax", choices=["ax", "onnx"]) ap.add_argument("--text", default="The voice generated by this model sounds amazing!") ap.add_argument("--reference", default="samples/reference.wav") ap.add_argument("--output", default="output.wav") ap.add_argument("--cfg", type=float, default=None) ap.add_argument("--max-new", type=int, default=None) ap.add_argument("--seed", type=int, default=42) ap.add_argument("--ref-seconds", type=float, default=5.0) ap.add_argument("--stream", action="store_true", help="true streaming: emit audio while generating") ap.add_argument("--first-chunk", type=int, default=16, help="latents in the first streamed chunk") ap.add_argument("--chunk", type=int, default=32, help="latents per streamed chunk afterwards") ap.add_argument("--windowed", action="store_true", help="exact windowed streaming (bit-identical to offline, higher latency)") a = ap.parse_args() tts = CuteTTSAX(a.model_dir, a.assets, engine=a.engine) if a.stream: import wave with wave.open(a.output, "wb") as wf: wf.setnchannels(1) wf.setsampwidth(2) wf.setframerate(tts.sr) for chunk in tts.synthesize_stream(a.text, a.reference, max_new=a.max_new, cfg_strength=a.cfg, seed=a.seed, ref_max_seconds=a.ref_seconds, first_chunk=a.first_chunk, chunk=a.chunk, windowed=a.windowed): pcm = (np.clip(chunk, -1.0, 1.0) * 32767.0).astype("