Kokoro TTS
Kokoro-82M ist ein leichtgewichtiges, nicht-autoregressives Text-zu-Sprache-Modell, das auf StyleTTS 2 mit einem ISTFTNet-Vocoder basiert. Es läuft vollständig über CoreML auf der Neural Engine und erzeugt in einem einzigen Forward-Pass natürliche 24-kHz-Sprache aus Texteingaben.
Kokoro-82M ist für die On-Device-Bereitstellung auf iOS entworfen. Mit 82M Parametern (~80 MB mit 1 Bucket, INT8) passt es bequem auf iPhone und iPad. CoreML läuft auf der Neural Engine und lässt die GPU für andere Aufgaben frei.
Unterstützte Sprachen
| Sprache | Code | Beispielstimmen |
|---|---|---|
| Englisch (US) | en | af_heart, am_adam, af_sky |
| Englisch (UK) | en | bf_emma, bm_george |
| Spanisch | es | ef_dora |
| Französisch | fr | ff_siwis |
| Hindi | hi | hf_alpha, hm_omega |
| Italienisch | it | if_sara |
| Japanisch | ja | jf_alpha, jm_omega |
| Portugiesisch | pt | pf_dora |
| Chinesisch | zh | zf_xiaobei, zm_yunjian |
| Koreanisch | ko | kf_somi |
Insgesamt 50 voreingestellte Stimmen. Namenskonvention: [language_prefix][gender]_[name] — z. B. af_heart = amerikanische Frau „Heart“, if_sara = italienische Frau „Sara“.
Sprachcode-Referenz
Jede Kokoro-Stimm-ID folgt demselben Muster: ein einbuchstabiges Sprachpräfix, ein einbuchstabiger Geschlechtscode, ein Unterstrich und dann der Stimmname. Verwenden Sie die untenstehende Tabelle, um Ihre Zielsprache dem richtigen Präfix zuzuordnen.
Sprachpräfix-Tabelle
| Präfix | Sprache | Locale | Geschlechtssuffixe |
|---|---|---|---|
a | Englisch | Amerikanisch (en-US) | af_, am_ |
b | Englisch | Britisch (en-GB) | bf_, bm_ |
e | Spanisch | (es) | ef_, em_ |
f | Französisch | (fr-FR) | ff_ |
h | Hindi | (hi) | hf_, hm_ |
i | Italienisch | (it) | if_, im_ |
j | Japanisch | (ja) | jf_, jm_ |
k | Koreanisch | (ko) | kf_ |
p | Portugiesisch | Brasilianisch (pt-BR) | pf_, pm_ |
z | Chinesisch | Mandarin (zh) | zf_, zm_ |
Alle Stimmen nach Sprache
Englisch — Amerikanisch (af_*, am_*)
Weiblich: af_alloy, af_aoede, af_bella, af_heart (Standard), af_jessica, af_kore, af_nicole, af_nova, af_river, af_sarah, af_sky
Männlich: am_adam, am_echo, am_eric, am_fenrir, am_liam, am_michael, am_onyx, am_puck, am_santa
Englisch — Britisch (bf_*, bm_*)
Weiblich: bf_alice, bf_emma, bf_isabella, bf_lily
Männlich: bm_daniel, bm_fable, bm_george, bm_lewis
Spanisch (ef_*, em_*)
Weiblich: ef_dora
Männlich: em_alex, em_santa
Französisch (ff_*)
Weiblich: ff_siwis
Hindi (hf_*, hm_*)
Weiblich: hf_alpha, hf_beta
Männlich: hm_omega, hm_psi
Italienisch (if_*, im_*)
Weiblich: if_sara
Männlich: im_nicola
Japanisch (jf_*, jm_*)
Weiblich: jf_alpha, jf_gongitsune, jf_nezumi, jf_tebukuro
Männlich: jm_kumo
Koreanisch (kf_*)
Weiblich: kf_somi
Portugiesisch — Brasilianisch (pf_*, pm_*)
Weiblich: pf_dora
Männlich: pm_alex, pm_santa
Chinesisch — Mandarin (zf_*, zm_*)
Weiblich: zf_xiaobei, zf_xiaoni, zf_xiaoxiao, zf_xiaoyi
Männlich: zm_yunjian, zm_yunxi, zm_yunxia, zm_yunyang
Führen Sie speech kokoro --list-voices aus, um alle aktuell mit dem Modell gebündelten Stimmen aufzulisten. Stimmen-IDs sind über Releases hinweg stabil — verwenden Sie die exakte Zeichenfolge (z. B. if_sara), wenn Sie --voice über die CLI aufrufen oder voice: an die Swift-API übergeben.
Architektur
Kokoro verwendet eine 3-stufige CoreML-Pipeline. Keine Sampling-Schleife — alle Stufen sind nicht-autoregressive Forward-Passes mit einem Swift-seitigen Alignment-Schritt zwischen den Stufen 1 und 2.
3-Stufen-Pipeline
| Stufe | Modell | Eingabe | Ausgabe |
|---|---|---|---|
| 1. Dauer | duration.mlmodelc | Phonem-Tokens + Stimmen-Embedding + Geschwindigkeit | Dauern, Prosodie-Merkmale, Textkodierung |
| — | Swift-Alignment | Dauern + Merkmale aus Stufe 1 | Ausgerichtete Prosodie- & Textmerkmale |
| 2. Prosodie | prosody.mlmodelc | Ausgerichtete Prosodie-Merkmale + Stil | F0 (Tonhöhe) + Rausch-Vorhersagen |
| 3. Decoder | decoder_*.mlmodelc | Ausgerichteter Text + F0 + Rauschen + Stil | 24-kHz-Audiowellenform |
Phonem-Buckets (Duration-Modell)
Das Duration-Modell verwendet aufgezählte Eingabeformen. Die Eingabe wird auf den kleinsten passenden Bucket aufgefüllt:
| Bucket | Max. Phoneme | Anwendungsfall |
|---|---|---|
| p16 | 16 | Kurze Phrasen |
| p32 | 32 | Kurze Sätze |
| p64 | 64 | Mittlere Sätze |
| p128 | 128 | Lange Sätze |
Decoder-Buckets
Decoder-Modelle mit fester Form für unterschiedliche maximale Audiolängen (jeder Frame = 600 Samples bei 24 kHz):
| Bucket | Max. Frames | Max. Audio |
|---|---|---|
decoder_5s | 200 | 5,0 s |
decoder_10s | 400 | 10,0 s |
decoder_15s | 600 | 15,0 s |
Erfordert iOS 18+ / macOS 15+.
Phonemizer
Text wird über eine dreistufige Pipeline in Phonem-Tokens umgewandelt — alles Apache-2.0-lizenziert, ohne GPL-Abhängigkeiten:
- Wörterbuchsuche — Aussprache-Wörterbücher für US-Englisch und britisches Englisch mit Unterstützung für Homographen
- Suffix-Stemming — Morphologische Zerlegung für bekannte Suffixe (z. B. „-ing", „-tion")
- BART-G2P — Neuronaler Graphem-zu-Phonem-Fallback mit separatem CoreML-Encoder-Decoder-Modell für unbekannte Wörter
Modellgewichte
| Komponente | Größe | Format |
|---|---|---|
| Duration-Modell | ~39 MB | .mlmodelc |
| Prosodie-Modell | ~17 MB | .mlmodelc |
| Decoder-Modelle (3 Buckets) | jeweils ~107 MB | .mlmodelc |
| Stimmen-Embeddings (54 Stimmen) | ~0,3 MB | JSON (256-dim Float32) |
| G2P-Encoder + Decoder | ~1,5 MB | .mlmodelc |
| Wörterbücher + Vokabular | ~6 MB | JSON |
| Gesamt (1 Decoder) | ~170 MB |
Leistung
| Kennzahl | Wert |
|---|---|
| Parameter | 82M |
| Inferenz-Backend | CoreML (Neural Engine) |
| Inferenz-RTFx | ~0,7 (schneller als Echtzeit) |
| Ausgabe-Abtastrate | 24 kHz |
| Gewichtsspeicher | ~170 MB (1 Decoder-Bucket) |
Im Gegensatz zu Qwen3-TTS und CosyVoice3, die Tokens schrittweise erzeugen, verwendet Kokoro eine 3-stufige Pipeline ohne Sampling-Schleife. Alle Stufen sind deterministische Forward-Passes.
CLI-Verwendung
speech kokoro "Hello, world!" --voice af_heart --output hello.wav
Optionen
| Option | Standard | Beschreibung |
|---|---|---|
<text> | Zu synthetisierender Text | |
--voice | af_heart | Name der Stimmvoreinstellung |
--language | en | Sprachcode: en, es, fr, hi, it, ja, pt, zh, ko, de |
--output, -o | kokoro_output.wav | Pfad der Ausgabe-WAV-Datei |
--list-voices | Listet alle verfügbaren Stimmen auf und beendet | |
--model, -m | HuggingFace-Modell-ID |
Beispiele
# Englisch mit Standardstimme
speech kokoro "Hello, how are you today?" --output hello.wav
# Französisch
speech kokoro "Bonjour le monde" --voice ff_siwis --language fr --output bonjour.wav
# Japanisch
speech kokoro "こんにちは世界" --voice jf_alpha --language ja --output konnichiwa.wav
# Alle 50 Stimmen auflisten
speech kokoro --list-voices
Swift-API
import KokoroTTS
import AudioCommon
let tts = try await KokoroTTSModel.fromPretrained()
// Lädt beim ersten Ausführen ~170 MB herunter
let audio = try tts.synthesize(text: "Hello world", voice: "af_heart")
// audio: [Float] — 24 kHz Mono PCM
try WAVWriter.write(samples: audio, sampleRate: 24000, to: outputURL)
Compute Unit Override
fromPretrained(computeUnits:) selects which hardware runs the main CoreML model. The default (.all) lets Core ML prefer the Neural Engine, which is the fastest path on every supported device. Pass .cpuAndGPU to bypass the ANE as a fallback on platforms where the ANE compiler produces incorrect output for this model.
import CoreML
import KokoroTTS
// Default: ANE preferred
let tts = try await KokoroTTSModel.fromPretrained()
// Fallback: bypass the Neural Engine
let tts = try await KokoroTTSModel.fromPretrained(computeUnits: .cpuAndGPU)
Wann Kokoro verwenden
| Anwendungsfall | Empfohlenes TTS |
|---|---|
| iOS-App, leichtgewichtig, akkuschonend | Kokoro (CoreML, 82M Parameter, ~170 MB) |
| Höchste Qualität, Streaming, Stimmklonen | Qwen3-TTS (MLX, 600M Parameter, ~1,7 GB) |
| Mehrsprachiges Streaming, 9 Sprachen | CosyVoice3 (MLX, 500M Parameter, ~1,2 GB) |
| Vollduplex-Sprachdialog | PersonaPlex (MLX, 7B Parameter, ~5,5 GB) |
Lizenz
- Modellgewichte: Apache-2.0 (hexgrad/Kokoro-82M)
- CoreML-Konvertierung: Apache-2.0 (aufklarer/Kokoro-82M-CoreML)
- Wörterbücher und G2P: Apache-2.0