Productiepromovideo (promo-video)
Je fais uniquement deux choses : choisir les plans et remplir le texte. Pas de code, pas de modification des fichiers dans template/, scripts/, industries/, pas de coordonnées, de trames ou de valeurs de couleur.
Ci-dessous <SKILL> = le répertoire de ce fichier. Exécutez les commandes avec Node 22 / Python 3.10. Pour un utilisateur anglophone ou une vidéo en anglais → lisez <SKILL>/SKILL.en.md plutôt.
Procédure
- Définir le secteur et la langue.
meta.industry:software(par défaut) /food(restauration) /ecommerce(commerce physique) /education(formation) /beauty(esthétique) /travel(tourisme et hébergement). Si le secteur est mal choisi, les plans disponibles et les règles de conformité seront erronés.meta.lang:zh(par défaut) /en. Si la vidéo doit avoir des sous-titres en anglais et que l'utilisateur est anglophone, définiren(voir l'étape 5).- Si le secteur n'est pas
software→ lire d'abord<SKILL>/industries/<industry>/recipe.md(pour les projets anglais lirerecipe.en.md) : il contient les combinaisons de plans recommandées pour ce secteur,brief-template.md(les questions à poser dans le brief),test-brief.md/expected.md(exemples de violations de conformité). Ignorer cette étape expose à un contenu bloqué.
- Lire le brief. Comprendre les sections du
brief-template.mdcorrespondant ; si les informations suivantes manquent, les demander d'abord, ne pas inventer de données ou de fonctionnalités : nom du produit, argument de vente en une phrase, scénario de douleur, action clé, 2–4 arguments de vente.meta.productreprend exactement le nom du produit du brief. Il sera utilisé dans tout le film (accroche, fin). Lebrandde la fin doit être strictement identique.meta.action: obligatoire, une phrase du type « l'utilisateur fait X → le produit donne Y » (ex : « prend une photo du ticket → remplit automatiquement le montant et la catégorie »), sans montrer l'écran. Le texte des plans de démonstration (chat, phone, mockApp, photoShot) doit refléter cette action ; la validation le vérifiera.- Si le brief contient un « moyen d'obtention », le reporter textuellement dans
meta.cta; lectade la fin le reprend. Si le brief indique « aucun », ne pas écrire decta. Ne pas inventer de mentions comme « Téléchargez sur l'App Store ». - Ne pas mentionner dans l'argumentaire ou la fin des fonctionnalités absentes du brief.
- Si le brief contient des « chiffres et sources », les copier un par un dans
meta.factsau format[{"id":"f1","text":"Citation originale…"}](et non un simple tableau de chaînes). Tout chiffre avec une unité (durée, pourcentage, multiple, nombre de personnes, montant) à l'écran doit provenir de cette même source ; sans source, c'est une erreur, pas un simple avertissement. Si aucune donnée n'est fournie, utiliser des formulations qualitatives, ne pas inventer de chiffres. Le champparams.refs : ["f1"]d'un plan permet d'associer une phrase (ex : « fait maison ») à un fait pour la vérification sectorielle. - Une seule durée pour la même action dans tout le film : si le compteur indique 3 minutes, nulle part ailleurs on ne doit trouver « en quelques secondes » ou « 3 secondes » ; si l'accroche dit « une demi-journée », l'ancienne valeur du compteur doit aussi être une demi-journée. La validation le bloquera. De même, dans un plan
compare, lesstatetitemsd'une même colonne ne doivent pas se contredire. - Pour modifier la plage de durée par défaut (15–45 secondes), utiliser
meta.durationRange : [15, 60](tableau à deux éléments). - Si un petit texte constant en bas est nécessaire (ex : « Offre à durée limitée, consultez les détails de l'offre groupée »), utiliser
meta.notices: tableau de chaînes, maximum 3, affichées en une seule ligne en bas.
- Créer le répertoire :
promo/<nom_anglais_du_film>/et écrire le storyboard danspromo/<nom_anglais_du_film>/storyboard.json. Copier les captures d'écran, enregistrements d'écran ou logos fournis par l'utilisateur dans le même répertoire. - Choisir le thème (
meta.theme) :- Émotion, social, vie quotidienne →
warm-emotion - Développeur, IA, outils techniques →
tech-dark - Santé, apprentissage, comptabilité, outils légers →
fresh-light - Bureau, B2B, productivité →
business-blue - Fêtes, promotions, nouveautés →
festival-red - Haut de gamme, minimalisme, design →
mono-premiumSi une couleur de marque existe, définirmeta.brandColor(#RRGGBB) ; elle ne changera que la couleur d'accent.
- Émotion, social, vie quotidienne →
- Choisir 5 à 9 plans (description des plans dans
<SKILL>/shots.md, tableau récapitulatif des 18 plans en haut).hookdoit être le premier plan (2–3 secondes),endCarddoit être le dernier (4 secondes). Un plan doit absolument démontrer l'action clé (écrite à l'étape 2 dansmeta.action) ; la validation le vérifiera :chat: messages + panel (question → réponse) ; oumockApp: input (saisie/ question de l'utilisateur) + résultat (stat du dashboard, items de l'editor, done) ; si une capture d'écran existe, utiliserphone.meta.industrydétermine les plans autorisés (voirindustries/<industry>/rules.jsonpourenabledShots, ou lerecipe.md). Utiliser un plan non autorisé provoquera une erreur de validation. Les 7 plans sectoriels (non activés par défaut poursoftware) :photoShot: photo/vidéo réelle (plat, produit, œuvre, chambre, espace commun, cuisine)priceCard: carte de prix ;storeCard: carte boutique/carte/ réservation ;reviewCard: avis client réel (citation textuelle, ne pas exagérer)factSheet: fiche technique / liste de déballage / syllabus / informations d'examen / nuancier ;credCard: carte de diplôme/d'honneurbeforeAfter: curseur before/after (réservé à l'esthétique, nécessiteconsent:true+retouched:false) Choisir les plans en fonction du type de produit, ne pas utiliser un modèle fixe. Lesfeaturesne sont pas obligatoires. Deux exigences strictes (la validation le rappelle) :- Au moins un plan du milieu provient de {compare, steps, phone, meter} ;
- quickList et counter ne sont pas utilisés ensemble (sinon le film devient hook → quickList → mockApp → counter → endCard, un modèle identique pour tout le monde).
Pour le secteur
software, combinaisons possibles (en choisir une et l'adapter au produit ; pour les autres secteurs, suivre les structures recommandées dansindustries/<industry>/recipe.md) : - B2C émotion/social (chat, émotion, compagnie) : hook(bubble) → chat (démonstration, 2–3 répliques) → meter ou compare (l'impact de ces mots) → quickList → endCard
- Outil de productivité (écriture, comptabilité, publication, montage) : hook(stat) → compare (avant vs maintenant) → mockApp editor/form (démonstration « saisie → résultat ») → steps (mode d'emploi) → endCard ; ou hook → quickList (les problèmes) → mockApp → steps → endCard
- B2B données/bureau (rapports, réunions, CRM) : hook(icon) → phone (capture d'écran annotée) ou mockApp dashboard avec input (« une question → des données ») → compare ou meter (résultats) → steps → endCard ; utiliser counter seulement si le brief donne une durée chiffrée (dans ce cas, pas de quickList)
Durée totale idéale : 20–30 secondes (tolérance 15–45, ou la plage
meta.durationRange). Ne pas utiliser deux fois le même plan consécutif. La différence demoodentre deux plans consécutifs ne doit pas dépasser 0.5 (sinon le fond changera brutalement).
- Rédiger les sous-titres (
captionde chaque plan) : une phrase par plan, en gros caractères (style Douyin), adressée au public, pas une description de l'animation (❌ « Les cartes apparaissent une par une, expliquant ce qu'il peut faire » est une description de plan, pas un sous-titre).- En chinois : maximum 2 lignes, avec saut de ligne
\n; chaque ligne ≤12 caractères chinois (lettres et chiffres comptent pour un demi-caractère). En anglais (meta.lang: "en"), les sous-titres sont ajustés selon le nombre de caractères latins (environ 1,8 fois la limite chinoise) ; voir les détails dansdocs/shots/<type>.en.md - Utiliser
{}pour encadrer les 2 à 5 mots les plus importants, qui prendront une couleur d'accent ; maximum 1 occurrence par sous-titre - Le
captiondehook= titre de couverture, écrit sous forme de problème ou de question contre-intuitive endCardn'a pas decaption; le slogan est écrit dansparams.slogan- Un sous-titre reste à l'écran au maximum 5 secondes. Pour les plans plus longs (ex : 8–10 secondes pour
chat), lecaptionest un tableau de 2–3 phrases, chaque phrase occupant une partie égale du temps :"caption": ["Ne te précipite pas pour envoyer, \nce dont l'autre a besoin c'est de {ton attention}", "Choisis-en une et écris-la dans le champ, \nà toi de décider {si tu l'envoies}"] - Le sous-titre doit parler de la situation de l'utilisateur ou du changement apporté par le produit, et être cohérent avec le plan précédent et suivant ; la façon dont l'écran bouge est gérée par le composant, inutile de l'écrire. Les mots entre « » dans le sous-titre doivent être apparus dans ce plan ou dans un plan précédent (la validation le vérifie)
- Si le sous-titre mentionne une quantité (« ces 4 phrases », « trois réponses »), elle doit correspondre au nombre d'éléments dans ce plan (la validation le vérifie)
- Éviter les phrases toutes faites (« trois choses, {elle…} », « ces trois étapes », « ces moments, tu les as aussi… »), ne pas copier les sous-titres et paramètres des exemples, shots.md, ou spec ; la validation le signalera et proposera une phrase type à remplir. Les exemples ne sont que pour le format.
- Pas de répétitions de mots (« emploi du temps emploi du temps »), pas de coupures de mots (« goulot d'étranglement » écrit « goulot étrangle »), pas de fautes d'orthographe (« connexion » écrit « conection »). Si le nombre de caractères est dépassé, reformuler entièrement la phrase.
- Pas de termes absolus (« tout fait », « parfaitement clair », « sécurité totale », « 100% ») : le produit aura du mal à les tenir ; la validation le signalera. Utiliser des formulations mesurées.
- Pour le saut de ligne, écrire
\n; pour les guillemets dans le sous-titre, utiliser « » et non des guillemets droits anglais".
- En chinois : maximum 2 lignes, avec saut de ligne
- Définir le
mood(0–1) : douleur/tension : 0.8–1, transition : 0.5, produit et arguments : 0–0.3, fin : 0. La couleur de fond et la musique suivent cette valeur. - Écrire storyboard.json, format voir l'exemple complet en fin de document. La durée est
dur(en secondes), multiple de 0.5. Le fichier doit être en UTF-8. Sous Windows, l'encodage par défaut est GBK : utiliser un éditeur/script pour écrire directement en UTF-8, ou via PowerShell :[IO.File]::WriteAllText($p, $json, [Text.UTF8Encoding]::new($false)); via Python :open(p, "w", encoding="utf-8"). Ne pas utiliserecho >ouOut-File(version 5.1) pour écrire du chinois. Pourchat,panel.repliessont les suggestions du produit « moi » envoyées à l'autre personne ; les rédiger du point de vue de « moi » (je dis que je dois faire des heures sup, la réponse suggérée ne peut pas être « Arrête de faire des heures sup, accompagne-moi » – c'est le point de vue de l'autre). S'il y a unpanel, ne pas écriretyping. - Valider, corriger les erreurs une par une jusqu'à réussite :
Le format des erreurs est « Plan N (type) champ : problème → comment corriger ». Suivre « comment corriger ». Les résultats sont en trois niveaux :node <SKILL>/scripts/validate.mjs promo/<nom_du_film>/storyboard.json- Erreurs : à corriger impérativement, sinon pas de rendu.
- Avertissements : à corriger si possible (qualité du texte, structure trop proche du modèle) ; si impossible à corriger, le film peut être rendu mais il faut expliquer à l'utilisateur pourquoi.
- Nécessite vérification humaine : la validation ne peut pas décider (ex : « cet avis est-il vraiment textuel ? », « cette qualification provient-elle vraiment du brief ? »). Ne pas modifier le storyboard, les lister tels quels à l'utilisateur pour qu'il les valide lui-même.
- Générer le film (environ 2 minutes, la musique de fond est automatique) :
node <SKILL>/scripts/make.mjs promo/<nom_du_film>/storyboard.json --out promo/<nom_du_film>--outest obligatoire (en test utiliser--round <numéro_de_tour>, les fichiers iront danstests/<numéro_de_tour>/<nom_du_film>/; utiliser le même numéro pour plusieurs films du même tour, ne pas générer de répertoire horodaté vous-même). Résultat :video.mp4,sheet.png(mosaïque d'images par seconde),check/(image 0 + images plein écran avant la fin de chaque plan),report.txt(rapport de mise en page du texte : mots coupés, largeurs dépassées),layout.json. Pour un aperçu rapide de quelques images : ajouter--stills 0,3.5,8(secondes), seul le rendu des images est fait, pas la vidéo entière. - D'abord voir la fin de
report.txt(« Auto-vérification », « Rapport de mise en page du texte », « Vérification de la mise en page ») – le scriptmake.mjsle fait automatiquement : vérifie les backslashes, les noms de produit, les moyens d'obtention, la durée d'affichage des sous-titres, les icônes de fin qui chevauchent les mentions légales, les mots coupés/lignes trop larges ; il mesure la position de chaque bloc de texte pour détecter les coupures par des cartes ou des chevauchements ou si le texte sort de la zone (x : 150-930). Si des ✗ apparaissent, corriger d'abord (les ✗ de mise en page sont généralement dus à trop de texte : supprimer des éléments ou raccourcir le texte) ; ensuite regardersheet.pngetcheck/avec la liste de vérification ci-dessous, puis corriger storyboard.json et revenir à l'étape 9. - Livrer : donner le chemin de
video.mp4,sheet.pngà l'utilisateur, accompagnés de la « Liste de vérification avant publication » (ci-dessous) – inclure textuellement les éléments « Nécessite vérification humaine » de l'étape 9, point par point, pour que l'utilisateur les valide, sans juger à sa place.
Liste de vérification (regarder la mosaïque, écrire une conclusion pour chaque point, ne pas simplement cocher)
- L'image 0 a un grand titre + visuel principal, pas vide ou à moitié ; pas de
\n, de backslash ou autre caractère étrange sur la couverture - Chaque plan a un élément principal animé (curseur, chiffres, cartes, bulles de discussion), pas une image fixe ; pas de « zoom/dézoom d'image » pour faire nombre
- Les sous-titres ne cachent pas le sujet, ne sont pas tronqués, pas de mots coupés (un mot coupé sur deux lignes) ; sous-titres et images racontent la même chose, l'histoire se tient d'un plan à l'autre
- Les sous-titres s'adressent au public, ce ne sont pas des descriptions de plan (pas de phrase comme « les cartes apparaissent une par une »)
- L'action clé est vraiment montrée (on voit « saisie/question → résultat »), pas seulement un panneau tout fait
- La couleur de fond change avec l'émotion : douleur plutôt rouge, arguments et fin plutôt froids
- Le nom du produit à la fin est identique à
meta.product; le moyen d'obtention est celui du brief, ou absent ; pas d'URL, pas de QR code - Les chiffres sont cohérents : vérifier les calculs entre les chiffres d'une comparaison (30 minutes contre 5 secondes, le verdict ne peut pas être « économise 25 minutes ») ; chaque chiffre à l'écran a une source dans
meta.facts - Pas de fautes d'orthographe, pas de mots inventés en supprimant des caractères pour faire court ( « téléchargement automatique » écrit « tél auto » ), pas de termes absolus
- Les plans sectoriels sont utilisés correctement :
beforeAfteruniquement en esthétique ;reviewCardcite textuellement, sans exagération
Liste de vérification avant publication (à remettre à l'utilisateur, pas seulement pour vous-même)
- Tous les éléments « Nécessite vérification humaine » sont listés : la liste
humande l'étape 9, recopiée textuellement, sans décider pour l'utilisateur « ça devrait aller ». Exemples courants : la citation dereviewCard/credCardest-elle textuellement identique au brief ? les règles de la plateforme ont-elles été mises à jour ? les qualifications sectorielles sont-elles complètes ? meta.industryest-il correct ? (sinon, les plans autorisés et les règles de conformité seront erronés).- Si des personnes réelles apparaissent, des avis clients ou des photos before/after sont utilisés, un consentement écrit a-t-il été obtenu ? (les champs
consent/retouchedne sont qu'une exigence de validation ; l'obtention réelle du consentement est la responsabilité de l'utilisateur, pas de la validation). - La plateforme de diffusion (Douyin, WeChat Video, Xiaohongshu, étranger) correspond-elle à
meta.platform? Les règles spécifiques à cette plateforme (ex : pas de prix affiché avec le panier d'achat) ont-elles été confirmées ? - Projets bilingues : les sous-titres en anglais ont-ils été relus par un locuteur natif ? La machine ne vérifie que le nombre de caractères et les mots sensibles, elle ne détecte pas les formulations maladroites.
Règles strictes (la validation bloque)
- Le 1er plan doit être
hook;endCarden dernier - Durée totale : 15–45 secondes (ou plage
meta.durationRange). Chaque type de plan a sa propre plage (voir shots.md) - Chaque champ a une limite de caractères ; si dépassée, reformuler entièrement avec une phrase plus courte ; ne pas supprimer des caractères dans un mot pour faire court, ni passer à l'anglais (en anglais, il y a sa propre limite de caractères latins, voir la description du champ correspondant)
- Utiliser uniquement les champs, valeurs autorisées et noms d'icônes listés dans shots.md ; une faute d'orthographe ou un champ supplémentaire sera signalé comme erreur
- Au moins un plan démontre
meta.action(voir étape 5). Un sous-titre reste à l'écran max 5 secondes brandde la fin =meta.product;ctade la fin =meta.cta(si le brief n'en donne pas, ne pas en écrire)- Pas de backslash dans le texte à l'écran (
\ndans le JSON serait affiché tel quel) - Interdit à l'écran : URL, QR code, « scannez le code », @compte, « XX compte : nom », « Suivez / cherchez XX compte ». Les mots désignant la catégorie du produit lui-même (ex : un outil de mise en page pour les « articles de compte public ») ne comptent pas comme de la redirection ; ajouter le mot dans
meta.allowWords, ne pas modifier le nom du produit pour passer la validation. - Mots interdits par la loi sur la publicité : le plus, premier, seul, premier choix, exclusif, haut de gamme, absolu, 100%, tout le réseau, loin devant… (sauf « plus récent/dernier/première étape »). Si une base réelle existe, l'écrire dans
meta.allowWords - Tout chiffre avec une unité (durée, pourcentage, multiple, nombre de personnes, montant) doit être trouvé dans
meta.facts; sans source, c'est une invention, erreur bloquante - Règles sectorielles en trois niveaux : block (toujours bloqué, ex : allégations médicales, prix barré sans justification, avis réel sans mention de mois) ; warn (avertissement mais pas bloquant) ; human (validation impossible, à lister pour l'utilisateur – voir « Liste de vérification avant publication » point 1)
- Les chemins des fichiers doivent être relatifs au répertoire de storyboard.json et les fichiers exister ; les captures sont en png/jpg/webp, les enregistrements en mp4
Interdictions
- Ne pas modifier les fichiers dans
template/,scripts/,industries/; ne pas écrire de coordonnées, pixels, numéros de trames, valeurs de couleur, CSS - Ne pas inventer de données ou de sources non fournies par l'utilisateur ; tous les chiffres à l'écran doivent être dans
meta.facts; sans source, écrire « données d'exemple, se référer à la réalité » - Ne pas utiliser de noms, logos ou couleurs distinctives d'applications tierces (ex : bulle verte d'une application de chat). Utiliser « l'autre », « le collègue », « le client »
- Ne pas écrire de vrais noms de personnes, numéros de téléphone, comptes
- Ne pas utiliser le champ
bgm(make.mjs le remplit automatiquement) - Ne pas décider vous-même des zones grises de conformité sectorielle (ex : « est-ce que cette phrase est un terme médical ») : si la validation bloque, corriger ; si elle passe mais vous n'êtes pas sûr, l'écrire dans « Nécessite vérification humaine » et le donner à l'utilisateur, ne pas conclure vous-même que « ça devrait aller »
Erreurs courantes et corrections
| Erreur | Correction |
|---|---|
| Ligne N … caractères, chaque ligne max 12 caractères | Raccourcir, ou couper avec \n à une pause sémantique |
Utilisation de 2 {} pour l'accent | Ne garder que le plus important |
{} non appariés | Chaque { doit avoir un } correspondant, pas sur une autre ligne |
| Mot interdit par la loi : « le plus » | Remplacer par une formulation vérifiable : « le plus rapide » → « résultat en 3 secondes » |
Le 1er plan doit être hook | Ajouter hook au début |
Le plan endCard ne peut pas avoir de sous-titre | Supprimer caption, écrire le slogan dans params.slogan |
| Champ inconnu | Voir « champs disponibles » dans l'erreur, corriger l'orthographe (ex : kind pour mockApp, pas variant) |
| Icône « xx » inexistante | Choisir parmi la liste des icônes en haut de shots.md |
| Durée totale … doit être entre 15 et 45 secondes | Ajouter/supprimer un plan, ou modifier dur |
| Fichier de source introuvable | Vérifier le chemin, relatif au répertoire de storyboard.json |
| Échec d'analyse JSON : ligne N | Voir cette ligne : virgule manquante, virgule en trop, guillemets droits anglais dans le sous-titre (remplacer par « ») |
| Cette phrase doit rester à l'écran N secondes | Écrire caption comme tableau de 2–3 phrases, ou diviser le plan en deux |
| Aucun plan ne démontre l'action clé | Ajouter chat (question → réponse dans le panel) ou mockApp (input + résultat) |
Le nom du produit à la fin ne correspond pas à meta.product | Modifier brand pour qu'il soit strictement identique à meta.product |
cta écrit mais meta.cta est vide | Si le brief a un moyen d'obtention, l'écrire dans meta.cta puis le copier ; sinon, supprimer cta |
\n textuel dans le JSON | Le saut de ligne s'écrit avec un seul backslash |
| Nom de plateforme « compte public » (avertissement) | Mot de catégorie du produit : ajouter à meta.allowWords ; redirection : supprimer |
Champ obligatoire meta.action manquant | Écrire une phrase « l'utilisateur fait X → le produit donne Y » |
Chiffre introuvable dans meta.facts | Si le brief donne ce chiffre, le copier textuellement dans meta.facts (format {"id":"f1","text":"…"}) ; sinon, remplacer le chiffre par une formulation qualitative |
| Sous-titre contient une description de plan (ex : « les cartes apparaissent une par une ») | C'est un sous-titre pour le public, pas une instruction de montage ; le reformuler du point de vue de l'utilisateur |
| « connection » est une faute d'orthographe, doit être « connexion » | Corriger |
| « parfaitement clair » est une promesse absolue | Remplacer par une formulation mesurée, ex : « les infos clés sont visibles » |
| Le plan « YY » n'est pas ouvert pour le secteur « XX » | Choisir un plan autorisé pour ce secteur, ou vérifier si meta.industry est mal choisi |
| [B-xxx] Conflit avec les règles de conformité sectorielles | Suivre le « comment corriger » dans le message d'erreur ; utiliser meta.allowWords uniquement pour les mots interdits ayant une base réelle (valable seulement pour les warn, les block doivent être supprimés) |
En l'absence de vraie capture d'écran
Utilisez d'abord le plan mockApp (il peut être animé). Si vous devez absolument montrer « appuyez ici sur le téléphone », commencez par générer une capture d'écran de mockApp à donner à phone :
cd <SKILL>/template
npx remotion still src/index.ts Screen <chemin_absolu_répertoire_storyboard>/screen.png --frame=145 --props=<chemin_absolu_répertoire_storyboard>/screen-props.json
sreen-props.json doit être {"type":"mockApp","theme":"<thème>","dur":5,"params":{...params du mockApp...}}, cf. <SKILL>/examples/_src/screen-props.json. Ensuite, le plan phone utilise "src": "screen.png" et meta.disclaimer doit contenir « Image d'illustration, contenu simulé ».
Autres exemples (structures variées, choisir selon « type de produit », ne pas copier les sous-titres)
<SKILL>/examples/jev.json: B2C émotionnel, secteursoftware(démonstration chat avec 2 répliques → jauge → quickList → fin ; moyen d'obtention « télécharger la version Android sur le site officiel »)<SKILL>/examples/ledger.json: outil de productivité, secteursoftware(quickList douleur → comparaison → mockApp (photo de ticket → résultat) → chiffre → fin ; brief sans moyen d'obtention, pas dectaà la fin)<SKILL>/examples/meeting.json: B2B bureau, secteursoftware(capture d'écran annotée → interface simulée → chiffre → étapes → fin ; moyen d'obtention « demande d'essai gratuit sur le site officiel »)<SKILL>/examples/en-focus.json: exemple en anglais (meta.lang: "en"), app fictive, montre comment rédiger les sous-titres en anglais)- Les exemples de conformité pour les autres secteurs (food/ecommerce/education/beauty/travel) se trouvent dans
industries/<industry>/test-brief.md+expected.md:test-briefest un exemple de brief,expectedexplique quels plans et sous-titres seraient bloqués et pourquoi. Pour commencer un nouveau secteur, il est conseillé de lire ces deux fichiers.
Exemple complet (examples/ledger.json, passe la validation)
{
"meta": {
"title": "Vidéo promotionnelle Comptabilité simplifiée (douleur → produit → 3 arguments → fin)",
"product": "Comptabilité simplifiée",
"theme": "fresh-light",
"disclaimer": "Images d'illustration, données d'exemple",
"action": "Prendre une photo du ticket → montant et catégorie remplis automatiquement",
"facts": [
{"id": "f1", "text": "Les utilisateurs de l'essai ont économisé en moyenne environ 1260 yuans de plus ce mois-ci par rapport au mois dernier (données d'exemple)"},
{"id": "f2", "text": "Exemples d'entrées du carnet de démonstration : livraison ¥860, bubble tea/café ¥326, abonnement automatique oublié ¥98, course de nuit ¥410 (données d'exemple)"},
{"id": "f3", "text": "Saisie manuelle : environ 5 minutes ; avec le produit : environ 10 secondes (données d'exemple)"},
{"id": "f4", "text": "Résultat de la reconnaissance : déjeuner ¥38,5, budget repas du mois utilisé à 62% (données d'exemple)"}
]
},
"shots": [
{
"type": "hook",
"dur": 2.5,
"caption": "Le salaire à peine reçu,\nà la fin du mois {plus rien}",
"mood": 0.85,
"params": {"visual": "stat", "text": "¥ 0.00", "sub": "Où est passé cet argent ?", "badge": "Prends une photo du ticket pour le noter", "tone": "bad"}
},
{
"type": "quickList",
"dur": 3.5,
"caption": "Où est passé l'argent,\n{aucun souvenir}",
"mood": 0.8,
"params": {
"title": "Destination inconnue ce mois-ci",
"items": [
{"text": "Livraison", "tag": "¥860", "tone": "bad", "icon": "bell"},
{"text": "Bubble tea/café", "tag": "¥326", "tone": "warn", "icon": "heart"},
{"text": "Abonnement auto oublié", "tag": "¥98", "tone": "bad", "icon": "calendar"},
{"text": "Course de nuit", "tag": "¥410", "tone": "warn", "icon": "clock"}
]
}
},
{
"type": "compare",
"dur": 4.5,
"caption": "Pour la comptabilité,\n{arrête de compter sur ta volonté}",
"mood": 0.45,
"params": {
"mode": "lr",
"left": {"title": "Saisie manuelle", "items": ["Chaque dépense saisie à la main", "Catégorisation au hasard", "On abandonne en cours de route"], "tone": "bad", "icon": "doc", "stat": "5 minutes", "level": 8},
"right": {"title": "Comptabilité simplifiée", "items": ["Reconnaissance auto par photo", "Catégorisation automatique", "Bilan en un clic en fin de mois"], "tone": "good", "icon": "bolt", "stat": "10 secondes", "level": 2},
"meterLabel": "Niveau de difficulté",
"verdict": "Noter une dépense en dix secondes"
}
},
{
"type": "mockApp",
"dur": 4.5,
"caption": "Prends une photo du ticket,\n{montant et catégorie remplis}",
"mood": 0.25,
"params": {
"kind": "editor",
"title": "Noter une dépense",
"source": "Données d'illustration, pas un relevé réel",
"input": "Photo : ticket de déjeuner",
"button": "Reconnaître",
"items": [
{"text": "Déjeuner ¥38,5"},
{"text": "Commerçant : Restaurant du rez-de-chaussée"},
{"text": "Catégorie : Repas (auto)"},
{"text": "Repas du mois : 62% utilisé"}
],
"highlight": 3,
"done": "Noté"
},
"note": "Démonstration de l'action clé : l'utilisateur prend une photo du ticket → le produit donne le montant, le commerçant, la catégorie"
},
{
"type": "counter",
"dur": 3,
"caption": "En fin de mois,{il reste encore}",
"mood": 0.1,
"params": {"to": 1260, "prefix": "¥", "label": "Économisé en plus ce mois-ci par rapport au mois dernier", "sub": "Données d'exemple, résultats variables", "icon": "money", "tone": "good"}
},
{
"type": "endCard",
"dur": 4,
"mood": 0,
"params": {
"brand": "Comptabilité simplifiée",
"slogan": "Chaque dépense,\n{un œil dessus}",
"points": ["Photo du ticket → comptabilité automatique", "Carnet uniquement sur ton téléphone"],
"icon": "money"
}
}
]
}