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][gender]_[name] — z. B. af_heart = American Female „Heart".
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
audio 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
audio kokoro "Hello, how are you today?" --output hello.wav
# Französisch
audio kokoro "Bonjour le monde" --voice ff_siwis --language fr --output bonjour.wav
# Japanisch
audio kokoro "こんにちは世界" --voice jf_alpha --language ja --output konnichiwa.wav
# Alle 50 Stimmen auflisten
audio 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)
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