Gepard Slovenian TTS (80k)
A LoRA fine-tune of nineninesix/gepard-1.0 — a ~555M autoregressive, Qwen3.5-backbone TTS that generates NVIDIA NanoCodec audio tokens — adapted to Slovenian on the ARTUR read-speech corpus.
Gepard is natively multilingual (EN/ES/PT/NL) and grapheme-based with a language-tag front-end, so
Slovenian is added by fine-tuning on sl: <text> prompts — no phoneme front-end (the Qwen3.5
tokenizer handles č/š/ž cleanly and the multilingual base learns Slovenian grapheme-to-sound internally;
using IPA would have discarded that multilingual transfer).
Honest quality note
The model speaks Slovenian with correct šumniki (č, š, ž) and its prosody is fairly natural (inherited from the multilingual base). Overall quality is not yet top-tier — this is a first scaled run (80k utterances, 5 epochs) on a single read-speech corpus. Expect occasional mispronunciations, variable pacing, and sensitivity to generation parameters. It is competitive on naturalness but a phoneme-based system can still be crisper on pure pronunciation.
Emotion: there is some content-driven emotional inflection — the multilingual base was pretrained on emotion-annotated speech (EmoNet-Voice), so emotionally-charged text and punctuation (questions, exclamations, sad/angry phrasing) nudge the prosody, in clean Slovenian with no foreign-accent leak. It is mild, not cinematic, and there is no explicit emotion-control input.
Samples
Generated with the settings below (cfg_scale=4.5, temperature=0.4, repetition_penalty=1.45).
| Style | Prompt | Audio |
|---|---|---|
| Pronunciation | Slovenščina je lep jezik s šumniki č, š in ž. | |
| Neutral | Danes je lep sončen dan in ptice pojejo na drevesih. | |
| Happy | Kako čudovit dan, res sem srečen! | |
| Sad | Žal mi je, vse je izgubljeno. | |
| Angry | Dovolj mi je tega, takoj nehaj! | |
| Question | Kaj se je zgodilo, kje si bil ves ta čas? | |
| Surprise | Neverjetno, kako je to sploh mogoče? | |
| Whisper | Tiho, nekdo prihaja, ne povej nikomur. |
Generation settings (important)
Use these — they are the tuned sweet spot. Prefix every input with sl: (the language tag is
caller-owned; the model was trained on it).
temperature = 0.4 # clear articulation
cfg_scale = 4.5 # strong text guidance → audible č/š/ž (2.5–4.5 usable; too high = harsh)
cfg_frames = 25 # onset-only guidance
repetition_penalty = 1.45 # REQUIRED — without it, cfg 4.0 occasionally fails to terminate (runaway)
repetition_window = 32
Architecture / codec
- Backbone:
Qwen3_5ForCausalLM, 14 layers, hidden 1024, vocab 248320, ~555M params, bf16. - Codec: NVIDIA NeMo NanoCodec
nvidia/nemo-nano-codec-22khz-1.89kbps-21.5fps— GroupFSQ, 8 layers, fsq_levels[8, 7, 6, 6], 21.5 frames/s, 22050 Hz output. - Language routing: transcripts prefixed
"{lang}: {text}"before tokenization.
How it was made
- Data: ARTUR Slovenian read speech. Clean multi-speaker selection (speakers with ≥ 25 utterances; drops single-clip pseudo-speakers), 80000 utterances across ~1348 speakers, 0.8–14 s, resampled to 22050 Hz.
- Audio → tokens: fused NanoCodec encode (slice/resample/encode in one GPU pass).
- Training: LoRA on the Qwen3.5 backbone (base frozen), 5 epochs, single GPU, via
gepard-train (
text_layout=repeat_ft, the short-register fix). Language tagsl, grapheme text (no G2P).
Usage
Run with the gepard-inference runner + the NeMo
codec (needs nemo_toolkit[tts] for decoding):
import torch, soundfile as sf
from gepard_inference import GepardRunner, UnfoldedCodecModel # gepard-inference package
dev = "cuda"
runner = GepardRunner.from_checkpoint("texdata/Gepard-Slovenian-TTS", device=dev)
codec = UnfoldedCodecModel.from_pretrained("nvidia/nemo-nano-codec-22khz-1.89kbps-21.5fps").eval().to(dev)
tokens = runner.generate(
"sl: Danes je lep sončen dan in ptice pojejo.", # MUST prefix "sl: "
temperature=0.4, cfg_scale=4.5, cfg_frames=25,
repetition_penalty=1.45, repetition_window=32, max_frames=800,
)
codes = tokens.unsqueeze(0).to(dev)
clen = torch.tensor([codes.shape[-1]], device=dev)
audio, alen = codec.decode_from_codes(codes, clen)
sf.write("out.wav", audio[0, : int(alen[0])].cpu().numpy(), 22050)
Limitations
- Overall quality is a first-pass; not production-grade. Best on short, declarative sentences.
- Grapheme-based: rare/foreign words and unusual stress may be mispronounced.
- Trained only on ARTUR read speech → neutral prosody, no emotion/expressive control tuned yet.
- Requires the generation settings above; low
cfg_scale(< 1) is unstable, very high (≈ 9) gets harsh.
References
- Base model: nineninesix/gepard-1.0 (Apache-2.0)
- Training: gepard-train · Inference: gepard-inference
- Codec: nvidia/nemo-nano-codec-22khz-1.89kbps-21.5fps · NVIDIA NeMo
- Base pretraining data (gepard-1.0): LAION Emilia, EmoNet-Voice
- Fine-tune data: ARTUR Slovenian speech corpus (CLARIN.SI)
- Tokenizer:
nineninesix/qwen3_5-full-attn-only-14
License
Apache-2.0 for the model weights (inherited from gepard-1.0). The NanoCodec used for decoding is under NVIDIA's Open Model License.
- Downloads last month
- -
Model tree for texdata/Gepard-Slovenian-TTS
Base model
Qwen/Qwen3.5-0.8B-Base