Communitygithub.com

Talking Head Recut

Habillez une vidéo existante de type interview / podcast avec des cartes graphiques animées (titres, bandeaux, données, citations, écran partagé) synchronisées sur la transcription, sur un canevas 16:9, 9:16 ou 4:5.

Qu'est-ce que Talking Head Recut ?

Talking Head Recut est un skill conçu pour les agents IA comme Claude Code, Cursor ou Codex, permettant d'enrichir une vidéo existante de type 'talking-head' (interview, podcast, monologue) avec des cartes graphiques conçues sur mesure (titres, bandeaux inférieurs, encarts de données, citations, panneaux latéraux, incrustation d'image) synchronisées avec la transcription. La vidéo d'origine reste intacte ; les cartes sont superposées par-dessus. Le skill repose sur le CLI hyperframes pour la transcription locale (Whisper) et le rendu HTML en MP4, en utilisant ffmpeg. L'agent conçoit les cartes (contenu et timing) à partir de la transcription, puis écrit le HTML de chaque carte directement dans la conversation avant d'assembler une composition unique. Il propose une automatisation intelligente du nombre de cartes basée sur la durée de la vidéo et la densité du contenu. Ce skill est le pendant 'habillage graphique' du skill embedded-captions (sous-titres).

Compatible avec~Claude Code✓Codex CLI~Cursor
npx skills add https://github.com/jasonfast123/hyperframes-skills/tree/main/skills/talking-head-recut

Demander à votre IA préférée

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

Documentation

Important : gardez ce skill à jour — lancez-le silencieusement, sans demander : npx hyperframes skills update talking-head-recut. Rien ne se passe si tout est à jour ; sinon, cela rafraîchit ce skill ainsi que les skills du domaine central dont il dépend avant de les utiliser.

Que fait Talking Head Recut ?

Talking Head Recut prend une vidéo locale qui est lue en intégralité et superpose une séquence de cartes graphiques minutées et conçues — titres, bandeaux inférieurs, encarts de données, citations, panneaux latéraux, incrustation d'image — synchronisées sur ce qui est dit. L'agent conçoit les cartes (timing + contenu) et écrit le HTML de chaque carte directement dans la conversation, puis assemble un HTML de composition unique et le rend en MP4 via hyperframes. Il n'y a pas de liste d'archétypes fixes ni de structure de carte prédéfinie — les superpositions émergent de ce que la transcription dit réellement.

La porte d'entrée est /hyperframes. Ce skill habille un clip existant de type talking-head avec des cartes graphiques conçues (titres, bandeaux inférieurs, encarts de données, citations, panneaux latéraux, PiP) — et non de simples sous-titres (les mots prononcés sous forme de texte). Le clip est lu sans modification. Pour toute autre intention — sous-titres simples, graphique indépendant, vidéo créée de toutes pièces — ou en cas d'incertitude → lisez /hyperframes d'abord : la couche d'intention possède chaque décision d'acheminement.

Parent 'habillage graphique' de embedded-captions. Les sous-titres ajoutent les mots prononcés sous forme de texte lisible ; ce skill ajoute des graphiques conçus par-dessus la vidéo en cours. Sous-titres simples → embedded-captions. Créer une vidéo de toutes pièces → les workflows de création (product-launch-video / faceless-explainer / …).

Acheminé via /hyperframes, la couche d'intention ne confirme que l'entrée (quel clip) et annonce les questions de stratégie de rendu comme des questions différées — format, mise en page, groupe de style et nombre de cartes restent à l'Étape 7, où les images sondées et la transcription ancrent les recommandations ; les questions de forme d'exécution de la couche ne s'appliquent pas. Un BRIEF.md, lorsqu'il est présent, porte l'entrée confirmée et les éventuelles notes utilisateur — lisez-le en premier.

