ProsaTTS: TTS pt-BR com emoções (16,7M, derivado do Kokoro)
Modelo derivado do Kokoro-82M (Apache 2.0): mesma arquitetura e mesmos fonemas, com o BERT do Kokoro, gerador iSTFT e 16,7M parâmetros. A voz é sintética.
O que tem de novo
- Controle de emoção:
triste,animado,suave,raiva,surpresa, além do neutro. - Cada emoção é um vetor aprendido (
f3_istft.labels.pt) somado ao estilo de cada frase, mais um banco de estilos por emoção (f3_istft.bank.pt). - O ganho da emoção (
EMO_GAIN) aumenta ou diminui a intensidade.
Arquivos
| arquivo | o que é |
|---|---|
f3_istft.pth |
pesos do modelo (state_dict do treino) |
f3_istft.kmodel.pt |
os mesmos pesos no formato do KModel do Kokoro |
config_v3_istft.json |
configuração do modelo |
f3_istft.labels.pt |
{emo_<emoção>: vetor de 256} |
f3_istft.bank.pt |
estilos de referência por emoção e por tipo de frase |
packs/*.pt |
estilos base: neutro (pm_alex), pergunta (q), animado, suave |
pipeline/ |
todo o código: geração do áudio professor, filtro, alinhamento, treino e avaliação |
logs/ |
saída completa do teste curto e do fine-tuning |
samples/ |
uma frase escrita para cada emoção |
Como usar
O estilo de uma frase é pack[len(fonemas) - 1] + labels["emo_<emoção>"] * EMO_GAIN, passado ao KModel.forward_with_tokens.
Etapas do fine-tuning
| etapa | o que acontece | resultado |
|---|---|---|
| 1. Vozes de referência | Trechos da gravação Rasalgethi escolhidos por emoção: 6 emoções × 8 trechos (pipeline/voxgen/prompts.tar) |
48 referências |
| 2. Áudio professor | O VoxCPM2 clona a voz de cada referência e fala frases novas com aquela emoção, 4 processos por GPU H100 (vox_gen.py, voxgen.sbatch) |
12.000 frases em 1h28 |
| 3. Filtro | O Whisper large-v3-turbo transcreve cada frase e só fica a que diz o texto pedido (pocket_filter.py) |
11.531 mantidas |
| 4. Alinhamento | Um alinhador CTC marca quanto tempo dura cada fonema (align_ctc.py); frases longas demais saem (gate16.py) |
11.515 alinhadas |
| 5. Conjunto de treino | As frases novas, com o rótulo da emoção, se juntam às frases do treino anterior: neutro, pergunta, animado, suave (emo_index.py) |
34.890 frases, 100 separadas para teste |
| 6. Teste curto | 20 passos para ver se tudo roda (vox.sh smoke) |
ok |
| 7. Fine-tuning | 60.000 passos a partir do modelo iSTFT de 16,7M anterior (b3_istft), batch 16, lr 1e-4 com decaimento (vox.sh train) |
6h26 numa H100, GPU em 83% |
| 8. Estilos por emoção | O codificador de estilo lê as frases do treino e guarda um banco de estilos por emoção (style_bank.py) |
f3_istft.bank.pt, f3_istft.labels.pt |
O que o fine-tuning ensina
- Rótulo de emoção: cada emoção ganhou um vetor de 256 números (
--style-labels), começando em zero e aprendido com lr 5e-4. É ele que muda o jeito de falar. - Perdas:
- mel (espectrograma, peso 5) e STFT;
- duração dos fonemas;
- silêncio (peso 100);
- semelhança com o WavLM (
slm); - discriminadores de GAN, a partir do passo ~600.
- Partida: o modelo de partida (
b3_istft) já falava pt-BR com o BERT do Kokoro. Ele foi destilado antes do Kokoro-82M, com áudio do Pocket TTS da Kyutai (CC-BY-4.0).
Como as perdas evoluíram (logs/train_f3_istft.log)
| passo | mel | duração | STFT |
|---|---|---|---|
| 100 | 0,852 | 0,885 | 0,417 |
| 10.000 | 0,731 | 0,613 | 0,373 |
| 30.000 | 0,708 | 0,555 | 0,358 |
| 58.600 | 0,687 | 0,470 | 0,354 |
Resultado
- Pronúncia e velocidade, medidas no Mac: 97–100% das palavras reconhecidas pelo Whisper, e 0,02–0,07 s de processamento por segundo de áudio.
- Tom médio por emoção (
pipeline/eval/emo_pitch.py):
| neutro | triste | animado | raiva | surpresa | suave | |
|---|---|---|---|---|---|---|
| tom (Hz) | 195 | 182 | 160 | 152 | 139 | 138 |
- Limite conhecido: a ordem dos tons não segue a do professor. No VoxCPM2, triste é a mais grave e surpresa a mais aguda.
Rodar de novo
pipeline/voxgen/voxgen.sbatchgera o áudio professor.pipeline/voxgen/vox.sbatchfiltra, alinha e treina (vox.sh smoke, depoisvox.sh train).pipeline/eval/synth14.pysintetiza;page_f3.pymonta uma página para ouvir.
O áudio do treino (audio.i16.bin, as 12 mil frases) não está neste repositório.
Uso responsável
Conforme os termos do VoxCPM2, não use para se passar por uma pessoa, para fraude ou para desinformação, e marque o áudio gerado como feito por IA. Os termos da Google sobre o áudio do Gemini usado como referência ainda não foram revisados.
Créditos
Kokoro (hexgrad, Apache 2.0), VoxCPM2 (OpenBMB, Apache 2.0), Pocket TTS (Kyutai, CC-BY-4.0).