Legenda Simples — frases curtas, sem animação, no tempo da fala
Uma frase por vez, texto branco em negrito, minúscula com inicial maiúscula (como transcrito), sem fundo, sombra suave, no terço inferior, sem vermelho e sem animação de entrada. Ex.: "O problema é que" / "sem prática".
Pré-requisitos
- Premiere Pro (testado no 2027/27.0; ExtendScript) e Python 3.9+ com
pip install -r requirements.txt(Pillow). - Uma forma de executar ExtendScript no Premiere (MCP com
execute_extendscriptou bridge CEP por arquivo) — vejadocs/PREMIERE-BRIDGE.mdna raiz do repositório. - Fonte Montserrat Bold instalada (grátis, Google Fonts). Se não for encontrada, defina
CAPTION_FONT_DIRou coloque o.ttfemfonts/dentro da skill. - O modo padrão (PNG) não precisa de
.mogrt. Só a alternativa.mogrtprecisa deassets/Simple_Text_WbW.mogrt(vejaassets/LEIA-ME.md).
Parâmetros (fonte da verdade: style.json e RULES em scripts/plan_phrases.py)
- 9x16 (1080x1920). Montserrat Bold 66 px, branco, sombra suave (blur 6, dy 4, 55%).
y_center0,70. - Sem animação de entrada: cada frase é um PNG transparente 1080x1920 (
make_stills.py) que aparece inteiro no 1º quadro e some em corte seco. O.mogrtpalavra por palavra não serve: a entrada é embutida (só existem "Out Animation" e "Anim Speed" 50-500, não "In Animation"). Contrapartida do PNG: o texto não é editável no Premiere — para corrigir, editeblocks.jsone gere de novo (segundos). - Frase de 3-4 palavras, por programação dinâmica: evita 1-2 palavras soltas, não termina em "o/de/que...", prefere cortar em vírgula ou pausa; vírgula só corta com ao menos 3 palavras. Em fala rápida (frase atravessada em < 0,9 s) junta até 5 palavras, sem atravessar fim de frase (. ? !).
- Margem segura: nada fora do title safe do Premiere (80% x 80%); largura útil 78% (842 px em 1080), bloco dentro de 10%-90% da altura. O texto encolhe até
min_scalee, se não couber, quebra em 2 linhas; tamanho arredondado para BAIXO. Conferir comcheck_margins.py(deve darfora da margem: 0). - Entrega: editar direto na sequência indicada (sem cópia), a menos que o usuário peça cópia.
Tempo na tela = tempo da fala (modo sync, padrão)
- A frase nasce no início da 1ª palavra falada (atraso zero) e morre no fim da última +
tail0,3 s, estendida atémin_dur0,8 s só se houver silêncio depois (nunca invade a próxima frase). Frase que ficaria < 0,5 s cola na anterior somente se couber em 5 palavras e a anterior não fechou uma frase. - Nota de projeto: existe também o modo
schedule_mode: "lag"(tempo de leitura: cada frase fica ao menos ~0,9 s e, se a fala for mais rápida, a seguinte entra depois, até 0,9 s). Ele descola a legenda da voz (início e fim deixam de coincidir e a duração varia sem relação com o que é falado), por isso o padrão ésync. Uselagsó se o usuário pedir leitura mais lenta (--configcom{"schedule_mode":"lag"}). - Limite honesto: fala muito densa (~3,6 palavras/s, picos de 6/s) faz algumas frases ficarem curtas (0,36-0,8 s). É a fala, não a legenda.
Opção A — só legenda numa sequência já editada
- Confirmar o projeto/sequência com o usuário e deixá-la ativa.
- Transcrição: JSON exportado do Premiere (Texto > Transcrição > ... > Exportar; fica em Documentos "<sequência>.json").
PYTHONIOENCODING=utf-8 python -I <skill>/scripts/plan_phrases.py <transcricao.json> <pasta>/blocks.json; mostre a lista e as palavras[conferir].python -I <skill>/scripts/make_stills.py <pasta>/blocks.json <pasta>/png --track 1(gera PNGs + JSX; use uma pasta NOVA a cada geração — o Premiere trava os PNGs já importados) epython -I <skill>/scripts/check_margins.py <pasta>/png/stills_clips.json.- No Premiere, com a sequência ativa: rodar
stills_import.jsx(importa os PNGs num bin) e em seguidastills_01.jsx...um por vez (ok=20/20). Os tempos já saem na grade de quadros (--fps, padrão 30).
Opção B — edição dinâmica completa (cortes + zoom + legenda)
- Importar o vídeo no projeto e ter a transcrição do Premiere.
python -I <skill>/scripts/plan_edit.py <transcricao.json> <pasta>: tira pausas/respiros > 0,3 s e as hesitações (texto vazio), faz sub-cortes de ~3 s em pontuação, alterna zoom 100%/116% e escreveclips.json+blocks.jsonjá no tempo cortado. Ajustes no topo do script (GAP,ZOOM_ALT,SUB_MIN/MAX).python -I <skill>/scripts/build_cut_script.py <pasta>/clips.json <pasta> --item <nome do arquivo no projeto> --name "<nome> editado 9x16"->montar.jsx; rode no Premiere (a sequência original não é tocada).- Legendas: passos 4 e 5 da Opção A com o
blocks.jsondesta pasta. - Salvar o projeto e entregar listando: cortes, zoom, palavras duvidosas e o que não foi visto.
Alternativa .mogrt (texto editável, COM entrada palavra por palavra)
python -I <skill>/scripts/make_graphics_script.py <pasta>/blocks.json <pasta>/lote.js --track 1 (usa assets/Simple_Text_WbW.mogrt; Anim Speed em style.json) e rodar os lotes lote_NN.js. Use só se o usuário aceitar a animação.
Dicas de Premiere (descobertas na prática)
importFilesprecisa de caminho absoluto (new File(...).fsName);createNewSequenceFromClipsherda 1080x1920 de um vídeo vertical.- Render:
app.encoder.encodeSequence(...)+startBatch()pode não entrar na fila do Media Encoder. O que funcionou:seq.exportAsMediaDirect(saida, preset, app.encoder.ENCODE_ENTIRE)(renderiza dentro do Premiere, ~5 min para 90 s). Preset:<pasta do Premiere>/MediaIO/systempresets/.../H264 Match Source - High bitrate.epr(procure com glob; fica dentro da instalação). O preset "MooV" gera áudio PCM em .mov/.mp4; se for postar, re-empacote comffmpeg -c:v copy -c:a aac. - Exportar frame (
exportFramePNGvia QE) pode falhar; os PNGs da legenda dispensam isso: o que se vê no PNG é o que vai pro vídeo.
Ajustes rápidos
| Quero | Mexer em |
|---|---|
| Fonte/tamanho/posição/sombra | style.json (font_path, mogrt_font, mogrt_size, y_center, shadow_*) |
| Mais tempo na tela | min_dur, tail em RULES (no sync só estende para o silêncio) |
| 3 palavras em vez de 4 | {"max_words": 3} via --config |
| Mais/menos cortes e zoom | GAP, ZOOM_ALT, SUB_MIN/SUB_MAX em plan_edit.py |
Limites conhecidos
- PNG não é texto editável (corrigir = editar
blocks.jsone regerar). - A transcrição do Premiere pode errar; revisar o
blocks.jsonantes de aplicar. - A fonte de referência parece Proxima Nova Bold (mais estreita); usa-se Montserrat Bold (livre).