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édéfinies au total. Convention de nommage : [language_prefix][gender]_[name] — par ex., af_heart = femme américaine « Heart », if_sara = femme italienne « Sara ».
Référence des codes de voix
Chaque identifiant de voix Kokoro suit le même schéma : un préfixe de langue d'une lettre, un code de genre d'une lettre, un trait de soulignement, puis le nom de la voix. Utilisez le tableau ci-dessous pour associer votre langue cible au bon préfixe.
Tableau des préfixes de langue
| Préfixe | Langue | Locale | Suffixes de genre |
|---|---|---|---|
a | Anglais | Américain (en-US) | af_, am_ |
b | Anglais | Britannique (en-GB) | bf_, bm_ |
e | Espagnol | (es) | ef_, em_ |
f | Français | (fr-FR) | ff_ |
h | Hindi | (hi) | hf_, hm_ |
i | Italien | (it) | if_, im_ |
j | Japonais | (ja) | jf_, jm_ |
k | Coréen | (ko) | kf_ |
p | Portugais | Brésilien (pt-BR) | pf_, pm_ |
z | Chinois | Mandarin (zh) | zf_, zm_ |
Toutes les voix par langue
Anglais — Américain (af_*, am_*)
Femme: af_alloy, af_aoede, af_bella, af_heart (par défaut), af_jessica, af_kore, af_nicole, af_nova, af_river, af_sarah, af_sky
Homme: am_adam, am_echo, am_eric, am_fenrir, am_liam, am_michael, am_onyx, am_puck, am_santa
Anglais — Britannique (bf_*, bm_*)
Femme: bf_alice, bf_emma, bf_isabella, bf_lily
Homme: bm_daniel, bm_fable, bm_george, bm_lewis
Espagnol (ef_*, em_*)
Femme: ef_dora
Homme: em_alex, em_santa
Français (ff_*)
Femme: ff_siwis
Hindi (hf_*, hm_*)
Femme: hf_alpha, hf_beta
Homme: hm_omega, hm_psi
Italien (if_*, im_*)
Femme: if_sara
Homme: im_nicola
Japonais (jf_*, jm_*)
Femme: jf_alpha, jf_gongitsune, jf_nezumi, jf_tebukuro
Homme: jm_kumo
Coréen (kf_*)
Femme: kf_somi
Portugais — Brésilien (pf_*, pm_*)
Femme: pf_dora
Homme: pm_alex, pm_santa
Chinois — Mandarin (zf_*, zm_*)
Femme: zf_xiaobei, zf_xiaoni, zf_xiaoxiao, zf_xiaoyi
Homme: zm_yunjian, zm_yunxi, zm_yunxia, zm_yunyang
Exécutez speech kokoro --list-voices pour afficher toutes les voix actuellement fournies avec le modèle. Les identifiants de voix sont stables d'une version à l'autre — utilisez la chaîne exacte (par ex., if_sara) lorsque vous appelez --voice depuis la CLI ou passez voice: à l'API Swift.
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
speech 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
speech kokoro "Hello, how are you today?" --output hello.wav
# Français
speech kokoro "Bonjour le monde" --voice ff_siwis --language fr --output bonjour.wav
# Japonais
speech kokoro "こんにちは世界" --voice jf_alpha --language ja --output konnichiwa.wav
# Lister les 50 voix
speech 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)
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)
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