Model reference · open weights
kokoro-tts-kazakh is an open-weight audio or speech model from AnuarSv. AxForge deploys and operates it for you on dedicated EU-owned hardware — with the licence handled where one is required.
Available as managed deployment — configured and operated for you on dedicated EU hardware, quoted per deployment.
What it is
| Released by | AnuarSv |
|---|---|
| Type | Audio & music |
| Task | Text→speech |
| Released | 2026-07-28 |
| Popularity | 504 downloads / month |
| Licence | Open weights |
About
Nuraidar Mambetaly · Altair Balakhazy
A single-speaker Kazakh text-to-speech voice, built by fine-tuning Kokoro-82M on the ISSAI KazakhTTS2 corpus with a StyleTTS2-based training pipeline (kikiri-tts).
Kokoro is an 82M-parameter architecture, which keeps this checkpoint lightweight and fast — synthesis runs comfortably in real time on a regular CPU, with no GPU required for inference.
All three were synthesized from held-out validation text not seen during training (see Why This Checkpoint).
| Base model | hexgrad/Kokoro-82M (82M params, 24 kHz) |
| Language | Kazakh (kk) |
| Speaker | km_m1 — male, single speaker |
| Training framework | kikiri-tts (StyleTTS2 Stage 1 + Stage 2) |
| Phonemization | espeak-ng via misaki, IPA |
Training audio (km_m1) | 102.8 h across 48,154 clips |
| Full multi-speaker corpus | ISSAI KazakhTTS2 — 5 speakers, 269.9 h total |
| License | Apache 2.0 (inherited from Kokoro-82M / kikiri-tts) |
| Value | |
|---|---|
| Batch size | 12 |
| Optimizer | AdamW (betas=0.0/0.99, eps=1e-9, weight_decay=1e-4) |
| Learning rate (acoustic / PL-BERT) | 1e-4 / 1e-5 |
| Epochs (Stage 1 / Stage 2) | 5 / 5 |
joint_epoch | 2 (adversarial/SLM loss starts here — required to avoid style-encoder collapse) |
| Sample rate | 24,000 Hz, 80 mel bands |
| Training time | ≈ 52 hours (13h Stage 1 + 38.6h Stage 2) |
StyleTTS2/GAN-style training can silently collapse the style encoder partway through a run, so checkpoints are not
reliable to pick by filename or epoch number alone. Several km_m1 candidates produced during training were instead
synthesized on 20 held-out validation sentences (not seen during training) and scored for word error rate (WER)
using a Kazakh-fine-tuned Whisper ASR model with jiwer:
| Voicepack | WER on held-out set | Verdict |
|---|---|---|
final (this release) | 16.4% | Clean, intelligible speech |
epoch4_good | 131.3% | Garbled / repetitive looping — stale, incompatible with the current decoder despite the filename |
epoch9_collapsed | 217.4% | Confirmed style-encoder collapse |
final matches the exact decoder weights shipped here (kokoro_kazakh.pth) — both were exported from the same
training checkpoint, so there is no decoder/voicepack mismatch. Stage 2 validation loss also decreased monotonically
across all 5 epochs of this run (0.402 → 0.385), with no sign of the divergence seen in the collapsed run.
Runs on CPU — no GPU needed.
pip install torch kokoro "misaki[kk]"
misaki[kk] pulls in espeak-ng bindings for Kazakh phonemization; see
kikiri-tts for a ready-made inference script (inference_kazakh.py).
Note:
kokoro_kazakh.pthis stored using the legacyweight_normkey format (weight_g/weight_v) so it loads cleanly with currenttorch/kokororeleases. If you re-export this checkpoint yourself from a different PyTorch version, double-check the resulting key names match what your installedkokoroexpects — a silentweight_g/weight_vvs.parametrizations.weight.original0/original1mismatch will makeload_state_dictskip the decoder/predictor weights without raising an error, producing noise instead of speech.
import torch
from kokoro import KModel
from misaki import espeak
g2p = espeak.EspeakG2P(language="kk")
model = KModel(repo_id="hexgrad/Kokoro-82M", config="config.json", model="kokoro_kazakh.pth").eval()
voicepack = torch.load("km_m1.pt", map_location="cpu", weights_only=True)
text = "Сәлем! Бұл қазақ тіліндегі сөйлеу синтезі."
phonemes, _ = g2p(text)
ref_s = voicepack[min(len(phonemes) - 1, voicepack.shape[0] - 1)]
audio = model(phonemes, ref_s, speed=1.0)
Download the checkpoint files directly with huggingface_hub:
from huggingface_hub import snapshot_download
snapshot_download("AnuarSv/kokoro-tts-kazakh", local_dir="kokoro-tts-kazakh")
Measured on an AMD Ryzen 5 5500U (6 physical cores / 12 threads via SMT, up to 4.06 GHz, no GPU), synthesizing a 3-sentence, 22.45s-audio test set:
| CPU threads | Synthesis time | Real-time factor (RTF) | Speed vs. real time | Peak RAM |
|---|---|---|---|---|
| 1 | 20.9 s | 0.93× | 1.1× | 1.46 GB |
| 2 | 13.1 s | 0.58× | 1.7× | 1.46 GB |
| 3 | 11.0 s | 0.49× | 2.0× | 1.39 GB |
| 4 | 9.5 s | 0.42× | 2.4× | 1.41 GB |
| 5 | 9.1 s | 0.41× | 2.5× | 1.41 GB |
| 6 | 8.7 s | 0.39× | 2.6× (peak) | 1.41 GB |
| 8 | 9.7 s | 0.43× | 2.3× | 1.42 GB |
| 10 | 9.7 s | 0.43× | 2.3× | 1.42 GB |
| 12 | 10.1 s | 0.45× | 2.2× | 1.39 GB |
Throughput scales with core count up to the number of physical cores (6 here); beyond that, additional SMT threads add scheduling overhead without extra real compute, so speed slightly regresses. Even single-threaded, this model already runs faster than real time. Peak memory stays flat at ~1.4 GB regardless of thread count.
The table above measures single-request latency: how many threads to give one synthesis call so it finishes faster. That's a different question from throughput: how many simultaneous requests from different users the machine can serve. For that, each request should run single-threaded, with concurrency handled by running multiple worker processes in parallel instead of parallelizing one request across threads — this avoids the synchronization overhead that caps the table above at ~2.6×.
Concurrent single-thread
From the published model card. Full card on the HuggingFace links in the sidebar.
How it works
Using it via the API
Once AxForge deploys anuarsv-kokoro-tts-kazakh for you, it answers on the OpenAI-compatible API — the same base URL and keys as every other model. (anuarsv-kokoro-tts-kazakh below is illustrative; you get the exact model name on deployment.)
$ curl -sS https://api.axforge.ai/v1/audio/transcriptions \ -H "Authorization: Bearer $AXFORGE_API_KEY" \ -F model="anuarsv-kokoro-tts-kazakh" -F file=@audio.mp3
Create an account — your API key is available in the console. 3M free tokens every 30 days with every new account.