Communitygithub.com

ussefehab/film-promotionnel-egyptien

Créez une vidéo promotionnelle professionnelle verticale (9:16) avec voix off en arabe égyptien, typographie cinétique arabe, captures d'écran réelles dans des maquettes de téléphone, sous-titres synchronisés, musique originale et effets sonores — le tout rendu localement en MP4 (plus une copie WhatsApp) sans outils payants.

Qu'est-ce que film-promotionnel-egyptien ?

Cette compétence permet de générer automatiquement une vidéo promotionnelle verticale professionnelle (9:16) d'environ 60 à 70 secondes, entièrement en local, sans outils payants. Elle utilise Gemini TTS (voix off égyptienne gratuite), Puppeteer pour les captures d'écran, FFmpeg pour le rendu vidéo, et un script de synthèse musicale (synth.cjs) pour créer un rythme trap moyen-oriental original avec des effets sonores. Le flux de travail est piloté par un script JSON (script.json) : chaque scène dure exactement le temps de sa ligne parlée, ce qui signifie que la modification d'un mot ou le changement de voix re-ajuste automatiquement le timing de toute la vidéo. La compétence prend en charge les systèmes d'exploitation Windows, macOS et Linux (nécessite Node 18+, FFmpeg, Google Chrome, et une clé API Google AI Studio gratuite). Elle est idéale pour créer des publicités, des reels TikTok/Instagram/Facebook, des vidéos explicatives ou des démos produits avec une voix off égyptienne naturelle, tout en évitant les risques juridiques liés aux statistiques ou témoignages inventés.

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

Demander à votre IA préférée

Ouvre une nouvelle conversation avec cette compétence d'agent déjà préchargée.

Documentation

Film promotionnel égyptien

Construit une vidéo promotionnelle verticale d'environ 60 à 70 secondes entièrement sur la machine locale :

script.json ──► voix off (Gemini TTS, gratuit) ──► clips par ligne ──► timeline
captures d'écran ──► promo.html (animation seek(t)) ──► images puppeteer ──► ffmpeg
synth.cjs (rythme original + SFX) ──► mix avec sidechain ──► loudnorm −14 LUFS ──► MP4 + copie WhatsApp

Chaque scène dure exactement le temps de sa ligne parlée, donc changer un mot ou la voix réajuste automatiquement le timing de toute la vidéo.

L'exemple éprouvé (un système de commande de restaurant : accroche téléphone occupé → douleur WhatsApp → révélation → menu → panier → QR tables → suivi commande → tableau de bord → statistiques → marque + CTA) est le modèle par défaut. Réutilisez sa structure pour d'autres produits en modifiant les scènes, pas le moteur.

Ce dont vous avez besoin

  • Node 18+, ffmpeg/ffprobe dans le PATH, Google Chrome (ou définissez CHROME_PATH).
  • Dans le dossier build : npm i puppeteer-core qrcode msedge-tts@2 (sur un disque C: plein, pointez npm_config_cache et TEMP vers un autre disque).
  • Une clé gratuite Google AI Studio pour la voix (aistudio.google.com/apikey). L'utilisateur la colle lui-même dans VIDEO/.env comme GEMINI_API_KEY=… — créez le fichier avec la clé vide et ne lui demandez jamais de la coller dans le chat ou de l'imprimer. Le premier appel peut indiquer que l'API Generative Language est désactivée pour leur projet : donnez-leur le lien de la console depuis l'erreur pour cliquer sur Activer, puis réessayez après une minute.

Structure des dossiers

Créez VIDEO/ dans le projet de l'utilisateur (par exemple marketing/video-<marque>/) :

