Kokoro TTS
Kokoro-82M est un modèle texte-vers-parole léger et non autorégressif basé sur StyleTTS 2 avec un vocodeur ISTFTNet. Il s'exécute entièrement sur le Neural Engine via CoreML, produisant une parole naturelle à 24 kHz à partir de texte en une seule passe avant.
Kokoro-82M est conçu pour un déploiement embarqué sur iOS. Avec 82M paramètres (~80 Mo avec 1 bucket, INT8), il tient confortablement sur iPhone et iPad. CoreML s'exécute sur le Neural Engine, laissant le GPU libre pour d'autres tâches.
Langues prises en charge
| Langue | Code | Exemples de voix |
|---|---|---|
| Anglais (US) | en | af_heart, am_adam, af_sky |
| Anglais (UK) | en | bf_emma, bm_george |
| Espagnol | es | ef_dora |
| Français | fr | ff_siwis |
| Hindi | hi | hf_alpha, hm_omega |
| Italien | it | if_sara |
| Japonais | ja | jf_alpha, jm_omega |
| Portugais | pt | pf_dora |
| Chinois | zh | zf_xiaobei, zm_yunjian |
| Coréen | ko | kf_somi |
50 voix préréglées au total. Convention de nommage des voix : [langue][genre]_[nom] — par ex. af_heart = American Female « Heart ».
Architecture
Kokoro utilise un pipeline CoreML à 3 étapes. Pas de boucle d'échantillonnage — toutes les étapes sont des passes avant non autorégressives, avec une étape d'alignement côté Swift entre les étapes 1 et 2.
Pipeline à 3 étapes
| Étape | Modèle | Entrée | Sortie |
|---|---|---|---|
| 1. Durée | duration.mlmodelc | Tokens de phonèmes + embedding de voix + vitesse | Durées, caractéristiques prosodiques, encodage du texte |
| — | Alignement Swift | Durées + caractéristiques de l'étape 1 | Caractéristiques prosodiques et textuelles alignées |
| 2. Prosodie | prosody.mlmodelc | Caractéristiques prosodiques alignées + style | Prédictions F0 (hauteur) et de bruit |
| 3. Décodeur | decoder_*.mlmodelc | Texte aligné + F0 + bruit + style | Forme d'onde audio à 24 kHz |
Buckets de phonèmes (modèle de durée)
Le modèle de durée utilise des formes d'entrée énumérées. L'entrée est paddée jusqu'au plus petit bucket qui convient :
| Bucket | Phonèmes max | Cas d'usage |
|---|---|---|
| p16 | 16 | Phrases courtes |
| p32 | 32 | Phrases brèves |
| p64 | 64 | Phrases moyennes |
| p128 | 128 | Phrases longues |
Buckets du décodeur
Modèles de décodeur à forme fixe pour différentes longueurs audio maximales (chaque trame = 600 échantillons à 24 kHz) :
| Bucket | Trames max | Audio max |
|---|---|---|
decoder_5s | 200 | 5,0 s |
decoder_10s | 400 | 10,0 s |
decoder_15s | 600 | 15,0 s |
Nécessite iOS 18+ / macOS 15+.
Phonémiseur
Le texte est converti en tokens de phonèmes via un pipeline à trois niveaux — tous sous licence Apache-2.0, sans dépendances GPL :
- Recherche dans le dictionnaire — dictionnaires de prononciation anglais US et anglais britannique avec prise en charge des hétéronymes
- Raccourcissement de suffixes — décomposition morphologique pour les suffixes connus (par ex. « -ing », « -tion »)
- G2P BART — solution neuronale de repli graphème-vers-phonème utilisant un modèle CoreML encodeur-décodeur séparé pour les mots hors vocabulaire
Poids du modèle
| Composant | Taille | Format |
|---|---|---|
| Modèle de durée | ~39 Mo | .mlmodelc |
| Modèle de prosodie | ~17 Mo | .mlmodelc |
| Modèles de décodeur (3 buckets) | ~107 Mo chacun | .mlmodelc |
| Embeddings de voix (54 voix) | ~0,3 Mo | JSON (Float32 256 dim) |
| Encodeur + décodeur G2P | ~1,5 Mo | .mlmodelc |
| Dictionnaires + vocab | ~6 Mo | JSON |
| Total (1 décodeur) | ~170 Mo |
Performance
| Métrique | Valeur |
|---|---|
| Paramètres | 82M |
| Backend d'inférence | CoreML (Neural Engine) |
| RTFx d'inférence | ~0,7 (plus rapide que le temps réel) |
| Fréquence d'échantillonnage de sortie | 24 kHz |
| Mémoire des poids | ~170 Mo (1 bucket de décodeur) |
Contrairement à Qwen3-TTS et CosyVoice3 qui génèrent les tokens étape par étape, Kokoro utilise un pipeline à 3 étapes sans boucle d'échantillonnage. Toutes les étapes sont des passes avant déterministes.
Utilisation en CLI
audio kokoro "Hello, world!" --voice af_heart --output hello.wav
Options
| Option | Par défaut | Description |
|---|---|---|
<text> | Texte à synthétiser | |
--voice | af_heart | Nom de la voix préréglée |
--language | en | Code de langue : en, es, fr, hi, it, ja, pt, zh, ko, de |
--output, -o | kokoro_output.wav | Chemin du fichier WAV de sortie |
--list-voices | Liste toutes les voix disponibles et quitte | |
--model, -m | Identifiant du modèle HuggingFace |
Exemples
# Anglais avec la voix par défaut
audio kokoro "Hello, how are you today?" --output hello.wav
# Français
audio kokoro "Bonjour le monde" --voice ff_siwis --language fr --output bonjour.wav
# Japonais
audio kokoro "こんにちは世界" --voice jf_alpha --language ja --output konnichiwa.wav
# Lister les 50 voix
audio kokoro --list-voices
API Swift
import KokoroTTS
import AudioCommon
let tts = try await KokoroTTSModel.fromPretrained()
// Télécharge ~170 Mo à la première exécution
let audio = try tts.synthesize(text: "Hello world", voice: "af_heart")
// audio: [Float] — PCM mono 24 kHz
try WAVWriter.write(samples: audio, sampleRate: 24000, to: outputURL)
Quand utiliser Kokoro
| Cas d'usage | TTS recommandé |
|---|---|
| App iOS, léger, économe en batterie | Kokoro (CoreML, 82M paramètres, ~170 Mo) |
| Qualité maximale, streaming, clonage vocal | Qwen3-TTS (MLX, 600M paramètres, ~1,7 Go) |
| Streaming multilingue, 9 langues | CosyVoice3 (MLX, 500M paramètres, ~1,2 Go) |
| Dialogue vocal full-duplex | PersonaPlex (MLX, 7B paramètres, ~5,5 Go) |
Licence
- Poids du modèle : Apache-2.0 (hexgrad/Kokoro-82M)
- Conversion CoreML : Apache-2.0 (aufklarer/Kokoro-82M-CoreML)
- Dictionnaires et G2P : Apache-2.0