Construtor de Reel
Engine: $(reelsmith root)/engine/ (build.py, template.html, music.py, pull_vo.py, capcut.py, fonts/). Uma pasta por reel: <reel-dir>/reel.json → <reel-dir>/out/reel.mp4. Se o reelsmith disser que não está configurado, execute reelsmith setup uma vez.
reelsmith new reels/meu-reel # pasta com src/, vo/ e um reel.json de modelo
reelsmith sheet reels/meu-reel/src/* # folhas de contato → escolha `ss` para cada segmento
reelsmith build reels/meu-reel --stills # ~1 min: frames, temporizações de palavras, legendas, out/qa_sheet.jpg
reelsmith stills reels/meu-reel 0.5,7.8,21.3 # frames de verificação extras
reelsmith build reels/meu-reel # renderização completa (~4–5 min para 60 s)
Sempre execute --stills primeiro: leia a lista de legendas impressa e observe out/qa_sheet.jpg (vermelho = zonas de interface do Reels/TikTok; nada importante pode ficar no vermelho). Corrija o reel.json, depois construa. Verifique as linhas de volume impressas no final (−14 LUFS ±1, pico ≤ −1 dB). Em seguida, observe os frames do MP4 final em cada efeito e transição antes de entregá-lo.
Fluxo de trabalho (tempo do criador ≈ 10 min por reel)
- Roteiro: skill
reel-script→ criador aprova. Marque as palavras de destaque com<em>…</em>; mantenha números como dígitos para exibição. - Locução: gravação própria do criador (
vo/vo.mp3) ou ElevenLabs (vejadocs/voice.md): texto TTS = roteiro sem tags, números escritos por extenso, nomes de marcas escritos foneticamente. No plano gratuito, gere na interface web do ElevenLabs (Claude no Chrome pode controlá-la), depoisreelsmith voice <reel-dir>puxa as 2 gravações mais recentes paravo/com durações. Transcreva ambas, mantenha a mais limpa comovo/vo.mp3. Vozes lentas:"speed": 1.07emvo. - Imagens: skill
footage-scout— apenas clipes novos (verifiqueused_footage.md), folhas de contato, verificação de privacidade. As durações dos segmentos devem somar até o final da locução + ~2 s. - Plano de edição: skill
reel-directorescolhe os 3–5 efeitos para esta história e onde as transições vão. - Escreva reel.json →
--stills→ corrija → construa → entregueout/reel.mp4+out/cover.jpg+out/caption.txt. - Passagem de som opcional no CapCut: skill
reel-capcut(efeitos sonoros de biblioteca + música escolhida de ouvido).
reel.json
{
"vo": {"file": "vo/vo.mp3", "offset": 0.25, "speed": 1.07, "gaps": [[5.73, 0.8]]},
"script": "Estou reescrevendo meu guia há três meses e ontem mudei a fonte da capa <em>pela quarta vez</em>. …",
"hook": {"tag": "o cenário do rascunho eterno", "lines": ["o guia está quase pronto.", "<em>há três meses</em>"], "out": 5.55},
"end": {"from": 55.6, "lines": ["quanto tempo", "<em>o seu está esperando?</em>"], "lines_at": [55.75, 56.6],
"sub": "conte nos comentários", "sub_at": "@comments", "handle": "@seudominio", "handle_at": 58.6},
"cover": {"from": 0, "to": 4.35, "title": "RASCUNHO", "left": "Nº4 · Outubro", "right": "@seudominio", "top": 330},
"cover_t": 2.0,
"stamps": [{"seg": ["I", "J"], "text": "tanya · 2 anos em rascunhos"}],
"punch": [[3.02, 4.4], ["@mil", 9.0]],
"segments": [
{"id": "A", "clip": "src/mesa_noite.mp4", "ss": 9.5, "dur": 2.5, "crop": [0, 0.196, 0.75], "cut": true},
{"id": "B", "clip": "src/teclas.mp4", "ss": 1.3, "dur": 1.9, "move": "none"},
{"id": "E", "clip": "src/andar_com_celular.mov", "ss": 0.8, "dur": 4.5, "cut": true, "in": "zoom"},
{"id": "I", "clip": "src/cafe.mp4", "ss": 0.3, "dur": 3.2, "look": "bw"},
{"id": "K", "clip": "src/caminhar.mov", "ss": 14.0, "dur": 4.95, "look": "burst"},
{"id": "N", "clip": "src/cafe_da_manha.mov", "ss": 0.0, "dur": 3.45, "rate": 0.4},
{"id": "Q", "clip": "src/prado.mov", "ss": 13.2, "dur": 9.1, "move": "pull-out", "in": "zoom"}
],
"caption": "…",
"music": "synth"
}
Um exemplo real completo (ucraniano, 61 s, 17 segmentos, todos os efeitos abaixo) está em $(reelsmith root)/examples/chernetka/reel.json; um exemplo mínimo em examples/template/reel.json.
Locução e legendas
- lang: Idioma Whisper da locução (
"uk","en", …); omitido = detecção automática (ouREELSMITH_LANG). - vo.gaps
[vo_time, extra_s]: uma pausa para respiração inserida no ponto mais silencioso próximo àquele momento da locução (acelerada) — espaço para uma fotomontagem. vo.speed: fator atempo. - âncoras "@palavra": qualquer tempo em hook / end / doodles / glass / checklist / cover / orbit / wall / punch / subs_skip pode ser
"@mil"(início daquela palavra do roteiro; correspondência exata primeiro, senão prefixo),"@novamente#2"(2ª ocorrência),"@duas_vezes+0.3". Palavras que o Whisper ouvir errado recebem tempos interpolados — use segundos ali.out/words.jsontem os tempos reais após--stills. - subs / punch: omitido = automático a partir de
script+ tempos das palavras (5–7 palavras, 1–2 linhas, palavras de destaque em cor de destaque itálico, sem ponto final, uma linha nunca termina em "e/em/de…"; punch-ins em até 4 frases de destaque com ≥ 3 s de intervalo). Substitua com"subs": [[a, b, "html"]],"punch": [[a, b]]. As legendas ficam ocultas enquanto o cartão de gancho está visível, sob títulos de vidro e listas de verificação, e assim que o cartão final começa (subs_from/subs_until/subs_skip [[a, b]]para ajustar).
Cartões e texto
- hook: cartão de papel visível desde o frame 0 (
at: [t…]revela linhas uma a uma,size,top). end: cartão a partir defrom, linhas emlines_at,sub,handle. - stamps: pílula mono no canto superior esquerdo sobre os segmentos listados (local, data, nome do personagem).
- cover (cover story + quebra de frame): cabeçalho de revista ajustado à largura, letras caem; em segmentos com
"cut": truea pessoa fica na frente do título. Escolha/recorte um plano onde o topo da cabeça fique 40–80 px abaixo do topo do cabeçalho — nunca sobre os olhos.colorpara o cabeçalho,toppara movê-lo.cover_t≈ 2 para queout/cover.jpgmostre a capa finalizada. - glass (vidro fosco):
{"from", "to", "lines", "at", "top"}título em vidro fosco. - checklist:
{"from", "to", "title", "items": [{"text", "sub", "at", "sub_at"}]}cartão que cresce item por item, marcas desenhadas emat. - wall (parede de manchetes):
{"from", "to", "items": [...], "every": 0.06}blocos de nomes de arquivo/manchetes empilhando; coloque um título de vidro por cima. - orbit:
{"from", "to", "seg", "text": "1000 SEGUIDORES · ", "speed", "scale", "tilt", "lift"}anel de texto em volta da cabeça em um segmentocut; a metade de trás passa atrás da pessoa. Melhor em uma selfie próxima. - doodles (doodle boil):
{"kind": "text"|"circle"|"underline"|"strike"|"arrow", "at", "to", "x", "y", …}— texto:text, size, rot, write; círculo/risco:w, h(risconziguezagues; 3 mantém a palavra legível); sublinhado:w; seta:x2, y2, bend;color,width. Tinta de destaque com um halo creme, escrita da esquerda para a direita, oscilando a cada 3 frames. Mantenha-as acima de y ≈ 1000 enquanto o cartão de gancho estiver visível e fora dos rostos.
Segmentos
- caminhos: relativos à pasta do reel, depois ao diretório atual, depois ao repositório. Fotos HEIC/JPG via
imgsão aceitáveis. ssinício no clipe,dursegundos;pos0–1 enquadramento horizontal para fontes largas;crop [x, y, size]= corte com aproximação do frame vertical (permanece nítido a partir de 4K);rate< 1 = câmera lenta quando apenas uma parte curta é utilizável.- cut:
true= máscaras de pessoa do macOS Vision para este segmento (reelsmith masks, ~0,2 s/frame, em cache). Necessário para cover e orbit. - in:
"zoom"(o plano de saída entra rapidamente com desfoque, o novo plano chega de um zoom) ou"whip"(deslize rápido desfocado, sem bordas pretas). Use em 4–6 cortes-chave, não em todos. - look:
""filme quente ·"memory"entrada com zoom desbotado para fotomontagens (dateadiciona um carimbo de data de câmera laranja) ·"bw"preto e branco (música abafada) ·"burst"cinza → colorido (música se abre). - move:
push(aproximação lenta padrão) ·tilt-up·pull-out·none.
Som e cor
- music:
"synth"(uma base lo-fi gerada moldada pelos looks — aceitável como placeholder, criadores geralmente preferem uma faixa real), um caminho para um arquivo de áudio para o qual você tem direitos, ounull. O som original do clipe nunca é usado. - music_gain: padrão 0,16 sob a locução (sidechain-ducked).
- colors:
{"accent": "#D4573A", "cream": "#F4EFE6", "ink": "#1F1A17"}(padrões: bege / terracota).
Regras que vieram de feedback real
- Os efeitos devem ser legíveis no tamanho do telefone na primeira visualização: grandes, na cor de destaque, animados. Doodles creme pequenos e um painel de vidro fraco foram "cadê os efeitos?".
- Sem flashes brancos repetidos nos cortes. Silencie o som original do clipe. 3–5 técnicas por reel, não todas.
- Nunca coloque texto, cartões ou doodles sobre os olhos; mova o cartão ou reenquadre o plano.
- Verifique as telas e fundos dos clipes em resolução total: mensagens de outras pessoas, placas de carro, nomes de ruas, painéis privados → pule esses segundos.
- Imagens novas a cada reel (
used_footage.md). Pergunte antes de usar planos com rostos de outras pessoas.