Vídeo promocional egípcio
Cria um vídeo promocional vertical de ~60–70 s inteiramente na máquina local:
script.json ──► voz (Gemini TTS, grátis) ──► clipes por linha ──► timeline
capturas de tela ──► promo.html (animação seek(t)) ──► frames do Puppeteer ──► ffmpeg
synth.cjs (batida original + SFX) ──► mix com sidechain ──► loudnorm −14 LUFS ──► MP4 + cópia WhatsApp
Cada cena dura exatamente o tempo de sua linha falada, então alterar uma palavra ou a voz ajusta automaticamente todo o vídeo.
O exemplo comprovado (sistema de pedidos de restaurante: gancho de telefone ocupado → dor do WhatsApp → revelação → cardápio → carrinho → QR das mesas → rastreamento de pedidos → painel → estatísticas → marca + CTA) é o modelo padrão. Reutilize sua estrutura para outros produtos alterando as cenas, não o mecanismo.
O que você precisa
- Node 18+, ffmpeg/ffprobe no PATH, Google Chrome (ou defina
CHROME_PATH). - Na pasta build:
npm i puppeteer-core qrcode msedge-tts@2(em uma unidade C: cheia, apontenpm_config_cacheeTEMPpara outra unidade). - Uma chave gratuita do Google AI Studio para a voz (aistudio.google.com/apikey). O usuário cola em
VIDEO/.envcomoGEMINI_API_KEY=…— crie o arquivo com a chave vazia e nunca peça para colar no chat ou imprimir. A primeira chamada pode informar que a API Generative Language está desabilitada para o projeto: forneça o link do console do erro para clicar em Ativar e tentar novamente após um minuto.
Estrutura de pastas
Crie VIDEO/ dentro do projeto do usuário (ex.: marketing/video-<marca>/):
VIDEO/.env GEMINI_API_KEY= (preenchido pelo usuário)
VIDEO/script.json cópia de assets/script.example.json, editado
VIDEO/build/ scripts/* + assets/template/* desta habilidade
VIDEO/build/img/ capturas de tela + logotipos usados por promo.html
VIDEO/vo/ s01.wav … s10.wav (clipes de voz)
VIDEO/out/ renders, sheet.jpg, timeline.json
Fluxo de trabalho
1. Briefing (pergunte apenas o que não encontrar)
Produto e o que ele faz, público (quem compra), nome da marca e como se pronuncia, paleta + logotipo (veja no código do usuário: configuração tailwind, icon.svg, componente Logo), CTA, informações de contato, se houver. Formato padrão: 9:16, 60–70 s, dialeto egípcio, voz masculina enérgica.
2. Roteiro → script.json
Dez linhas, uma por cena. A estrutura que funcionou:
- Gancho (0–4 s): uma pergunta dolorosa que o espectador reconhece ("كام أوردر ضاع منك النهارده… عشان التليفون كان مشغول؟").
- Dor: a forma ruim atual, terminando na perda.
- Revelação: "طب تخيّل…" + o produto (a batida cai aqui). 4–9. Um recurso por cena, cada um com sua captura de tela real.
- Marca + CTA: quem oferece, convite para se inscrever/contatar.
voice é o que o TTS lê: escreva como um egípcio fala (عامية, "…" para pausas, "؟" para tom de pergunta, números por extenso como "أربعة وعشرين", "QR" como "كيو آر"). subtitles é o que os espectadores leem (dígitos "٢٤", "QR", marca em letras latinas). headlines são títulos cinéticos de 2–5 palavras para as cenas 1–9; envolva a palavra destacada em *…*.
Não invente estatísticas, porcentagens, preços, prêmios ou depoimentos — os espectadores e o cliente não podem verificá-los, e eles criam risco legal. Benefícios declarados de forma simples vendem bem o suficiente.
Nomes de marcas com V/P/G: O árabe não tem V, então "نوفيكس" é lido "NOFIX". Escreva com ڤ ("نوڤيكس") ou em latim ("NOVIX") em voice e verifique com check-v.cjs (passo 4).
3. Capturas de tela (produto real, tamanho de celular)
Use Puppeteer em 390×844, deviceScaleFactor 3 (→ 1170×2532) e salve em build/img/. O modelo espera: phone-home.png, phone-sweets.png, phone-restaurant.png, phone-options.png, phone-cart.png, tracking.png, dashboard-cancel.jpg, dashboard-stats.jpg, dashboard-products.jpg — renomeie/substitua por produto (veja references/template.md).
- Rebranding / demonstração genérica: injete um script com
evaluateOnNewDocument+MutationObserverque reescreve o nome da marca antiga, troca osrcdo logotipo, oculta números de telefone e substitui fotos da marca, depois verifiqueinnerTextpara resquícios. - Páginas logadas (painéis): use o painel do navegador no app onde o usuário já está logado (nunca digite a senha), emule uma viewport 375×812, aplique as mesmas trocas de DOM com
javascript_toole tire a captura lá (ele salva um arquivo que você pode copiar). O painel pode redefinir o tamanho durante a tarefa — reaplique a viewport móvel antes de cada captura. - Dados reais de clientes: mascare nomes/telefones na tela antes de capturar. Se precisar de estados realistas (um novo pedido, uma solicitação de cancelamento), crie registros de demonstração claramente identificados, capture, depois exclua exatamente esses registros e confirme que foram removidos.
4. Narração
Vozes egípcias naturais e gratuitas vêm do Gemini TTS (scripts/vo-gemini.cjs):
gemini-3.8-flash-ttstem 92 vozes egípcias nativas (ar-eg-*, ex.:ar-eg-concierge-1jovem/brilhante,ar-eg-commercial-11voz de anúncio,ar-eg-storyteller-3casual). Nível gratuito: apenas 10 solicitações/dia para este modelo.gemini-3.1-flash-tts-previewtem uma cota gratuita separada, mas apenas vozes gerais (Puckmasculino animado — a escolha do usuário,Orusmasculino firme, …) direcionadas ao egípcio pelo texto de estilo.- Comandos (execute de
VIDEO/build):node vo-gemini.cjs voices→ lista vozesar-EG.node vo-gemini.cjs sample <voice> [voice…]→ linha de gancho por voz emvo/samples/(1 solicitação cada). Converta para mp3 e envie para o usuário escolher ouvindo — você não pode ouvir.node vo-gemini.cjs all <voice>→ uma solicitação para o roteiro inteiro, dividido em 10 clipes nas pausas (econômico em cota e soa como uma tomada contínua). Clipes antigos são copiados para backup.node vo-gemini.cjs line <voice> <n>→ regravar uma única linha.- Use
GEMINI_TTS_MODEL=gemini-3.1-flash-tts-previewpara trocar de modelo.
- Use as amostras com sabedoria (5 vozes = 5 solicitações). Se a cota do 3.8 acabar, ofereça: aguarde até redefinir (~meia-noite no Pacífico), ou grave hoje com o 3.1. Não sugira contas extras do Google para obter mais cota — os termos da API do Google proíbem contornar limites e isso pode suspender ambas as contas.
- Alternativas:
vo-edge.cjs(Microsoftar-EG-ShakirNeural, ilimitado, sem chave — usuários acharam robótico/não egípcio), ou o usuário grava as linhas no celular e você as corta/normaliza emvo/sNN.wav. ElevenLabs é excelente, mas pago.
Verifique cada tomada — você não pode ouvir:
node transcribe.cjs [s05 s06…]transcreve cada clipe com um modelo de texto Gemini. Cada transcrição deve ser igual à sua linha de roteiro. Se palavras da próxima linha estiverem no final de um clipe, o corte está atrasado: encontre pausas comffmpeg -af silencedetect=noise=-38dB:d=0.1e mova a cauda para o próximo clipe (veja as armadilhas para a pegadinha do-ss). Corrija a partir dos originais emvo/take/.node check-v.cjs s10pergunta se uma consoante da marca é /v/ ou /f/ (duas vezes por clipe). Inclua a tomada ruim conhecida como controle para saber que a verificação funciona.
5. Personalize o modelo
O modelo também precisa de img/qr.png (crie com node -e "require('qrcode').toFile('img/qr.png','<url do site ou marca>',{errorCorrectionLevel:'H',margin:1,width:680})" — os espectadores podem escaneá-lo, então aponte para algo real ou para texto simples), img/rest-logo.svg (logotipo do negócio de demonstração) e o ícone da marca (img/novix-icon.svg no exemplo).
assets/template/promo.html é estilizado NOVIX (azul-marinho #0B1020, gradiente azul→violeta). Re-tematize editando as variáveis :root, o fundo do palco e as cores de brilho, o gradiente .hl, chips/aneis/pílula de legenda, cartão QR e a cena final (logotipo, marca escrita, slogan, CTA, linha de recursos). references/template.md lista onde cada peça vive e como as cenas são conectadas.
6. Verifique, pré-visualize, renderize
De VIDEO/build:
node build.cjs --check— executa todos os ~2000 quadros sem capturas de tela; detecta erros de JavaScript em segundos, em vez de após uma renderização de 5 minutos.node build.cjs --preview 3→out/sheet.jpg. Olhe para ele (Leia a imagem): quebra de linha do título, elementos fora da tela, contraste (ex.: texto laranja em um cartão laranja), marca antiga restante.node build.cjs(execute em segundo plano, ~5 min para 66 s). Ele relata o comprimento do vídeo vs. áudio (devem corresponder) e o volume (≈ −14 LUFS).- Envie a cópia do WhatsApp com SendUserFile (o arquivo completo geralmente tem > 30 MB e só aparece no desktop), informe ao usuário onde ambos os arquivos estão e diga claramente que você verificou por transcrição/quadros, mas não pôde ouvir.
7. Música
synth.cjs compõe uma batida original de trap do Oriente Médio a 98 BPM (darbuka, 808, lead dedilhado tipo oud em D Hijaz) com a batida caindo na cena de revelação, além de sons de tom de ocupado / whoosh / ding / beep / pop SFX. Bibliotecas licenciadas (ex.: conectores Epidemic Sound) podem permitir apenas prévias, não downloads — prévias não são licenciadas para anúncios, então não as use.
Entrega
- Final:
out/<nome>-9x16.mp4(1080×1920, 30 fps, H.264, AAC, −14 LUFS) eout/<nome>-9x16-whatsapp.mp4. - Mencione qualquer espaço reservado (número de telefone ausente no cartão final, etc.) e ofereça o próximo passo óbvio (adicionar informações de contato, versão paisagem, incorporar no site).
- Se as capturas de tela tiveram que ser hospedadas publicamente (necessário apenas para ferramentas de vídeo em nuvem), informe ao usuário onde e ofereça removê-las.
Leia references/gotchas.md antes de executar qualquer coisa — ele lista todas as falhas encontradas ao construir isso e suas correções.