Communitygithub.com

Jenesyx/reel-story

À utiliser lorsque l'utilisateur exécute /reel-story, ou demande le montage Reel plein cadre et riche en mouvement — intervenant en plein écran, coupures vers ses propres clips B-roll, stickers et widgets apparaissant sur les mots prononcés, une mascotte, des mots géants derrière l'intervenant, sans sous-titres — sur une prise de vue en plan rapproché dans raw/.

Qu'est-ce que reel-story ?

Cette compétence, dédiée aux agents AI de type Claude Code, Cursor ou Codex, permet la génération automatisée de vidéos Reel (montage « Story ») pleine image pour les réseaux sociaux. L'agent orchestre l'ensemble du pipeline de post‑production : depuis l'analyse de la prise de vue (ffprobe, et contact sheet avec ffmpeg), la transcription avec Whisper, le suivi de visage, la sélection des clips B‑roll à partir d'un catalogue, la rédaction d'une « beat sheet » synchronisée aux mots, jusqu'au rendu final avec effet de matte et animations complexes. L'utilisateur n'a qu'à fournir le nom de la prise et le sujet ; l'agent pose les questions nécessaires en un seul message, puis exécute les étapes en arrière‑plan avec vérifications intermédiaires. La vidéo produite alterne coupures B‑roll (25‑30 % du temps), moments de profondeur (mots géants derrière l'intervenant), graphismes plein écran et bulle flottante pour l'intervenant, sans jamais de sous‑titres continus. Le système est conçu pour être robuste face aux sources HDR, aux erreurs de transcription et aux bugs connus du moteur (hyperframes, GSAP), avec des règles précises de sécurité d'affichage (zones de texte, flips, RTL pour le farsi/arabe).

Compatible avec~Claude Code~Codex CLI~Cursor
npx skills add https://github.com/Jenesyx/arta-edit-studio/tree/main/.claude/skills/reel-story

Demander à votre IA préférée

Ouvre une nouvelle conversation avec cette compétence d'agent déjà préchargée.

Documentation

Reel — Montage Story (plein cadre avec mouvement)

L'intervenant reste en plein écran. L'histoire est racontée par des coupures vers ses propres clips, des stickers/cartes/widgets qui apparaissent sur les mots prononcés, une mascotte qui réagit, et des moments de profondeur où des mots géants ou un arrière-plan de marque se trouvent derrière l'intervenant (masque de personne). Exemple concret : examples/story/story_stoodi_inviteraw.py.

Arguments : $ARGUMENTS

Valeurs par défaut (modifier uniquement si l'utilisateur le demande)

Lire d'abord reel.config.json (sinon reel.config.example.json).

ÉlémentValeur par défaut
Sous-titresAucun. Les graphiques de mots-clés sont acceptables ; jamais de transcription continue
AudioMix original de la prise, inchangé — finish.py le remuxe. Pas d'effets sonores, pas de musique d'ambiance
PriseSupposer déjà montée, étalonnée, musique ajoutée → ne pas couper ni étalonner. Brute/non montée → demander d'abord
B-rollbroll_dir depuis la configuration ; descriptions dans work/_catalog/<dossier>/NOTES.md
Marquebrand + palette depuis la configuration. Pas de fichiers mascotte → pas de scènes de mascotte
Appel à l'actionMot-clé de commentaire géant à l'écran ; carte « Suivre » = texte @<handle du créateur> uniquement, jamais de visage recadré
Languelanguage depuis la configuration (Whisper + quelle classe de texte utiliser)

Entrées

Le nom de la prise et le sujet proviennent des arguments. Demander une fois, en un seul message, uniquement ce qui manque : la prise est-elle déjà montée/étalonnée/avec musique ; mot-clé de commentaire ; noms ou jargon que Whisper pourrait mal entendre ; clips qu'ils veulent inclure ou exclure.

Pipeline

PY = .venv/Scripts/python.exe -X utf8 (Windows) ou .venv/bin/python -X utf8 (macOS/Linux). Étapes longues en arrière‑plan.

#ÉtapeCommande / actionVérification
1Regarderffprobe la prise ; contact sheet ffmpeg -i raw/<prise> -vf fps=1/5,scale=216:384,tile=9x2 -frames:v 1 work/<prise>/sheet.jpg et regarderespace au-dessus de la tête, texte dans le cadre inversé ?, déjà étalonné ?
2Transcrire$PY tools/transcribe.py <prise> --prompt "<noms, jargon>"relire les noms ; écarts de mots > 3 s → retranscrire cette fenêtre
3Visage$PY tools/face_track.py <prise>affiche FACE = (x, y) et le haut de la tête
4B-roll$PY tools/story_assets.py <prise> catalog ; lire NOTES.md ; regarder les bandes des clips non décrits encore et ajouter leurs lignes dans NOTES.mdIndicateurs HDR / inversé / VFR
5Feuille de rythmeécrire work/<prise>/beats.md : temps | mots | mode | quoi. Règles ci-dessous, techniques dans references/techniques.mdchaque temps fort ancré à un mot
6Masquesi moment de profondeur : $PY tools/story_assets.py <prise> matte (~8 min CPU pour 80 s, arrière‑plan, pas de ffmpeg en parallèle)work/<prise>/matte/fg.webm
7Module de prisecopier examples/story/story_stoodi_inviteraw.py → tools/story_<slug>.py (slug : nom de la prise, non‑alphanumériques → _) ; définir NAME, FACE, BROLL, TILES, MIRRORED, scènes, SCENES (DUR optionnel — détecté). Noms de mascottes = les fichiers dans assets/mascot (minuscules, espaces → -)
8Actifs$PY tools/story_assets.py <prise> all (mascotte, logo, rognages B-roll, tuiles)
9Construction$PY tools/story_build.py <prise> ; dans work/<prise>/sc : npx hyperframes lint public → 0 erreurs (avertissements nested_structure attendus) ; npx hyperframes snapshot public -o ../snaps --no-end --describe false --at <chaque temps fort> ; lire les contact sheets, corriger, reconstruire
10Rendu rapide$PY tools/finish.py <prise> --seconds 12 ; lire work/<prise>/sc/quick_sheet.jpgles superpositions entrent et sortent ; couleurs pas ternes
11Rendu complet$PY tools/finish.py <prise> (~12 min pour 80 s, arrière‑plan) → final/<prise>/, vérifier, qa/sheet.jpglire la sheet image par image
12Rapportchemin, durée, temps forts, clips utilisés, tout élément retourné/re‑mappé tonalement, vérifier le résultat. Si quelque chose de nouveau a été appris, l'ajouter à cette compétence

Règles des temps forts

  • Quelque chose change toutes les 2 à 4 s ; jamais plus d'environ 5 s d'intervenant nu.
  • Mélanger les modes : intervenant + stickers · coupure B-roll (~25–30 % du temps) · moment de profondeur (4–6 par reel) · graphique plein écran avec l'intervenant en bulle facecam (1–2 max).
  • Repère = heure de début du mot prononcé dans transcript.json. Chaque élément part avant le temps fort suivant.
  • Les mots de profondeur vont au-dessus de la tête (haut de la tête depuis l'étape 3) : un mot géant à la fois, le mot précédent s'envole. Les lignes empilées finissent cachées derrière la tête.
  • Zones de sécurité : pas de texte au-dessus de y 150 (en‑tête Instagram) ni en dessous de y 1560 (légende) ; garder x < 960 entre y 1100–1650 (boutons j'aime/commentaire).
  • Les chiffres présentés comme des faits doivent provenir de la prise. Les étiquettes illustratives sont acceptables.
  • Texte farsi/arabe : classe .fa (RTL limité à l'élément — jamais dir="rtl" sur <html>, cela rend en noir), letter-spacing: 0, chiffres via fa(), un grand zéro en latin 0 (le zéro persan est un point). Texte latin : .en ; mots d'affichage géants : .blk.

Contrat du moteur — bugs déjà payés

  • Scène = def scene(c: Comp) : c.clip(calque, id, debut, fin, html, piste), c.broll(nom, a, b, mstart), c.matte(n, a, b), c.j(js...). Calques : under (derrière la bulle), tiles, behind (entre la prise et le masque), fw, broll, over, fx.
  • Les divs de clip reçoivent un id k-<id> ; animer #<id>-i ou des ids internes — jamais un .clip lui‑même.
  • Tout élément qui glisse depuis l'extérieur de l'écran a besoin de autoAlpha:0 dans son état de départ, sinon il apparaît trop tôt.
  • La première interpolation d'un élément définit son état initial (fromTo rend immédiatement) ; interpolations suivantes : .to ou immediateRender:false.
  • Jamais de décalages from:"random" ni Math.random — mélanger l'ordre du DOM en Python avec random.Random(seed).
  • Même propriété, même élément : une interpolation doit se terminer avant que la suivante ne commence (lint overlapping_gsap_tweens).
  • #cam scale/x/y/clipPath/borderRadius pilotent les zooms, la bulle et la mosaïque. Le masque vit à l'intérieur de #cam, donc les moments de profondeur restent alignés à n'importe quelle échelle de caméra.
  • B‑roll de la caméra avant avec texte lisible dans le cadre → ajouter à MIRRORED. Ne jamais inverser la prise principale.
  • Les sources HLG/HDR sont re‑mappées tonalement par story_assets.py. Si finish.py s'arrête sur « HDR auto‑promotion », une source a échappé à ce chemin.
  • hyperframes snapshot n'est pas une preuve du rendu — c'est à cela que sert l'étape 10.

Individual skills in this repo

This repo contains 2 individual skills — each has its own dedicated page.

Skills associés