Kokoro TTS

Kokoro-82M es un modelo de texto a voz ligero y no autorregresivo basado en StyleTTS 2 con un vocoder ISTFTNet. Se ejecuta íntegramente en el Neural Engine a través de CoreML, produciendo voz natural a 24 kHz a partir de una entrada de texto en una sola pasada forward.

Listo para iOS

Kokoro-82M está diseñado para su despliegue en el dispositivo en iOS. Con 82M parámetros (~80 MB con 1 bucket, INT8), cabe cómodamente en iPhone y iPad. CoreML se ejecuta en el Neural Engine, dejando la GPU libre para otras tareas.

Idiomas soportados

IdiomaCódigoVoces de ejemplo
Inglés (EE. UU.)enaf_heart, am_adam, af_sky
Inglés (Reino Unido)enbf_emma, bm_george
Españolesef_dora
Francésfrff_siwis
Hindihihf_alpha, hm_omega
Italianoitif_sara
Japonésjajf_alpha, jm_omega
Portuguésptpf_dora
Chinozhzf_xiaobei, zm_yunjian
Coreanokokf_somi

50 presets de voz en total. Convención de nombrado de las voces: [idioma][género]_[nombre] — p. ej., af_heart = femenino americano "Heart".

Arquitectura

Kokoro utiliza un pipeline CoreML de 3 etapas. Sin bucle de sampling — todas las etapas son pasadas forward no autorregresivas con un paso de alineación en Swift entre las etapas 1 y 2.

Pipeline de 3 etapas

EtapaModeloEntradaSalida
1. Duraciónduration.mlmodelcTokens de fonemas + embedding de voz + velocidadDuraciones, características prosódicas, codificación de texto
Alineación en SwiftDuraciones + características de la etapa 1Características prosódicas y de texto alineadas
2. Prosodiaprosody.mlmodelcCaracterísticas prosódicas alineadas + estiloPredicciones de F0 (tono) + ruido
3. Decodificadordecoder_*.mlmodelcTexto alineado + F0 + ruido + estiloForma de onda de audio a 24 kHz

Buckets de fonemas (modelo de duración)

El modelo de duración usa formas de entrada enumeradas. La entrada se rellena hasta el bucket más pequeño que quepa:

BucketMáx. fonemasCaso de uso
p1616Frases cortas
p3232Oraciones cortas
p6464Oraciones medianas
p128128Oraciones largas

Buckets del decodificador

Modelos de decodificador con forma fija para diferentes longitudes máximas de audio (cada frame = 600 muestras a 24 kHz):

BucketMáx. framesMáx. audio
decoder_5s2005.0s
decoder_10s40010.0s
decoder_15s60015.0s

Requiere iOS 18+ / macOS 15+.

Fonemizador

El texto se convierte en tokens de fonemas mediante un pipeline de tres niveles — todo con licencia Apache-2.0, sin dependencias GPL:

  1. Búsqueda en diccionario — Diccionarios de pronunciación de inglés americano y británico con soporte para heterónimos
  2. Stemming de sufijos — Descomposición morfológica para sufijos conocidos (p. ej., "-ing", "-tion")
  3. BART G2P — Fallback neuronal de grafema a fonema usando un modelo CoreML encoder-decoder separado para palabras fuera de vocabulario

Pesos del modelo

ComponenteTamañoFormato
Modelo de duración~39 MB.mlmodelc
Modelo de prosodia~17 MB.mlmodelc
Modelos de decodificador (3 buckets)~107 MB cada uno.mlmodelc
Embeddings de voz (54 voces)~0.3 MBJSON (Float32 de 256 dim)
Encoder + decoder G2P~1.5 MB.mlmodelc
Diccionarios + vocab~6 MBJSON
Total (1 decodificador)~170 MB

Rendimiento

MétricaValor
Parámetros82M
Backend de inferenciaCoreML (Neural Engine)
RTFx de inferencia~0.7 (más rápido que tiempo real)
Frecuencia de muestreo de salida24 kHz
Memoria de pesos~170 MB (1 bucket de decodificador)
No autorregresivo

A diferencia de Qwen3-TTS y CosyVoice3 que generan tokens paso a paso, Kokoro usa un pipeline de 3 etapas sin bucle de sampling. Todas las etapas son pasadas forward deterministas.

Uso de la CLI

audio kokoro "Hello, world!" --voice af_heart --output hello.wav

Opciones

OpciónPor defectoDescripción
<text>Texto a sintetizar
--voiceaf_heartNombre del preset de voz
--languageenCódigo de idioma: en, es, fr, hi, it, ja, pt, zh, ko, de
--output, -okokoro_output.wavRuta del archivo WAV de salida
--list-voicesLista todas las voces disponibles y sale
--model, -mID del modelo en HuggingFace

Ejemplos

# English with default voice
audio kokoro "Hello, how are you today?" --output hello.wav

# French
audio kokoro "Bonjour le monde" --voice ff_siwis --language fr --output bonjour.wav

# Japanese
audio kokoro "こんにちは世界" --voice jf_alpha --language ja --output konnichiwa.wav

# List all 50 voices
audio kokoro --list-voices

API de Swift

import KokoroTTS
import AudioCommon

let tts = try await KokoroTTSModel.fromPretrained()
// Downloads ~170 MB on first run

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)

Cuándo usar Kokoro

Caso de usoTTS recomendado
App iOS, ligera, eficiente en bateríaKokoro (CoreML, 82M params, ~170 MB)
Máxima calidad, streaming, clonación de vozQwen3-TTS (MLX, 600M params, ~1.7 GB)
Streaming multilingüe, 9 idiomasCosyVoice3 (MLX, 500M params, ~1.2 GB)
Diálogo hablado full-duplexPersonaPlex (MLX, 7B params, ~5.5 GB)

Licencia