Kokoro voices — GGUF bundle
Per-speaker style packs for the Kokoro-82M family, converted to ggml's GGUF voice-pack format (arch=
kokoro-voice, single F32 tensor
voice.pack[max_phon, 1, 256]). For use with
CrispStrobe/CrispASR alongside
cstr/kokoro-82m-GGUF or the German backbone
cstr/kokoro-de-hui-base-GGUF.
Each voicepack is ~510 KB. Loading is direct passthrough — no quantisation needed at this size.
Voices
The Tundragoon voicepacks are [512, 1, 256] F32 (max_phon=512); the official Kokoro and kikiri voicepacks are [510, 1, 256] F32 (max_phon=510). The voice loader reads max_phon from the file so both layouts work transparently.
German voice cascade
When CrispASR is invoked with -l de (or any de_* / de-* locale) and no explicit --voice, it picks German voicepacks in this order:
df_victoria — kikiri-tts, in-distribution to the dida-80b German backbone (recommended)
df_eva — Tundragoon recovery, second-tier German speaker
ff_siwis — French baseline, last-resort non-silence fallback
Languages without a native pack (ru, ko, ar, …) fall back to
ff_siwis. See
cstr/kokoro-de-hui-base-GGUF for the matching German backbone.
Quality (ASR roundtrip)
Long German phrase ("Guten Tag, dies ist ein Test des deutschen Phonemizers."), parakeet-tdt-0.6b-v3 -l de, dida-80b backbone F16:
| Voice | Parakeet output |
|---|
dm_martin | "...Phonemizers." (perfect) |
df_victoria | "...Tester des Deutschen Phonemizers." (1 word-boundary err) |
dm_bernd | "...Phonemetzers." (1 phoneme err) |
df_eva | "...Phonemetzes." (1 phoneme err) |
All four clear the energy gate (peak ≥ 8000, RMS ≥ 1000); two are word-perfect on a phrase the official English-trained Kokoro-82M with af_heart collapses to silence on.
Quick start
1huggingface-cli download cstr/kokoro-voices-GGUF kokoro-voice-af_heart.gguf --local-dir .
2huggingface-cli download cstr/kokoro-82m-GGUF kokoro-82m-q8_0.gguf --local-dir .
3
4./crispasr --backend kokoro \
5 -m kokoro-82m-q8_0.gguf \
6 --voice kokoro-voice-af_heart.gguf \
7 --tts "Hello world" --tts-output hello.wav
Conversion
1python models/convert-kokoro-voice-to-gguf.py \
2 --input voices/af_heart.pt \
3 --output kokoro-voice-af_heart.gguf
Attribution
- Official voices (
af_heart, ef_dora, ff_siwis): hexgrad/Kokoro-82M, Apache-2.0.
- Tundragoon recovery (
df_eva, dm_bernd): the original Tundragoon/Kokoro-German HF repo was deleted; voices were recovered from r1di/kokoro-fastapi-german's Git LFS (api/src/voices/v1_0/{df_eva,dm_bernd}.pt), retaining the original Apache-2.0 license.
- kikiri-tts (
df_victoria, dm_martin): kikiri-tts/kikiri-german-victoria and kikiri-tts/kikiri-german-martin by the dida-80b maintainer, Apache-2.0.
- GGUF format + runtime:
CrispStrobe/CrispASR.
Voice provenance (EU AI Act Art. 50(4))
Whose voice a pack reproduces is decided per pack, not by the backbone — a
kokoro model is a base model, not a voice.
| Pack | speaker_identity | Evidence |
|---|
df_eva, dm_bernd | real_person | Per-speaker style packs from HUI-Audio-Corpus-German, carrying the narrators' own names. HUI is built from librivox.org recordings, so Eva and Bernd are real volunteers. |
df_victoria, dm_martin | synthetic | kikiri fine-tunes over kikiri-german-base-51speakers-synthetic, whose card states: "Trained entirely on synthetic (TTS-generated) audio". The speaker labels are person-shaped, but the base's training data is the evidence, not the name. |
af_heart, ef_dora, ff_siwis | synthetic | hexgrad's shipped style vectors — designed/blended, not any one person. |
Synthesizing with df_eva or dm_bernd prepends a spoken AI disclosure:
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.
Note the German cascade crosses this boundary. The documented fallback
order is df_victoria → df_eva → ff_siwis, so a missing default silently
moves you from a synthetic voice to a real HUI narrator. That is exactly why
the disclosure follows the pack rather than the run.
Override per run with
--speaker-identity, or stamp a pack permanently with
models/stamp-speaker-identity.py. See
docs/eu-ai-act.md §6.2a.
License
Apache-2.0 across the bundle, matching every upstream source.