Communitygithub.com

talking-head-recut

トークヘッド/インタビュー/ポッドキャスト動画に、トランスクリプトに同期したタイミングデザイン済みグラフィックカード(キネティックタイトル、ローワーサード、データコールアウト、引用、サイドパネル、ピクチャーインピクチャー)を重ねるパッケージングを行います。元の動画はそのまま再生され、16:9/9:16/4:5の任意のキャンバスサイズに対応します。

talking-head-recut とは?

Talking Head Recutは、既存のトークヘッド/インタビュー/ポッドキャスト動画を入力として、トランスクリプトに完全に同期した、一連のデザイン済みグラフィックカード(タイトル、ローワーサード、データコールアウト、引用、サイドパネル、ピクチャーインピクチャーなど)を重ねるAIエージェントスキルです。元の動画クリップは一切編集されることなく、そのまま再生されます。このスキルは/hyperframesインテントレイヤーを通じてルーティングされ、エージェントが動画のアスペクト比、レイアウト、スタイルグループ、カード数を決定します。まず、`ffprobe`と`ffmpeg`を使って動画からメタデータと音声を抽出し、`hyperframes transcribe`でWhisperをローカル実行してワードレベルのトランスクリプトを生成します。次に、エージェントはトランスクリプトを分析し、動画の長さと情報密度に基づいてカード数を計算し、軽量なストーリーボードJSONを作成します。その後、エージェントは各カードのHTMLをチャット内で直接作成し、GSAPアニメーションを使用した最終的な合成HTMLをアセンブルし、`hyperframes render`でMP4にレンダリングします。このスキルは、Claude Code、Cursor、Codex、その他のAIコーディングエージェントと互換性があり、`hyperframes` CLI、`ffmpeg`、システムのヘッドレスブラウザのみに依存します。

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

お気に入りのAIに質問する

このエージェントスキルを事前に読み込んだ状態で新しいチャットを開きます。

ドキュメント

まず、このスキルを最新に保ってください — サイレントに実行し、確認は不要です: npx hyperframes skills update talking-head-recut。すべてが最新の場合は高速なno-opで終了します。そうでない場合は、このスキルと、それが依存するコアドメインスキルを、それらに依存する前に更新します。

Talking Head Recut

Talking Head Recutは、ローカル動画をそのままフル再生し、その上に、発言に同期した、タイミング設定済みのデザインされたグラフィックカードのシーケンス(タイトル、ローワーサード、データコールアウト、引用、サイドパネル、ピクチャーインピクチャー)を重ねます。エージェントはカード(タイミングと内容)をデザインし、各カードのHTMLを会話内で直接作成し、単一の合成HTMLをアセンブルして、hyperframes経由でMP4にレンダリングします。固定のアーキタイプリストや所定のカード構造はありません — オーバーレイはトランスクリプトの実際の発言から生成されます。

玄関は/hyperframesです。 このスキルは、既存のトークヘッドクリップを、デザインされたグラフィックカード(タイトル、ローワーサード、データコールアウト、引用、サイドパネル、PiP)でパッケージングします — プレーンなキャプション(発言をテキスト化したもの)ではありません。クリップはそのまま再生されます。 その他の意図 — プレーンな字幕、スタンドアロンのグラフィック、ゼロからの動画作成 — または不確かな場合は、まず/hyperframesを読んでください:インテントレイヤーがすべてのルート決定を担当します。

embedded-captionsのグラフィックパッケージング版です。 キャプションは_発言_を読みやすい字幕として追加しますが、こちらは_デザインされたグラフィック_を再生中の動画の上に追加します。プレーンな字幕 → embedded-captions。ゼロから動画を作成 → 作成ワークフロー(product-launch-video / faceless-explainer / …)。

/hyperframes経由でルーティングされると、インテントレイヤーは入力(どのクリップか)のみを確認し、レンダリング戦略に関する質問(アスペクト、レイアウト、スタイルグループ、カード数)は後回しの質問として告知します。これらはステップ7に留まり、プローブされた映像とトランスクリプトが推奨の根拠となります。レイヤーの実行形状に関する質問は該当しません。BRIEF.mdが存在する場合、確認済みの入力とユーザーノートが含まれているので、最初にそれを読んでください。

