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 tag sl, 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

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
-
Safetensors
Model size
0.6B params
Tensor type
BF16
·
Inference Providers NEW
This model isn't deployed by any Inference Provider. 🙋 Ask for provider support

Model tree for texdata/Gepard-Slovenian-TTS

Adapter
(1)
this model