Kokoro TTS

Kokoro-82M e um modelo leve de texto para fala nao autoregressivo baseado em StyleTTS 2 com um vocoder ISTFTNet. Executa inteiramente no Neural Engine via CoreML, produzindo fala natural a 24 kHz a partir de texto em um unico forward pass.

Pronto para iOS

Kokoro-82M foi projetado para implantacao no dispositivo em iOS. Com 82M parametros (~80 MB com 1 bucket, INT8), cabe confortavelmente em iPhone e iPad. CoreML executa no Neural Engine, deixando a GPU livre para outras tarefas.

Idiomas suportados

IdiomaCodigoVozes de exemplo
Ingles (EUA)enaf_heart, am_adam, af_sky
Ingles (Reino Unido)enbf_emma, bm_george
Espanholesef_dora
Francesfrff_siwis
Hindihihf_alpha, hm_omega
Italianoitif_sara
Japonesjajf_alpha, jm_omega
Portuguesptpf_dora
Chineszhzf_xiaobei, zm_yunjian
Coreanokokf_somi

50 vozes predefinidas no total. Convenção de nomes: [language_prefix][gender]_[name] — por ex., af_heart = mulher americana “Heart”, if_sara = mulher italiana “Sara”.

Referência de códigos de voz

Cada ID de voz do Kokoro segue o mesmo padrão: um prefixo de idioma de uma letra, um código de gênero de uma letra, um sublinhado e, em seguida, o nome da voz. Use a tabela abaixo para mapear o idioma de destino para o prefixo correto.

Tabela de prefixos de idioma

PrefixoIdiomaLocaleSufixos de gênero
aInglêsAmericano (en-US)af_, am_
bInglêsBritânico (en-GB)bf_, bm_
eEspanhol(es)ef_, em_
fFrancês(fr-FR)ff_
hHindi(hi)hf_, hm_
iItaliano(it)if_, im_
jJaponês(ja)jf_, jm_
kCoreano(ko)kf_
pPortuguêsBrasileiro (pt-BR)pf_, pm_
zChinêsMandarim (zh)zf_, zm_

Todas as vozes por idioma

Inglês — Americano (af_*, am_*)

Feminino: af_alloy, af_aoede, af_bella, af_heart (padrão), af_jessica, af_kore, af_nicole, af_nova, af_river, af_sarah, af_sky
Masculino: am_adam, am_echo, am_eric, am_fenrir, am_liam, am_michael, am_onyx, am_puck, am_santa

Inglês — Britânico (bf_*, bm_*)

Feminino: bf_alice, bf_emma, bf_isabella, bf_lily
Masculino: bm_daniel, bm_fable, bm_george, bm_lewis

Espanhol (ef_*, em_*)

Feminino: ef_dora
Masculino: em_alex, em_santa

Francês (ff_*)

Feminino: ff_siwis

Hindi (hf_*, hm_*)

Feminino: hf_alpha, hf_beta
Masculino: hm_omega, hm_psi

Italiano (if_*, im_*)

Feminino: if_sara
Masculino: im_nicola

Japonês (jf_*, jm_*)

Feminino: jf_alpha, jf_gongitsune, jf_nezumi, jf_tebukuro
Masculino: jm_kumo

Coreano (kf_*)

Feminino: kf_somi

Português — Brasileiro (pf_*, pm_*)

Feminino: pf_dora
Masculino: pm_alex, pm_santa

Chinês — Mandarim (zf_*, zm_*)

Feminino: zf_xiaobei, zf_xiaoni, zf_xiaoxiao, zf_xiaoyi
Masculino: zm_yunjian, zm_yunxi, zm_yunxia, zm_yunyang

Listar vozes em tempo de execução

Execute speech kokoro --list-voices para imprimir todas as vozes atualmente incluídas no modelo. Os IDs de voz são estáveis entre as versões — use a string exata (por ex., if_sara) ao invocar --voice pela CLI ou passar voice: para a API Swift.

Arquitetura

Kokoro usa um pipeline CoreML de 3 estagios. Sem loop de amostragem — todos os estagios sao forward passes nao autoregressivos com um passo de alinhamento do lado Swift entre os estagios 1 e 2.

Pipeline de 3 estagios

