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, pointeznpm_config_cacheetTEMPvers 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/.envcommeGEMINI_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é :
- Accroche (0–4 s) : une question douloureuse que le spectateur reconnaît ("كام أوردر ضاع منك النهارده… عشان التليفون كان مشغول؟").
- Douleur : la mauvaise méthode actuelle, se terminant par la perte.
- Révélation : "طب تخيّل…" + le produit (le beat drop ici). 4–9. Une fonctionnalité par scène, chacune avec sa capture d'écran réelle.
- 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+MutationObserverqui réécrit l'ancien nom de marque, échange lesrcdu logo, masque les numéros de téléphone et remplace les photos de marque, puis vérifiezinnerTextpour 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-ttsa 92 voix égyptiennes natives (ar-eg-*, par exemplear-eg-concierge-1jeune/lumineux,ar-eg-commercial-11voix pub,ar-eg-storyteller-3décontracté). Niveau gratuit : seulement 10 requêtes/jour pour ce modèle.gemini-3.1-flash-tts-previewa un quota gratuit séparé mais seulement des voix générales (Puckmasculin optimiste — le choix de l'utilisateur,Orusmasculin 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 voixar-EG.node vo-gemini.cjs sample <voix> [voix…]→ ligne d'accroche par voix dansvo/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-previewpour 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(Microsoftar-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 dansvo/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 avecffmpeg -af silencedetect=noise=-38dB:d=0.1et déplacez la queue vers le clip suivant (voir les pièges pour le piège-ss). Corrigez à partir des originaux dansvo/take/.node check-v.cjs s10demande 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 :
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.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.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).- 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) etout/<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.