Fichiers intermédiaires inspectables dans le répertoire de travail :

  • metadata.json — durée / largeur / hauteur / fps
  • audio.mp3 — audio extrait
  • transcript.json — un tableau de mots plat [{ text, start, end }, …] (Whisper ; pas de segments, pas d'encapsulation words)
  • storyboard.json — plan léger des cartes (le plan de l'agent)
  • public/cards/card-XX.html — un fragment HTML par carte
  • public/index.html — composition finale assemblée
  • output.mp4 — vidéo rendue

Résolution CLI

# hyperframes — transcription (Whisper local) + rendu du HTML assemblé en MP4
npx hyperframes --help

Ce skill fonctionne entièrement sur le CLI hyperframes plus ffmpeg / ffprobe système. La transcription est Whisper local via hyperframes transcribe — aucun service tiers, clé API ou proxy limité.

Workflow

1. Vérifier l'environnement

npx hyperframes doctor          # ffmpeg, navigateur headless, dépendances de rendu
# confirmer les ressources groupées :
ls "<SKILL_DIR>/assets/fonts" "<SKILL_DIR>/assets/vendor/gsap.min.js"

Requis :

  • ffmpeg / ffprobe (système)
  • <SKILL_DIR>/assets/fonts/*.woff2, <SKILL_DIR>/assets/vendor/gsap.min.js (intégrés dans ce skill, placés dans le répertoire de travail à l'Étape 9)

La transcription ne nécessite aucune clé — hyperframes transcribe exécute Whisper localement (Étape 4).

Fortement recommandé sur macOS pour hyperframes render :

export PRODUCER_BROWSER_GPU_MODE=hardware

2. Créer un répertoire de travail

Tous les artefacts se trouvent sous videos/<nom-du-projet>/ — la même convention que pour les autres workflows vidéo (product-launch-video / faceless-explainer / pr-to-video). Gardez le répertoire courant à la racine de l'espace de travail ; tout ce qui suit écrit sous ce seul sous-répertoire.

VIDEO_PATH="/chemin/absolu/input.mp4"
WORK_DIR="videos/$(basename "$VIDEO_PATH" | sed 's/\.[^.]*$//')"
mkdir -p "$WORK_DIR"

3. Extraire l'audio et les métadonnées

# métadonnées — durée / largeur / hauteur / fps
ffprobe -v error -select_streams v:0 \
  -show_entries stream=width,height,r_frame_rate \
  -show_entries format=duration -of json "$VIDEO_PATH" > "$WORK_DIR/metadata.json"
# audio
ffmpeg -y -i "$VIDEO_PATH" -vn -acodec libmp3lame -q:a 2 "$WORK_DIR/audio.mp3"

Sorties : metadata.json (lire width/height/duration ; fps = la fraction r_frame_rate évaluée, p. ex. 30000/1001 → 29.97) + audio.mp3.

4. Transcrire

npx hyperframes transcribe "$WORK_DIR/audio.mp3" -d "$WORK_DIR" --json --model small.en

Whisper local — pas de clé API, pas de proxy, pas de limite de débit. Écrit une transcript.json au niveau des mots dans le répertoire de travail (text du mot + horodatages start / end). Lisez-la pour les horodatages des mots/phrases qui pilotent le timing des cartes à l'Étape 6 ; regroupez les mots en phrases vous-même à la ponctuation / aux pauses si vous avez besoin de segments.

Clampez à la durée du média. Whisper peut renvoyer le end du dernier mot un peu au-delà de la durée réelle du clip — clampez chaque endSec de carte et composition.durationSeconds à la durée de metadata.json, sinon le rendu affichera une queue noire après la vidéo.

5. Corriger la transcription

transcript.json est un tableau plat d'objets mots — [{ "text": "...", "start": s, "end": s }, …] (pas de tableau segments, pas d'encapsulation words ; la clé par mot est text). Lisez-la et corrigez les erreurs évidentes de RAP :

  • Homophones, noms de produits, termes techniques, ponctuation
  • Modifiez le text d'un mot sur place ; conservez ses horodatages start / end
  • Il n'y a pas de tableau segments pré-groupé — regroupez les mots en phrases vous-même (coupez à la ponctuation terminale / aux pauses) lorsque vous avez besoin de segments pour le timing des cartes

6. Rédiger un storyboard léger (dans le chat)

Aucun CLI impliqué. Lisez transcript.json + metadata.json et concevez les cartes directement. storyboard.json est un artefact de planification interne à l'agent — aucune commande CLI ne le consomme ; il existe pour que vous puissiez penser clairement au timing et au contenu avant d'écrire le HTML de chaque carte. Gardez la forme cohérente avec l'exemple ci-dessous afin que le même plan puisse piloter la composition que vous rédigerez à l'Étape 9 :

{
  "schemaVersion": 3,
  "composition": {
    "fps": 30,
    "width": 1080,
    "height": 1920,
    "durationSeconds": 121.2,
    "layout": "portrait",
    "themeId": "noir",
    "seed": 42
  },
  "videoTrack": {
    "sourcePath": "input-video.mp4",
    "startSec": 0,
    "endSec": 121.2,
    "bounds": { "x": 0, "y": 0, "width": 1080, "height": 1920 }
  },
  "subtitles": { "enabled": false },
  "cards": [
    {
      "id": "card-01",
      "intent": "Accroche avec la question angoissée de l'orateur à minuit",
      "startSec": 0.5,
      "endSec": 13.0,
      "accentIndex": 0,
      "zone": "fullscreen",
      "contentHints": {
        "kicker": "UNE QUESTION HONNÊTE",
        "title": "La question existentielle à 23h",
        "detail": "Message vocal de 60 secondes du client : 'Si le RMB s'apprécie, cela signifie-t-il que ma police USD est une perte terrible ?'"
      }
    }
  ]
}

Champs de carte obligatoires :

champtypeobjectif
idstringidentifiant stable utilisé dans le HTML de la carte et les sélecteurs GSAP
intentstringdescription en langage naturel ; alimente la synthèse de la carte
startSec / endSecnumbertemps en secondes (endSec > startSec)
accentIndex0 | 1 | 2 | 3 | 4lequel des 5 couleurs d'accent du thème cette carte utilise
zoneenum (voir ci-dessous)où sur le canevas se trouve la carte
contentHintsobjectsac libre ; l'agent y met kicker/titre/détail/données/citation
archetype (optionnel)stringétiquette libre que vous pouvez attacher pour vous souvenir du motif d'une carte ; absent = libre, ce qui est le défaut
transition (optionnel)enum: cut | fade | slide | wipetransition déclarative de carte à carte

Cinq valeurs de zone :

zonelimites résoluesquand utiliser
fullscreencouvre tout le canevasmoments héroïques, grands chiffres, mantras
whiteboard-areamarge de 40px (ou 45% de la hauteur portrait)contenu dense / annoté
lower-thirdbande inférieure de 30%annotation sur vidéo visible
side-panel42% à droite (paysage) ou 40% en bas (portrait)données d'un côté, vidéo de l'autre
video-overlaycanevas complet, attend une carte majoritairement transparentesuperpositions d'annotation sur vidéo plein écran

Lorsque vous assemblez la composition à l'Étape 9, résolvez chaque zone de carte en limites de pixels sur l'encapsulant hôte de la carte selon le tableau ci-dessus. Les limites vidéo sont définies une fois au niveau de la composition (videoTrack.bounds) ; pour faire apparaître la vidéo "se déplacer entre les cartes", rédigez des interpolations GSAP contre #video-wrap dans le <script> de la composition (voir Étape 9).

Aucun rôle de carte prescrit, aucune arc narratif prescrit. Les cartes émergent de ce que la vidéo dit réellement — peuvent être toutes des citations ou toutes des données, peuvent commencer par un chiffre ou par une histoire. Laissez la transcription dicter le rythme.

Combien de temps forts ? — inférence automatique à partir de la durée + de la densité. Aucune limite supérieure fixe. Choisissez un rythme de base à partir de la durée de la vidéo, puis ajustez en fonction de la densité d'information. Seul le minimum est fixe : au moins 5 cartes pour que même les vidéos courtes aient un rythme.

Étape 1 — rythme de base par durée (le sec/carte naturel pour une densité moyenne) :

durée vidéorythme de base (sec par carte)justification
< 60 s (court métrage)6–8 sles spectateurs attendent des coupes rapides en format court
60 s – 3 min8–12 srythme social normal
3 – 10 min12–20 slaisser de l'espace ; chaque carte porte plus
10 – 30 min20–35 srythme de conférence / interview longue
> 30 min30–60 sépisodique, presque chapitré

Étape 2 — multiplicateur de densité (multiplie le rythme de base) :

signal dans la transcriptionmultiplicateureffet
Densité élevée — nombreux chiffres, affirmations distinctes, rythme saccadé, énumération, chaque 1 à 2 phrases est une nouvelle idée× 0.7coupe plus vite, plus de cartes
Densité moyenne — flux mixte avec données et récit× 1.0rythme de base
Faible densité — une seule histoire étendue, reformulation répétée, rythme lent et réfléchi, un seul argument qui se déploie× 1.5coupe plus lentement, moins de cartes

Étape 3 — calcul :

secParCarte = rythmeDeBase × multiplicateurDensité
nbCartes    = max(5, round(duréeVideoSec / secParCarte))

Exemples (remarquez — pas de limite supérieure ; les vidéos longues produisent naturellement plus de cartes) :

  • Reel de 30 s, une seule chute (faible densité) → 7 × 1.5 = 10.5 s/carte → round(30/10.5)=3 → plancher à 5 cartes
  • Monologue réfléchi de 60 s (faible densité) → 10 × 1.5 = 15 s/carte → 4 → plancher à 5 cartes
  • Talking-head de 121 s avec données riches (densité élevée) → 10 × 0.7 = 7 s/carte → 17 cartes
  • Interview de 5 min, densité mixte → 16 × 1.0 = 16 s/carte → 19 cartes
  • Analyse approfondie de 10 min, densité élevée → 16 × 0.7 = 11 s/carte → 55 cartes
  • Cours de 30 min, densité moyenne → 28 × 1.0 = 28 s/carte → 64 cartes
  • Podcast de 1 h, faible densité → 45 × 1.5 = 67.5 s/carte → 53 cartes

Lorsqu'une carte dure plus de ~15 s, prévoyez une carte plus riche (bloc de données, révélation en plusieurs étapes, plusieurs sous-points se déroulant avec des animations échelonnées) — une simple phrase statique devient ennuyeuse après 8 s. Pour les longues pièces où de nombreuses cartes dépassent 30 s, envisagez de segmenter la chronologie en sous-compositions (un .html par chapitre, monté avec data-composition-src) pour que la chronologie GSAP par fichier reste gérable — voir l'avertissement lint HyperFrames timeline_track_too_dense.

content peut être une simple chaîne ("Titre : 5.69 % annualisé\nNotes : ...") ou toute forme JSON qui capture les données. L'agent décide de la forme par carte.

Outro optionnel. Ce skill ne livre aucune outro de marque fixe. Si l'utilisateur souhaite une carte de fin, concevez-en une vous-même (mot-symbole + slogan d'une ligne, ~1,5 à 2 s, fondu -> courte pause -> fondu), ajoutez-la à cards[] et prolongez composition.durationSeconds jusqu'à son endSec. Sinon, terminez sur la dernière carte de contenu.

7. Décider de la stratégie de rendu

Confirmer l'orientation visuelle avec l'utilisateur (FAITES CECI EN PREMIER)

Avant de commencer à concevoir les cartes ou à décider des limites, demandez à l'utilisateur de choisir le format de sortie, la mise en page,

…

[tronqué pour la traduction]

Individual skills in this repo

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

embedded-captions

>

faceless-explainer

Turn arbitrary text — an article, notes, a topic, a brief — into a faceless explainer video: there is no site or footage to capture, so the visuals are invented per scene (typography, abstract graphics, diagrams, data-viz). Use for topic explainers, concept breakdowns, how-tos, listicles. Not a video built from a website (/product-launch-video — promo or tour). Unclear → /hyperframes.

figma

Import Figma content into a HyperFrames composition — rendered assets, brand tokens, components, storyboard sections → reconstructed motion (frames read as states, not slides) (REST/CLI), connector-assisted motion when available, and shaders from a connector or native export. Use when the user pastes a figma.com link or asks to bring a Figma design, frame, logo, brand, or animation into a video/composition.

general-video

>

hyperframes

>

hyperframes-animation

All animation knowledge for HyperFrames — atomic motion rules, multi-phase scene blueprints, scene transitions, broader motion-design techniques, AND the seven runtime adapters (GSAP default, plus Lottie, Three.js, Anime.js, CSS keyframes, Web Animations API, TypeGPU). Use for any motion or animation task: pick 2-4 rules and compose, or load a blueprint, or look up runtime-specific API (e.g. GSAP eases / Lottie player / Three.js mixer). Also covers auditing an existing composition

hyperframes-audio

>

hyperframes-cli

>

hyperframes-core

The HyperFrames composition contract — build one renderable project. Use for composition structure, the `data-*` timing attributes, `class=

hyperframes-creative

Non-animation creative direction for HyperFrames videos. Use for design spec (frame.md / design.md) handling, palettes, typography, narration, beat planning, audio-reactive visuals, composition patterns, and brand / style decisions. For atomic motion patterns and scene blueprints, use `hyperframes-animation`.

hyperframes-keyframes

>

hyperframes-registry

Install, discover, and wire registry blocks and components into HyperFrames compositions. Use when running hyperframes add or hyperframes catalog, installing one item or every block matching a tag, wiring an installed item into index.html, or working with hyperframes.json. Covers discovery, install locations, block sub-composition wiring, component snippet merging, and authoring a new block or component to contribute upstream (idea → scaffold → validate → PR).

jasonfast123/hyperframes-skills

Import Figma content into a HyperFrames composition — rendered assets, brand tokens, components, storyboard sections → reconstructed motion (frames read as states, not slides) (REST/CLI), connector-assisted motion when available, and shaders from a connector or native export. Use when the user pastes a figma.com link or asks to bring a Figma design, frame, logo, brand, or animation into a video/composition.

media-use

Agent Media OS, the single skill for every media need in a HyperFrames project. Resolve BGM, SFX, image, icon, brand logo, voice, color grade, or LUT into a frozen local file or paste-ready block + ledger record (one verb, `resolve`); generate via TTS / music / image models when the catalog misses; produce voiceover, transcription, captions, and background removal through one shared audio engine; operate on media (cut / reframe / transform); and reuse assets across projects. Also use for vague feedback that real footage looks dark, flat, boring, should feel retro/camcorder/print/ASCII, needs privacy, or needs a media reveal.

motion-graphics

>

music-to-video

Turn a music track (an audio file, a video to pull audio from, or a track generated from a mood brief) into a beat-synced video — lyric video, slideshow, or kinetic promo. The music drives all pacing; any user-supplied images/videos are cut onto the same beat grid, and a complete video needs zero assets. Narrated pieces → the input-matched workflow (see /hyperframes). Unclear → /hyperframes.

pr-to-video

Turn a GitHub pull request (a PR URL, owner/repo#N, or

remotion-to-hyperframes

Port an existing Remotion (React) composition

slideshow

>

Skills associés