Reel — 分割編集(スピーカーの上に45%パネル)
クリーム色の固定パネルがフレーム上部(1080 × split.panel_height、デフォルト864 = 45%)を覆い、UI風ウィジェット(カード、メーター、トグル、ターミナル、チップ)を表示して発言内容を正確に図示します。スピーカーはスケール1で下部に配置され、決して動きません。終了時:コメントキーワードを大きく表示、フォローカードを表示。実例:examples/split/(実際の100秒動画「5つのClaudeスキル」の企画+シーンモジュール)。
引数:$ARGUMENTS
デフォルト(ユーザーが指定した場合のみ変更)
まず reel.config.json を読み込みます(なければ reel.config.example.json にフォールバック)。
| 項目 | デフォルト |
|---|---|
| 分割 | "split": split.panel_height(864 → パネル45%、スピーカー55%、960 = 50/50) |
| スピーカー | スケール1、ズームなし、移動なし;顔はスピーカー領域の中央(speaker_y) |
| セーフボックス | "safe": split.safe = [64, 160, 64, 32] → シーンコンテンツは上から160px、952×672の範囲内(Instagramヘッダー/電話ステータスバーで上部が隠れるのを避ける) |
| 字幕 / SFX / 音楽 | なし。音声はテイクのミックスそのまま、finish.py でリマックス |
| テイク | 既にカット、グレーディング、音楽追加済みと想定 → そのまま使用。未編集/生テイクの場合は事前に確認 |
| CTA | 吹き出しカードにコメントキーワード(単語または数字)を大きく表示;フォローカード:"handle": creator.handle、テキストのみ、顔写真なし |
| パレット | split_palette:クリーム色パネル、インク色テキスト、アクセント塗り;クリーム色上のテキストは accent_deep(コントラスト) |
入力
テイク名とトピックは引数から取得します。不足している情報(テイクが既にカット/グレーディング/音楽付きか、コメントキーワード、Whisperが聞き間違えそうな名前や専門用語(ツール名、製品名))は、一度のメッセージでまとめて質問します。
パイプライン
PY = .venv/Scripts/python.exe -X utf8(Windows)または .venv/bin/python -X utf8(macOS/Linux)。長時間のステップはバックグラウンドで実行。
| # | ステップ | コマンド / アクション | 確認事項 |
|---|---|---|---|
| 1 | 確認 | ffprobe;コンタクトシート ffmpeg -i raw/<take> -vf fps=1/5,scale=216:384,tile=9x2 -frames:v 1 work/<take>/sheet.jpg を目視確認 | 頭の上に空の壁? 既に編集済み? |
| 2 | 文字起こし | $PY tools/transcribe.py <take> --prompt "<名前, 専門用語>" | ツール名を校正;3秒以上のギャップ → ウィンドウを再文字起こし |
| 3 | 顔 | $PY tools/face_track.py <take> --split <パネル高さ> | speaker_y を出力 |
| 4 | ビート計画 | アイデアごとに1シーン、通常3~7秒、各ウィジェットを発言単語にピン留め(キュー=単語の開始)。シーンはコンテンツのみ変更、レイアウトは変更しない | |
| 5 | 計画ファイル | work/<take>/showcase.json を examples/split/showcase.json から生成:video("../../raw/<file>")、split、speaker_y、safe、scenes_module、scenes[] {kind, start, end, cue{...}}、フォローシーン用の handle;_note に顔番号を記録 | |
| 6 | シーン | tools/scenes_<slug>.py を examples/split/scenes_5skills.py から生成:種類ごとに sc_<kind>(i, s) -> (html, js)、RENDER 辞書、オプションで CSS/JS。座標はセーフボックス内(幅952);id は s{i}-*;キュー時間は絶対時間。sc_comment、sc_follow がCTA | |
| 7 | ビルド | $PY tools/showcase_build.py <take>;work/<take>/sc 内で:npx hyperframes lint public → エラー0;npx hyperframes snapshot public -o ../snaps --no-end --describe false --at <各シーンの中間>;シートを読んで修正 | テキストがパネル内に収まっているか、ヘッダーの下にはみ出ていないか |
| 8 | クイックレンダリング | $PY tools/finish.py <take> --seconds 12;work/<take>/sc/quick_sheet.jpg を読む | |
| 9 | 完全レンダリング | $PY tools/finish.py <take>(バックグラウンド)→ final/<take>/、確認、qa/sheet.jpg | シートを読む |
| 10 | 報告 | パス、長さ、シーン数、検証結果。新しいことが学べたらこのスキルに追加する |
パネルルール
- ウィジェットはその瞬間に話されている文を図示する:リポジトリ名が出たらリポジトリカード、比較するときはメーター、「これは違う」と言ったら取り消し線。
- 各シーンは次のシーンの0.25秒前にフェードアウト(ビルダーが自動実施);シーン内では要素がキュー単語のタイミングで出現する。
- 画面に表示する数字はテイク内の実際のカウントでなければならない。
showcase_build.pyに組み込まれているシーン種類(hook、repo、cta、…)は45%セーフボックスより前のもので、はみ出す可能性がある;代わりにexamples/split/scenes_5skills.pyをベースにtools/scenes_<slug>.pyに種類を記述すること。- ペルシア語/アラビア語テキスト:
.faクラス(要素単位のRTL、決して<html>にdir="rtl"を設定しない)、letter-spacing: 0、数字はfa()を使用、大きなゼロはラテン文字0。 - 同一プロパティに重複するトゥイーン、
Math.random/from:"random"は禁止;スライドインのfrom-stateにはautoAlpha:0を含める。 - ソースクリップがHDR(HLG)の場合、事前にトーンマッピング(
tools/story_assets.pyのTONEMAP)—finish.pyは「HDRオートプロモーション」で停止する。 hyperframes snapshotはレンダリングの証明にはならない — ステップ8が確認手段。