Model reference · open weights
Kokoro is an open-weight audio or speech model from Thorsten-Voice. 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 | Thorsten-Voice |
|---|---|
| Type | Audio & music |
| Task | Text→speech |
| Released | 2026-07-25 |
| Popularity | 2k downloads / month |
| Licence | Open weights |
About
A German fine-tune of Kokoro-82M on the Thorsten-Voice dataset — a fast, high-quality, CPU-friendly text-to-speech model that speaks with Thorsten's own voice.
Kokoro-82M is a compact (82M parameter) TTS model based on the StyleTTS2 architecture. Its small size means it runs comfortably on CPU, in real time or faster, without requiring a GPU — making it well suited for local, offline use.
This model would not exist without:
Fine-tuned on the Thorsten-Voice dataset (CC0 / public domain).
| File | Description |
|---|---|
config.json | Kokoro-82M architecture config (unchanged from the base model) |
model.pth | Default checkpoint (epoch 5). Fine-tuned weights (bert, bert_encoder, predictor, text_encoder, decoder), converted from the Stage 2 StyleTTS2 checkpoint |
voices/thorsten.pt | Voicepack matching the default (epoch 5) checkpoint |
model_ep{1,2,3,4,6,7,8,9,10}.pth | All other Stage 2 checkpoints (epochs 1–4, 6–10), same converted, ready-to-use format as model.pth |
voices/thorsten_ep{1,2,3,4,6,7,8,9,10}.pt | Matching voicepacks for each of the above |
This model requires the German-language forks of misaki and kokoro (the official PyPI misaki package does not include the de submodule needed for German G2P), plus the espeak-ng system package that misaki relies on for phonemization:
# System dependency (required by misaki for German G2P)
# macOS:
brew install espeak-ng
# Debian/Ubuntu:
sudo apt-get install espeak-ng
# Python dependencies
pip install huggingface_hub soundfile numpy torch
pip install "git+https://github.com/semidark/misaki.git@6d252a2e02f3b030f22f56686f1a73786c16ffc8"
pip install "git+https://github.com/semidark/kokoro.git"
import numpy as np
import soundfile as sf
import torch
from huggingface_hub import hf_hub_download
from kokoro import KModel, KPipeline
REPO_ID = "Thorsten-Voice/Kokoro"
device = "cuda" if torch.cuda.is_available() else "cpu"
config_path = hf_hub_download(repo_id=REPO_ID, filename="config.json")
model_path = hf_hub_download(repo_id=REPO_ID, filename="model.pth")
voice_path = hf_hub_download(repo_id=REPO_ID, filename="voices/thorsten.pt")
kmodel = KModel(repo_id="hexgrad/Kokoro-82M", config=config_path, model=model_path)
kmodel = kmodel.to(device).eval()
pipeline = KPipeline(lang_code="d", repo_id="hexgrad/Kokoro-82M", model=kmodel)
# Workaround: misaki's German G2P can emit 'ʏ' (short ü), which is not in
# Kokoro's vocabulary (only 'y' is). See "Known limitations" below.
_original_g2p = pipeline.g2p
pipeline.g2p = lambda text: (lambda ps, tok: (ps.replace("ʏ", "y"), tok))(*_original_g2p(text))
voice = torch.load(voice_path, map_location="cpu", weights_only=True)
text = "Hallo, hier spricht Thorsten."
audio_chunks = [audio for _, _, audio in pipeline(text, voice=voice, speed=1.0)]
combined = np.concatenate(audio_chunks)
sf.write("output.wav", combined, 24000)
A ready-to-run version of this snippet is included as inference.py:
# Default checkpoint (epoch 5)
python inference.py "Hallo, hier spricht Thorsten." output.wav
# Any other epoch (1-10) - e.g. epoch 10, faster/tighter delivery
python inference.py "Hallo, hier spricht Thorsten." output.wav ep10
python inference.py "Hallo, hier spricht Thorsten." output.wav ep3
Sample outputs from the default (epoch 5) checkpoint, covering German pronunciation edge cases (umlauts, ich/ach-laut, eszett, consonant clusters, numbers, prosody) and technical/loanword pronunciation overrides:
All 14 samples are available under test_audio_epoch5/.
Validation loss stayed essentially flat across the second half of Stage 2 training, with epoch 5 and epoch 10 tied for the lowest value. Epoch 10 has a slightly lower F0 (pitch) loss, suggesting more refined prosody after additional adversarial fine-tuning — but in informal listening comparisons, epoch 5 was judged more natural, with a slightly slower, less "clipped" speaking pace. The metrics alone did not predict this; it only became apparent by listening to both checkpoints on identical sentences.
All 10 Stage 2 checkpoints are included in this repository, already converted to Kokoro's inference format and ready to use via inference.py (see Usage above) — no separate conversion step needed.
| Epoch | Validation loss | Duration loss | F0 loss | inference.py variant |
|---|---|---|---|---|
| 1 | 0.288 | 0.455 | 2.281 | ep1 |
| 2 | 0.285 | 0.432 | 2.131 | ep2 |
| 3 | 0.283 | 0.427 | 2.085 | ep3 |
| 4 | 0.272 | 0.439 | 2.015 | ep4 |
| 5 | 0.269 | 0.420 | 1.957 | ep5 / default |
| 6 | 0.274 | 0.427 | 1.953 | ep6 |
| 7 | 0.271 | 0.422 | 1.883 | ep7 |
| 8 | 0.271 | 0.420 | 1.869 | ep8 |
| 9 | 0.271 | 0.425 | 1.846 | ep9 |
| 10 | 0.269 | 0.416 | 1.800 | ep10 |
Only epochs 5 and 10 were carefully compared by ear; the others are pro
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 thorsten-voice-kokoro for you, it answers on the OpenAI-compatible API — the same base URL and keys as every other model. (thorsten-voice-kokoro 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="thorsten-voice-kokoro" -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.