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 preset no total. Convencao de nomes de vozes: [idioma][genero]_[nome] — por exemplo, af_heart = American Female "Heart".
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
audio 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
audio kokoro "Hello, how are you today?" --output hello.wav
# Frances
audio kokoro "Bonjour le monde" --voice ff_siwis --language fr --output bonjour.wav
# Japones
audio kokoro "こんにちは世界" --voice jf_alpha --language ja --output konnichiwa.wav
# Listar todas as 50 vozes
audio 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)
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