Bot de voz no Discord
Um bot que entra no canal de voz e fala com a voz de quem você escolher, rodando clonagem de voz em CPU comum, e um punhado de decisões sobre consentimento que vieram antes do código.
O problema
Queria entender clonagem de voz de perto, e o jeito de entender é construir. O recorte foi deliberadamente apertado: rodar em CPU, sem GPU e sem serviço pago, dentro de um bot de Discord que os meus amigos usariam de verdade.
Rodar em CPU não é detalhe de economia. É a restrição que define o projeto: muda o modelo que dá pra usar, muda quanto áudio de referência é preciso, e muda o que é aceitável em tempo de resposta.
Decisões técnicas
Consentimento antes de código
Contra o quê: clonar a voz de quem está no servidor e pedir desculpa depois, que é o caminho natural de um projeto de fim de semana.
Voz é dado biométrico e é dado pessoal protegido pela LGPD; a licença do modelo também proíbe uso sem consentimento explícito. Então a regra ficou escrita no próprio README, antes do setup: pede autorização no grupo antes de gravar.
O que custou: o projeto passou a depender de pessoas dizerem sim, o que é mais lento do que só raspar áudio de chamada antiga. E limitou o conjunto de vozes ao de quem topou.
Nada de voz, áudio ou histórico entra no repositório
Contra o quê: versionar as vozes prontas junto do código, que seria mais prático pra reinstalar.
As vozes (.safetensors, ~270 MB), as amostras de áudio, as saídas geradas e o log de quem falou o quê ficam todos fora do versionamento, por regra explícita no .gitignore.
O que custou: quem clonar o repositório não recebe nada funcionando: precisa gravar as próprias amostras e refazer a preparação. A reprodutibilidade caiu de propósito, porque o alternativo é publicar dado biométrico de terceiro num repositório.
Dois ambientes Python separados, e a separação é obrigatória
Contra o quê: um requirements.txt só, que é o que qualquer pessoa tentaria primeiro.
O bot roda no Python do sistema; a preparação de áudio roda num virtualenv com Python 3.11 e versões pinadas.
O que custou: setup com duas etapas e uma explicação, o que é péssimo pra quem chega. Mas a pinagem não é manha: o deepfilterlib só publica wheel para 3.11, o torchaudio 2.2 removeu um módulo que a biblioteca de limpeza de áudio importa, e o setuptools 81 removeu o pkg_resources de que outra dependência precisa. Cada versão travada está travada por um motivo escrito ao lado dela, porque a alternativa é alguém atualizar de boa-fé e quebrar tudo sem saber por quê.
O que ficou de fora
O bot não usa FFmpeg; só as ferramentas de preparação usam. E não tem banco de dados nem framework web: são três arquivos Python. O escopo foi mantido pequeno de propósito, porque o objetivo era entender o modelo, não construir um produto.
[Stack]
- Python
- Pocket TTS
- discord.py
- PyTorch