Todos os artigos

Clonar a Minha Voz para Ler Este Blogue em Seis Línguas

Ouvir o artigo (experimental) · 10:35

00:00 / 10:35

Uma pequena onda sonora à esquerda que se desdobra em seis fitas de voz paralelas, uma por língua, todas com a mesma forma de onda

Este site publica em seis línguas: inglês, português, espanhol, alemão, francês e italiano. Durante algum tempo, essa promessa era só de texto. Podias ler qualquer artigo na tua língua, mas se quisesses ouvir a caminho do trabalho ou enquanto cozinhavas, não havia nada onde carregar no play. Acrescentar áudio era o passo seguinte óbvio. A pergunta interessante era de quem devia ser a voz.

Primeira ronda: uma voz pronta a publicar

A primeira versão usava vozes neuronais gratuitas de conversão de texto em fala, uma por língua. Foi o primeiro passo certo: custo zero, minutos para integrar, e pôs um leitor a funcionar em todos os artigos. Publicá-la foi também o que expôs a verdadeira fasquia. As vozes eram limpas mas formais, liam as minhas frases com a cadência de outra pessoa, e um site pessoal narrado por uma voz de catálogo é um marcador de posição. O meu nome está na escrita. A voz que a lê também devia ser a minha, incluindo nas cinco línguas que não vou narrar à mão tão cedo.

O desbloqueio: um modelo local que clona

A peça que tornou isto praticável é o Chatterbox Multilingual, um modelo TTS open-source com licença MIT da Resemble AI. Três propriedades fizeram dele a escolha certa:

  • Cobre as minhas seis línguas com um único modelo.
  • Corre numa GPU de consumo. A minha é uma RTX 3080, e a geração usa cerca de 5,5 GB de VRAM.
  • Faz clonagem de voz zero-shot: basta dar-lhe uma gravação de referência curta e lê qualquer texto com essa voz, em qualquer uma das suas línguas.

Esta última é a funcionalidade toda. Sem estúdio, sem treino do modelo, sem um dataset de horas a falar. A referência que alimenta tudo neste site é uma gravação que fiz ao computador numa sala silenciosa: cerca de quarenta segundos a ler um dos meus próprios artigos em português, a um ritmo normal.

Porque é que a referência importa

De origem, a voz de série do modelo não era a minha, para começar, e em português puxava para o brasileiro, que não é como eu falo. Não há nenhum menu de vozes para corrigir isso, nenhuma opção "masculina, português europeu" para selecionar. A voz é definida inteiramente pelo áudio de referência com que se condiciona o modelo, por isso aqueles quarenta segundos eram a única alavanca que eu tinha, e mudaram muito. O timbre, o registo e o ritmo são reconhecivelmente meus em todas as línguas. O sotaque só veio em parte: a narração fica muito mais perto do português europeu do que a voz de série ficava, e ainda resvala para uma cadência brasileira em alguns pontos, porque o modelo aprendeu o seu português com dados onde a variante brasileira domina, e quarenta segundos meus dobram essa tendência sem a apagar.

A parte que ainda me surpreende é que a referência é apenas em português. Nunca gravei uma amostra em inglês, nem em espanhol, nem em alemão, francês ou italiano. Os mesmos quarenta segundos em português alimentam as seis línguas: o modelo extrai da gravação como soa a minha voz e aplica-a à língua que lhe pedirem para ler a seguir.

Duas notas de afinação do processo de o pôr a soar bem:

  • O ritmo por omissão era demasiado rápido para uma escuta de fôlego longo. Baixar o peso de orientação do modelo (cfg_weight 0.3) e aliviar a expressividade produziu uma leitura mais calma, adequada a artigos. Essas definições estão integradas no pipeline, por isso todos os ficheiros saem consistentes.
  • Em inglês, a voz clonada carrega o meu sotaque português. Mantive-o. Um site pessoal que de repente soa a um nativo da Califórnia em inglês e a mim em português seria mais estranho do que um sotaque, e o sotaque é a versão verdadeira.

