Vidéo storytelling
Comment construire la couche visuelle d'une vidéo longue durée pour qu'un spectateur soit toujours orienté à la neuvième minute. S'applique à toute vidéo de type « tête parlante » avec un script : une actualité, une analyse approfondie sur un sujet, une comparaison, un tutoriel, un listicle.
L'échec que cela remplace est la pensée en scènes. Un nouveau graphique toutes les quelques secondes oblige le spectateur à recommencer sa compréhension toutes les quelques secondes, et aucun graphique individuel n'est en cause, c'est pourquoi le retour est formulé comme « confus » ou « trop d'informations » plutôt que comme un défaut spécifique.
Pour une feuille de pratique neutre, lisez docs/STORYTELLING-WORKBOOK.md à la racine du dépôt. Le système de conception réutilisable se trouve dans reference/design-system.md de cette compétence ; la géométrie des boucles ouvertes travaillées est dans reference/patterns/wall-of-slots/. Les vidéos sources privées ne sont pas requises.
Ce n'est pas hyperframes-video-beats. Cette compétence place des cartes incrustées par-dessus une tête parlante. Celle-ci conçoit la chose dont parle la vidéo.
1 · Les quatre principes
Un monde persistant
La vidéo vit dans un espace unique, et elle ne se réinitialise jamais. Tout ce que le spectateur a déjà vu existe toujours là où il l'a laissé, et le nouveau matériel s'y ajoute plutôt que de le remplacer. Un élément, une fois dessiné, n'est jamais redessiné, déplacé ou réétiqueté.
Tout le reste de cette compétence en dépend. La caméra n'a nulle part où aller si l'espace change constamment, un projecteur ne signifie rien s'il n'y a rien d'autre à l'écran, et une boucle ouverte ne peut pas rester ouverte dans un monde qui se réinitialise.
Le monde doit aussi valoir la peine d'y rester, alors décidez la grammaire spatiale avant de construire quoi que ce soit et tenez-la pendant toute la durée. Dans la construction de référence : de gauche à droite va vers le résultat, le haut est vers un humain et est la seule chose chaude à l'écran, le bas est dans un système d'enregistrement. Un spectateur qui l'apprend dans les deux premières minutes lit le reste de la vidéo gratuitement.
Brisez la grammaire exactement une fois, délibérément, pour le sens. Le seul mouvement de droite à gauche de la construction de référence en dix minutes est un ticket résolu qui revient dans la file d'attente sur les mots « taux de réouverture ». Il atterrit sans un mot parce que la direction avait signifié quelque chose pendant les trois minutes précédentes.
La caméra est le montage
Couper vers un nouveau graphique coûte au spectateur ses repères à chaque fois. Se déplacer dans un espace qui reste en place ne leur coûte rien. Un zoom avant se lit alors comme « regarde de plus près la partie de la chose que tu comprends déjà », et le zoom arrière est là où le travail paie, parce que tout ce qui a été construit jusqu'à présent est toujours là.
Travaillez à trois altitudes et déplacez-vous entre des altitudes adjacentes :
| Altitude | Montre | Utilisé pour |
|---|---|---|
| Monde | tout l'espace | orientation, aboutissements, « voici où nous sommes » |
| Région | le sous-graphe en discussion | la majeure partie du temps |
| Détail | un élément | un nombre, un changement d'état, une décision |
Sauter du détail au monde est désorientant sauf s'il s'agit d'un battement d'aboutissement délibéré, auquel cas c'est le meilleur mouvement disponible.
Règles qui coûtent chacune une reconstruction à apprendre :
- Nommez les cadrages comme des fenêtres exactes du monde, pas comme des facteurs d'échelle. Les limites des fenêtres doivent tomber entre les étiquettes. Spécifier un cadrage comme « échelle 0,6 » coupe les mots en deux au bord du cadre.
- Réutilisez la même fenêtre pour le même usage. Si le plan d'orientation est une fenêtre particulière, utilisez toujours cette fenêtre exacte. Des cadrages quasi identiques se lisent comme une dérive.
- Variez la durée avec la distance parcourue, pas un préréglage global unique.
- Séquencez la caméra et les fondus pleine image, jamais en même temps. En simultané, ils guillotinent le contenu. D'abord la caméra, puis le fondu.
- Une couche de couverture devient opaque avant que la caméra ne se déplace en dessous. Inversé, une partie du mouvement est exposée et se lit comme un cut jump.
- Aucune étiquette à moins de 60 px du bord du cadre. Un élément peut dépasser et se lire comme « le monde continue » ; un mot coupé au milieu d'un glyphe se lit comme un bug. Résolvez-le par le placement, pas par le masquage, car un fondu ne peut pas rattraper une lame se déplaçant à ~1800 px/s.
- Deux mouvements séquentiels sur le même sujet se lisent comme un problème technique. Un recadrage qui se termine ET PUIS un fondu qui commence est un zoom, un arrêt net, et un second mouvement — le client appelle cela « un défaut technique et une pause ». Fusionnez-les en UN SEUL geste : une facilité symétrique partagée (power2.inOut), atterrissant sur la même image, de sorte que le panneau se lit comme poussant la vidéo de côté. Associé : les facilités front-loaded (power3/4.out) sur un mouvement de métrage visible chargent ~90 % du trajet au début et rampent jusqu'à l'arrêt ; réservez-les pour les entrées d'éléments, où la rampe se lit comme une stabilisation. (A coûté une révision signalée par le client sur l'introduction de l'exemple travaillé.)
L'attention est un projecteur
Exactement un élément à pleine luminosité à tout moment. Tout ce qui est déjà dessiné reste calme mais lisible. Non négociable. C'est la règle qui permet à un monde de s'accumuler jusqu'à une douzaine d'éléments sans jamais sembler chargé, et c'est ce qui rend le zoom arrière lisible plutôt qu'accablant.
La hiérarchie vient du RAPPORT entre l'actif et le calme, jamais en rendant tout sombre. Le premier prototype de la construction de référence avait un pixel le plus brillant à 101/255 et était illisible à 960×540 ; la correction a été une encre plus brillante, pas plus de gradation.
| État | Luminance cible (Y, 16-235) | Opacité dans la référence |
|---|---|---|
| Trait actif + étiquette | 200-235 | 1,0 |
| Contexte, dessiné et toujours pertinent | 120-150 | 0,56 |
| Épuisé, a dit son mot | 85-105 | 0,33 |
| Toute étiquette, tout état | jamais en dessous de 90 |
L'implémentation est une fonction, appelée à chaque battement de narration avec les identifiants en cours de discussion (build_s01.py, lit()) :
def lit(t, active, warm=(), dur=0.5, floor=FLOOR):
active = list(active) + [g + "-l" for g in active if g + "-l" in order]
for gid in order:
if gid not in opac: # jamais dessiné : rien à éclairer
continue
tgt = 1.0 if gid in active else (WARM if gid in warm else floor)
if gid not in active:
tgt = min(tgt, MUTED.get(gid, 1.0))
...
Trois détails là-dedans sont essentiels :
- Une étiquette hérite toujours de l'état de son élément (l'ajout du suffixe
-l). Un élément allumé avec une étiquette illisible en dessous est exactement le défaut que l'on corrige. - Un accessoire qui a terminé se retire à une opacité de 0, via un plafond
MUTED, pas à 0,3. Atténuer à 0,3 laisse des confettis inexpliqués à l'écran pour le reste de la section. Règle du générateur : émettez lemute()avant toutlit()qui commence plus tard, sinon le muet est écrasé lorsque son interpolation se termine. - Les événements d'opacité doivent être émis dans l'ordre de la timeline ou le tracker voit un état obsolète et calcule la mauvaise cible. Conservez une garde
seq()qui lève une exception en cas d'émission hors ordre. - Une seule autorité d'opacité par élément par fenêtre. Deux interpolations simultanément actives conduisant l'opacité du même élément vers des valeurs différentes se rendent de manière fluide dans une section autonome mais stroboscopent à ~10 Hz dans le master assemblé, où l'interpolation gagnante alterne par image. La construction de référence a livré ce défaut à chaque dock. Lorsqu'un balayage comme
lit()chevauche un éclaircissement ou une atténuation explicite, l'interpolation qui commence plus tard est le seul conducteur et le balayage saute ces identifiants (lit(..., skip=(...))). Contrôlez-le : scannez les rendus assemblés pour détecter des pops de luminance aller-retour sur une image dans chaque fenêtre de transition (qa/v4/flicker/qa-flicker.mjsdans la construction de référence).
Les boucles ouvertes sont spatiales
Ne dites jamais « nous y reviendrons ». Laissez quelque chose visiblement incomplet dans le monde et revenez-y. Une promesse que le spectateur peut voir est une promesse qu'il peut ressentir comme en suspens.
Le mécanisme est identique quelle que soit la forme :
- Plantez-la dans l'accroche, dans l'espace, sur la ligne qui fait la promesse.
- Remontrez-la à chaque frontière. Toute transition de section est une frontière. La remontrée coûte environ deux secondes et est le mécanisme de rétention ; la sauter est ainsi qu'un aboutissement finit par ne rien rapporter.
- Faites-la avancer visiblement. Le spectateur doit voir l'incomplétude diminuer.
- Fermez sur l'image sur laquelle vous avez ouvert.
Choisissez la forme dans le script :
| Forme du script | Le monde | Ce qui est incomplet |
|---|---|---|
| N éléments parallèles | N prises sur une colonne vertébrale | emplacements vides (voir reference/patterns/wall-of-slots/) |
| Un processus, approfondi | l'ensemble du pipeline, disposé | un lien cassé ou manquant |
| Niveaux ou paliers | une pile qui se construit vers le haut | le sommet de la pile est un fantôme |
| Comparaison | deux colonnes sur un axe partagé | une colonne vide, ou une fiche de score incomplète |
| Actualité ou annonce | une timeline, ou une carte de paysage | le côté droit, le futur, est vierge |
| Tutoriel ou construction guidée | l'architecture finie, fantomatique | chaque nœud pas encore construit |
Remettre un élément à son emplacement est un mouvement de caméra en direct, ~1,4 s, jamais une coupe vers une image préfabriquée de l'état rempli. Le spectateur regarde la chose qu'il vient d'apprendre devenir la tuile. Si la vidéo a un chiffre ou un compteur, faites-le défiler à l'intérieur de ce même mouvement, comme un odomètre, avec le même début, la même durée et la même facilité pour les deux chiffres, sinon ils fusionnent en une seule bande en cours de défilement.
Le compteur a besoin d'un nom, pas seulement d'un nombre. Un chiffre dans le coin dit au spectateur où il se trouve dans la séquence mais pas ce qu'est l'élément actuel ; neuf minutes plus tard, « 03 » n'apporte rien. Associez le chiffre à une étiquette de 1 à 2 mots nommant l'élément actuel (SUPPORT, VOIX AI), dans la même chimie de plaque, se déplaçant comme un seul accessoire rigide avec le chiffre, changeant à l'intérieur du même défilement d'odomètre. La révision client de la construction de référence a demandé exactement cela : les visuels étaient bons et le spectateur perdait toujours la trace du cas d'utilisation à l'écran.
2 · Discipline
Si ça n'a pas de mot, ça n'est pas dessiné
Chaque forme est un élément étiqueté, un connecteur entre des éléments étiquetés, le sujet en déplacement ou le fond ambiant. Rien d'autre.
Cela vient d'une revue de test muet qui a noté la compréhension 7/10 et a nommé la cause : le diagramme était propre, les décorations ne l'étaient pas. Une douzaine de formes non étiquetées dessinées avec la même épaisseur et la même palette que les formes significatives, de sorte qu'un spectateur novice ne peut pas distinguer le signal de la texture et consacre une réelle attention à décoder des choses qui n'étaient jamais destinées à être décodées. C'est « trop d'informations » déplacé des mots vers les formes.
Budget : ~20 mots à l'écran par section. Pas de phrases. Les étiquettes font 1 à 2 mots, sous leur élément. La section 1 de référence fait 21 mots en 84 secondes.
Corollaire : un visuel anti-modèle ne superpose jamais la recommandation. Mettez d'abord le monde au noir presque complet, ou placez le contre-exemple là où le bon diagramme n'est pas.
Donnez au spectateur une seule chose à suivre
Portez l'histoire sur un seul sujet voyageur dont l'état change visiblement : une puce avec des lignes de données et une barre de score, un document, une requête. Les lignes se remplissent, une barre bouge, une bordure change de couleur. Un spectateur doit pouvoir suivre une section entière en regardant cet objet unique, et il ne doit jamais téléporter ; il se déplace le long de connecteurs dessinés à une vitesse constante.
Un seul ensemble de tokens global
Détail complet dans reference/design-system.md.
| Token | Valeurs |
|---|---|
| Trait | 1,5 / 2,5 / 4 / 7, et rien d'autre |
| Typographie | 22 / 30 / 42 / 60 / 84 |
| Rayon | 10 / 22 / 40, toujours superellipse(2) |
Cinq couleurs, cinq significations fixes, zéro décoration. Chaud signifie qu'un humain est impliqué et rien d'autre n'est jamais chaud. Jamais de blanc pur pour la typographie ; il forme un halo sur fond sombre.
L'échec que cela évite, d'après la revue artisanale de la première construction : « chaque décision a été prise localement et correctement ; aucune décision n'a été prise globalement. » 18 épaisseurs de trait et 9 tailles de police, la plupart à 0,2 d'écart, individuellement invisibles et collectivement fatales. L'œil reçoit du bruit au lieu d'une hiérarchie. Contrôlez-le avec un linter de tokens qui fait échouer la construction.
Mouvement
Entrées sur cubic-bezier(0.16,1,0.3,1), sorties plus rapides que les entrées, la durée varie avec la masse de sorte qu'un nœud de 290 px et une étiquette de 40 px ne décélèrent pas de manière identique, et back.out exactement une fois par section, sur le temps fort qui le mérite.
Pas de fondu enchaîné, jamais. Les couches pleine page entrent et sortent par clip sur un fond déjà opaque. À tout instant, un pixel est soit un graphique, soit la vidéo.
3 · Contrat de construction
- Un générateur par section.
scripts/build_<id>.pyécrit uniquementcompositions/<id>.html. Modifiez le générateur, jamais le HTML généré. Les racines de sectionindex-*.htmlsont maintenues à la main, donc les changements de cadrage y vont. - Les modules partagés restent partagés. Tout ce qui définit la géométrie partagée est importé par chaque section. Si les sections sont construites par des agents parallèles, interdisez-leur de toucher aux modules partagés ; une géométrie divergente casse silencieusement chaque transition.
- Espacez les définitions SVG avant l'assemblage. Chaque section définit ses propres
gEdge,shadow,edgeFade. Dans un DOM assemblé,url(#id)se résout à la première correspondance dans l'ordre du document, donc une fois qu'une composition antérieure se démonte, chaque graphique ultérieur peint rien. Coût dans la construction de référence : 35 secondes d'écran vide avec chaque porte verte. Seul le regard sur le rendu assemblé l'a attrapé. - Cadrez tout sur les débuts de mots à partir d'une transcription au niveau du mot, en entrant 0,15-0,25 s en avance sur le mot d'ancrage. Ne divisez jamais une section uniformément en battements.
- Auditez les temps morts. Tout étirement de plus de ~1,5 s sans rien qui se passe est un écran mort ; faites en sorte que le générateur les imprime.
- Laissez de l'air dans la coupe. Une limitation agressive des pauses produit des écarts quasi nuls aux limites des phrases que le client entend comme des « bégaiements » et des cut jumps. Calibrez par rapport à la norme du locuteur : signalez les écarts aux limites des phrases qui sont ~10 fois plus serrés que leur médiane (le locuteur de référence était de 470 ms ; les jonctions signalées se situaient à 20-40 ms), et réparez en insérant 4 à 8 images d'air, les mots jamais touchés. L'air est une tranche donneuse du véritable son ambiant de la piste avec des fondus de 10 ms, jamais
anullsrc: le silence numérique contre un plancher de -50 dBFS est une perte audible. La vidéo maintient l'image ; entre les phrases, une tête parlante est quasi immobile et 4 à 8 images de maintien est invisible. Les changements par insertion seule décalent la transcription de manière déterministe, donc aucune retranscription n'est nécessaire. Les bords d'une insertion doivent respecter l'enveloppe de la parole : buter le son donneur contre une queue de mot en 1 ms est audible.