cstr/parler-tts-mini-v1.1-GGUF
Parler TTS Mini v1.1 — GGUF (ggml-quantised)
GGUF / ggml conversion of `parler-tts/parler-tts-mini-v1.1` for use with [CrispStrobe/CrispASR](https://github.com/CrispStrobe/CrispASR).
Parler TTS is a prompt-conditioned text-to-speech model: describe the desired voice in natural language and the model generates matching speech. Architecture: T5 encoder (flan-t5-large, 24 layers) encodes the voice description, a MusicGen-style causal decoder (24 layers, 9 codebooks) generates DAC audio tokens autoregressively, and a DAC 44 kHz codec decoder synthesises the final waveform. Distributed under Apache 2.0 license.
Single GGUF contains all three components (T5 encoder + decoder + DAC codec).
Files
A duplicate, tokenizer-broken file set was removed (2026-08-03). The repo also carriedparler-mini-v1.1-{f16,q4_k,q8_0}.gguf. Their tensors were byte-identical to the files above (741/741 verified), but they were missing theparler.tokenizer.is_bpemetadata key — and CrispASR defaults that tofalse, which selects a Viterbi unigram tokenizer instead of BPE. Prompts therefore tokenized differently, and the model spoke differently. CrispASR's model registry pointed at the brokenparler-mini-v1.1-q8_0.gguf, so-m autodownloaded it. Both the registry and this repo now use theparler-tts-names.parler-mini-v1.1-ref.ggufis unrelated — it is the diff-harness reference, not a model, and is unaffected.
Quick start
# 1. Build CrispASR
git clone https://github.com/CrispStrobe/CrispASR
cd CrispASR
cmake -B build -DCMAKE_BUILD_TYPE=Release -DBUILD_SHARED_LIBS=OFF
cmake --build build -j --target crispasr-cli
# 2. Download
huggingface-cli download cstr/parler-tts-mini-v1.1-GGUF parler-tts-mini-v1.1-q8_0.gguf --local-dir .
# 3. Synthesise
./build/bin/crispasr --backend parler-tts \
-m parler-tts-mini-v1.1-q8_0.gguf \
--instruct "A female speaker with a warm, natural voice delivers her words at a moderate pace in a quiet environment." \
--tts "Hello, this is a test of Parler TTS." \
--tts-output output.wav
# 4. Auto-download shortcut
./build/bin/crispasr -m parler-tts --auto-download \
--instruct "A young man speaks clearly in a studio." \
--tts "The quick brown fox jumps over the lazy dog." \
--tts-output fox.wavArchitecture
Voice description
The --instruct parameter controls voice characteristics. Examples:
"A female speaker with a warm, natural voice delivers her words at a moderate pace in a quiet environment.""A young man speaks clearly with an enthusiastic tone in a professional studio setting.""An elderly woman reads softly with a gentle pace, slight background noise."
Conversion
python models/convert-parler-to-gguf.py \
--input parler-tts/parler-tts-mini-v1.1 \
--output parler-tts-mini-v1.1-f16.ggufQuantization notes
DAC audio codec weights are kept at F16 in all quantized variants — audio codecs are precision-sensitive and quantization noise produces audible artefacts. Only T5 encoder and MusicGen decoder weights are quantized. The BPE tokenizer is embedded in the GGUF (parler.tokenizer.is_bpe=true) so the C++ runtime auto-selects the correct algorithm.
Limitations
- Greedy decoding (temperature=0) produces degenerate output; use temperature=1.0 (default)
- C++ RNG (
std::mt19937) differs from PyTorch RNG — same seed produces different audio - Generation quality varies with the voice description — more specific descriptions yield better results
- No streaming support yet — audio is generated in one pass
- Maximum ~30 s audio per generation (2580 AR steps at 44.1 kHz / 512 hop)
Voice provenance (EU AI Act Art. 50(4))
Trained on LibriTTS-R and MLS, both derived from LibriVox recordings by real volunteer narrators, and the upstream card notes it was "trained on 34 speakers, characterized by name (e.g. Jon, Lea, Gary, Jenna, Mike, Laura)" for speaker consistency. Whether "Jon" is that reader's real name does not change the analysis: it reproduces one identifiable corpus speaker, pseudonymously, exactly like VCTK's p225.
CrispASR records this as speaker_identity=real_person. Output synthesized with it carries a spoken AI disclosure, because audio resembling an identifiable person is a deep fake under Art. 3(60) whether or not any cloning took place. It does not require --i-have-rights: the donor's agreement to the training is a licensing matter settled upstream, which a downstream operator cannot attest to.
Override per run with --speaker-identity, or stamp a file permanently with models/stamp-speaker-identity.py. See `docs/eu-ai-act.md` §6.2a.
License
Apache 2.0 — same as the upstream model.
