Constructeur de reel
Moteur : $(reelsmith root)/engine/ (build.py, template.html, music.py, pull_vo.py, capcut.py, fonts/). Un dossier par reel : <reel-dir>/reel.json → <reel-dir>/out/reel.mp4. Si reelsmith indique qu’il n’est pas configuré, exécutez reelsmith setup une fois.
reelsmith new reels/my-reel # dossier avec src/, vo/ et un reel.json modèle
reelsmith sheet reels/my-reel/src/* # fiches de contact → choisissez `ss` pour chaque segment
reelsmith build reels/my-reel --stills # ~1 min : images, timings des mots, sous-titres, out/qa_sheet.jpg
reelsmith stills reels/my-reel 0.5,7.8,21.3 # images de contrôle supplémentaires
reelsmith build reels/my-reel # rendu complet (~4–5 min pour 60 s)
Exécutez toujours --stills en premier : lisez la liste imprimée des sous-titres et regardez out/qa_sheet.jpg (rouge = zones UI Reels/TikTok ; rien d’important ne doit se trouver dans le rouge). Corrigez reel.json, puis construisez. Vérifiez les lignes de volume imprimées à la fin (−14 LUFS ±1, crête ≤ −1 dB). Regardez ensuite les images du MP4 final autour de chaque effet et transition avant de le remettre.
Workflow (temps du créateur ≈ 10 min par reel)
- Script : compétence
reel-script→ le créateur approuve. Marquez les mots d’accentuation avec<em>…</em>; conservez les nombres tels quels pour l’affichage. - Voix : soit l’enregistrement du créateur (
vo/vo.mp3) soit ElevenLabs (voirdocs/voice.md) : texte TTS = script sans balises, nombres épelés en toutes lettres, noms de marques écrits phonétiquement. Sur le plan gratuit, générez dans l’interface web ElevenLabs (Claude dans Chrome peut le piloter), puisreelsmith voice <reel-dir>récupère les 2 prises les plus récentes dansvo/avec leurs durées. Transcrivez les deux, conservez la plus propre commevo/vo.mp3. Voix lentes :"speed": 1.07dansvo. - Séquences : compétence
footage-scout— uniquement des clips récents (vérifiezused_footage.md), fiches de contact, vérification de la vie privée. Les durées des segments doivent additionner jusqu’à la fin de la voix + ~2 s. - Plan d’édition : compétence
reel-directorchoisit les 3–5 effets pour cette histoire et où placer les transitions. - Écrivez reel.json →
--stills→ corrigez → construisez → livrezout/reel.mp4+out/cover.jpg+out/caption.txt. - Passage sonore optionnel dans CapCut : compétence
reel-capcut(effets sonores de bibliothèque + musique choisie à l’oreille).
reel.json
{
"vo": {"file": "vo/vo.mp3", "offset": 0.25, "speed": 1.07, "gaps": [[5.73, 0.8]]},
"script": "Je réécris mon guide depuis trois mois et hier j’ai changé la police de la couverture <em>pour la quatrième fois</em>. …",
"hook": {"tag": "le scénario du brouillon éternel", "lines": ["le guide est presque prêt.", "<em>depuis trois mois maintenant</em>"], "out": 5.55},
"end": {"from": 55.6, "lines": ["depuis combien de temps", "<em>le vôtre attend-il ?</em>"], "lines_at": [55.75, 56.6],
"sub": "dites-le moi en commentaire", "sub_at": "@comments", "handle": "@votrehandle", "handle_at": 58.6},
"cover": {"from": 0, "to": 4.35, "title": "BROUILLON", "left": "No.4 · Octobre", "right": "@votrehandle", "top": 330},
"cover_t": 2.0,
"stamps": [{"seg": ["I", "J"], "text": "tanya · 2 ans dans les brouillons"}],
"punch": [[3.02, 4.4], ["@mille", 9.0]],
"segments": [
{"id": "A", "clip": "src/night_desk.mp4", "ss": 9.5, "dur": 2.5, "crop": [0, 0.196, 0.75], "cut": true},
{"id": "B", "clip": "src/keys.mp4", "ss": 1.3, "dur": 1.9, "move": "none"},
{"id": "E", "clip": "src/phone_walk.mov", "ss": 0.8, "dur": 4.5, "cut": true, "in": "zoom"},
{"id": "I", "clip": "src/cafe.mp4", "ss": 0.3, "dur": 3.2, "look": "bw"},
{"id": "K", "clip": "src/walk.mov", "ss": 14.0, "dur": 4.95, "look": "burst"},
{"id": "N", "clip": "src/breakfast.mov", "ss": 0.0, "dur": 3.45, "rate": 0.4},
{"id": "Q", "clip": "src/meadow.mov", "ss": 13.2, "dur": 9.1, "move": "pull-out", "in": "zoom"}
],
"caption": "…",
"music": "synth"
}
Un exemple réel complet (ukrainien, 61 s, 17 segments, chaque effet ci-dessous) se trouve dans $(reelsmith root)/examples/chernetka/reel.json ; un exemple minimal dans examples/template/reel.json.
Voix et sous-titres
- lang : langue Whisper de la voix-off (
"uk","en", …) ; omis = détection automatique (ouREELSMITH_LANG). - vo.gaps
[vo_time, extra_s]: une pause de respiration insérée au point le plus silencieux proche de ce temps de la voix (accélérée) — place pour un montage photo. vo.speed : facteur atempo. - ancres "@word" : tout temps dans hook / end / doodles / glass / checklist / cover / orbit / wall / punch / subs_skip peut être
"@thousand"(début de ce mot du script ; correspondance exacte d’abord, sinon préfixe),"@again#2"(2e occurrence),"@twice+0.3". Les mots mal entendus par Whisper reçoivent des temps interpolés — utilisez des secondes dans ce cas.out/words.jsoncontient les temps réels après--stills. - subs / punch : omis = automatique à partir de
script+ timings des mots (5–7 mots, 1–2 lignes, mots d’accentuation en couleur d’accent italique, pas de point final, une ligne ne se termine jamais par "et/dans/de…" ; incrustations sur jusqu’à 4 phrases d’accentuation espacées d’au moins 3 s). Remplacez par"subs": [[a, b, "html"]],"punch": [[a, b]]. Les sous-titres sont masqués pendant que la carte d’accroche est affichée, sous les titres en verre et les listes de contrôle, et une fois la carte de fin commencée (subs_from/subs_until/subs_skip [[a, b]]pour ajuster).
Cartes et texte
- hook : carte en papier visible depuis l’image 0 (
at: [t…]révèle les lignes une par une,size,top). end : carte à partir defrom, lignes àlines_at,sub,handle. - stamps : pastille mono en haut à gauche sur les segments listés (lieu, date, nom du personnage).
- cover (cover story + cadre brisé) : en-tête de magazine ajusté à la largeur, les lettres tombent ; sur les segments avec
"cut": true, la personne se tient devant le titre. Choisissez/recadrez un plan où le sommet de la tête se situe 40–80 px sous le haut de l’en-tête — jamais en travers des yeux.colorpour l’en-tête,toppour le déplacer.cover_t≈ 2 pour queout/cover.jpgmontre la couverture finale. - glass (glass type) :
{"from", "to", "lines", "at", "top"}titre en verre dépoli. - checklist :
{"from", "to", "title", "items": [{"text", "sub", "at", "sub_at"}]}carte qui grandit élément par élément, cases cochées dessinées àat. - wall (headline wall) :
{"from", "to", "items": [...], "every": 0.06}tuiles de noms de fichiers / titres qui s’empilent ; placez un titre en verre par-dessus. - orbit :
{"from", "to", "seg", "text": "1000 ABONNÉS · ", "speed", "scale", "tilt", "lift"}anneau de texte autour de la tête sur un segmentcut; la moitié arrière passe derrière la personne. Idéal sur un selfie rapproché. - doodles (doodle boil) :
{"kind": "text"|"circle"|"underline"|"strike"|"arrow", "at", "to", "x", "y", …}— text :text, size, rot, write; circle/strike :w, h(strikenzigzags ; 3 maintient le mot lisible) ; underline :w; arrow :x2, y2, bend;color,width. Encre d’accentuation avec un halo crème, écrit de gauche à droite, vacillant toutes les 3 images. Conservez-les au-dessus de y ≈ 1000 pendant que la carte d’accroche est affichée, et hors des visages.
Segments
- chemins : relatifs au dossier du reel, puis au répertoire courant, puis au dépôt. Les photos HEIC/JPG via
imgsont acceptables. ssdébut dans le clip,dursecondes ;pos0–1 cadrage horizontal pour les sources larges ;crop [x, y, size]= recadrage incrusté de l’image droite (reste net à partir de 4K) ;rate< 1 = ralenti lorsqu’une seule petite partie est utilisable.- cut :
true= masques de personne macOS Vision pour ce segment (reelsmith masks, ~0,2 s/image, mis en cache). Nécessaire pour cover et orbit. - in :
"zoom"(le plan sortant se précipite avec flou, le nouveau arrive depuis un zoom) ou"whip"(diapositive floue rapide, sans bords noirs). Utilisez sur 4–6 coupes clés, pas sur chaque coupe. - look :
""film chaud ·"memory"zoom traversé fané pour les montages photos (dateajoute un tampon de date d’appareil photo orange) ·"bw"noir et blanc (la musique s’étouffe) ·"burst"gris → éclosion de couleur (la musique s’ouvre). - move :
push(push-in lent par défaut) ·tilt-up·pull-out·none.
Son et couleur
- music :
"synth"(une nappe lo-fi générée, façonnée par les looks — acceptable comme placeholder, les créateurs préfèrent généralement une piste réelle), un chemin vers un fichier audio dont vous avez les droits, ounull. Le son original du clip n’est jamais utilisé. - music_gain : par défaut 0,16 sous la voix (sidechain-ducked).
- colors :
{"accent": "#D4573A", "cream": "#F4EFE6", "ink": "#1F1A17"}(valeurs par défaut : beige / terre cuite).
Règles issues de retours réels
- Les effets doivent être lisibles sur un téléphone au premier visionnage : grands, de couleur d’accentuation, animés. Des petits doodles crème et un panneau de verre faible étaient "où sont les effets ?".
- Pas de flashs blancs répétés sur les coupes. Coupez le son original du clip. 3–5 techniques par reel, pas toutes.
- Ne placez jamais de texte, cartes ou doodles en travers des yeux ; déplacez la carte ou recadrez le plan.
- Vérifiez les écrans et arrière-plans des clips en pleine résolution : messages d’autres personnes, plaques d’immatriculation, noms de rues, tableaux de bord privés → sautez ces secondes.
- Nouveau contenu à chaque reel (
used_footage.md). Demandez avant d’utiliser des plans avec les visages d’autres personnes.