Communitygithub.com

Talking Head Recut

Ein vorhandenes Talking-Head-, Interview- oder Podcast-Video mit zeitlich abgestimmten, gestalteten Grafik-Overlay-Karten versehen – animierte Titel, Lower-Thirds, Daten-Callouts, Zitate, Seitenpanels, Bild-in-Bild – synchron zum Transkript, auf einer 16:9-/9:16-/4:5-Leinwand Ihrer Wahl; das Video läuft darunter unberührt. Auslöser ist der Intent.

Was ist Talking Head Recut?

Talking Head Recut ist ein Skill für KI-Agenten (z. B. Claude Code, Cursor, Codex), der ein vorhandenes Talking-Head-Video lokal verarbeitet und mit einer Sequenz von gestalteten Grafik-Overlay-Karten überlagert. Der Skill ist nützlich für die Erstellung von professionell wirkenden Social-Media-Clips, Video-Podcast-Ausschnitten oder Interview-Highlights. Er unterstützt die Seitenverhältnisse 16:9, 9:16 und 4:5 und verwendet die hyperframes-CLI für die lokale Transkription (Whisper) und das Rendering. Der Agent analysiert das Video, extrahiert das Transkript, entwirft Karten (Titel, Lower-Thirds, Daten-Callouts, Zitate, Seitenpanels, Bild-in-Bild) und generiert direkt HTML/GSAP-Animationen, die dann zu einem MP4-Video zusammengesetzt werden.

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

In Ihrer bevorzugten KI fragen

Öffnet einen neuen Chat, in dem dieser Agent-Skill bereits geladen ist.

Dokumentation

Aktualisieren Sie diesen Skill zuerst im Hintergrund (lautlos, ohne Rückfrage): npx hyperframes skills update talking-head-recut. Ein schneller No-Op, wenn alles aktuell ist; andernfalls aktualisiert es diesen Skill sowie die davon abhängigen Kern-Domain-Skills, bevor Sie sich auf sie stützen.

Was macht Talking Head Recut?

Talking Head Recut nimmt ein lokales Video, das vollständig abgespielt wird, und legt eine Sequenz von zeitlich abgestimmten, gestalteten Grafikkarten darüber – Titel, Lower-Thirds, Daten-Callouts, Zitate, Seitenpanels, Bild-in-Bild – synchron zum Gesprochenen. Der Agent entwirft die Karten (Timing + Inhalt) und schreibt das HTML jeder Karte direkt im Chat, setzt dann eine einzelne Komposition HTML zusammen und rendert sie über hyperframes in MP4. Es gibt keine feste Archetypliste und keine vorgeschriebene Kartenstruktur – die Overlays ergeben sich aus dem, was das Transkript tatsächlich sagt.

Der Eingang ist /hyperframes. Dieser Skill verpackt einen vorhandenen Talking-Head-Clip mit gestalteten Grafikkarten (Titel, Lower-Thirds, Daten-Callouts, Zitate, Seitenpanels, PiP) – nicht einfache Untertitel (der gesprochene Text als solcher). Der Clip läuft unberührt. Jede andere Absicht – einfache Untertitel, eine eigenständige Grafik, ein Video von Grund auf – oder jegliche Unsicherheit → lesen Sie zuerst /hyperframes: Die Intent-Ebene trifft alle Routenentscheidungen.

Grafik-Overlay-Geschwister von embedded-captions. Captions fügen die gesprochenen Wörter als lesbare Untertitel hinzu; dieser Skill fügt gestaltete Grafiken über das laufende Video. Einfache Untertitel → embedded-captions. Ein Video von Grund auf erstellen → die Erstellungs-Workflows (product-launch-video / faceless-explainer / …).

Über /hyperframes geroutet, bestätigt die Intent-Ebene nur die Eingabe (welcher Clip) und kündigt die Render-Strategie-Fragen als aufgeschobene Anfragen an – Seitenverhältnis, Layout, Stilgruppe und Kartenanzahl bleiben bei Schritt 7, wo das untersuchte Filmmaterial und Transkript die Empfehlungen stützen; die Run-Shape-Fragen der Ebene gelten nicht. Ein BRIEF.md, falls vorhanden, enthält die bestätigte Eingabe und etwaige Benutzernotizen – lesen Sie es zuerst.

