CoolFace
Modelpublic

cstr/parler-tts-mini-v1.1-GGUF

sourceHugging Faceapache-2.0updated 2mo agoView on Hugging Face
0likes772downloads
Model Card

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

FileQuantSizeNotes
parler-tts-mini-v1.1-f16.ggufF161.8 GBReference quality
parler-tts-mini-v1.1-q8_0.ggufQ8_0979 MBRecommended
parler-tts-mini-v1.1-q4_k.ggufQ4_K569 MBSmallest (DAC codec kept at F16)
parler-mini-v1.1-ref.gguf—286 KBCrispASR crispasr-diff per-stage F32 PyTorch reference (not a model)
A duplicate, tokenizer-broken file set was removed (2026-08-03). The repo also carried parler-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 the parler.tokenizer.is_bpe metadata key — and CrispASR defaults that to false, 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 broken parler-mini-v1.1-q8_0.gguf, so -m auto downloaded it. Both the registry and this repo now use the parler-tts- names. parler-mini-v1.1-ref.gguf is unrelated — it is the diff-harness reference, not a model, and is unaffected.

Quick start

bash
# 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.wav

Architecture

ComponentParamsDetails
T5 Encoder~335Mflan-t5-large encoder, d=1024, 16 heads, 24 layers, gated-GELU FFN, relative position bias
Decoder~300MMusicGen-style causal transformer, d=1024, 16 heads, 24 layers, 9 codebooks, sinusoidal PE
DAC Codec~75MDescript Audio Codec 44 kHz, 9 codebooks x 1024, Snake activations, 512x upsample

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

bash
python models/convert-parler-to-gguf.py \
    --input parler-tts/parler-tts-mini-v1.1 \
    --output parler-tts-mini-v1.1-f16.gguf

Quantization 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.