From da25fa2aa9a2629d7fe42e303c17e87279d65799 Mon Sep 17 00:00:00 2001 From: Daniel Howells Date: Sat, 13 Jun 2026 19:42:11 +0100 Subject: [PATCH] feat: add Miso TTS CLI --- generator.py | 4 +++- tts_cli.py | 44 ++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 47 insertions(+), 1 deletion(-) create mode 100644 tts_cli.py diff --git a/generator.py b/generator.py index 8441cee..2084778 100644 --- a/generator.py +++ b/generator.py @@ -31,7 +31,9 @@ def load_llama3_tokenizer(): """ https://github.com/huggingface/transformers/issues/22794#issuecomment-2092623992 """ - tokenizer_name = "meta-llama/Llama-3.2-1B" + # meta-llama/Llama-3.2-1B is a gated repo; default to an ungated mirror with + # the identical tokenizer so no HF auth / license acceptance is needed. + tokenizer_name = os.environ.get("MISO_LLAMA_TOKENIZER", "unsloth/Llama-3.2-1B") tokenizer = AutoTokenizer.from_pretrained(tokenizer_name) bos = tokenizer.bos_token eos = tokenizer.eos_token diff --git a/tts_cli.py b/tts_cli.py new file mode 100644 index 0000000..99872b2 --- /dev/null +++ b/tts_cli.py @@ -0,0 +1,44 @@ +"""Isolated MisoTTS (8B) single-utterance generation CLI. + +Runs in its own venv (transformers 4.49). MisoTTS skips MPS (float64 limits), +so it runs on CPU — slow for an 8B model, but functional. tilde's main server +invokes this as a subprocess. + +Usage: python tts_cli.py --text "..." --out out.wav [--speaker 0] +""" + +from __future__ import annotations + +import argparse +import os +import sys + +os.environ.setdefault("NO_TORCH_COMPILE", "1") +os.environ.setdefault("HF_HUB_DOWNLOAD_TIMEOUT", "60") + + +def main() -> int: + ap = argparse.ArgumentParser() + ap.add_argument("--text", required=True) + ap.add_argument("--out", required=True) + ap.add_argument("--speaker", type=int, default=0) + ap.add_argument("--max-ms", type=int, default=20000) + args = ap.parse_args() + + import torch + import torchaudio + from generator import load_miso_8b + + device = "cuda" if torch.cuda.is_available() else "cpu" + repo = os.environ.get("MISO_TTS_8B_MODEL", "MisoLabs/MisoTTS") + gen = load_miso_8b(device, model_path_or_repo_id=repo) + audio = gen.generate( + text=args.text, speaker=args.speaker, context=[], max_audio_length_ms=args.max_ms + ) + torchaudio.save(args.out, audio.unsqueeze(0).cpu(), gen.sample_rate) + print(f"OK {args.out}", file=sys.stderr) + return 0 + + +if __name__ == "__main__": + raise SystemExit(main())