Troquei Meu Motor de TTS. A Chamada de API Foi a Parte Fácil.
Como integrar Google Chirp 3 HD em um pipeline de dublagem por IA sem destruir o timing original. Os desafios de sincronização de áudio e legendas.
13 de setembro de 2026
O Katto já tinha dublagem por IA. Um criador podia pegar um clipe curto, escolher um idioma e receber a versão traduzida. A primeira versão usava Kokoro e cobria oito idiomas.
Recentemente, migrei o motor principal de fala para o Google Cloud Text-to-Speech com Chirp 3 HD. O objetivo parecia direto: melhorar as vozes e adicionar mais idiomas. O Katto agora expõe 19 idiomas de dublagem e 12 vozes curadas no editor.
Eu esperava que a migração fosse basicamente uma troca de API.
Não foi.
Gerar uma frase natural é fácil. Fazer essa frase começar e terminar exatamente no espaço deixado por outro locutor é o problema real de dublagem.
Se o locutor original fala algo em 2,4 segundos e a tradução leva 3,2 segundos, um bom modelo de TTS não salva o clipe. A voz invade a próxima frase, as legendas desalinham ou a fala precisa ser acelerada até soar apressada.
A requisição de TTS acabou sendo a menor parte do sistema.
O pipeline que construí
timings de palavras em cache
|
v
segmentos de frases com slots de tempo fixos
|
v
tradução consciente de duração
|
v
Google Chirp 3 HD, uma frase por vez
|
v
alinhamento de áudio limitado com FFmpeg
|
+----> legendas traduzidas dos mesmos segmentos
|
v
remux final do MP4Cada estágio existe porque uma versão mais simples falhou de um jeito diferente.
Manter o timing original como dado
O Katto já tem timestamps de palavras do pipeline de transcrição. Eu não envio o transcript inteiro para tradução e TTS como um bloco único. Eu agrupo palavras em frases.
Uma frase termina em pontuação de sentença, após uma pausa maior que 0,6 segundos, ou quando excederia seis segundos. Cada segmento mantém seu início e fim originais. Esses números viram o contrato para cada estágio posterior.
Sintetizar o transcript completo pode soar mais suave, mas remove as âncoras necessárias para colocar a fala de volta na timeline do vídeo. Síntese no nível de frase preserva contexto suficiente para uma voz natural enquanto mantém limites de timing úteis.
Traduzir para duração falada, não só significado
Uma tradução escrita correta pode ser uma tradução ruim para dublagem. Alguns idiomas precisam de mais sílabas para expressar a mesma ideia. Uma versão literal pode preservar cada nuance e ainda ser inutilizável porque não cabe no slot.
Para cada grupo de frases, peço ao Claude Haiku uma tradução falada natural que prefere fraseado mais curto e menos sílabas. A resposta preserva cada índice de segmento de origem.
O prompt faz parte do sistema de áudio. Seu trabalho não é só precisão linguística. Ele também reduz o esticamento de tempo necessário depois.
Isso continua sendo uma heurística. Um LLM não pode garantir duração porque a voz selecionada também muda o ritmo. A camada de áudio ainda mede o WAV gerado. Um cache em memória, indexado por idioma de destino e segmentos de origem, permite reutilizar a tradução enquanto o worker permanece ativo.
Sintetizar uma frase por vez
Cada frase traduzida vai para a API REST do Google Cloud Text-to-Speech como áudio LINEAR16 de 24 kHz. Nomes de voz seguem o formato locale-Chirp3-HD-speaker documentado pelo Google.
O Google suporta mais locales Chirp 3 HD do que o Katto atualmente expõe. Eu deliberadamente limitei o produto a 19 idiomas conectados pelo caminho completo: UI, mapeamento de locale, fontes, legendas e comportamento de fallback. Uma API afirmar um idioma não significa que o produto ao redor o suporta corretamente.
Encaixar fala no slot sem destruí-la
Após a síntese, comparo a duração gerada com o slot original.
target_duration = segment["end"] - segment["start"]
ratio = generated_duration / target_duration
Se a fala é ligeiramente longa demais, o filtro atempo do FFmpeg acelera preservando o pitch. Eu limito a aceleração em 1,3x.
Esse limite importa. Um limite anterior de 1,6x fazia mais frases caberem, mas algumas vozes soavam artificialmente apressadas. Alinhamento perfeito não é útil se o resultado é desagradável de ouvir.
Cada frase ajustada é colocada em seu offset original em uma trilha mestre. Frases curtas deixam uma pausa natural. Frases mais longas recebem uma correção limitada. Isso não resolve toda tradução patológica. Ele impõe uma regra mais útil: preservar inteligibilidade antes de perseguir timing matematicamente perfeito.
Dar à fala e legendas o mesmo relógio
A resposta de síntese me dá áudio, não timestamps confiáveis de palavras para o texto recém-falado. Inventar timing no nível de palavra faria as legendas parecerem precisas enquanto estão erradas.
Clipes dublados portanto usam legendas no nível de frase geradas dos mesmos segmentos traduzidos usados para fala. Seus tempos de início e fim já correspondem ao posicionamento do áudio.
O renderizador também seleciona fontes que cobrem o script de destino. Fontes latinas não são suficientes para japonês, chinês, hindi ou árabe. Títulos de intro e ganchos de IA seguem o mesmo caminho de localização, então a tela não fala um idioma e exibe outro.
Os problemas comuns de produção também importaram
Nem todo locutor curado funcionou em todo locale que testei. Se uma voz selecionada está indisponível, o Katto tenta novamente uma vez com um padrão conhecido para o gênero escolhido. A prévia ao vivo do editor chama o mesmo motor do Google. Uma amostra de outro modelo deixaria o usuário escolher uma voz que nunca recebe.
A chave de API de produção é restrita ao endereço IPv4 do VPS, mas o VPS preferia IPv6 ao alcançar o Google. Requisições válidas eram rejeitadas até a chamada de TTS ser forçada por IPv4. A API, chave e código estavam corretos. O caminho de rede não estava.
Dublagem produz uma variante de vídeo separada. Se tradução, síntese, renderização de legendas ou remuxing falham, o clipe original permanece intacto. Para os oito idiomas originais, o Kokoro permanece disponível quando o caminho do Google está desabilitado ou não configurado.
O que mudou e o que não mudou
O resultado visível foi uma expansão de 8 para 19 idiomas de dublagem, mais vozes selecionáveis e prévias ao vivo.
A melhoria mais profunda foi arquitetural. Tradução, fala, legendas, overlays e renderização de vídeo agora compartilham uma unidade temporal: o segmento de frase.
O sistema não clona o locutor original, não faz lip sync nem inventa timestamps de palavras gerados. Traduções muito longas ainda podem exceder seu slot ideal. Esses limites são melhores que afirmar precisão que o pipeline não pode entregar.
Eu pensei que estava substituindo um motor de fala. Acabei apertando o contrato entre quase todo estágio do pipeline de mídia.
A chamada de API foi a parte fácil. Fazer o resultado pertencer à timeline original foi o trabalho.
O Katto transforma vídeos longos em clipes verticais curtos e agora pode dublar esses clipes em 19 idiomas. Se você está construindo vídeo multilíngue, eu ficaria interessado em ouvir como você lida com timing sem fazer a voz soar apressada.
Referências
Artigos relacionados
Pronto para transformar seus vídeos em clipes virais?
O Katto corta, legenda e reenquadra automaticamente seus vídeos longos em conteúdo de formato curto.
Experimente o Katto grátis →