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é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

É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

audio 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
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'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