Brief, storyboard et découpage en plans
Le responsable acquisition de la Brûlerie Calade (torréfacteur lyonnais fictif, douze salariés) veut tester une publicité de 8 secondes pour son cold brew, en 9:16 pour Reels et TikTok, en 1:1 pour le fil Instagram, en 16:9 pour YouTube. Son agence demande deux semaines. Il a essayé seul : quatre heures de prompts dans une interface web, 6 € de crédits Veo, et trois clips où la bouteille change de forme, d'étiquette et de couleur d'un plan à l'autre.
Le problème n'était pas le modèle. Il n'y avait ni brief, ni découpage, ni contrôle avant de payer. Cette leçon pose ces trois choses, dans un fichier versionné.
Le mécanisme : un brief exécutable
Un brief d'agence est un document Word que personne ne relit. Ici, le brief est un fichier YAML validé par un schéma : chaque plan, chaque texte prononcé, chaque prompt en découle. Le code ne contient aucun texte créatif ; changer de produit revient à changer de fichier.
flowchart LR
B["brief.yaml"] --> V{"Schéma pydantic<br/>+ conformité + devis"}
V -->|"refus"| R["Erreur lisible<br/>0 $ dépensé"]
V -->|"ok"| P["Plans p1, p2"]
P --> T["Voix off (TTS)"]
P --> I["Image produit"] --> C["Clips Veo"]
T --> M["Montage ffmpeg"]
C --> M
L["Musique Lyria"] --> M
M --> F["9:16 · 1:1 · 16:9<br/>sous-titrés, ≤ 3 Mo"]
Trois décisions structurent le découpage.
Le plan est l'unité de génération. Veo 3.1 produit des clips de 4, 6 ou 8 secondes (pas 5, pas 7). Un plan du storyboard = un appel Veo. On choisit la durée du plan en fonction de ce qui s'y passe, pas l'inverse : un gros plan produit tient en 4 s, une action en trois temps (prendre, ouvrir, boire) en demande 8 et a de bonnes chances d'échouer.
Une action par plan. Les modèles vidéo enchaînent mal deux actions dans le même clip : la deuxième arrive trop tôt, ou pas du tout. « La main saisit la bouteille et dévisse le bouchon » est déjà à la limite ; ajouter « puis la porte à la bouche » rate presque toujours.
La « bible » visuelle. Veo ne voit jamais les autres plans. Ce qui doit rester identique d'un plan à l'autre (le produit, le décor, la lumière, le style) est écrit une seule fois et injecté dans chaque prompt.
| Champ du plan | Rôle | Exemple (plan p2) |
|---|---|---|
duree | 4, 6 ou 8 s, imposé par Veo | 4 |
image | image de départ : produit ou consigne d'édition | « même scène, cadrage plus large, une main entre par la droite » |
sujet / action | qui fait quoi, une seule action | « la main soulève la bouteille et dévisse le bouchon » |
camera / objectif | mouvement, hauteur, focale | « plan moyen serré fixe, 50 mm » |
son | ambiance et bruitages générés par Veo | « clic du bouchon, léger pschitt » |
voix | voix off, ajoutée au montage et sous-titrée | « Ouvrez. C'est prêt. » |
La mise en œuvre
Le dépôt complet est dans files/. Le brief d'exemple : brief.yaml.
projet: calade-cold-brew
format_ugc: demo-produit # demo-produit | temoignage | face-camera
budget_usd: 1.00 # le pipeline refuse de lancer la génération au-delà
bible:
produit: "a 25 cl clear glass bottle of cold brew coffee, dark amber liquid,
matte kraft paper label reading CALADE, black metal screw cap"
lumiere: "low golden sunrise light from the left, soft shadows"
plans:
- id: p1
duree: 4
image: produit
action: "a single condensation droplet slowly runs down the glass ..."
camera: "slow push-in, eye level, perfectly stable"
voix: "Calade Cold Brew. Seize heures à froid."Le schéma refuse ce que Veo refuserait, avant tout appel :
class Plan(BaseModel):
id: str
duree: Literal[4, 6, 8] # durées acceptées par Veo 3.1
image: str = "produit" # "produit" ou consigne d'édition de l'image produit
sujet: str
action: str
camera: str
dialogue: str = "" # réplique prononcée À L'ÉCRAN (Veo la synthétise)
voix: str = "" # voix off (TTS), sous-titréeLa distinction dialogue / voix compte. Un dialogue est généré par Veo, avec la bouche du personnage : il ne se corrige qu'en regénérant le clip (0,20 ). Une voix off est générée à part par le TTS pour un millième de dollar, et se refait à volonté. Pour une publicité produit, mettez le texte en voix off.
Installez puis lancez les tests :
cd files
make setup
make testRésultat obtenu
Exécution du 2026-10-15 :
$ make test
........................... [100%]
27 passed in 8.23sCe qui casse en production
| Symptôme | Cause | Parade |
|---|---|---|
400 INVALID_ARGUMENT sur durationSeconds | durée de 5 s ou 10 s demandée | Literal[4, 6, 8] dans le schéma : l'erreur sort avant l'appel |
| La bouteille change de forme entre les plans | description du produit réécrite à la main dans chaque prompt | une seule bible, injectée par le code |
| La deuxième action du plan n'arrive jamais | deux actions dans un clip de 4 s | un plan par action, ou 8 s et une action simple |
| Le texte prononcé dépasse la fin du plan | voix écrite sans mesurer sa durée | le pipeline génère la voix en premier et la mesure (leçon 4) |
| Le client change le slogan après génération | slogan placé en dialogue | slogan en voix, refait pour 0,001 $ |
La règle de décision
Découpez en plans de 4 s tant que chaque plan ne porte qu'une action et qu'un message. Passez à 6 ou 8 s quand le mouvement de caméra a besoin de temps (travelling, révélation). Au-delà de deux ou trois plans, le format « publicité courte » n'est plus le bon : un 15 s se monte avec des plans tournés ou des banques d'images, la génération servant aux plans impossibles à tourner.
Pratique
Le client veut un plan de 8 s où une cycliste attrape la bouteille, l'ouvre, boit puis repart. Quelle décision prenez-vous avant d'écrire le moindre prompt ?
Une action par plan est la règle qui tient le mieux. Les horodatages dans le prompt sont tentants mais rarement respectés au-delà de deux temps. Le modèle standard coûte 8 fois plus cher (0,40 $/s contre 0,05 $/s en 720p) sans garantir l'enchaînement. Des clips de 2 s n'existent pas : Veo 3.1 accepte 4, 6 ou 8 s.
Le slogan final n'est pas validé par le service juridique. Où le placez-vous dans le brief ?
Un texte susceptible de changer va là où il coûte le moins à refaire : la voix off se régénère pour un millième de dollar sans toucher aux clips. En dialogue, chaque modification impose de regénérer le clip Veo. Écrit dans l'image, il serait déformé par le modèle et figé dans tous les plans qui en dérivent.
Exercice. Ajoutez au brief un troisième plan de 4 s : la bouteille ouverte posée sur un vélo garé devant la vitrine, avec la voix « Chez votre caviste. ». Lancez make test puis .venv/bin/python run.py --plan. Que devient le devis, et le brief passe-t-il encore sous budget_usd ?
Voir la solution
- id: p3
duree: 4
image: "Same bottle, open, standing on the rear rack of a bicycle parked in front of the café window, same morning light. No people."
sujet: "the open cold brew bottle on a parked bicycle"
action: "the bicycle wheel slowly settles, a light breeze moves a leaf past the bottle"
camera: "static wide shot, slight low angle"
son: "street ambience, a bicycle bell in the distance"
voix: "Chez votre caviste."Le devis passe de 0,575 : 0,20 ), 0,067 . Les tests test_brief_exemple et test_devis_exemple échouent, car ils figent la durée (8 s) et le devis du brief d'exemple : c'est voulu, un test qui décrit le brief doit être mis à jour avec lui.
- Je découpe une publicité en plans de 4, 6 ou 8 s, une action par plan
- Je sépare ce qui est constant (bible) de ce qui varie (plan)
- Je place tout texte susceptible de changer en voix off, pas en dialogue
-
make testpasse sur mon poste