O pipeline

A marca deste site é AI em produção, por isso a narração tinha de ser um sistema, não um lote de ficheiros feito uma única vez. Tudo corre a partir de um comando, node scripts/generate-audio.mjs, e faz o seguinte:

  1. Percorre todos os artigos em todas as línguas e compara os timestamps dos ficheiros, para que só os artigos novos ou editados sejam regenerados. Publicar um artigo novo é escrever o markdown e correr o script.
  2. Entrega os textos a um worker em Python que carrega o Chatterbox uma vez e o mantém quente, em vez de pagar o carregamento do modelo por cada ficheiro.
  3. Lê cada artigo bloco a bloco e cose o áudio com pausas naturais, que é o que impede uma leitura de 15 minutos de soar a um único parágrafo sem fôlego.
  4. Normaliza o volume em todos os ficheiros. A saída em bruto do modelo vinha por volta de menos 41 LUFS, o que é um sussurro ao lado de qualquer podcast. Tudo é elevado para volume de podcast, entre menos 16 e menos 18 LUFS, para que o leitor soe confortavelmente ao lado da última coisa que ouviste.
  5. Escreve o resultado como um simples MP3 por artigo e por língua. O áudio é distribuído com o site como qualquer outro recurso estático: sem serviço de streaming, sem leitor de terceiros, sem tracking.

O controlo de qualidade corre na direção oposta: depois de um lote, fatias do áudio gerado passam pelo Whisper, o modelo de fala para texto, e as transcrições são comparadas com o texto de origem. Hoje é uma verificação por amostragem, e não um passo automático dentro do pipeline, e já apanhou o que o meu ouvido nunca apanharia, nas quatro línguas que não consigo rever de ouvido.

Os números, para poderes dimensionar isto para a tua própria configuração: a geração por blocos demora aproximadamente o dobro da duração do áudio final, por isso um artigo longo custa 25 a 30 minutos de tempo de GPU por língua. O catálogo completo, cinco artigos vezes seis línguas, é uma corrida de cerca de doze horas. A gravação de referência nunca entra no repositório; o script lê-a de uma pasta local e o repositório só vê os MP3 finais.

O que um lote longo te ensina

Um trabalho de doze horas encontra os teus pontos fracos. A minha primeira corrida completa morreu a meio quando o processo que a lançou foi derrubado, uma falha clássica de trabalhos longos. O que a salvou foi o mesmo desenho que torna a publicação barata: como o pipeline é incremental e cada ficheiro terminado é durável, o crash não custou nada além do ficheiro que estava a meio da codificação, e mesmo esse era recuperável a partir da sua saída temporária. Reinicia o comando e ele continua de onde a última corrida parou. Se estiveres a construir qualquer pipeline de geração de longa duração, essa propriedade, a capacidade de retomar por omissão, vale mais do que uma barra de progresso.

Como soa hoje

Não vou vender isto acima do que é. A narração é claramente audível e inconfundivelmente minha, e ainda tem arestas: de vez em quando uma frase sai cortada, ou um bloco gagueja como um disco riscado antes de recuperar. E o português mantém o desvio que descrevi acima. É o meu timbre a ler as minhas palavras, com uma cadência que um ouvinte português vai notar, em alguns pontos, como puxada para o brasileiro. Suficientemente ligeiro para eu o publicar, suficientemente presente para o querer deixar aqui por escrito. As verificações por amostragem com o Whisper apanham as falhas grosseiras; as mais subtis escapam, e em quatro destas línguas eu próprio nunca as ouviria. Por isso trato o áudio como o que é hoje, um companheiro. Carrega no play enquanto lês e ele leva-te ao longo do texto. As próximas iterações já se veem daqui: uma gravação de referência mais longa e mais limpa, para puxar o sotaque mais para cá, e transformar a verificação de qualidade num ciclo de reparação, em que qualquer bloco cuja transcrição se desvie do texto de origem é regenerado automaticamente, para que cada ficheiro publicado convirja para uma versão limpa.

