Todos os projetos

MOSAICO

Um framework open source de vídeo com IA

Contribuições ao framework open source de vídeo do lab

Papel Contribuidor do Mosaico, o framework open source de vídeo do lab. Reescrevi o motor de tipografia das legendas e retrabalhei o gerador de roteiros de notícia.
Período 2025
Resultado Incorporado ao framework público (GPL-3.0, no PyPI); a quebra medida é o padrão.
Stack
  • Python
  • Pydantic
  • instructor + litellm
  • MoviePy
  • open source (GPL-3.0)
Open source · GPL-3.0 GitHub PyPI Documentação

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 mesma legenda, na mesma largura de quadro. A quebra gulosa deixa uma palavra sozinha na última linha; medir em pixels e reequilibrar distribui o texto por igual nas três linhas. A etapa marcada é minha.

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.