VIDEO/.env            GEMINI_API_KEY=      (rempli par l'utilisateur)
VIDEO/script.json     copie de assets/script.example.json, modifié
VIDEO/build/          scripts/* + assets/template/* de cette compétence
VIDEO/build/img/      captures d'écran + logos utilisés par promo.html
VIDEO/vo/             s01.wav … s10.wav (clips vocaux)
VIDEO/out/            rendus, sheet.jpg, timeline.json

Flux de travail

1. Brief (ne demandez que ce que vous ne pouvez pas trouver)

Produit et ce qu'il fait, public cible (qui achète), nom de la marque et comment il se prononce, palette + logo (cherchez dans le code de l'utilisateur : config tailwind, icon.svg, composant Logo), CTA, coordonnées si présentes. Format par défaut : 9:16, 60–70 s, dialecte égyptien, voix masculine énergique.

2. Script → script.json

Dix lignes, une par scène. La structure qui a fonctionné :

  1. Accroche (0–4 s) : une question douloureuse que le spectateur reconnaît ("كام أوردر ضاع منك النهارده… عشان التليفون كان مشغول؟").
  2. Douleur : la mauvaise méthode actuelle, se terminant par la perte.
  3. Révélation : "طب تخيّل…" + le produit (le beat drop ici). 4–9. Une fonctionnalité par scène, chacune avec sa capture d'écran réelle.
  4. Marque + CTA : qui l'offre, invitation à s'abonner/contacter.

voice est ce que le TTS lit : écrivez-le comme un Égyptien le dit (عامية, "…" pour les respirations, "؟" pour le ton interrogatif, les nombres en toutes lettres "أربعة وعشرين", "QR" comme "كيو آر"). subtitles est ce que les spectateurs lisent (chiffres "٢٤", "QR", marque en lettres latines). headlines sont des titres cinétiques de 2 à 5 mots pour les scènes 1 à 9 ; encadrez le mot mis en évidence avec *…*.

N'inventez pas de statistiques, pourcentages, prix, récompenses ou témoignages — les spectateurs et le client ne peuvent pas les vérifier, et ils créent un risque juridique. Les avantages énoncés simplement se vendent assez bien.

Noms de marque avec V/P/G : L'arabe n'a pas de V, donc "نوفيكس" se lit "NOFIX". Écrivez-le avec ڤ ("نوڤيكس") ou en latin ("NOVIX") dans voice, puis vérifiez avec check-v.cjs (étape 4).

3. Captures d'écran (produit réel, taille téléphone)

Utilisez puppeteer à 390×844, deviceScaleFactor 3 (→ 1170×2532) et enregistrez dans build/img/. Le modèle attend : 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 — renommez/remplacez par produit (voir references/template.md).

  • Re-branding / démo générique : injectez un script avec evaluateOnNewDocument + MutationObserver qui réécrit l'ancien nom de marque, échange le src du logo, masque les numéros de téléphone et remplace les photos de marque, puis vérifiez innerText pour les résidus.
  • Pages connectées (tableaux de bord) : utilisez le volet du navigateur dans l'application où l'utilisateur est déjà connecté (ne tapez jamais son mot de passe), émulez une fenêtre d'affichage de 375×812, appliquez les mêmes échanges DOM avec javascript_tool, et prenez la capture d'écran là-bas (elle enregistre un fichier que vous pouvez copier). Le volet peut réinitialiser sa taille en cours de tâche — réappliquez la fenêtre d'affichage mobile avant chaque prise.
  • Données réelles des clients : masquez les noms/téléphones à l'écran avant de capturer. Si vous avez besoin d'états réalistes (une nouvelle commande, une demande d'annulation), créez des enregistrements de démo clairement étiquetés, capturez, puis supprimez exactement ces enregistrements et confirmez qu'ils ont disparu.

4. Voix off

Des voix égyptiennes naturelles gratuites proviennent de Gemini TTS (scripts/vo-gemini.cjs) :

  • gemini-3.8-flash-tts a 92 voix égyptiennes natives (ar-eg-*, par exemple ar-eg-concierge-1 jeune/lumineux, ar-eg-commercial-11 voix pub, ar-eg-storyteller-3 décontracté). Niveau gratuit : seulement 10 requêtes/jour pour ce modèle.
  • gemini-3.1-flash-tts-preview a un quota gratuit séparé mais seulement des voix générales (Puck masculin optimiste — le choix de l'utilisateur, Orus masculin ferme, …) orientées vers l'égyptien par le texte de style.
  • Commandes (exécutées depuis VIDEO/build) :
    • node vo-gemini.cjs voices → liste les voix ar-EG.
    • node vo-gemini.cjs sample <voix> [voix…] → ligne d'accroche par voix dans vo/samples/ (1 requête chacune). Convertissez en mp3 et envoyez-les pour que l'utilisateur choisisse à l'oreille — vous ne pouvez pas écouter.
    • node vo-gemini.cjs all <voix> → une seule requête pour tout le script, divisé en 10 clips aux pauses (économique en quota et sonne comme une seule prise continue). Les anciens clips sont sauvegardés.
    • node vo-gemini.cjs line <voix> <n> → ré-enregistre une seule ligne.
    • Utilisez GEMINI_TTS_MODEL=gemini-3.1-flash-tts-preview pour changer de modèle.
  • Utilisez les échantillons avec parcimonie (5 voix = 5 requêtes). Si le quota 3.8 est épuisé, proposez : attendre sa réinitialisation (~minuit Pacifique), ou enregistrer aujourd'hui avec 3.1. Ne suggérez pas de comptes Google supplémentaires pour obtenir plus de quota — les conditions d'utilisation de Google interdisent de contourner les limites et cela peut entraîner la suspension des deux comptes.
  • Alternatives : vo-edge.cjs (Microsoft ar-EG-ShakirNeural, illimité, pas de clé — les utilisateurs l'ont trouvé robotique/non-égyptien), ou l'utilisateur enregistre les lignes sur son téléphone et vous les normalisez/découpez dans vo/sNN.wav. ElevenLabs est excellent mais payant.

Vérifiez chaque prise — vous ne pouvez pas l'entendre :

  • node transcribe.cjs [s05 s06…] retranscrit chaque clip avec un modèle de texte Gemini. Chaque transcription doit correspondre à sa ligne de script. Si des mots de la ligne suivante se trouvent à la fin d'un clip, la coupe est tardive : trouvez les pauses avec ffmpeg -af silencedetect=noise=-38dB:d=0.1 et déplacez la queue vers le clip suivant (voir les pièges pour le piège -ss). Corrigez à partir des originaux dans vo/take/.
  • node check-v.cjs s10 demande si une consonne de marque est /v/ ou /f/ (deux fois par clip). Incluez la prise défectueuse connue comme témoin pour savoir que la vérification fonctionne.

5. Thème du modèle

Le modèle a également besoin de img/qr.png (créez-le avec node -e "require('qrcode').toFile('img/qr.png','<url du site ou marque>',{errorCorrectionLevel:'H',margin:1,width:680})" — les spectateurs peuvent le scanner, donc pointez-le vers quelque chose de réel ou du texte brut), img/rest-logo.svg (le logo de l'entreprise de démonstration) et l'icône de la marque (img/novix-icon.svg dans l'exemple).

assets/template/promo.html est stylisé NOVIX (marine #0B1020, dégradé bleu→violet). Re-thématisez en modifiant les variables :root, le fond de scène et les couleurs de lueur, le dégradé .hl, les chips/anneaux/pilule de sous-titres, la carte QR, et la scène finale (logo, mot-symbole, slogan, CTA, ligne de fonctionnalités). references/template.md liste où chaque élément se trouve et comment les scènes sont câblées.

6. Vérification, aperçu, rendu

Depuis VIDEO/build :

  1. node build.cjs --check — exécute toutes les ~2000 images sans captures d'écran ; détecte les erreurs JS en secondes au lieu d'après un rendu de 5 minutes.
  2. node build.cjs --preview 3 → out/sheet.jpg. Regardez-le (Lisez l'image) : retour à la ligne des titres, éléments hors écran, contraste (par exemple texte orange sur fond orange), branding ancien résiduel.
  3. node build.cjs (exécutez en arrière-plan, ~5 min pour 66 s). Il rapporte la longueur vidéo vs audio (doivent correspondre) et le niveau sonore (≈ −14 LUFS).
  4. Envoyez la copie WhatsApp avec SendUserFile (le fichier complet est généralement > 30 Mo et ne s'affiche que sur ordinateur), dites à l'utilisateur où se trouvent les deux fichiers, et dites clairement que vous avez vérifié par transcription/images mais que vous n'avez pas pu écouter.

7. Musique

synth.cjs compose un rythme trap moyen-oriental original à 98 BPM (darbuka, 808, lead pincé style oud en D Hijaz) avec le drop sur la scène de révélation, plus des SFX (tonalité d'occupation, whoosh, ding, bip, pop). Les bibliothèques sous licence (par exemple les connecteurs Epidemic Sound) peuvent n'autoriser que les aperçus, pas les téléchargements — les aperçus ne sont pas sous licence pour les publicités, donc ne les utilisez pas.

Livraison

  • Final : out/<nom>-9x16.mp4 (1080×1920, 30 ips, H.264, AAC, −14 LUFS) et out/<nom>-9x16-whatsapp.mp4.
  • Mentionnez tout élément provisoire (numéro de téléphone manquant sur la carte de fin, etc.) et proposez l'étape suivante évidente (ajouter les coordonnées, version paysage, intégration sur leur site).
  • Si les captures d'écran ont dû être hébergées publiquement (nécessaire uniquement pour les outils vidéo cloud), dites à l'utilisateur où et proposez de les supprimer.

Lisez references/gotchas.md avant d'exécuter quoi que ce soit — il liste tous les échecs rencontrés lors de la construction de cela et leur correctif.

Skills associés