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.

Prêt pour iOS

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

LangueCodeExemples de voix
Anglais (US)enaf_heart, am_adam, af_sky
Anglais (UK)enbf_emma, bm_george
Espagnolesef_dora
Françaisfrff_siwis
Hindihihf_alpha, hm_omega
Italienitif_sara
Japonaisjajf_alpha, jm_omega
Portugaisptpf_dora
Chinoiszhzf_xiaobei, zm_yunjian
Coréenkokf_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éfixeLangueLocaleSuffixes de genre
aAnglaisAméricain (en-US)af_, am_
bAnglaisBritannique (en-GB)bf_, bm_
eEspagnol(es)ef_, em_
fFrançais(fr-FR)ff_
hHindi(hi)hf_, hm_
iItalien(it)if_, im_
jJaponais(ja)jf_, jm_
kCoréen(ko)kf_
pPortugaisBrésilien (pt-BR)pf_, pm_
zChinoisMandarin (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

Lister les voix à l'exécution

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

ÉtapeModèleEntréeSortie
1. Duréeduration.mlmodelcTokens de phonèmes + embedding de voix + vitesseDurées, caractéristiques prosodiques, encodage du texte
Alignement SwiftDurées + caractéristiques de l'étape 1Caractéristiques prosodiques et textuelles alignées
2. Prosodieprosody.mlmodelcCaractéristiques prosodiques alignées + stylePrédictions F0 (hauteur) et de bruit
3. Décodeurdecoder_*.mlmodelcTexte aligné + F0 + bruit + styleForme 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 :

BucketPhonèmes maxCas d'usage
p1616Phrases courtes
p3232Phrases brèves
p6464Phrases moyennes
p128128Phrases longues

Buckets du décodeur

Modèles de décodeur à forme fixe pour différentes longueurs audio maximales (chaque trame = 600 échantillons à 24 kHz) :

BucketTrames maxAudio max
decoder_5s2005,0 s
decoder_10s40010,0 s
decoder_15s60015,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 :

  1. Recherche dans le dictionnaire — dictionnaires de prononciation anglais US et anglais britannique avec prise en charge des hétéronymes
  2. Raccourcissement de suffixes — décomposition morphologique pour les suffixes connus (par ex. « -ing », « -tion »)
  3. 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

ComposantTailleFormat
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 MoJSON (Float32 256 dim)
Encodeur + décodeur G2P~1,5 Mo.mlmodelc
Dictionnaires + vocab~6 MoJSON
Total (1 décodeur)~170 Mo

Performance

MétriqueValeur
Paramètres82M
Backend d'inférenceCoreML (Neural Engine)
RTFx d'inférence~0,7 (plus rapide que le temps réel)
Fréquence d'échantillonnage de sortie24 kHz
Mémoire des poids~170 Mo (1 bucket de décodeur)
Non autorégressif

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

OptionPar défautDescription
<text>Texte à synthétiser
--voiceaf_heartNom de la voix préréglée
--languageenCode de langue : en, es, fr, hi, it, ja, pt, zh, ko, de
--output, -okokoro_output.wavChemin du fichier WAV de sortie
--list-voicesListe toutes les voix disponibles et quitte
--model, -mIdentifiant 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'usageTTS recommandé
App iOS, léger, économe en batterieKokoro (CoreML, 82M paramètres, ~170 Mo)
Qualité maximale, streaming, clonage vocalQwen3-TTS (MLX, 600M paramètres, ~1,7 Go)
Streaming multilingue, 9 languesCosyVoice3 (MLX, 500M paramètres, ~1,2 Go)
Dialogue vocal full-duplexPersonaPlex (MLX, 7B paramètres, ~5,5 Go)

Licence