- A geração de voz local agora consegue entregar qualidade suficientemente realista mesmo sem uma GPU dedicada; no ambiente de exemplo, a GPU fica reservada para inferência de LLM e a CPU cuida do TTS
- Kokoro é um modelo de 82M parâmetros, mas oferece suporte a vários idiomas, como inglês, chinês e hindi, fornece cerca de 50 vozes e é mais otimizado para inglês
- A configuração mais simples é executar o contêiner Kokoro-FastAPI; os modelos de voz já vêm incluídos, e a imagem tem cerca de 5 GB
- Ele oferece uma interface compatível com a OpenAI speech API, facilitando relativamente a troca de programas já baseados em APIs de voz para TTS local
- A síntese de parágrafos curtos leva cerca de 4,7 s em um Intel Core i7-4770K, 4,5 s em um Apple M2 Pro e 1,5 s em um AMD Ryzen 7 8745HS, permitindo usar LLMs locais de uma forma em que você ouve em vez de ler as respostas
Kokoro TTS executado apenas com CPU
- Há alguns anos, gerar voz local realista era difícil, mas hoje é possível criar voz de alta qualidade sem entregar dados pessoais a serviços externos
- O exemplo é executado em uma máquina com GTX 1080 Ti para LLM local, abordada anteriormente
- A GPU dedicada dessa máquina fica reservada para inferência de LLM
- A síntese de voz usa apenas a CPU
- O modelo usado é o Kokoro
- É um modelo de 82M parâmetros
- Gera vozes realistas em vários idiomas, como inglês, chinês e hindi
- Oferece cerca de 50 vozes e é otimizado principalmente para inglês
- A configuração de servidor mais simples é usar a imagem de contêiner Kokoro-FastAPI
- Ela inclui modelos de voz baixados previamente
- Por isso, a imagem do contêiner tem cerca de 5 GB
- Comando para executar com Docker ou Podman:
podman run -p 8880:8880 ghcr.io/remsky/kokoro-fastapi-cpu - Depois de executar, a UI web pode ser aberta em
localhost:8880/web, onde é possível inserir texto, gerar áudio e reproduzi-lo automaticamente
API compatível com OpenAI e exemplos de execução
- Além da UI web, o contêiner Kokoro-FastAPI oferece uma interface TTS compatível com a OpenAI speech API
- Programas que já usam a OpenAI speech API podem ser adaptados com facilidade
- Exemplos de código em JavaScript e Python estão em github.com/remotebrowser/speak
- Exemplo de execução em JavaScript:
export TTS_API_BASE_URL=http://127.0.0.1:8880/v1 ./speak.js "Good morning! How are you today?" - Exemplo de execução em Python:
export TTS_API_BASE_URL=http://127.0.0.1:8880/v1 ./speak.py "Good morning! How are you today?" - O áudio gerado é salvo como um arquivo MP3
- Se SoX ou Sound eXchange estiver instalado, o áudio é reproduzido automaticamente
- Informações sobre o SoX podem ser conferidas em sox.sf.net
- Para escolher outra voz, defina a variável de ambiente
TTS_VOICEexport TTS_API_BASE_URL=http://127.0.0.1:8880/v1 export TTS_VOICE="am_eric" ./speak.js "Good morning! How are you today?" - A lista completa de vozes disponíveis está em Kokoro VOICES.md
Tempo de síntese por CPU e alternativas
- Ao sintetizar um parágrafo curto de teste com a voz
am_eric, os tempos de geração, considerando o melhor resultado em 3 execuções, foram os seguintes- Intel Core i7-4770K: 4,7 segundos
- Apple M2 Pro: 4,5 segundos
- AMD Ryzen 7 8745HS: 1,5 segundo
- A primeira CPU da lista é um modelo lançado há 12 anos, e mesmo CPUs antigas conseguem dar conta da tarefa
- Como alternativa de TTS em contêiner compatível com OpenAI, há também o Speaches
- Diferentemente do Kokoro-FastAPI, a imagem do contêiner não inclui os pesos de voz; eles precisam ser baixados explicitamente pela API
- Também oferece recursos de STT de alta qualidade, incluindo Whisper
- Se uma aplicação precisar tanto de TTS quanto de STT, pode ser uma opção para tratar tudo em um só lugar
- Combinado com um LLM local, isso permite usar o sistema ouvindo as respostas por voz em vez de lê-las
1 comentários
Opiniões no Hacker News
Usei bastante o Kokoro em produtos de acessibilidade, e foi bom trabalhar com ele porque não exige a GPU NVidia que vários TTS de qualidade semelhante pedem
Gosto especialmente do fato de ser possível inserir manualmente guias de pronúncia em IPA. Isso porque houve casos em que uma palavra importante era homógrafa e o Kokoro a pronunciava errado
Mas ele fica fraco quando você pede para falar só uma ou duas palavras. Por exemplo, se você mandar falar apenas "six", quase sempre ele diz algo como "ah-six-ah". Em vez disso, se você passa uma frase mais longa, como "The word is: six", ele lê corretamente; e como a API do Kokoro fornece timestamps de cada palavra dentro da frase, dá para recortar só a palavra desejada com um script em Python. A entonação é um pouco plana, mas é muito estável
Perguntei no Discord e me disseram que é uma limitação do tamanho reduzido dos parâmetros; em defesa do Kokoro, vozes da eleven-labs também às vezes têm esse problema
Meu caso de uso é quase todo de palavras isoladas, então não serve para mim, porque não quero ter que lidar com processamento para concatenar ou dividir entrada e saída
Isso é interessante porque é um tema que realmente me interessa
Antes eu mantinha o whisperx separadamente, porque acho que, além da transcrição simples, timing e identificação de falantes também são importantes para usos como legendas. Só que ele depende do pyannote, e a licença é meio ambígua, então automatizar a instalação também fica mais complicado
Por isso fui procurar algo que oferecesse uma transcrição melhor e também desse suporte à diarização de falantes; acabei escolhendo parakeet para transcrição e softformer para separação de falantes. Mas a maioria dos engines disponíveis não inclui softformer
Criei um servidor compatível com OpenAI para parakeet-rs com suporte a softformer (https://github.com/altunenes/parakeet-rs) e estou usando junto com o OpenWhispr, um app desktop de transcrição que lida com vários recursos de conveniência
Como uso a GPU para outras coisas, ainda não adicionei o caminho por GPU; por enquanto transcrevo só na CPU, mas a possibilidade de rodar transcrição localmente quando eu quiser parece muito poderosa
Para o que você quer fazer, usar Senko junto com parakeet faz a separação de falantes funcionar muito bem. No meu MacBook, foi mais rápido e preciso que Pyannote e whisper
Esse modelo é muito bom. Eu ficava frustrado por quase não conseguir mexer com modelos locais por falta de GPU, mas cerca de um mês atrás instalei o Kokoro em uma GTX1650 para criar um TTS para leitura de textos
Numa WebUI simples, colo uma URL ou um bloco de texto copiado; o Python limpa tudo e envia ao Kokoro para gerar o TTS, e o resultado é disponibilizado como RSS para o Apple Podcasts. Uso para colocar em dia artigos salvos e posts de blogs enquanto dirijo de manhã
Um dia quero criar algo tipo NotebookLM, usando várias vozes separadas, para que itens de notícias salvos sejam apresentados como um programa de rádio matinal
Alguns meses atrás criei uma extensão do Chrome que faz isso em qualquer página web e destaca simultaneamente a frase que está sendo lida
Ela elimina tanto a etapa de subir um contêiner quanto a de copiar e colar o conteúdo do site, então pode ser útil para quem quer usar o Kokoro com mais comodidade
https://chromewebstore.google.com/detail/local-reader-ai-on-...
TTS evoluiu muito e há muitas opções. Tem o Kokoro, e o Pocket TTS é um modelo pequeno de 100M que também consegue clonar vozes
O Chatterbox Turbo é um pouco maior, mas dá suporte melhor ao controle de emoções na voz; e o Fish Audio S2 é maior, mas permite controlar tom e emoção com muito mais granularidade e praticamente sem limitações. Tudo isso roda facilmente em um MacBook
Um bom repositório para começar a comparar modelos de TTS é https://github.com/5uck1ess/tts-bench
Considerando que o Kokoro é um modelo lançado há 1,5 ano, ele é realmente muito bom e tem ótimo desempenho para o seu tamanho: https://5uck1ess.github.io/tts-bench/scores.html
Já usei Piper para TTS local antes, e o Kokoro também parece interessante
Muito legal. Como uso Linux, não consigo usar Aqua, Whipsrflow etc., então desde janeiro venho usando uma solução que eu mesmo fiz
Recentemente organizei tudo e deixei mais fácil de instalar. Se houver interesse, dá para ver aqui: https://github.com/Hugo0/voiceio
Ele melhora sozinho com o tempo, roda na máquina local e, no geral, é um software bastante utilizável. Hoje em dia, 60% das minhas interações com o PC são por entrada de voz pura
Gosto muito do Kokoro. Uso para ler e-books que não têm audiolivro, e ele funciona muito bem para esse fim
Tenho um script em Python que lê epub/html, executa o modelo e grava mp3
O número de idiomas que o Kokoro suporta é limitado, então tive que usar outro modelo para suporte a neerlandês, mas a qualidade não é tão boa. Em geral ele é muito mais lento e também maior, grande demais para 8 GB de VRAM
No fim, até testei o TTS embutido do Windows; ele não soa natural, mas pelo menos consegue pronunciar a maioria das palavras e é muito rápido
Passei um dia mexendo com IA e removi camadas caras do Kokoro; ele roda 3 vezes mais rápido na CPU de celular e no MNN
A qualidade é muito parecida. Pode variar conforme o ambiente, mas o script está aqui: https://github.com/DavidVentura/translator-rs/blob/master/sc...