stripe-youtube は何をしますか?
Adnaanの長尺スキル(adnaan-youtube)のStripe版:同じパイプラインとv7デザインシステムを16:9ボードに適用し、すべての色を単一のブランドファイルから取得します。デフォルトのブランドはStripe(brand/stripe.json、Stripeの公開ブランドページから作成:#533AFD blurpleアクセント、#061B31 slateディスクとインク、#EEF1F6 cool paper、白色カード、データのみstrawberry)。他の会社の場合は別のブランドファイル($Y/brand.py init --edit-dir edit --brand acme.json)を使用します。それ以外は変わりません。最初に、assets/style/stripe_youtube_sheet.jpg(このスキルで作成された最初の動画の実フレーム)を参照し、examples/stripe-v1/(そのビートテーブルとシーン)およびexamples/yt-01-v7/をざっと確認してください。アートディレクションはreferences/style.mdに定義されており、章、ウィンドウ、リズムはreferences/planning.md、説明文はreferences/description.mdにあります。(古いGreg Light/Darkマーカールックはリクエストがあった場合のみ保持します。)
ブランドの適用方法: edit/brand/brand.json → $Y/brand.pyがbrand.cssを書き出し(ランタイムのトークンを再設定) → board.pyが各シーンの準備時にv7yt.cssの後にリンクし、talkcaps.pyもキャプションオーバーレイで同様にリンクします。ランタイムのトゥイーン(V.mintTo / V.charcoalTo)もトークンを読み取り、composeのプレートはファイルに従います。シーンは16進数を直接指定しません。ブランドファイルが指定するロゴは公式キットからedit/logos/に取得されます(再描画はしません)。
このスキルはadnaan-reelの長尺版であり、そのヘルパーを再利用します(文字起こし、カット、検証、ページキャプチャ、ロゴ/写真/アイコン取得、レンダリング/ラウドネスパイプライン、効果音キット、頭部姿勢)。~/.claude/skills/adnaan-reelにインストールされている必要があります。すべてのヘルパーはそのプロジェクトの環境で実行します:uv run --project ~/.claude/skills/adnaan-reel python <helper> … — 以下、R=~/.claude/skills/adnaan-reel/helpers、Y=~/.claude/skills/stripe-youtube/helpersとします。
長尺動画の構築方法(リールとの違い)
リールではすべてのビートを完全なHyperFramesシーンにします。長尺動画ではそうはいきません(レンダリングに時間がかかり、視聴も疲れます)。ここでは:
- カット(
$R/render.py --base-only)→base.mp4:カメラ映像、カット済み、1920x1080、音声付き(サンプル精度で1パスで構築 — アンチパターン、リップシンクのずれを参照)、その後$Y/lookdowns.pyがうつむき部分でフレームを保持します。 - デザインモーメントはHyperFramesシーン(
$Y/board.py):キャンバス、マップ、ボード、プルーフ(不透明、3〜10秒)、およびコールアウトオーバーレイ — 通常は動画あたり25〜45個、エージェントが並列構築します。トークキャプションは生成オーバーレイ($Y/talkcaps.py)、フルフレームトークウィンドウごとに1つ。 - それ以外はすべてコンポジット(
$Y/compose.py):トーク = ベースフルフレーム + キャプション;スクリーン = ボードプレート + スクリーン録画(同じ範囲でカット、$Y/zoomplan.pyでズーム)+ スピーカーカード;シーンウィンドウ = レンダリング + カード;上部のオーバーレイ;効果音 + レベル調整済みBGM;−14 LUFS。動画1分あたり約40秒のコンポジット。
原則
- ボードがベース、彼はカード上にいる。 ランタイムの約70〜85%はボードレイアウトで、彼のプレーンカメラがカード内にあります(固定位置、カット時のみ移動、アクセントリング);フルフレームトークは句読点(イントロ、意見、ストーリー、CTA)。デフォルトではマットなし — 彼はプレーンカードを好みます。
- 1つのルック、1つのブランドファイル。 ペーパー + グリッド + 強いビネット、ブランドのプライマリカラーを唯一のアクセント(Stripeのblurple)、その濃い色を白色Phosphorグリフとインクのディスクに使用(Stripe slate)、フラットな白色カード、クリーンなベクターストローク、Inter Tight / Inter(Stripeの独自書体は公開されていません)。データ色(strawberry #E8435A)は数値のみ。マーカーなし、Caveatなし、パステル色なし、シーン内で16進数を直接指定しない。
- トークはすべてキャプション付き。 フルフレームトークウィンドウには全カバレッジのキネティックキャプション(白色、フレーズごとに1つのヒーローワードがブランドのライトアクセント色、背景の落ち着いた部分に左寄せ)。ボードウィンドウはデザイン内に言葉を表示。SRTも提供されます。画面上の言葉は彼が話す言葉です。
- 本物を見せる。 彼が名前を挙げるすべてのページ、紙、投稿、研究は実物で表示(白色カード内の読み取り可能なストリップ、ブランドカラーのハイライターで話されたフレーズを強調);すべてのツール/企業には公式ロゴ;人には実写。数字、引用、スクリーンショットをでっち上げない。
- スクリーンはウォークスルー。 彼のCap録画をウィンドウカード内に表示、クリック部分をズーム(Capのズームが優先、次にクリッククラスター、最後に手動ターゲット)、ズーム着地後にコールアウト描画。待ち時間はカット、スピードアップなし。
- 2回の承認、その後すべてを構築。 章の概要 → ビートテーブル → パイロット(2〜3シーン + そのルックのキャプション)→ 全モーメント並列構築 → コンポジット → 自己チェック → 納品。自動パイロット("just do it")は待機をスキップ。
- デッドボードは禁止。 すべてのデザインモーメントには、文を表現するヒーローオブジェクト + 1〜3のマイクロアニメーションがある;カメラが移動;すべてのシーンのフレーム0にはすでにその見出しまたはメインオブジェクトが表示されている。
- サウンドは音声をサポート。 構造的効果音のみ(約30〜60秒に1つ、低めで温かみのあるv6キット)、落ち着いたダック処理のBGMが音声より約5 dB下(それより小さいと彼には聞こえない)、音声が最優先、−14 LUFS。
- 表示前に検証。 フレームカウントが正確、すべてのカットでリップシンク確認、すべてのウィンドウ境界をシートで確認、カットに対してキャプションを読み合わせ、ラウドネスを測定。彼が同期やレベルの問題を見つける側になってはいけない。
ハードルール
- 概要が承認され、ビートテーブルが承認されてから、シーンを構築する(自動パイロットでない限り)。
- adnaan-reelのカットルールをそのまま適用:ワード境界カット、すべてのフィラーカットと結合は
$R/verify_cuts.pyで検証(⚠ TAIL/HEADフラグを読むこと)、テストEDLをedit/にレンダリングしない、30 msフェード。 - 彼のCapトリムから開始(
source/cap.json"trims")。次にリテイクを除去:各行の最後の完全なテイクを保持し、1つのラインを2つの試行から結合しない、彼が声に出して拒否したもの("no", "again", "scratch that")やNGは削除;セッション末尾で再録されたフックを確認。重複を見つけるには、保持した各範囲を個別に文字起こしし、その後隣接範囲と結合して確認 — whisperが長尺カットで同じラインの2つのテイクを1つに結合するのを防ぐ。 - 無音禁止:各範囲を音声にトリミング(ノイズフロア + 7 dB、0.07秒前 / 0.09秒後)、内部ポーズ0.22秒以上は分割(
$R/audio_env.py tighten --margin 7 --min-gap 0.22)。彼は「すべてのポーズ」をカットするよう2回依頼した — 最初のパスで残した0.3〜0.9秒の空白はポーズとみなされる。 - スクリーンはカメラと同じ範囲でカット(compose.pyがtimeline.jsonから実行)。
- シーン:正確なフレーム数(board.pyが設定、
board.py checkで検証);ランタイム(board.css/js、v7yt.css/js)はインストール済みで、シーンごとに編集しない;グローバルなルック変更はtemplates/runtime/で1回だけ行い、board.py runtimeで適用。カードゾーンはクリア;フレーム0は空でない。 board.py render経由でのみレンダリング(エージェントも、--only <id>を使用):オーバーレイ用にProRes 4444 .movを選択(h264 .movは不透明 — トークウィンドウで彼の代わりに紙が表示された)、マシン全体でレンダリングスロットを共有。レンダリングをpkillしない — あるエージェントのpkillが他のエージェントのレンダリングをすべて停止させた。- コールアウト位置は
compose.py where <out_t> <sx> <sy>から取得、決して推測しない。 - シーンごとに1サブエージェント(またはオブジェクトを共有するシーンファミリー、例:チェーン)、すべてを1メッセージで起動;各シーンのスチルが到着次第レビュー、SendMessageで同じエージェントに修正を送信。共有オブジェクトには1人のオーナーが共有モジュール + メモを書き、他のエージェントはコピーするがフォークしない。レポートではなくファイルタイムスタンプを信頼する。
- ダウンロードは
$R/fetch.py、キャプチャは$R/capture.py経由(credits.mdに記録);すべての出力は<project>/edit/内;編集時にスキルディレクトリ内に書き込まない。 - カット前にカメラのミラーチェック(フル解像度スチルで彼の服や背景の印刷物をズームイン)。
- シェルループ内では、ffmpegに
-nostdinを指定(そうしないとループのstdinを消費する)。
ヘルパー
| ヘルパー | 機能 |
|---|---|
$Y/cap.py find / info <p.cap> / ingest <p.cap> --edit-dir E | Capプロジェクト(最新順)→ source/cam.mov、source/screen.mp4、source/cap.json(クリック、移動、トリム、ズーム) |
$R/transcribe.py source/cam.mov --edit-dir E --vocab "…" | ワードレベル文字起こし → transcripts/cam.json(キャッシュ済み) |
$R/pack_transcripts.py · $R/audio_env.py · $R/verify_cuts.py · $R/timeline_view.py | テイク読み取り、タイトニング、すべての結合を検証(adnaan-reel) |
$R/headpose.py source/cam.mov --start 0 --end <s> > E/headpose_report.txt | テイク全体の頭部ピッチ → うつむき範囲 |
$R/render.py edl.json -o base.mp4 --base-only | カット → base.mp4 + timeline.json(サンプル精度の音声) |
$Y/lookdowns.py --edit-dir E | ラインの開始/終了でうつむき部分にオンデマンドフレームを保持;ベースレンダリングのたびに再実行 |
$Y/sync_check.py --edit-dir E [--final final.mp4] | セグメントごとのリップシンク(映像 vs 音声 vs ソース)およびファイナル vs ベース;ずれがあればexit 1 |
$R/capture.py · $R/fetch.py logo/photo/icon/url/credits | 読み取り可能なページストリップ、公式ロゴ、実写、Phosphorアイコン、ダウンロード、credits.md |
$Y/board.py prepare/runtime/render/check --edit-dir E [--only ids] | animations/scenes.jsonからのシーンプロジェクト(v7ランタイム + アイコン + スターター + アセット + TASK.md);スロット制限レンダリング;正確フレーム / アルファチェック |
$Y/talkcaps.py --edit-dir E [--dry-run] | 全カバレッジトークキャプション:トークウィンドウごとに1つの生成済みcNN_talkオーバーレイ(カット/シーン変更のたびに再実行) |
$Y/compose.py plan / where <t> <sx> <sy> / render -o final.mp4 [--preview] [--only-window N] / sheet <video> | ウィンドウテーブル;コールアウト座標;コンポジット(ウィンドウ + カード + オーバーレイ + SFX + レベル調整済みBGM + −14 LUFS);境界シート |
$Y/zoomplan.py | ズームカメラ(ライブラリ) |
$Y/deliver.py srt / chapters / stills <video> t… | deliver/captions.srt、deliver/chapters.txt(YouTube用に検証済み)、サムネイルスチル |
$Y/brand.py init / css / apply --edit-dir E [--brand x.json] | ブランドファイル → brand.css → すべてのシーン(board.pyとtalkcaps.pyが呼び出し;applyは手動で再インストール) |
$Y/review.py --edit-dir E <ids> | シーンごとのレビューシート(5フレーム、カードボックス枠付き)→ verify/review/<id>.jpg |
$Y/inserts.py clip / splice / shift --edit-dir E | ブランドボード上の独自オーディオ付きクリップ → フレーム正確にコンポジットに結合 → SRTとチャプターをシフト |
スターター(templates/scenes/):canvas、map、board、proof(不透明)、callout_overlay、talk_overlay(透明)、talk_captions(talkcaps.pyのテンプレート)。ランタイムヘッダー(board.js、v7yt.js)はすべてのプリミティブをリスト化。リファレンスシーン:examples/stripe-v1/(Stripe動画:ビートテーブル、シーンリスト、チェーン + ブランドカード + ページモジュール)およびexamples/yt-01-v7/(チェーンマップ + 共有モジュール、データバー、プルーフページ、ボードフロー、キャプション)。
レイアウト
<project>/
└── edit/
├── project.md セッション記憶
├── source/ (cam.mov, screen.mp4, cap.json) transcripts/ (cam.json 生, CAM.json 補正済み)
├── edl.json, base.mp4 (+ base_unfrozen.mp4), timeline.json, headpose_report.txt, layout.json
├── brand/ (brand.json, brand.css) captures/ logos/ photos/ icons/ downloads/ music/ inserts/
├── animations/ (scenes.json, <id>/{hf/, TASK.md, render.mp4|mov, beats.json, qa/}, cNN_talk/ generated)
├── compose/ (plates, screen_cut.mp4, windows/) verify/
└── final.mp4, deliver/ (captions.srt, chapters.txt, description.txt, thumb_*.png), credits.md
プロセス
- 再開。
edit/project.mdが存在する場合、最後のセッションを1行で要約し、続行するか尋ねます。 - 取り込み。 パスが指定されていない場合:
$Y/cap.py findで録画を確認。Capではない場合:カメラファイルをsource/cam.movとしてリンク(スクリーン録画は同一クロックでsource/screen.mp4;最小限のcap.json)。スクリプト、リンク、表示したいものを収集。ブランド:$Y/brand.py init --edit-dir edit(Stripe;他の会社の場合は--brand x.json)、その後ブランドファイルが指定するロゴを公式キットからedit/logos/に取得。残りを構築する前に、ブランドで1シーンをテスト。 - 取り込み + 読み取り。
ffprobe;ミラーチェック用のフル解像度スチル;$R/transcribe.py source/cam.mov --edit-dir edit --vocab "<スクリプト/リンクの全名称>";$R/pack_transcripts.py;$R/headpose.pyでテイク全体 →headpose_report.txt(内容が不完全なため省略)
(原文が途中で切れているため、プロセスセクションの残りは翻訳できません。原文の残りがあれば、同様のアプローチで翻訳します。)