Communitygithub.com

ussefefhab/egyptian-promo-video

Crie um vídeo promocional profissional vertical (9:16) para sites, apps, sistemas ou produtos, com narração em árabe egípcio, tipografia cinética em árabe, capturas de tela reais em mockups de celular, legendas sincronizadas, música original e efeitos sonoros — tudo renderizado localmente para MP4 (mais uma cópia para WhatsApp) sem ferramentas pagas.

O que é egyptian-promo-video?

Esta habilidade permite construir um vídeo promocional vertical de 60 a 70 segundos totalmente na máquina local, sem depender de ferramentas pagas ou serviços online. Ela utiliza Google Gemini TTS gratuito para gerar narração em dialeto egípcio, Puppeteer para capturar frames de animações HTML/CSS, e FFmpeg para compor o vídeo final com áudio sincronizado. O fluxo começa com um roteiro de 10 cenas, cada uma durando exatamente o tempo da fala correspondente, garantindo que qualquer alteração no texto reaja automaticamente no cronograma. A habilidade também inclui um template de exemplo comprovado (sistema de pedidos de restaurante) que pode ser reutilizado para outros produtos, alterando apenas as cenas. É ideal para desenvolvedores e profissionais de marketing que desejam produzir conteúdo promocional de alta qualidade para TikTok, Instagram, Facebook ou YouTube sem assinaturas caras.

Funciona com~Claude Code~Codex CLI~Cursor✓Gemini CLI
npx skills add https://github.com/ussefehab/afhamha-sah-video-skill/tree/HEAD/egyptian-promo-video

Perguntar na sua IA favorita

Abre um novo chat com esta habilidade de agente já pré-carregada.

Documentação

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, aponte npm_config_cache e TEMP para outra unidade).
  • Uma chave gratuita do Google AI Studio para a voz (aistudio.google.com/apikey). O usuário cola em VIDEO/.env como GEMINI_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:

  1. Gancho (0–4 s): uma pergunta dolorosa que o espectador reconhece ("كام أوردر ضاع منك النهارده… عشان التليفون كان مشغول؟").
  2. Dor: a forma ruim atual, terminando na perda.
  3. Revelação: "طب تخيّل…" + o produto (a batida cai aqui). 4–9. Um recurso por cena, cada um com sua captura de tela real.
  4. 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 + MutationObserver que reescreve o nome da marca antiga, troca o src do logotipo, oculta números de telefone e substitui fotos da marca, depois verifique innerText para 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_tool e 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-tts tem 92 vozes egípcias nativas (ar-eg-*, ex.: ar-eg-concierge-1 jovem/brilhante, ar-eg-commercial-11 voz de anúncio, ar-eg-storyteller-3 casual). Nível gratuito: apenas 10 solicitações/dia para este modelo.
  • gemini-3.1-flash-tts-preview tem uma cota gratuita separada, mas apenas vozes gerais (Puck masculino animado — a escolha do usuário, Orus masculino firme, …) direcionadas ao egípcio pelo texto de estilo.
  • Comandos (execute de VIDEO/build):
    • node vo-gemini.cjs voices → lista vozes ar-EG.
    • node vo-gemini.cjs sample <voice> [voice…] → linha de gancho por voz em vo/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-preview para 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 (Microsoft ar-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 em vo/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 com ffmpeg -af silencedetect=noise=-38dB:d=0.1 e mova a cauda para o próximo clipe (veja as armadilhas para a pegadinha do -ss). Corrija a partir dos originais em vo/take/.
  • node check-v.cjs s10 pergunta 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:

  1. 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.
  2. 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.
  3. 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).
  4. 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) e out/<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.

Habilidades Relacionadas