A linha do consentimento

Bastaram quarenta segundos de áudio para fazer uma cópia convincente da minha voz, numa GPU de gaming, com software gratuito. O mesmo é verdade para a tua voz.

Sinto-me confortável a publicar isto por uma razão: é a minha voz, clonada por mim, com o meu consentimento, a ler as minhas próprias palavras, e identificada como aquilo que é. A mesma capacidade apontada à voz de outra pessoa sem autorização é fraude, e o facto de a barreira ser agora uma gravação curta significa que o ónus da prova mudou de lugar. A voz, por si só, já não autentica ninguém. Se a tua empresa ainda trata "soa como o CEO ao telefone" como autorização, este parágrafo é o teu relatório de incidente vindo do futuro.

Quanto custa

Depois da configuração inicial, feita uma única vez, o custo marginal de narrar um artigo novo em seis línguas é umas horas de tempo de GPU em segundo plano e a eletricidade por trás delas. Não há taxas de API por carácter, e nenhum texto de artigo sai alguma vez da minha máquina. As plataformas de voz alojadas clonam com mais polimento, e para produtos comerciais com a narração no centro vale a pena avaliá-las, mas para um site pessoal a via local ganha em custo, privacidade e controlo, e transforma a funcionalidade inteira num par de scripts num repositório.

Todos os artigos aqui têm agora um leitor no topo. Escolhe uma língua, carrega no play e acompanha a leitura: vais ouvir este texto mais ou menos como eu to leria, tirando um sotaque que decidi manter e a sílaba ocasional que o modelo ainda está a aprender a acertar.

Perguntas a que este artigo responde

  • É mesmo possível clonar uma voz a partir de uma gravação de quarenta segundos?

    Sim, e sem treino do modelo, sem estúdio e sem um dataset de horas a falar. O Chatterbox Multilingual, o modelo open-source com licença MIT da Resemble AI, faz clonagem de voz zero-shot: condiciona-se numa gravação de referência curta e lê qualquer texto com essa voz. Corre localmente numa RTX 3080 e usa cerca de 5,5 GB de VRAM.

  • É preciso gravar uma amostra de voz para cada língua?

    Não. A referência por trás de todos os ficheiros deste site é apenas em português, cerca de quarenta segundos a ler um artigo a um ritmo normal, e nunca foi gravada nenhuma amostra em inglês, espanhol, alemão, francês ou italiano. O modelo extrai da gravação como soa a voz e aplica-a à língua que lhe pedirem para ler a seguir.

  • Soa mesmo à tua voz ou estás a ser generoso?

    É claramente audível e é inconfundivelmente o meu timbre, e tem arestas que prefiro dizer a esconder. De vez em quando uma frase sai cortada ou um bloco gagueja como um disco riscado antes de recuperar, e o português mantém em alguns pontos uma cadência puxada para o brasileiro. As transcrições do Whisper sobre fatias por amostragem apanham as falhas grosseiras, as mais subtis escapam, e em quatro destas línguas eu próprio nunca as ouviria. Por isso o áudio é hoje um companheiro do texto, não um substituto da leitura.

  • Quanto tempo demora e quanto custa narrar um artigo em seis línguas?

    A geração por blocos demora aproximadamente o dobro da duração do áudio final, por isso um artigo longo custa 25 a 30 minutos de tempo de GPU por língua, e o catálogo completo, cinco artigos vezes seis línguas, foi uma corrida de cerca de doze horas. Depois da configuração inicial, o custo marginal de um artigo novo é umas horas de tempo de GPU em segundo plano e a eletricidade por trás delas: não há taxas de API por carácter e nenhum texto de artigo sai da máquina. As plataformas alojadas clonam com mais polimento e vale a pena avaliá-las quando a narração está no centro de um produto comercial, mas para um site pessoal a via local ganha em custo, privacidade e controlo.