Communitygithub.com

nandinishukla/talking-head-short

トーキングヘッドの生録音を、コードのみでInstagramリール、TikTok、YouTubeショート向けの完成された9:16ショート動画に編集します。

talking-head-short とは?

このスキルは、トーキングヘッドの生映像とクリーンオーディオを入力として、完全にコードベースで高品質な9:16ショート動画(Instagramリール、TikTok、YouTubeショート)を生成するAIエージェントツールです。カメラとオーディオの同期、単語タイムスタンプ付きの文字起こし、最良のテイクの選択、不要な部分のカット、Jカット音声トラック、アイコンタクトチェックを自動で行います。3種類のレイアウト(フルカム、スプリット、HyperFramesのフルフレームグラフィック)から選択でき、編集計画をストーリーボードとビートテーブルとして事前にユーザーに提示し、承認を得てからレンダリングを開始します。キャプション(ピル型とヒーロー型)の合成、カバータイトル、CTAコメントカードの追加、numpyを使った効果音・ライザー・BGMの合成、-14 LUFSへのミキシング、編集レポートの生成までをカバーしています。Claude CodeやClineなどのAIエージェントプラットフォームで動作し、ffmpeg、Python、Node.js、HyperFramesをプロジェクト内にローカルインストールすることで実現しています。

対応✓Claude Code~Codex CLI✓Cursor
npx skills add nandinishukla/talking-head-short

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

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

ドキュメント

トーキングヘッド → 完成された9:16ショート動画

このパイプラインは、1つの生録音(オプションでクリーンオーディオファイルも可)をedit/final.mp4(1080×1920、60 fps、H.264 + AAC 48 kHz)に変換します。また、4つのフルレングスステムとレポートも出力します。すべてコード内で実行され、プロジェクト内にローカルにインストールされます:ffmpeg、Python、Node、HyperFrames。システム全体へのインストールやエディターアプリは不要です。

  • 標準: references/brief.mdは完全なハウスブリーフであり、レベル、ジオメトリ、タイミング、タイプ、色に関するすべての数値が記載されています。このファイルとブリーフで数値に矛盾がある場合は、ブリーフが優先されます。
  • 開始前にお読みください: references/lessons.mdには、最初の実行で時間を浪費する落とし穴が記載されています。
  • サウンドプロファイル: references/sound-profile.mdには、クリエイターの効果音スタイルとレベルが、自身の編集から測定されて保存されています。
  • モーションライブラリ: references/motion-library.mdには、ユーザーが厳選したモーションリファレンス、グラフィックが従うハウスルックが保存されています。
  • 例: references/examples/には、最初のショート動画(r1~r9およびcta)のグラフィックが保存されています。references/example-report.mdは完成したレポートです。

最初にスタイル摂取の質問(ステップ0b)をエディターに尋ね、その後は意図的な停止ポイントであるストーリーボード承認(ステップ7)まで自律的に作業を進めます。これら2つのポイントの間では、ユーザーに何も質問しないでください:テイクの選択、レイアウト、事実の不一致、到達不能なUIなど、すべての判断を下し、処理を続行し、レポートに記録します。ストーリーボード承認は、ユーザーを待つ唯一のポイントです。入力ファイルがないか、読み取れない場合にのみ停止します。

プロジェクトのレイアウト

<project>/RAW.MP4 (+ クリーンオーディオがあれば)
<project>/edit/
  project.json        # すべてのビデオごとの決定がここに保存されます(テイク、ラン、キャプション、カバー...)
  tools/              # bin/ffmpeg、bin/ffprobe、venv/、node_modules/(setup.sh)
  work/               # すべての中間ファイル(gfx/はHyperFramesプロジェクト)
  stems/  final.mp4  final_master.wav  REPORT.md

すべてのスクリプトは edit/から、export PATH="$PWD/tools/bin:$PATH"およびPY=tools/venv/bin/pythonで実行されます。以下の$Sは、このスキルのscripts/フォルダーです。

ステップ

0. セットアップとプローブ

bash $S/setup.sh <project> を実行します。次に、ffprobe -show_streamsでカメラファイルを調べ、以下を記録します。

  • サイズと回転(ポートレートソースは、−90°のフラグが付いたランドスケープとして到着することがよくあります);
  • フレームレート;
  • オーディオレイアウト。\n一度デコードして、方向付けられた中間ファイルにします。すべてのステップで4Kを再デコードしないでください: ffmpeg -i RAW.MP4 -an -vf scale=1080:-2 -c:v libx264 -crf 13 -g 15 work/cam1080.mp4 ランドスケープソースの場合はscale=-2:1080を使用します。長時間のコマンドはバックグラウンドで実行します:8 GB Macで4K 90秒あたり約6分。