Insektierbare Zwischendateien im Arbeitsverzeichnis:

  • metadata.json – Dauer / Breite / Höhe / fps
  • audio.mp3 – extrahierter Ton
  • transcript.json – ein flaches Wortarray [{ text, start, end }, …] (Whisper; kein segments, kein words Wrapper)
  • storyboard.json – leichter Kartenentwurf (der Plan des Agenten)
  • public/cards/card-XX.html – ein HTML-Fragment pro Karte
  • public/index.html – endgültige zusammengesetzte Komposition
  • output.mp4 – gerendertes Video

CLI-Auflösung

# hyperframes – Transkription (lokales Whisper) + Rendern des zusammengesetzten HTML in MP4
npx hyperframes --help

Dieser Skill läuft vollständig auf der hyperframes-CLI plus systemeigenem ffmpeg / ffprobe. Die Transkription erfolgt lokal über Whisper via hyperframes transcribe – kein Drittanbieter-Dienst, kein API-Schlüssel, kein ratenbegrenzter Proxy.

Arbeitsablauf

1. Umgebung prüfen

npx hyperframes doctor          # ffmpeg, Headless-Browser, Render-Abhängigkeiten
# gebündelte Assets bestätigen:
ls "<SKILL_DIR>/assets/fonts" "<SKILL_DIR>/assets/vendor/gsap.min.js"

