Vertical Reels Video Studio (básico)
Um pipeline simples e passo a passo para um vídeo vertical de 30 a 90 segundos.
0. Primeira execução: peça ao usuário SUAS configurações (nunca use valores padrão)
Antes do primeiro vídeo, se brand.config.json estiver ausente, tiver "configured": false ou ainda contiver @yourhandle,
pergunte ao usuário (uma pergunta de cada vez) e salve as respostas em brand.config.json:
- Redes sociais: Instagram, Threads, TikTok, X (quais ele usa).
- Texto da marca d'água (exatamente como deve aparecer, ex.
@yourhandleou@ig / @x) e posição (bottom-center,bottom-left,top-left,top-right). - Texto do CTA e o handle que ele menciona.
- Voz: o ID da voz ElevenLabs do usuário + modelo + idioma, ou "Vou gravar minha própria voz". A chave da API é solicitada apenas como o segredo
ELEVENLABS_API_KEY. - Idioma e tom; como a voz deve pronunciar o nome/handle do usuário.
Em seguida, defina "configured": true. Nunca invente um handle, nunca reutilize o de outra pessoa (incluindo o autor deste kit) e nunca renderize uma marca d'água que ainda diga @yourhandle.
Os placeholders abaixo mapeiam para brand.config.json:
| Placeholder | Chave de configuração | Significado |
|---|---|---|
{{HANDLE}} | handles.* | O(s) próprio(s) handle(s) do usuário |
{{WATERMARK}} | watermark.text, watermark.position | Texto e posição da marca d'água, conforme fornecidos pelo usuário |
{{LANGUAGE}} | language, tone | Idioma e tom da narração e legendas |
{{VOICE_ID}} | voice.voiceId | A voz escolhida pelo usuário |
{{TTS_MODEL}} | voice.model | Modelo ElevenLabs, ex. eleven_multilingual_v2 |
{{CTA}} | cta.text, cta.handle | A chamada para ação do usuário |
A chave da API sempre vem da variável de ambiente ELEVENLABS_API_KEY. Nunca a imprima, nunca a escreva em um arquivo que seja commitado.
O fluxo
- Pergunte as configurações do usuário (primeira execução) → 1. Tópico → 2. Pesquisa e verificação de fatos → 3. Rascunho do roteiro → 4. Aprovação do usuário →
- Narração → 6. Timing → 7. Construir cenas → 8. Renderizar → 9. Exportação compatível com Reels →
- QA → 11. Capas e legendas → 12. Entregar. Se o usuário solicitar uma alteração, volte para a etapa mais antiga que a alteração afeta (uma nova linha de texto significa uma nova narração apenas para essa linha).
1–2. Tópico e pesquisa
- Uma história por vídeo. Escreva para iniciantes.
- Verifique cada número, data, nome e citação com uma fonte primária (página oficial, postagem do próprio autor, captura de tela datada). Descarte qualquer coisa que não puder verificar. Nunca invente fatos.
- Mantenha um breve
sources.mdcom os links que você usou.
3–4. Rascunho e aguarde
- Ofereça 2–4 opções de gancho para os primeiros 2 segundos (uma pergunta ou um contraste surpreendente).
- Escreva uma tabela cronometrada:
tempo | texto na tela | narração. Aponte para 45–65 s, nunca mais de 90 s. - Pare e envie o rascunho ao usuário. Não gere áudio nem renderize até que ele o aprove.
5. Narração
- Gere o roteiro aprovado com
{{VOICE_ID}}(vejascripts/tts.py). Mantenha dois textos: o texto de exibição (o que as legendas mostram) e o texto TTS (soletrado para a voz, ex.A.I.para "IA", números escritos por extenso). - Ouça. Regere apenas as linhas que estiverem erradas. Nunca deixe a mesma linha duas vezes no áudio.
- Se você não tiver uma conta ElevenLabs, grave sua própria voz. Funciona igualmente bem.
6. Timing
- Obtenha timestamps de palavras (alinhamento ElevenLabs, ou Whisper no áudio) e salve
timing.json:{duration, words:[{w,s,e}], scenes:[{id,start}]}. - As animações começam no quadro em que sua palavra é falada:
frame = Math.round(seconds * 30).
7. Construir cenas (Remotion, 1080 × 1920, 30 fps)
- Fundo escuro, uma cor de texto clara, uma cor de destaque. Um título grande por batida.
- Texto cinético: cada palavra do título aparece no momento em que é falada (escala 0,6 → 1 com um pequeno overshoot).
- Uma coisa nova na tela a cada 1,5–3 s. Mantenha números por pelo menos 1,5 s para que as pessoas possam lê-los.
- O texto do gancho fica visível desde o quadro 0, para que o primeiro quadro funcione como uma imagem estática.
- Zona segura: mantenha o texto entre y = 200 e y = 1500. Coloque o texto
{{WATERMARK}}pequeno na posição escolhida pelo usuário (padrão inferior: y ≈ 1430). - Use capturas de tela reais e logotipos com crédito. Rotule mock-ups como "ilustração".
8–9. Renderizar e exportar
npx remotion render src/index.ts <CompositionId> out/raw.mp4
bash scripts/reels-export.sh out/raw.mp4 out/final-reels.mp4
A exportação produz: 1080 × 1920, H.264 High ≤ 4.1, yuv420p (faixa TV), BT.709, 30 fps constante, 8–12 Mbps, AAC 48 kHz, +faststart, −14 LUFS / ≤ −1 dBTP. Mantenha o vídeo abaixo de 90 s.
10. QA (sempre, antes de entregar)
Execute bash scripts/qa-check.sh out/final-reels.mp4 e veja a saída de scripts/contact-sheet.sh. Verifique:
- Áudio: palavras estão claras, nada cortado, nenhuma linha repetida, volume ≈ −14 LUFS.
- Vídeo: nenhum texto cortado, nada fora da zona segura, nenhum clipe congelado, nenhum primeiro ou último segundo vazio.
Corrija e renderize novamente antes de enviar qualquer coisa.
11–12. Capas, legendas, entrega
- 2–4 opções de capa, 1080 × 1920 mais uma versão de grade 1080 × 1350. Um grande gancho, uma imagem principal, no máximo 2–3 pequenos cartões numéricos. Mantenha o texto principal dentro do centro 1080 × 1080.
- Legendas: Instagram (gancho, corpo,
{{CTA}}, algumas hashtags), Threads (mais curtas, sem hashtags), TikTok. - Entregue o MP4 final, uma prévia pequena (< 40 MB), capas, legendas, um
.srte a lista de fontes.
Regras
- Nunca publique, carregue ou compre nada. Entregue os arquivos ao usuário.
- Sem fatos inventados. Dê crédito a cada fonte e a cada autor de código aberto que você mostrar.
- Use apenas músicas, clipes e vozes que você tem o direito de usar.