Kokoro TTS — Android

Kokoro-82M is a lightweight, non-autoregressive text-to-speech model running on Android via ONNX Runtime. It produces natural 24 kHz speech with 50 preset voices across 8 languages.

Supported Languages

LanguageCodeExample Voices
English (US)enaf_heart, am_adam, af_sky
English (UK)enbf_emma, bm_george
Spanishesef_dora
Frenchfrff_siwis
Hindihihf_alpha, hm_omega
Italianitif_sara
Japanesejajf_alpha, jm_omega
Portugueseptpf_dora
Chinesezhzf_xiaobei, zm_yunjian
Germandedm_martin, df_victoria (voice packs)

50 preset voices total. Voice naming convention: [language][gender]_[name] — e.g., af_heart = American Female "Heart".

German voice packs

German is not a voice of the multilingual bundle above: the two German voices are kikiri-tts fine-tunes of Kokoro-82M, each a separate 162 MB weight set trained on German phonemes only. Pick one with KokoroPack when downloading, then synthesize with language = "de". Each pack lives in its own cache, so English and German stay installed side by side.

PackVoiceDownload
KokoroPack.GERMAN_MARTINdm_martin (male)soniqo/Kokoro-82M-German-Martin-ONNX (~170 MB)
KokoroPack.GERMAN_VICTORIAdf_victoria (female)soniqo/Kokoro-82M-German-Victoria-ONNX (~170 MB)
val modelDir = ModelManager.ensureTtsModels(
    context,
    ttsModel = TtsModel.KOKORO_SHORT_TURN,
    kokoroPack = KokoroPack.GERMAN_MARTIN, // or GERMAN_VICTORIA
)
val tts = SpeechSynthesizer(SpeechSynthesizerConfig(modelDir = modelDir))
val audio = tts.synthesize("Am 3. Oktober um 18:30 Uhr kostet es 12,80 €.", "de")

Numbers, ordinals, dates, times, currency amounts, units and common abbreviations are spelled out on device; words come from a 50k-word German dictionary with inflection, compound and rule-based fallbacks. The system TTS engine (SpeechTextToSpeechService) offers the Martin voice as de-DE next to en-US.

Model Files

FileSize
kokoro-e2e.onnx + .onnx.data~330 MB
voices.binVoice embeddings
Phoneme dictionariesLanguage-specific pronunciation data

HuggingFace: soniqo/Kokoro-82M-ONNX

Performance

MetricValue
Parameters82M
Inference backendONNX Runtime
Output sample rate24 kHz

Phonemizer

Text is converted to phoneme tokens using a dictionary-based phonemizer with language-specific support. The Android implementation includes phonemizers for English, French, Spanish, Italian, Portuguese, Hindi, Japanese, and Chinese.

Pipeline Integration

On Android, Kokoro TTS is part of the SpeechPipeline. After STT transcribes speech, the text is phonemized and synthesized back into audio. The pipeline manages the full VAD → STT → TTS flow automatically.

val modelDir = ModelManager.ensureModels(context)
val pipeline = SpeechPipeline(SpeechConfig(modelDir = modelDir))
pipeline.events.collect { event ->
    when (event) {
        is SpeechEvent.TranscriptionCompleted -> println(event.text)
        else -> {}
    }
}
pipeline.start()
pipeline.pushAudio(samples) // 16kHz mono float32

Source code: github.com/soniqo/speech-android