Kokoro 82M German (Victoria) — ONNX
kikiri-tts/kikiri-german-victoria — the German female voice Victoria Asztaller, a StyleTTS2 stage-2 fine-tune of Kokoro-82M by kikiri-tts — converted to the same end-to-end ONNX graphs as soniqo/Kokoro-82M-ONNX for on-device German TTS on Android.
German is not a voice of the multilingual Kokoro bundle: each German voice is a separate weight set trained on German phonemes only, so this bundle carries exactly one voice. The other voice, Martin, is published as soniqo/Kokoro-82M-German-Martin-ONNX.
Model
| Property | Value |
|---|---|
| Parameters | 82M |
| Architecture | Non-autoregressive, single-pass (BERT → duration → alignment → prosody → iSTFTNet) |
| Format | ONNX (opset 18) |
| Weights | 162 MB (FP16 storage → FP32 compute, shared external data) |
| Sample rate | 24 kHz |
| Max phonemes | 128 |
| Max audio | 5.0 s full graph, 3.0 s short-turn graph |
| Voice | df_victoria (female) |
| Language | German (de) |
Graph variants
| Graph | Audio tensor | Intended use |
|---|---|---|
kokoro-e2e.onnx |
[1, 1, 120000] (5.0 s) |
Full-capacity synthesis |
kokoro-e2e-realtime.onnx |
[1, 1, 72000] (3.0 s) |
Default short voice-agent replies |
Both graphs reference the same kokoro-e2e.onnx.data, so switching profiles is a
small graph download.
Files
| File | Description |
|---|---|
kokoro-e2e.onnx |
Full-capacity model graph |
kokoro-e2e-realtime.onnx |
3.0 s short-turn graph; shares the weights file below |
kokoro-e2e.onnx.data |
Model weights (external data, FP16 storage) |
vocab_index.json |
The upstream hexgrad IPA → token table (space = 16, ʦ = 20) |
dict_de.json |
German pronunciation dictionary (49,578 entries) in the voice's phoneme convention |
voices/df_victoria.bin |
Voice embedding (256 × float32) |
Phonemes
The voice was trained on espeak-ng 1.52 German phonemes as post-processed by
misaki (the kikiri-tts training
front-end): I/W for ai/au, ɔø for eu, ʦ/ʧ/ʤ affricates, ɜ for a
vocalic -er, the short ü written y, stress marks before the stressed vowel.
dict_de.json holds the 50,000 most frequent German words in exactly that
convention plus the kikiri brand/tech overrides. speech-core and speech-swift
reproduce the rest of the front-end without espeak: number, date, time,
currency, unit and abbreviation normalization, inflected and compound forms of
dictionary words, and rule-based G2P.
This bundle's vocab_index.json holds hexgrad's exact token table, the same
one the multilingual bundle has shipped since it was corrected on 2026-10-22.
Tensors
Input
| Name | Shape | Type | Description |
|---|---|---|---|
input_ids |
[1, 128] |
int64 | Phoneme token IDs (zero-padded) |
attention_mask |
[1, 128] |
int64 | 1 for real tokens, 0 for padding |
ref_s |
[1, 256] |
float32 | Voice style embedding |
speed |
[1] |
float32 | Speed factor (1.0 = normal) |
random_phases |
[1, 9] |
float32 | Initial harmonic phases (uniform [0,1)) |
Output
| Name | Shape | Type | Description |
|---|---|---|---|
audio |
[1, 1, 120000] ([1, 1, 72000] realtime) |
float32 | Raw PCM waveform (24 kHz) |
audio_length_samples |
[1] |
int64 | Valid sample count (trim audio to this) |
pred_dur |
[1, 128] |
float32 | Predicted phoneme durations |
Usage
import json
import numpy as np
import onnxruntime as ort
sess = ort.InferenceSession("kokoro-e2e-realtime.onnx")
vocab = json.load(open("vocab_index.json"))["vocab"]
phonemes = "ɡˈuːtən tˈɑːk, viː ɡˈeːt ɛs ˈiːnən?" # from dict_de.json / speech-core
ids = [0] + [vocab[c] for c in phonemes if c in vocab] + [0]
input_ids = np.zeros((1, 128), dtype=np.int64); input_ids[0, :len(ids)] = ids
attention_mask = np.zeros((1, 128), dtype=np.int64); attention_mask[0, :len(ids)] = 1
voice = np.fromfile("voices/df_victoria.bin", dtype=np.float32).reshape(1, 256)
audio, length, _ = sess.run(None, {
"input_ids": input_ids,
"attention_mask": attention_mask,
"ref_s": voice,
"speed": np.ones(1, dtype=np.float32),
"random_phases": np.random.rand(1, 9).astype(np.float32),
})
pcm = audio.flatten()[:int(length[0])]
On Android: ModelManager.ensureTtsModels(context, kokoroPack = KokoroPack.GERMAN_VICTORIA)
then synthesize(text, "de").
Source
Converted from kikiri-tts/kikiri-german-victoria
(revision ce81e200ff92, Apache 2.0) with the Soniqo end-to-end Kokoro
export (FluidInference-aligned SineGen, masked AdaIN) and FP16 weight storage.
Voice embedding: row 128 of the published [510, 1, 256] voicepack.
Links
- speech-android — Android SDK
- Docs — Android setup docs
- soniqo.audio — website
- blog — blog