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.
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
| Idioma | Codigo | Vozes de exemplo |
|---|---|---|
| Ingles (EUA) | en | af_heart, am_adam, af_sky |
| Ingles (Reino Unido) | en | bf_emma, bm_george |
| Espanhol | es | ef_dora |
| Frances | fr | ff_siwis |
| Hindi | hi | hf_alpha, hm_omega |
| Italiano | it | if_sara |
| Japones | ja | jf_alpha, jm_omega |
| Portugues | pt | pf_dora |
| Chines | zh | zf_xiaobei, zm_yunjian |
| Coreano | ko | kf_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
| Prefixo | Idioma | Locale | Sufixos de gênero |
|---|---|---|---|
a | Inglês | Americano (en-US) | af_, am_ |
b | Inglês | Britânico (en-GB) | bf_, bm_ |
e | Espanhol | (es) | ef_, em_ |
f | Francês | (fr-FR) | ff_ |
h | Hindi | (hi) | hf_, hm_ |
i | Italiano | (it) | if_, im_ |
j | Japonês | (ja) | jf_, jm_ |
k | Coreano | (ko) | kf_ |
p | Português | Brasileiro (pt-BR) | pf_, pm_ |
z | Chinês | Mandarim (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
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
| Estagio | Modelo | Entrada | Saida |
|---|---|---|---|
| 1. Duracao | duration.mlmodelc | Tokens de fonema + embedding de voz + velocidade | Duracoes, caracteristicas de prosodia, codificacao de texto |
| — | Alinhamento em Swift | Duracoes + caracteristicas do estagio 1 | Prosodia e caracteristicas de texto alinhadas |
| 2. Prosodia | prosody.mlmodelc | Caracteristicas de prosodia alinhadas + estilo | Predicoes de F0 (pitch) + ruido |
| 3. Decodificador | decoder_*.mlmodelc | Texto alinhado + F0 + ruido + estilo | Forma 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:
| Bucket | Max fonemas | Caso de uso |
|---|---|---|
| p16 | 16 | Frases curtas |
| p32 | 32 | Sentencas curtas |
| p64 | 64 | Sentencas medias |
| p128 | 128 | Sentencas longas |
Buckets do decodificador
Modelos de decodificador com formas fixas para diferentes comprimentos maximos de audio (cada frame = 600 amostras a 24 kHz):
| Bucket | Max frames | Max audio |
|---|---|---|
decoder_5s | 200 | 5.0s |
decoder_10s | 400 | 10.0s |
decoder_15s | 600 | 15.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:
- Busca em dicionario — dicionarios de pronuncia de ingles americano e britanico com suporte a heteronimos
- Remocao de sufixos — decomposicao morfologica para sufixos conhecidos (por exemplo, "-ing", "-tion")
- BART G2P — fallback neural de grafema para fonema usando um modelo CoreML encoder-decoder separado para palavras fora do vocabulario
Pesos do modelo
| Componente | Tamanho | Formato |
|---|---|---|
| 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 MB | JSON (Float32 de 256 dim) |
| Encoder + decoder G2P | ~1.5 MB | .mlmodelc |
| Dicionarios + vocab | ~6 MB | JSON |
| Total (1 decoder) | ~170 MB |
Desempenho
| Metrica | Valor |
|---|---|
| Parametros | 82M |
| Backend de inferencia | CoreML (Neural Engine) |
| RTFx de inferencia | ~0.7 (mais rapido que tempo real) |
| Taxa de amostragem de saida | 24 kHz |
| Memoria de pesos | ~170 MB (1 bucket de decoder) |
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
| Opcao | Padrao | Descricao |
|---|---|---|
<text> | Texto a sintetizar | |
--voice | af_heart | Nome do preset de voz |
--language | en | Codigo de idioma: en, es, fr, hi, it, ja, pt, zh, ko, de |
--output, -o | kokoro_output.wav | Caminho do arquivo WAV de saida |
--list-voices | Lista todas as vozes disponiveis e sai | |
--model, -m | ID 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 uso | TTS recomendado |
|---|---|
| App iOS, leve, eficiente em bateria | Kokoro (CoreML, 82M params, ~170 MB) |
| Qualidade mais alta, streaming, clonagem de voz | Qwen3-TTS (MLX, 600M params, ~1.7 GB) |
| Streaming multilingue, 9 idiomas | CosyVoice3 (MLX, 500M params, ~1.2 GB) |
| Dialogo falado full-duplex | PersonaPlex (MLX, 7B params, ~5.5 GB) |
Licenca
- Pesos do modelo: Apache-2.0 (hexgrad/Kokoro-82M)
- Conversao CoreML: Apache-2.0 (aufklarer/Kokoro-82M-CoreML)
- Dicionarios e G2P: Apache-2.0