0b. スタイル摂取(作業前に1回だけ質問)

ビデオを編集している人に、1回の質問ラウンドで(質問ツールがある場合はそれを使用して)、その人だけが決定できる選択肢を尋ねます。すでに与えられているものはスキップし、回答をproject.json → "intake"に記録します。

  1. キャプション: 日常的な小さいスタイル、"small_style": "pill"(落ち着いた、一般的なビデオ)または"mono"(タイプライター、テック/AI/開発ビデオ); さらにヒーロー瞬間(フックとキーラインで、画面上にその人だけが表示される)を使用するかどうか。
  2. アクセントカラー: トピックから(メイン製品のブランドカラー;あなたが調査します)、その人の服に合わせる、またはその人が指定した16進数 → "accent"。
  3. CTA: "cta_style": "box"または"pill"、コメントキーワード、およびピル用のリンクチップテキスト(例:「Free on GitHub · owner/repo」)。
  4. 音楽: "music": {"mode": "synth" | "file" | "none"}(+ ファイルパス)。
  5. カバータイトル: その人のもの、またはフックから作成。

オプションには適切なデフォルト値を提示します(例:トピックのブランドカラー;一般的なビデオではピル+ヒーロー、テックビデオではモノ+ヒーロー;最後のビデオとは異なるCTAスタイル)。これにより回答に数秒しかかかりません。誰も回答できない場合(無人実行)、これらのデフォルト値を使用し、レポートでその旨を明記します。

1. 同期と文字起こし

  1. $PY $S/analyze_audio.py <camera> [clean_audio]は16kHzで相互相関を実行し、オフセットとピーク比を報告します。カメラタイムライン上の音声ソース、10 ms RMSエンベロープ、クリップされたサンプル数、ノイズフロアを書き出します。クリーンファイルがない場合は、カメラトラックを使用し、レポートでその旨を明記する必要があります。
  2. $PY $S/transcribe.py medium.en "Product names, people, @handles"は、250 ms以上のギャップがフラグ付けされたすべての単語をリストアップします。
  3. analyze_audio.pyを再実行して、静かなストレッチのリストに隣接する単語が表示されるようにします。
  4. 単語を行ごとのテイクにグループ化します。各行について、最後の完全なテイクを保持します。最後のテイクに明らかな欠陥(吃音、クリップ、誤った単語、再スタート)がある場合のみ、以前のテイクを使用します。再スタート、自己訂正、「okay」、迷いの音節、テイク後のつぶやき、および両端の無音部分を削除します。

2. カット

project.json → "lines": [[label, src_start, src_end], …]に、保持された各テイクの周囲の大まかなエッジを、配信順に書き込みます。連続する行は1つの範囲を共有できます。次に:

  1. $PY $S/cut.pyは、オンセット/トゥルーエンド(−35 dB / −32 dB-150 ms間)、250 ms以上のポーズ→120 ms、40 msのリードイン、50 msのオーディオJカットリード、ギャップ内でフェードアウトするテール、フレーム量子化されたピクチャーカット、およびENDを処理します。
  2. $PY $S/check_joins.py: 150 msを超える静かなストレッチがあるジョインは、負の"gap_overrides": {"<segment>": -0.0333}を取得します。cut.pyを再実行します。決して無音を追加しないでください。

3. アイコンタクト

