Short editorial (Fringe Lines)
O visual é modelado nos shorts de Greg Isenberg. Mantenha todo short de acordo com:
- Nunca exiba um rosto falando por mais de ~6 s.
- Um gráfico ou mudança de layout ocorre a cada 3–5 s.
- Legendas aparecem palavra por palavra, com algumas palavras-chave em itálico laranja.
- Os gráficos acompanham o que está sendo dito, então um gráfico aparece na palavra que ilustra.
0. Pré‑requisitos (por máquina)
pipeline/setup.shinstala o venv~/.shorts-skille os node_modules do Remotion em~/.cache/fringe-lines-video.- As transcrições dos episódios devem existir:
work/<ep>/words-quinn.jsonewords-doom.json(dopipeline/transcribe_verbatim.py). - Código‑fonte do Remotion:
pipeline/remotion/src/ShortV2.tsx(layout) eGraphics.tsx(tipos de gráfico).
1. Escolha o momento (30–50 s)
- Pesquise nos arquivos de palavras por um trecho autocontido que tenha:
- uma frase de abertura forte (afirmação, número ou confissão);
- uma ideia;
- um desfecho ou piada perto do final.
- Bons sinais:
- números concretos (porcentagens, valores em dólar, quantidade de pessoas);
- empresas ou produtos nomeados;
- uma opinião contrária;
- um experimento pessoal ("Deixei o Codex…").
- Evite trechos que dependam de contexto anterior ("como eu disse", "aquela coisa").
- Vários
--ranges podem ser costurados. Corte no final das frases e verifique se a emenda não repete palavras.
2. Corte o trecho
Adicione uma linha em work/<ep>/shorts.sh e execute‑a:
b --name short-NN --range START:END [--range ...] --replace "27=>27%" --replace "claude=>Claude"
build_short.pyfaz o seguinte:- remove vícios de linguagem, gaguejos e pausas longas;
- escolhe a câmera ativa;
- escreve
work/<ep>/short-NN/clip.mp4eprops.json; - renderiza a versão simples v1 do short.
--replacecorrige o texto da legenda. Um lado direito vazio oculta aquela palavra.- Sempre corrija: números ("27"→"27%"), nomes de produtos (Claude, Codex, Descript, GTM, SQL) e erros de transcrição do Whisper.
- Para obter os timings exatos de saída ao escrever o spec, imprima‑os:
python3 -c "import json;p=json.load(open('work/<ep>/short-NN/props.json'));print(' '.join(f\"{w['text']}@{w['startMs']/1000:.1f}\" for w in p['words']))"
3. Escreva o spec de estilo: work/<ep>/short-NN/style.json
{
"hook": {"text": "Microsoft quer que *27%* de sua equipe peça demissão", "end": 2.8},
"outro": {"text": "Crescer *sem* aumentar o *quadro*", "hold": 2.0},
"emphasis": ["microsoft", "27%", "sair"],
"scenes": [
{"at": 0.0, "mode": "full"},
{"at": 3.0, "mode": "graphic", "graphic": {"type": "stat", "kicker": "Oferta de saída da Microsoft", "value": 27, "suffix": "%", "label": "dos funcionários receberam oferta para *sair*"}},
{"at": 6.2, "mode": "card"}
]
}
Os tempos estão em segundos no clipe cortado, obtidos a partir dos timings de palavras na etapa 2.
Regras para manter a consistência:
- Estrutura:
- A cena 0 é sempre
full, com umhookde 4–8 palavras que termina em ~2,5–3 s. - Diga a afirmação; não resuma o clipe.
- A cena 0 é sempre
- Ritmo:
- Alterne modos como
full→graphic→card→graphic→card… com 3–6 gráficos em um short de 40 s. - Use
fullnovamente para uma reação ou risada impactante na segunda metade.
- Alterne modos como
- Tempo:
- Inicie cada gráfico 0,1–0,3 s antes da palavra que ele ilustra e mantenha‑o por 2,5–5 s.
- Dois gráficos podem se seguir diretamente, por exemplo, um cartão de $20 e depois um de $100.
- Ênfase: escolha 10–18 palavras‑chave: números, nomes e as palavras do desfecho. A correspondência é em letras minúsculas, ignorando pontuação.
- Acentos: em qualquer campo de texto,
*palavra*renderiza itálico laranja. Use um ou dois por string. - Outro: um cartão final de 2 s com uma frase curta que reafirme a conclusão, ou uma pergunta ao espectador.
- Honestidade:
- Números na tela devem corresponder ao que foi dito no programa.
- Gráficos são esquemáticos: use
linescom formas, nunca eixos ou valores inventados. - Use "aproximadamente" ou "~" quando o apresentador o fizer.
Tipos de gráfico (Graphics.tsx):
| tipo | campos | uso para |
|---|---|---|
stat | kicker, prefix, value (número, conta crescente), decimals, suffix, label | um número de destaque |
people | kicker, value (string), label, filled (0–1) | número de pessoas / participação |
lines | kicker, series: [{label, shape: up|flat|down}], caption | tendência vs. tendência |
quote | text, by? | a frase de efeito, dita na tela |
headline | source, title, highlight | notícias, anúncios, um "veredito" |
list | title, items[] | etapas, produtos, o que deu errado |
Se um novo tipo de gráfico for necessário, adicione‑o a Graphics.tsx e ao seu tipo união. Mantenha o estilo do cartão: cartão branco ou tinta, raio de 36px, entrada com mola e uma animação que executa a partir do quadro local f.
4. Renderize
~/.shorts-skill/bin/python pipeline/style_short.py --ep <ep> --name short-NN --spec work/<ep>/short-NN/style.json
- O rastreamento facial (
pipeline/face_track.py, YuNet) é calculado uma vez e armazenado em cache emshort-NN/faces.json. Ele mantém o PiP redondo e o cartão centralizados no rosto; exclua o arquivo se o clipe for recortado novamente. - Os efeitos sonoros são sintetizados: um whoosh em cada mudança de cena e um pop quando um gráfico aparece. Eles são mixados a
--sfx-db -20. - Loudness: −14 LUFS.
- Saída:
out/shorts/<ep>-short-NN-v2.mp4.
5. QA (sempre, antes de relatar)
Extraia quadros e examine‑os:
for t in 1.5 5 10 15 20 25 30 35 40; do ffmpeg -v error -y -ss $t -i out/shorts/<ep>-short-NN-v2.mp4 -frames:v 1 -vf scale=270:-1 /tmp/q_$t.png; done
Verifique cada um destes itens:
- Gancho: legível e sem cobrir o rosto.
- Gráficos: não sobrepõem o bloco de legendas, que fica em y≈1340–1600. Nenhum texto transborda do cartão. Valores de estatísticas longos como "+$500K" encolhem automaticamente.
- PiP: o rosto está centralizado no círculo.
- Legendas: sem
*soltos; palavras‑chave renderizam em laranja. - Loudness:
ffmpeg -i out.mp4 -af ebur128 -f null - 2>&1 | grep " I:"exibe aproximadamente −14.
Relate ao usuário:
- Sobre o que é o short e sua duração.
- Quaisquer números para verificar.
- Se há alguma linguagem explícita mantida.