Erforderlich:

  • ffmpeg / ffprobe (systemweit)
  • <SKILL_DIR>/assets/fonts/*.woff2, <SKILL_DIR>/assets/vendor/gsap.min.js (in diesem Skill gebündelt, werden in Schritt 9 in das Arbeitsverzeichnis kopiert)

Für die Transkription wird kein Schlüssel benötigt – hyperframes transcribe führt Whisper lokal aus (Schritt 4).

Auf macOS für hyperframes render stark empfohlen:

export PRODUCER_BROWSER_GPU_MODE=hardware

2. Arbeitsverzeichnis erstellen

Alle Artefakte liegen unter videos/<Projektname>/ – dieselbe Konvention wie bei den anderen Video-Workflows (product-launch-video / faceless-explainer / pr-to-video). Behalten Sie das cwd im Workspace-Root; alles unten Geschriebene wird unter diesem einen Unterverzeichnis abgelegt.

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

3. Audio und Metadaten extrahieren

# Metadaten – Dauer / Breite / Höhe / 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"

Ausgaben: metadata.json (width/height/duration lesen; fps = der r_frame_rate-Bruch ausgewertet, z. B. 30000/1001 → 29.97) + audio.mp3.

4. Transkribieren

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

Lokales Whisper – kein API-Schlüssel, kein Proxy, keine Ratenbegrenzung. Schreibt ein wortgenaues transcript.json in das Arbeitsverzeichnis (Wort text + start / end Zeitstempel). Lesen Sie es für die Wort-/Satzzeiten, die das Karten-Timing in Schritt 6 steuern; gruppieren Sie Wörter selbst an Satzzeichen / Pausen in Sätze, wenn Sie segmentgenaue Blöcke benötigen.

An Mediendauer anpassen. Whisper kann das end des letzten Wortes ein winziges Stück über die tatsächliche Cliplänge hinaus zurückgeben – begrenzen Sie jedes Karten-endSec und composition.durationSeconds auf die Dauer in metadata.json, sonst zeigt der Render einen schwarzen Balken nach dem Video.

5. Transkript korrigieren

transcript.json ist ein flaches Array von Wortobjekten – [{ "text": "...", "start": s, "end": s }, …] (kein segments-Array, kein words-Wrapper; der Schlüssel pro Wort ist text). Lesen Sie es und korrigieren Sie offensichtliche ASR-Fehler:

  • Homophone, Produktnamen, Fachbegriffe, Zeichensetzung
  • Bearbeiten Sie den text eines Wortes an Ort und Stelle; bewahren Sie seine start/end-Zeitstempel
  • Es gibt kein vorgegruppiertes segments-Array – gruppieren Sie Wörter selbst in Sätze (teilen Sie an Satzzeichen / Pausen), wenn Sie segmentgenaue Blöcke für das Karten-Timing benötigen

6. Leichtes Storyboard entwerfen (im Chat)

Keine CLI beteiligt. Lesen Sie transcript.json + metadata.json und entwerfen Sie Karten direkt. storyboard.json ist ein agenteninternes Planungsartefakt – kein CLI-Befehl verarbeitet es; es existiert, damit Sie klar über Timing und Inhalt nachdenken können, bevor Sie das HTML jeder Karte schreiben. Halten Sie die Form konsistent mit dem folgenden Beispiel, damit derselbe Entwurf die Komposition steuern kann, die Sie in Schritt 9 verfassen:

{
  "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": "Aufhänger mit der ängstlichen Mitternachtsfrage des Sprechers",
      "startSec": 0.5,
      "endSec": 13.0,
      "accentIndex": 0,
      "zone": "fullscreen",
      "contentHints": {
        "kicker": "EINE EHRLICHE FRAGE",
        "title": "Die seelensuchende Frage um 23 Uhr",
        "detail": "60-Sekunden-Sprachnachricht des Kunden: 'Wenn der RMB aufwertet, bedeutet das dann, dass meine USD-Police ein schrecklicher Verlust ist?'"
      }
    }
  ]
}

Erforderliche Kartenfelder:

FeldTypZweck
idstringstabile ID, in Karten-HTML und GSAP-Selektoren verwendet
intentstringBeschreibung in natürlicher Sprache; an die Kartensynthese weitergegeben
startSec / endSecnumberZeiten in Sekunden (endSec > startSec)
accentIndex0 | 1 | 2 | 3 | 4Welche der 5 Themenakzentfarben diese Karte verwendet
zoneenum (siehe unten)Wo auf der Leinwand die Karte platziert wird
contentHintsobjectFreiform-Beutel; Agent legt hier kicker/title/detail/data/quote ab
archetype (optional)stringFreiform-Label, das Sie anhängen können, um sich an ein Kartenmuster zu erinnern; fehlend = Freiform, was der Standard ist
transition (optional)enum: cut | fade | slide | wipeDeklarativer Karten-zu-Karten-Übergang

Fünf zone-Werte:

zoneaufgelöste GrenzenVerwendung
fullscreendeckt die gesamte Leinwand abHeldenmomente, große Zahlen, Mantras
whiteboard-area40px Rand (oder 45% der Hochkant-Höhe)dichte / kommentierte Inhalte
lower-thirduntere 30%-BandeAnnotation über sichtbarem Video
side-panelrechte 42% (Querformat) oder untere 40% (Hochkant)Daten auf einer Seite, Video auf der anderen
video-overlayganze Leinwand, erwartet weitgehend transparente KarteAnnotationen über vollflächigem Video

Wenn Sie die Komposition in Schritt 9 zusammenstellen, lösen Sie die zone jeder Karte gemäß der obigen Tabelle in Pixelgrenzen auf dem Karten-Host-Wrapper auf. Videogrenzen werden einmalig auf Kompositionsebene gesetzt (videoTrack.bounds); damit das Video zwischen Karten zu „wandern“ scheint, verfassen Sie GSAP-Tweens gegen #video-wrap im <script> der Komposition (siehe Schritt 9).

Keine vorgeschriebenen Kartenrollen, kein vorgeschriebener Erzählbogen. Karten ergeben sich daraus, was das Video tatsächlich sagt – könnten nur Zitate oder nur Daten sein, könnten mit einer Zahl oder einer Geschichte beginnen. Lassen Sie das Transkript den Rhythmus bestimmen.

Wie viele Karten? – automatisch aus Dauer + Dichte ableiten. Keine feste Obergrenze. Wählen Sie ein Basistempo aus der Videodauer, passen Sie es dann an die Informationsdichte an. Nur Untergrenze ist fest: mindestens 5 Karten, damit auch kurze Videos Rhythmus haben.

Schritt 1 – Basistempo nach Dauer (die natürlichen s/Karte für mittlere Dichte):

VideodauerBasistempo (s pro Karte)Begründung
< 60s (kurzer Reel)6–8sZuschauer erwarten schnelle Schnitte im Kurzformat
60s – 3 Min8–12snormales Social-Media-Tempo
3 – 10 Min12–20smehr Raum zum Atmen; jede Karte trägt mehr
10 – 30 Min20–35slanges Format (Vortrag / Interview) Rhythmus
> 30 Min30–60sepisodisch, fast kapitelartig

Schritt 2 – Dichtemultiplikator (multipliziert das Basistempo):

Signal im TranskriptMultiplikatorEffekt
Hohe Dichte – viele Zahlen, unterschiedliche Behauptungen, abgehacktes Tempo, aufzählungsartige Aufzählung, alle 1–2 Sätze eine neue Idee× 0,7kürzere Schnitte, mehr Karten
Mittlere Dichte – gemischter Fluss mit Daten und Erzählung× 1,0Basistempo
Niedrige Dichte – eine ausgedehnte Geschichte, wiederholte Umrahmung, langsames reflektierendes Tempo, einzelnes sich entfaltendes Argument× 1,5langsamere Schnitte, weniger Karten

Schritt 3 – Berechnen:

secPerCard = Basistempo × Dichtemultiplikator
cardCount  = max(5, round(VideodauerSec / secPerCard))

Beispiele (beachten Sie – keine obere Grenze; lange Videos erzeugen natürlich mehr Karten):

  • 30s Reel, einzelner Punchline (niedrige Dichte) → 7 × 1,5 = 10,5s/Karte → round(30/10,5)=3 → auf 5 Karten aufgestockt
  • 60s reflektierender Monolog (niedrige Dichte) → 10 × 1,5 = 15s/Karte → 4 → auf 5 Karten aufgestockt
  • 121s Talking-Head mit reichhaltigen Daten (hohe Dichte) → 10 × 0,7 = 7s/Karte → 17 Karten
  • 5 Min Interview, gemischte Dichte → 16 × 1,0 = 16s/Karte → 19 Karten
  • 10 Min Deep-Dive, hohe Dichte → 16 × 0,7 = 11s/Karte → 55 Karten
  • 30 Min Vorlesung, mittlere Dichte → 28 × 1,0 = 28s/Karte → 64 Karten
  • 1 Std Podcast, niedrige Dichte → 45 × 1,5 = 67,5s/Karte → 53 Karten

Wenn eine Karte länger als ~15s hält, planen Sie eine reichhaltigere Karte (Datenblock, mehrstufige Enthüllung, mehrere Unterpunkte, die sich mit gestaffelten Animationen entfalten) – ein statischer Einzeiler wird nach 8s langweilig. Für lange Stücke, bei denen viele Karten 30s überschreiten, sollten Sie die Zeitleiste in Unterkompositionen aufteilen (eine .html pro Kapitel, montiert mit data-composition-src), damit die GSAP-Zeitleiste pro Datei handhabbar bleibt – siehe die timeline_track_too_dense HyperFrames-Lint-Warnung.

content kann ein einfacher String sein („Titel: annualisierte 5,69%\nNotizen: …“) oder eine beliebige JSON-Form, die die Daten erfasst. Der Agent entscheidet über die Form pro Karte.

Optionaler Abspann. Dieser Skill liefert keinen festen Brand-Abspann. Wenn der Benutzer eine Schlusskarte wünscht, entwerfen Sie selbst eine neutrale (Wortmarke + einzeiliger Slogan, ~1,5-2s, Einblenden -> kurzer Halt -> Ausblenden), hängen Sie sie an cards[] an und verlängern Sie composition.durationSeconds bis zu ihrem endSec. Andernfalls enden Sie mit der letzten Inhaltskarte.

7. Render-Strategie festlegen

Visuelle Richtung mit dem Benutzer bestätigen (Zuerst machen)

Bevor Sie mit dem Entwurf von Karten oder der Entscheidung über Grenzen beginnen, fragen Sie den Benutzer nach dem Ausgabe-Seitenverhältnis, dem Layout, …

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

>

Verwandte Skills