EstagioModeloEntradaSaida
1. Duracaoduration.mlmodelcTokens de fonema + embedding de voz + velocidadeDuracoes, caracteristicas de prosodia, codificacao de texto
Alinhamento em SwiftDuracoes + caracteristicas do estagio 1Prosodia e caracteristicas de texto alinhadas
2. Prosodiaprosody.mlmodelcCaracteristicas de prosodia alinhadas + estiloPredicoes de F0 (pitch) + ruido
3. Decodificadordecoder_*.mlmodelcTexto alinhado + F0 + ruido + estiloForma de onda de audio a 24 kHz

Buckets de fonemas (modelo de duracao)

O modelo de duracao usa formas de entrada enumeradas. A entrada e preenchida ate o menor bucket que couber:

BucketMax fonemasCaso de uso
p1616Frases curtas
p3232Sentencas curtas
p6464Sentencas medias
p128128Sentencas longas

Buckets do decodificador

Modelos de decodificador com formas fixas para diferentes comprimentos maximos de audio (cada frame = 600 amostras a 24 kHz):

BucketMax framesMax audio
decoder_5s2005.0s
decoder_10s40010.0s
decoder_15s60015.0s

Requer iOS 18+ / macOS 15+.

Fonemizador

O texto e convertido em tokens de fonema via um pipeline de tres niveis — tudo licenciado Apache-2.0, sem dependencias GPL:

  1. Busca em dicionario — dicionarios de pronuncia de ingles americano e britanico com suporte a heteronimos
  2. Remocao de sufixos — decomposicao morfologica para sufixos conhecidos (por exemplo, "-ing", "-tion")
  3. BART G2P — fallback neural de grafema para fonema usando um modelo CoreML encoder-decoder separado para palavras fora do vocabulario

Pesos do modelo

ComponenteTamanhoFormato
Modelo de duracao~39 MB.mlmodelc
Modelo de prosodia~17 MB.mlmodelc
Modelos de decodificador (3 buckets)~107 MB cada.mlmodelc
Embeddings de voz (54 vozes)~0.3 MBJSON (Float32 de 256 dim)
Encoder + decoder G2P~1.5 MB.mlmodelc
Dicionarios + vocab~6 MBJSON
Total (1 decoder)~170 MB

Desempenho

MetricaValor
Parametros82M
Backend de inferenciaCoreML (Neural Engine)
RTFx de inferencia~0.7 (mais rapido que tempo real)
Taxa de amostragem de saida24 kHz
Memoria de pesos~170 MB (1 bucket de decoder)
Nao autoregressivo

Diferente do Qwen3-TTS e do CosyVoice3 que geram tokens passo a passo, Kokoro usa um pipeline de 3 estagios sem loop de amostragem. Todos os estagios sao forward passes deterministicos.

Uso do CLI

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

Opcoes

OpcaoPadraoDescricao
<text>Texto a sintetizar
--voiceaf_heartNome do preset de voz
--languageenCodigo de idioma: en, es, fr, hi, it, ja, pt, zh, ko, de
--output, -okokoro_output.wavCaminho do arquivo WAV de saida
--list-voicesLista todas as vozes disponiveis e sai
--model, -mID do modelo HuggingFace

Exemplos

# Ingles com voz padrao
speech kokoro "Hello, how are you today?" --output hello.wav

# Frances
speech kokoro "Bonjour le monde" --voice ff_siwis --language fr --output bonjour.wav

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

# Listar todas as 50 vozes
speech kokoro --list-voices

API Swift

import KokoroTTS
import AudioCommon

let tts = try await KokoroTTSModel.fromPretrained()
// Baixa ~170 MB na primeira execucao

let audio = try tts.synthesize(text: "Hello world", voice: "af_heart")
// audio: [Float] — PCM mono a 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)

Quando usar Kokoro

Caso de usoTTS recomendado
App iOS, leve, eficiente em bateriaKokoro (CoreML, 82M params, ~170 MB)
Qualidade mais alta, streaming, clonagem de vozQwen3-TTS (MLX, 600M params, ~1.7 GB)
Streaming multilingue, 9 idiomasCosyVoice3 (MLX, 500M params, ~1.2 GB)
Dialogo falado full-duplexPersonaPlex (MLX, 7B params, ~5.5 GB)

Licenca