小さなプロキシを作成し(scale=-2:540)、次に$PY $S/eyesheet.py work/proxy.mp4を実行して、work/eye/*.jpgを見ます。頭の動きの周りに100 msのステップを追加します。カメラは、話者がレンズに向いている間のみ表示されます。行の途中で視線をそらした場合は、ターンの前の単語境界で分割し、残りをフルビジュアルにします。

4. ランの計画(グラフィックの前)

$PY $S/plan.pyはピクチャーカットの時間を出力します。"runs": [[start_ms, end_ms, layout, "R1 hook"], …]を[0, END]にタイリングして記述し(最後の終わりには"END"を使用)、再実行します。ルールを検証します。

  • フックはスプリットで、アウトロ(CTA以降)はフルカムです。
  • どのランも約8秒を超えず、隣接するランは同じレイアウトを共有しません。
  • 3つのレイアウトすべてが使用されます。

コンテンツに応じてレイアウトを選択します。

  • カメラに向かっての意見やストーリー → cam;
  • 1つのスクリーンショット、カード、ロゴ行、または短いリスト → split;
  • スクリーンレコーディング、ニュースページ、ズームが必要な製品UI → visual。

境界をピクチャーカットに配置します。plan.pyは、各ランの単語をラン相対時間で出力します。グラフィックをそれらにタイミングを合わせます。

5. リサーチとキャプチャ

名前付きの製品とすべての主張(リリース、引用、数値)について、実際のソースを見つけ、2つ以上の信頼できるソースで数値を確認します。矛盾があればレポートに記録します。

  • edit/からnode $S/shot.mjs <url> <out.png> 1280 1400 0を使用して実際のページをキャプチャします。これはHyperFramesのchrome-headless-shellを自分で見つけます。各サイトのrobots.txtと利用規約を尊重します:引用するページのみをキャプチャし、クロールしないでください。
  • リポジトリには、docs/にUI GIFやスクリーンショットが含まれていることがよくあります。それらからUIを再構築します。
  • ログインが必要なUIは、公開スクリーンショットやドキュメントから再構築し、レポートに記録します。
  • 「Claude Code」は、話者がターミナルについて話していない限り、ClaudeデスクトップアプリのUIを意味します。

6. キャプションとカバー(ストーリーボードがそれらを表示するため、今計画します)

$PY $S/captions.py work/cam1080.mp4(カメラビデオはヒーローカラーのためです)。"small_style": "mono"はテック/AIツール/開発者/プロダクト説明ビデオ(ターミナル、コード、アプリ画面があるもの)に設定し、"pill"は一般的なビデオやライフスタイルビデオに設定します。"captions.chunks"がない場合は、自動ドラフト(すべての場所で小さいスタイル、フックに1つのヒーロードラフト)を出力します。それを編集して貼り付け直します。3つのスタイルがあります:

  • mono [a, b, "mono", [accent word]]: 1〜3単語、ターミナルタイプライター。大文字VT323、ほぼ黒のボックス上で、文字が入力されるにつれて成長します(30文字/秒)、1つの意味のあるキーワードが無地のアクセントブロック上に表示され、アクセントブロックカーソル(入力中は点灯、入力後は点滅)。assemble.pyはフレームごとに入力します。
  • pill [a, b, "pill"]: 1〜3単語、小さなPoppins Bold、半透明の暗い角丸ボックス上:非テックビデオ用の落ち着いた小さいスタイル。
  • hero [a, b, "hero", [big word indices]]: 2〜5単語、1〜2の巨大な無地の単語(Archivo Black)が、上下の小さな単語の間に配置されます。小さな単語はビデオの小さいスタイル(ピル、または静的モノボックス)に従います。大きな単語の色は話者の服に合わせます:captions.py work/cam1080.mp4は、最初のヒーローフレームのトルソをサンプリングし、選択した色を出力します。その服の上でも読み取れるように、深い同色のアウトラインがあります。選択が適切でない場合(にぎやかなプリント、シャツの上のジャケット)は、"hero_color": "#RRGGBB"でオーバーライドします。フックと、画面上に話者だけが表示されている重要なライン(フルカム、またはスプリットのカード)で使用し、グラフィックの上や2行連続では決して使用しません。意味を伝える単語(主張、数値、利点)を選び、機能語は決して選びません。

"cover": [line1, line2]を設定します(ユーザーから与えられていない場合はフックから作成し、110 pxで1行約14文字)。ピルの中心をレイアウトごとに"y"に設定し、ヒーローブロックの中心を"hero_y"に設定します。

  • キャプションは決して顔、カードエッジ、またはビジュアルの上に配置してはいけません。
  • ポートレートソースの場合、スプリットギャップは顔であるため、ピルをトルソの約y 1660に配置し、実際のフレームでアウトロを確認します。
  • assemble.pyは両方のスタイルを合成します。

7. ストーリーボードとビートテーブル:承認のためにSTOP

ユーザーが計画を確認して承認するまで、何もレンダリングされません。

  1. references/motion-library.md(ユーザーが厳選したハウスルック)から、各グラフィックビートのモーションリファレンスを選択します。references/motion-prompts.mdには完全なプロンプトテキスト(作成者にクレジット)が保持されています。引用された各IDのブロックを読みます。サードパーティのギャラリーをスクレイピングしないでください。ライブラリエントリはユーザーによって追加され、一部のサイト(例:prompt-motion.com)はAIクローラーをブロックしています。
  2. 教えられている内容からビデオのアクセントカラーを選択します:メイン製品のブランドカラー(ロゴ、プライマリボタン)、そうでなければ主題に合った色。"accent": {"color": "#RRGGBB", "why": "..."}を記述し、$PY $S/accent.pyを実行します。これはwork/gfx/assets/accent.css(アクセントフィル、4.5:1のテキストシェード、薄いバンドティント)を書き出し、すべてのコンポジションがbase.cssを通じてそれを取得します。アクセントの16進数値をコンポジションにハードコードしないでください:var(--clay)、var(--clayText)、var(--band)を使用します。ヒーローキャプションの色は別です(服から取得します)。
  3. project.jsonに"beats"を記述します。ランごとに1つ以上:{"run": "R1", "t": 0.0, "visual": "...", "camera": "...", "sfx": "...", "refs": ["id"], "source": "real capture / rebuilt UI / logo"}。オプションで"storyboard_notes": {"R1": "why this layout"}を追加します。
  4. $PY $S/storyboard.py work/cam1080.mp4はwork/storyboard.htmlを書き出します:ランごとの9:16スケッチ(レイアウトゾーン、話者のフレーム、グラフィック、キャプションスタイルと位置)とビートテーブル(時間、ラン、レイアウト、正確な単語、画面上のアクション、カメラ移動、SFX、すべてのヒーローモーメントを含むキャプションスタイル、モーションリファレンス、ソース)。
  5. ユーザーに表示します(ページはアクセントスウォッチとその選択理由を表示します):アーティファクトとして公開するか、ファイルを送信し、何を見るべきかを1行で示します。次にあなたのターンを終了し、待機します。変更をproject.jsonに適用し、再生成して再度表示します。明確な承認があった場合のみ続行します。

8. グラフィック(HyperFrames)

  1. assets/engine.js、assets/base.css、assets/accent.css、assets/fonts/、assets/motion/をwork/gfx/assets/にコピーします(その後、accent.pyを再実行して、ビデオごとのアクセントがデフォルトを置き換えるようにします)。さらに、hyperframes initからhyperframes.jsonをコピーします。
  2. スプリット/ビジュアルランごとに、work/gfx/compositions/<run key lowercase>.htmlを1つ記述します。そのdata-durationはランと正確に一致する必要があります。
  3. 承認されたストーリーボードに正確に従って構築し、各ビートのモーションリファレンスに一致させます。references/examples/の最も近い例から開始します:
    • r1、r3、r5、r7:スプリットワールド、ステップとプッシュ付き。
    • r2:ロゴロックアップ、次に固定フレーム内の実際のキャプチャへのホイップ、そのウォッシュクローン上。
    • r4、r6、r9:内部のカメラのみが動くプロダクトウィンドウ。
    • cta:透明なコメントカード(CTAスタイルA);cta_pill.html:コメントピル(CTAスタイルB)。
    • motion/*.html:モーションコンポーネントごとに1つのデモ(カーソル、ガラス、モーフ、フラッド+アイリス、マスクライズ、キネティック、ウォール、ホイップ;エクスプレイン-フロー、エクスプレイン-コールアウト、エクスプレイン-ステータス、エクスプレイン-ループ);以下の「モーションコンポーネント」と「エクスプレインコンポーネント」を参照。

エンジンの仕組みと重要なルール:

  • E.run(id, dur, render)は、1つの一時停止されたタイムラインを登録します。render(t)はtの純粋な関数でなければなりません。
  • E.pathはワールドカメラのキーフレームを提供します。E.cameraはそれらを適用し、画面速度に沿ってビューポートをブラーします(σ = 0.29·v·0.75/60、≤ 40 px、静止時とt=0でゼロ)。
  • E.trackとE.landは、オブジェクトごとのプロパティ(不透明度、x、y、スケール、ブラー)をアニメーション化します。被写界深度:隣接オブジェクトは最大14 pxのブラーと70%の不透明度;古いヒーローは9 pxと40%。
  • カメラ移動:
    • グライド:sine.inOut、スケール変更 ≤ 0.04;
    • ステップ:0.5秒のpower3.inOut、次のアイテムを名前付ける単語の0.25秒前から開始;
    • プッシュ:1.2〜2秒のpower2.inOut、最大約1.6倍;
    • プルバック:1〜2秒;
    • ホイップ:ランあたり最大1回、0.45秒アウト power3.in、0.6秒イン power3.out。
  • フレーム0は着地状態で、シャープ、カメラは静止。
  • プロダクトウィンドウが被写体である間は、ウィンドウ内側のカメラのみが動きます(1.15〜1.4倍、0.4〜0.7秒のpower2.inOut)。
  • コンテンツゾーン:
    • スプリットはコンテンツをy 40〜900に保持し、ワールドはy 900からフェードアウト;
    • ビジュアルはコンテンツをy 1230より上に保持;
    • フレーム0では、イントログラフィックはy 620より下に留まります(カバーはその上に配置されます)。
  • ビジュアルスタイル:
    • シーンごとに1つのまばらな被写体;
    • Poppinsと30 px未満はなし;
    • ほぼ白のラジアルグラウンドと3層のシャドウ;
    • 暗いものはなし、グリッドもなし;
    • アクションをアニメーション化し、ラベル付けしない。
  • 可聴イベントに値するすべての目に見えるイベントは、コンポジションの<script type="application/json" id="events">(ポップ/クリック/チャイム/サッド for アイコン着地/フラッシュ for 白いフラッシュ/ホイップの中間点でのウーッシュ/キー/ティック、ラン相対)に入れます。オーディオステップはこれらを読み取るため、SFXは常にそのタイミングに配置されます。

9. オーディオ

$PY $S/synths.pyは、numpyでSFX、ライザー、BGMを合成するための単一の呼び出しです。references/sound-profile.mdで定義されたスタイルとレベルに従います。

  1. SFXはイベントJSONから各ランに合わせて配置されます。
  2. BGMは"music"設定に従います:"synth"はnumpyで合成、"file"は提供されたオーディオファイルのループ、"none"は無音。
  3. すべてのステムはstems/に個別に書き出されます。stems/final_master.wavは-14 LUFSにミキシングされます。
  4. $PY $S/mix.pyは最終オーディオをラウドネス正規化し、ステムを作成します。

10. レンダリングとレポート

  1. $PY $S/assemble.pyは、グラフィックオーバーレイ(キャプション、カバー、CTAカード)を合成して最終ビデオを作成します。
  2. $PY $S/report.pyはstems/REPORT.mdを書き出し、すべての決定(テイク、ラン、キャプション、アクセントカラー、モーションリファレンス、ソース、矛盾)を文書化します。

モーションコンポーネント

references/motion-prompts.mdを参照して、各コンポーネントの完全なプロンプトテキストを取得します。各コンポーネントは、work/gfx/assets/motion/内の個別のHTMLファイルとして存在し、例として使用できます。

  • カーソル:テキスト選択/クリック/ドラッグのアニメーション付きカーソル。
  • ガラス:ガラス効果(ブラー、反射)を備えたUI要素。
  • モーフ:2つの形状間のスムーズなモーフィング。
  • フラッド+アイリス:フラッドフィルで領域を塗りつぶし、アイリスでフェードイン/アウト。
  • マスクライズ:マスクを使用した要素の出現/消失アニメーション。
  • キネティック:テキストまたは要素のキネティックタイポグラフィアニメーション。
  • ウォール:3Dグリッドまたは壁の視覚効果。
  • ホイップ:画面を横切るホイップ/スワイプ遷移。
  • エクスプレイン-フロー:フローチャートまたはプロセスを示すエクスプレイナービデオコンポーネント。
  • エクスプレイン-コールアウト:UI要素にラベルを付けるコールアウト。
  • エクスプレイン-ステータス:ステータスバーまたは進行状況表示。
  • エクスプレイン-ループ:繰り返しアニメーションループを示すループ。

トラブルシューティングと注意事項

  • setup.shに失敗した場合は、tools/を削除して再実行します。
  • 使用可能なメモリが少ないMacでは、ffmpegコマンドに-threads 2を追加します。
  • eyesheet.pyは、顔検出に失敗した場合、代わりにフルスキャンを実行しますが、遅くなります。
  • 常にwork/cam1080.mp4を中間ファイルとして使用し、RAWファイルを直接編集しないでください。
  • project.jsonはすべての編集決定の信頼できる情報源です。cut.pyまたはplan.pyを再実行する前に、常にここに変更を加えます。

関連スキル