MOSAICO
Um framework open source de vídeo com IA
Contribuições ao framework open source de vídeo do lab
Contexto
O Mosaico é o framework Python open source do Lab de IA da Folha de S.Paulo para montar vídeos de notícia. Você entrega mídia e uma matéria; ele devolve um vídeo pronto. Um LLM escreve o roteiro cena a cena com saída estruturada via instructor e litellm, um TTS narra, um transcritor sincroniza as legendas com o áudio e o MoviePy renderiza. Cada etapa fica atrás de um plugin baseado em protocolo, então dá para trocar o modelo ou a voz sem mexer no pipeline. É distribuído sob GPL-3.0.
Meu papel
Contribuí com duas partes. A primeira é o motor de tipografia das legendas (o código que decide onde uma linha de legenda quebra na tela). Reescrevi esse motor com testes, umas 410 linhas. A segunda é o gerador de roteiros de notícia. Retrabalhei esse gerador para uso na redação, principalmente para tratar o caso em que a mesma foto ou o mesmo clipe aparece mais de uma vez na matéria. Umas 280 linhas aí. As duas coisas estão no repositório público.
Antes: quebra gulosa
Chuva forte deve atingirtodo o estado neste fim de semana
uma palavra sozinha na última linha
Depois: medida e reequilibrada
Chuva forte deveatingir todo o estadoneste fim de semana
três linhas de tamanho parecido, nada sobrando
- mede cada linha em pixels, contorno incluído
- quebra uma palavra mais larga que a caixa em vez de estourar
- puxa palavras para trás nas quebras para nenhuma linha ficar sozinha
= meu trabalho
A parte difícil
Quebra de legenda parece problema bobo até você olhar os frames renderizados. Os vídeos saíam com quebras feias: uma palavra sozinha na última linha, ou uma linha passando da borda da caixa.
O motivo é que a lógica antiga contava caractere. Caractere não é largura. A legenda renderizada tem um contorno em volta das letras para o texto continuar legível por cima do vídeo, e esse contorno soma pixels dos dois lados de cada letra. Então passei a medir. Cada linha candidata é medida em pixel de verdade, contorno incluído, contra a caixa em que ela precisa caber.
Isso resolve o estouro. Não resolve a palavra órfã. Duas passadas a mais cuidam do resto. Se uma palavra sozinha já é mais larga que a caixa, ela é quebrada em vez de empurrar a linha para fora. Nome composto comprido e URL, principalmente. Depois que as linhas cabem, o algoritmo reequilibra, puxando palavra para trás nas quebras para a última linha não ficar com uma palavra órfã. O resultado é uma legenda com as linhas parecidas de tamanho e nada sobrando na ponta.
Ou a legenda cabe na caixa ou não cabe, e isso dá para testar.
Resultado
O Mosaico é público, e minha parte de tipografia foi junto. Quem renderiza legenda com o framework hoje pega a quebra medida por padrão.
Foi aqui que peguei a parte de vídeo da stack. Depois desenhei o novo motor de renderização do lab junto com o tech lead e o escrevi do zero (é o estudo de caso do Kubrick). O que eu sabia de texto e mídia em nível de frame veio do Mosaico.