ワークディレクトリ内の検査可能な中間ファイル:

  • metadata.json — 長さ / 幅 / 高さ / fps
  • audio.mp3 — 抽出された音声
  • transcript.json — フラットなワード配列 [{ text, start, end }, …](Whisper; segmentsやwordsラッパーはありません)
  • storyboard.json — 軽量なカード概要(エージェントの計画)
  • public/cards/card-XX.html — カードごとのHTMLフラグメント
  • public/index.html — 最終的な合成構成
  • output.mp4 — レンダリングされた動画

CLI 解決

# hyperframes — 文字起こし(ローカルWhisper)+ 合成HTMLのMP4へのレンダリング
npx hyperframes --help

このスキルはhyperframes CLIとシステムのffmpeg / ffprobeのみで動作します。文字起こしはhyperframes transcribeによるローカルWhisperです — サードパーティのサービス、APIキー、レート制限のあるプロキシは不要です。

ワークフロー

1. 環境確認

npx hyperframes doctor          # ffmpeg, ヘッドレスブラウザ, レンダリング依存関係
# バンドルされたアセットを確認:
ls "<SKILL_DIR>/assets/fonts" "<SKILL_DIR>/assets/vendor/gsap.min.js"

必須:

  • ffmpeg / ffprobe(システム)
  • <SKILL_DIR>/assets/fonts/*.woff2, <SKILL_DIR>/assets/vendor/gsap.min.js(このスキル内にバンドルされ、ステップ9でワークディレクトリにステージングされます)

文字起こしはキー不要 — hyperframes transcribeはWhisperをローカルで実行します(ステップ4)。

macOSでhyperframes renderを使用する場合は、以下を強く推奨します:

export PRODUCER_BROWSER_GPU_MODE=hardware

2. ワークディレクトリを作成

すべてのアーティファクトはvideos/<project-name>/の下に配置されます — これは他の動画ワークフロー(product-launch-video / faceless-explainer / pr-to-video)と同じ規則です。カレントワーキングディレクトリはワークスペースルートに保ちます。以下のすべての処理はこの単一のサブディレクトリに書き込まれます。

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

3. 音声とメタデータを抽出

# メタデータ — 長さ / 幅 / 高さ / 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"
# 音声
ffmpeg -y -i "$VIDEO_PATH" -vn -acodec libmp3lame -q:a 2 "$WORK_DIR/audio.mp3"

出力: metadata.json(width/height/durationを読み取ります。fpsはr_frame_rate分数を評価した値、例:30000/1001 → 29.97)+ audio.mp3。

4. 文字起こし

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

ローカルWhisper — APIキー、プロキシ、レート制限は不要。ワードレベルのtranscript.jsonをワークディレクトリに書き込みます(ワードtext + start / endタイムスタンプ)。ステップ6でカードタイミングを決定するために、ワード/文のタイミングを読み取ってください。文末の句読点やポーズで自分で文にグループ化し、必要に応じてセグメントレベルのチャンクを取得します。

メディアの長さにクランプしてください。 Whisperは最終ワードのendを実際のクリップ長よりわずかに超えて返すことがあります。すべてのカードendSecとcomposition.durationSecondsをmetadata.jsonのdurationにクランプしないと、レンダリング時に動画が終わった後に黒いテールが表示されます。

5. トランスクリプトの修正

transcript.jsonはワードオブジェクトのフラット配列です — [{ "text": "...", "start": s, "end": s }, …](segments配列やwordsラッパーはありません。ワードごとのキーは**text**です)。これを読み取り、明らかなASRエラーを修正してください:

  • 同音異義語、製品名、技術用語、句読点
  • ワードのtextをその場で編集してください。start / endタイムスタンプは保持してください
  • 事前にグループ化されたsegments配列はありません — カードタイミングのためにセグメントレベルのチャンクが必要な場合は、自分でワードを文にグループ化してください(文末の句読点/ポーズで分割)

6. 軽量なストーリーボードをドラフト(チャット内)

CLIは関与しません。 transcript.json + metadata.jsonを読み取り、カードを直接デザインしてください。storyboard.jsonはエージェント内部の計画アーティファクトです — これを消費するCLIコマンドはありません。これは、ステップ9で各カードのHTMLを作成する前に、タイミングと内容について明確に考えるために存在します。以下の例と一貫した形状を保ち、同じ概要でステップ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": "話者の不安な深夜の質問でフックする",
      "startSec": 0.5,
      "endSec": 13.0,
      "accentIndex": 0,
      "zone": "fullscreen",
      "contentHints": {
        "kicker": "正直な質問",
        "title": "午後11時の魂の探求",
        "detail": "クライアントの60秒ボイスメッセージ: '人民元が上昇したら、私の米ドル保険は大損ってことですか?'"
      }
    }
  ]
}

必須カードフィールド:

フィールドタイプ目的
id文字列カードHTMLとGSAPセレクタで使用される安定したID
intent文字列自然言語での説明。カード合成に供給される
startSec / endSec数値秒単位の時間(endSec > startSec)
accentIndex0 | 1 | 2 | 3 | 4テーマの5つのアクセントカラーのうち、このカードが使用するもの
zone列挙型(下記参照)カードがキャンバス上のどこに配置されるか
contentHintsオブジェクト自由形式のバッグ。エージェントがkicker/title/detail/data/quoteなどをここに入れる
archetype (オプション)文字列カードのパターンを覚えておくために自由に付けるラベル。省略時=自由形式(デフォルト)
transition (オプション)列挙型: cut | fade | slide | wipe宣言的なカード間トランジション

5つのzone値:

zone解決された境界使用するタイミング
fullscreenキャンバス全体を覆うヒーローモーメント、大きな数字、マントラ
whiteboard-area40pxマージン内側(または縦長の高さの45%)密度の高いデータ/注釈付きコンテンツ
lower-third下部30%の帯可視動画上の注釈
side-panel右42%(横長)または下部40%(縦長)データ側、ビデオ反対側
video-overlayキャンバス全体、ほぼ透明なカードを想定全面動画上の注釈オーバーレイ

ステップ9で合成をアセンブルするとき、各カードのzoneを、上記のテーブルに従って、カードホストラッパー上のピクセル境界に解決してください。動画の境界は合成レベルで1回設定されます(videoTrack.bounds)。動画がカード間で「移動」しているように見せるには、合成の<script>内で#video-wrapに対するGSAPトゥイーンを作成してください(ステップ9参照)。

所定のカードの役割はなく、所定のナラティブアークもありません。 カードは動画が実際に言っていることから生成されます — すべて引用符だったり、すべてデータだったり、数字で始まったり、ストーリーで始まったりするかもしれません。トランスクリプトにリズムを任せてください。

テイクアウトはいくつ? — 長さと密度から自動推測。 固定の上限はありません。基本ペースを動画の長さから選び、次に情報密度で調整します。唯一の下限は固定: 最低5枚のカードとすることで、短い動画でもリズムが生まれます。

ステップ1 — 長さによる基本ペース(中程度の密度の場合の自然な秒/カード):

動画の長さ基本ペース(秒/カード)根拠
< 60秒(ショートリール)6–8秒視聴者はショートフォームで速いカットを期待する
60秒 – 3分8–12秒通常のソーシャルペース
3 – 10分12–20秒息継ぎの余裕を与える。各カードがより多くを伝える
10 – 30分20–35秒長尺の講義/インタビューのリズム
> 30分30–60秒エピソード的、章に近い感覚

ステップ2 — 密度倍率(基本ペースに掛けます):

トランスクリプト内のシグナル倍率効果
高密度 — 多くの数字、明確な主張、スタッカートなペース、リスト的な列挙、1〜2文ごとに新しいアイデア× 0.7より速くカット、より多くのカード
中密度 — データとナラティブが混在した流れ× 1.0基本ペース
低密度 — 1つの拡張ストーリー、繰り返されるリフレーミング、ゆっくりとした内省的なペース、単一の論点が展開する× 1.5より遅くカット、より少ないカード

ステップ3 — 計算:

secPerCard = 基本ペース × 密度倍率
cardCount  = max(5, round(動画の長さ秒 / secPerCard))

例(注意 — 上限クランプはありません。長い動画は自然とより多くのカードを生成します):

  • 30秒リール、単一のオチ(低密度) → 7 × 1.5 = 10.5秒/カード → round(30/10.5)=3 → 下限で5カード
  • 60秒内省的なモノローグ(低密度) → 10 × 1.5 = 15秒/カード → 4 → 下限で5カード
  • 121秒トークヘッド、豊富なデータ(高密度) → 10 × 0.7 = 7秒/カード → 17カード
  • 5分インタビュー、混合密度 → 16 × 1.0 = 16秒/カード → 19カード
  • 10分ディープダイブ、高密度 → 16 × 0.7 = 11秒/カード → 55カード
  • 30分講義、中密度 → 28 × 1.0 = 28秒/カード → 64カード
  • 1時間ポッドキャスト、低密度 → 45 × 1.5 = 67.5秒/カード → 53カード

カードが〜15秒を超えて保持される場合は、よりリッチなカード(データブロック、マルチステップの表示、いくつかのサブポイントが段階的アニメーションで展開するもの)を計画してください — 静的なワンライナーは8秒を超えると退屈になります。多くのカードが30秒を超える長尺の作品では、タイムラインをサブコンポジション(章ごとに1つの.html、data-composition-srcでマウント)にチャンク分割することを検討してください。そうすることで、ファイルごとのGSAPタイムラインを管理しやすく保てます — HyperFramesのtimeline_track_too_dense lint警告を参照してください。

contentはプレーンな文字列(「タイトル: 年率5.69%\nノート: ...」)でも、データをキャプチャする任意のJSONシェイプでも構いません。エージェントがカードごとにシェイプを決定します。

オプションのアウトロ。 このスキルには固定のブランドアウトロはありません。ユーザーがクロージングカードを希望する場合は、自分でニュートラルなもの(ワードマーク + 1行のタグライン、約1.5〜2秒、フェードイン -> 短いホールド -> フェードアウト)をデザインし、それをcards[]に追加し、composition.durationSecondsをそのendSecまで延長してください。そうでない場合は、最後のコンテンツカードで終了します。

7. レンダリング戦略を決定

ビジュアルの方向性をユーザーと確認する(これを最初に行う)

カードのデザインや境界の決定を始める前に、ユーザーに出力の比率、レイアウト、スタイルグループ、カード数の好みを尋ねて、透明性を確保し、後戻りを防いでください。ただし、エージェントがトランスクリプト分析に基づいてインテリジェントなデフォルトを提案することを躊躇しないでください(ユーザーが要求しない限り)。

推奨されるユーザープロンプトパターン:

「この121秒のインタビュークリップを処理する準備ができました。多くのデータポイントが高密度のペースを示しています。おすすめは:

  • 比率: 縦長 (9:16) — ソーシャルシェアに最適
  • スタイル: ノワール — データの多いコンテンツでよく機能するクリーンでコントラストのあるルック
  • カード数: 17 — 各主要データポイントをカバー

変更しますか、それともこのままで進めますか?」

ユーザーが明示的な指示を提供するまで、または同意するまで、実際のカードのHTML作成やレンダリングコマンドに進まないでください。

ステップ7a: 呼び出し間でユーザー環境を尊重する

このスキルは、/hyperframesゲートのステップ3(ランシェイプ変数)とステップ7(レンダリング戦略)からの設定を尊重します。ユーザーが前回の呼び出しで何を選んだか(アスペクト比、スタイルグループ、カード数)を呼び出し間で記憶し、次回はそれをデフォルトとして提案します。戦略を再確認するときは、常に「前回と同じ設定(縦長、ノワール、17カード)を使いますか、それとも変更しますか?」と尋ねてください。hyperframes.yaml設定ファイルが存在する場合は、それを読み取って尊重してください。

ステップ7b: レンダリング

talking-head-recutは、アスペクト比に応じてhyperframes renderに適切な引数を渡します:

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

>

関連スキル