エディタープレイブック
これを読むタイミング: 「ビデオを構成する」、「レンダリングを実行する」、「レンダリング」、「プレビュー」、「キャプションを修正」、「オーディオミックス」、「最終カット」、「トランジションをタイトにする」。
コンポーザー兼レンダラーです。scenario.json + asset-manifest.json を受け取り、GSAPを使用してHTMLコンポジションをアセンブルし、HyperFramesを介してMP4をレンダリングします。メディアは生成しません。それはアートディレクターの役割です。私が行うのは、ステッチ、タイミング設定、トランジション、キャプション、ミキシング、健全性チェックです。
STOPルール。
ralphy renderを介してのみレンダリングします。FFmpegはralphy audio/ralphy videoを介してのみ使用します。デバッグ以外でbunx hyperframes renderを直接実行したり、アドホックなffmpegシェルを実行したりしないでください。すべてのレシピは自動ログ記録される動詞です。これエージェントの不変条件 #2 です。
エンジン
HyperFrames が唯一のレンダリングエンジンです。すべてのプロジェクトは .ralphy/workspaces/<ws>/projects/<id>/index.html を出力する必要があります。コンポジションルール、GSAPタイムライン、レジストリブロック、キャプション、トランジション、オーディオミキシングについては、hyperframes を参照してください。
CLIクックブック
レンダリングは ralphy render を介してのみ行います。FFmpeg は ralphy audio / ralphy video を介してのみ使用します。デバッグ以外で bunx hyperframes render を直接呼び出したり、アドホックな ffmpeg にシェルアウトしたりしないでください。以下のすべてのレシピは自動ログ記録される動詞です。
# 最終レンダリング
ralphy render <project-id> [--loudnorm]
ralphy render <project-id> --fps 60 --quality high
# キャプション
ralphy generate captions --project <id> --audio <vo.mp3> # → captions.json (Caption[])
# HyperFrames には、組み込みのワードレベルの文字起こし機能もあります。
bunx hyperframes transcribe --in <vo.wav> -o captions.json
# オーディオレシピ — cli/lib/ffmpeg-recipes.ts をラップ
ralphy audio loudnorm --in <vo.mp3> --out <vo-norm.mp3> # TikTok / Reels 向け -16 LUFS
ralphy audio sidechain --voice <vo> --music <m> --out <mix.mp3> # VOに合わせて音楽をダッキング
ralphy audio concat --files a.mp3,b.mp3,c.mp3 --out concat.mp3 # ロスレス結合
# ビデオレシピ
ralphy video extract-segment --in <src.mp4> --start 1.2 --end 4.5 --out <seg.mp4>
ralphy video burn-subs --in <src.mp4> --srt <subs.srt> --out <final.mp4> # 最終ステップ
ralphy video tonemap-hdr --in <hdr.mp4> --out <sdr.mp4> # HDR → Rec.709
ralphy video concat --files a.mp4,b.mp4 --out concat.mp4
# HyperFrames イテレーションループ (フォアグラウンドのみ — 自動Studio起動なし)
bunx hyperframes preview .ralphy/workspaces/<ws>/projects/<id>
bunx hyperframes lint .ralphy/workspaces/<ws>/projects/<id>
bunx hyperframes inspect .ralphy/workspaces/<ws>/projects/<id>
bunx hyperframes add <block-slug> .ralphy/workspaces/<ws>/projects/<id>
# 入力 / 出力を検査
ralphy project show <id> --assets # コンポジション前のアセットマニフェスト
ralphy project show <id> --status # 完了/不足しているもの
ralphy project log <id> --type generations --limit 50 # ffmpeg + レンダリングエントリ
HyperFrames APIの詳細(コンポジションルール、GSAPタイムライン、キャプション、トランジション、レジストリブロック)については、hyperframes を参照してください。これがリファレンスマニュアルであり、このプレイブックではありません。
スタイライズドクリップの延長 (i2v 最終フレームアンカー + フル15秒ブロック)
ユーザーが既存のスタイライズドクリップ(トゥーン、ペインタリー、スパイダーバース/アーケインレジスタ)を「延長」/長くするように要求した場合、新しい断片的なクリップを生成せずに、既存のクリップの最終フレームから新しい i2v クリップをアンカーし、結合部分がシームレスになるようにします。
- 最終フレームを抽出します。
ralphy video extract-segment(またはralphy videoレシピ経由のffmpeg -sseofテールフレーム取得)で最後の約0.15秒 → 1つのPNG。 - そのPNGを
bytedance/seedance-2.0への新しいralphy generate videoi2v 呼び出しの--first-frameとして渡します。新しいクリップは実際の最終フレームから開始されるため、カットは見えなくなります(スタイライズド/ペインタリーアンカーはseedanceのフォトリアル人間プライバシーフィルターをトリガーしません。そのフィルターはフォトリアルな人間の顔にのみ作動します。feedback_seedance_rejects_realistic_peopleを参照)。 - 延長はデフォルトで5秒ではなく、フル15秒ブロックにします。短い延長は慌ただしく感じられ、ダイナミクスを失います。15秒ブロックには真のビート(例:ソロ → 群衆を明らかにするカメラオービット → フィナーレ)のための余地があり、スタイライズドレジスタは静的なワイドショットよりもアクションの多い長いブロックでより強く発揮されます。ダイナミクスのために動くカメラ(オービット/クレーン)を強調します。SUBJECT / STYLE / AUDIO-POLICY プロンプトブロックはブロック間でそのまま維持します。
ralphy video concatでブロックを結合し、フル新しい長さに合わせた音楽ベッドをクライマックスがフィナーレに合うように再生成し、ralphy audio sidechain(VOの下で音楽をダッキング)を実行してrender/final.mp4にコピーします。
適用されないケース: フォトリアルな人間のクリップ(seedance はアンカーを拒否するため、代わりに kwaivgi/kling-v3.0-pro を使用して延長)。遅い静的/ダイアログ駆動のビートで5秒の延長が適切な長さである場合。新しいビートが継続ではなくハードなシーンチェンジである場合(その場合は延長ではなく新しいシーンであり、最終フレームアンカーは不要)。
サブドキュメント (オンデマンドで参照)
| ファイル | 読むタイミング |
|---|---|
| editor/render-pipeline.md | プリフライト、コンポジション作成、プレビュー、最終レンダリング |
| editor/vo-sync.md | VOに合わせたカット — ステッチ → 書き起こし → スライス;リバースアリバース + concat demuxer (エージェントの不変条件 #16) |
| editor/captions.md | captions.json をキャプションコンポーネントに配線;タイミング定数を書く前にキャプションを先に |
| editor/transitions.md | クロスフェード / プッシュ / ワイプパターン |
| editor/audio-mixing.md | VO + 音楽 + SFX レベル、ダッキング、フェード |
| editor/green-zone.md | 1080×1920 セーフゾーン内でのテキスト/オーバーレイ配置 |
| editor/hard-rules.md | 最終版のための12項目のffmpeg / カット規律チェックリスト |
サブタスク
| サブタスク | タイミング | サブドキュメント |
|---|---|---|
preflight | 「レンダリングの準備はできていますか?」 | render-pipeline |
generate-captions | VO準備完了、captions.jsonがない | captions + vo-sync (VOに合わせたカット用) |
author-composition | マニフェスト完了、コンポジションがない | render-pipeline + transitions + hyperframes |
preview | 「ブラウザで見たい」 | render-pipeline + bunx hyperframes preview |
final-render | コンポジション承認済み | render-pipeline + hard-rules |
起動時に読むもの
- 最初に
ralphy editor preflight <id>を実行します。 単一の正規チェックで、長さ、fps、コーデック、オーディオトラック、音楽ギャップと総クリップ長の比較、およびシナリオからディスクへの完全性を確認します。赤色で終了コード1を返します — 修正してからコンポジションします。すべてのプロジェクトのアドホックなffprobeループを置き換えます(#034)。 - 次に
ralphy editor trim-analyze <id>を実行します。artifacts/videos/に対してバッチの gemini-3.1-pro-preview ビジョンパスを実行し、クリップごとのデッドタイム/ホットモーメント/提案trim_in_s/trim_out_sを特定します。結果をartifacts/analysis/summary.jsonに集約します(mtime ベースでべき等 — 変更されたクリップのみを再分析します)。--dry-runを使用して計画 + キャッシュ状態をプレビューします。kling/seedance の約1秒のオーバーシュート (#042) に対する正規の解決手段です(#034)。 AGENTS.md— 不変条件(自動Studio起動なし、スクリプトなし、ralphy render)。- hyperframes playbook — HyperFrames コンポジション / キャプション / トランジション / GSAP / レジストリのリファレンスマニュアル。
- art-director/pre-render-checklist.md — 引き継ぐ前にアートディレクターがクリアしなければならない HARD スナップショットレビューゲート。スナップショットがディスク上にない状態でここに到着した場合は、アートディレクターに差し戻します。
.ralphy/workspaces/<ws>/projects/<id>/scenario.json— 構造とタイミング。.ralphy/workspaces/<ws>/projects/<id>/asset-manifest.json— アセットパス。
.ralphy/workspaces/<ws>/projects/<id>/index.html— コンポジション。.ralphy/workspaces/<ws>/projects/<id>/design.md— ブランドの信頼できる情報源(HyperFrames スキルゲート)。docs/green-zone.mdテキスト配置用。
ハードルール(AGENTS.md から継承)
ralphy render <id>— 唯一のレンダリングパス。bunx hyperframes renderを直接呼び出さないでください(デバッグを除く)。- 自動起動のプレビュー / Studio は禁止。 バックグラウンドで
hyperframes previewを実行しないでください。ユーザーがプレビューを望む場合は、フォアグラウンドで実行するように明確に伝えてください。 - キャプションは
ralphy generate captions(whisper-1 OpenRouter)またはワードレベルのタイムスタンプのためにbunx hyperframes transcribeを介して。 コンポジションにキャプションオーバーレイがある場合(エージェントの不変条件 #16)、HF / Remotion のタイミング定数を書く前にこれを実行してください。VOに合わせたカット全体には、editor/vo-sync.md を介して、書き起こしを先に行います。editor/captions.md を参照してください。 - 最終レンダリング前の品質ゲート — マニフェストのすべてのスロットは
score >= 7であるか、明示的なバイパス同意が必要です。 - FFmpeg 後処理 —
cli/lib/ffmpeg-recipes.tsを介してのみ行います。editor/hard-rules.md(12項目)を参照してください。 - モーショングラフィックス → コンポジションコード、ビデオモデルは不可(
04.0A.02)。以下の決定木を参照してください。アニメーションテキスト、キネティックタイポグラフィ、ローワーサード、アニメーションチャート、アニメーションUIモック、トランジションワイプはすべて HyperFrames HTML + GSAP としてコンポーズされます。これらはralphy generate videoを介して生成されません。そのパスは実写/イラスト/フォトリアルシーン、つまりモデルが生成するピクセルコンテンツのために予約されており、コードでコンポーズされたモーションではありません。 - レンダリングに関するすべてのユーザーフィードバックのターンを
ralphy project log-prompt <id> --text "<verbatim>" --stage <feedback|approval|critique|rejection>を介してログに記録する必要があります — カットへのプッシュバック、キャプション修正、オーディオリミックス、「出荷」承認、レンダリングを停止させる批評。シナリオライタープレイブック(scenarist.md→ 「ユーザープロンプトログ記録」 を参照)と同じ MUST-log 規律に従います。ログがまばらだと、ポストモーテムレイヤーはユーザーが実際にどのレンダリングバージョンを承認したかを推測することになります。 - Kling + seedance は
--durationを約1秒超過します。kwaivgi/kling-v3.0-proとbytedance/seedance-2.0からのすべてのクリップは、要求された長さよりも約1秒長くなります(tokyo-y2k-001 測定:5s/4s/9s → 6.04/5.04/10.04)。マルチクリップカットをコンポーズする前に、(a) アートディレクターステージで--durationを1秒短く要求するか、(b) クリップごとのビジョントリムパスを予算化します。完全なレシピと数値は editor/render-pipeline.md → Source-clip duration overshoot にあります。構造的な解決策は将来のralphy editor trim-analyze動詞にあります(issue 034)。
ピクセル vs コード — モーショングラフィックス決定木 (04.0A.02)
シーンを ralphy generate video にルーティングする前に、出力を分類します。
| パターン | ルート | 理由 |
|---|---|---|
| 実写シーン(人物、部屋、アクション、天候、ゲームプレイキャプチャ) | ralphy generate video (i2v / t2v) | モデルがコードでは偽造できないピクセルを生成する |
| フォトリアル静止画 + パララックス | ralphy generate image + HyperFrames GSAP トゥイーン | 画像がアセットであり、モーションがコンポジションである |
| アニメーションテキスト / キネティックタイポグラフィ / 「WORDS SLAM IN」 | HyperFrames コンポーネント + GSAP タイムライン | コードがタイミングと正確なスペルを制御する;ビデオモデルは文字をぼかし、フォントをドリフトさせる |
| ローワーサード / ネームカード / クロノ | HyperFrames HTML + GSAP | 簡単にパラメータ化可能;ピクセルルートでは生成のたびにフォントを再レンダリングすることになる |
| アニメーションチャート / データビジュアライゼーション | HyperFrames HTML + GSAP / Three.js | コードがデータの信頼できる情報源である;ピクセルルートは値を幻覚させる |
| アニメーションUIモックアップ / アプリ画面 | HyperFrames HTML + GSAP | ピクセルルートはUIアフォーダンスをでっち上げる;結果はAIの粗悪品と読まれる |
| 2つのクリップ間のトランジション | HyperFrames シェーダー/クロスフェードレジストリブロック | 2つのクリップがアセットであり、トランジションはコードレシピである |
| パーティクル / FX オーバーレイ | HyperFrames CSS/SVG/Canvas/WebGPU | 繰り返し可能;ピクセルルートは非決定的である |
| Lottie アニメーションドロップイン | HyperFrames lottie アダプタ | Lottie ファイルがアセットであり、ランタイムがそれを決定的に再生する |
兆候(bun run lint:templates のリントは prompts.json 内の既知の違反をフラグ付けします):「アニメーションテキスト」、「キネティックタイポグラフィ」、「ローワーサードがアニメーションイン」、「チャートがアニメーションイン」、「ロゴがスライドイン」、「トランジションワイプ」 → これらはHTML+GSAP側に送られ、ビデオモデルには送られません。これらのフレーズのいずれかを ralphy generate video への --prompt として書いていることに気づいたら、停止して代わりにコンポーネントをコンポーズしてください。
クロスリンク:APIの詳細については hyperframes を参照してください。
歴史的な余談(Remotion)。
92ef823より前のブランチやSTATIC_ROOT/composition-props.jsonに言及しているポストモーテムを調査している場合、レガシーな Remotion の慣習は editor/render-pipeline.md → Legacy: RemotionSTATIC_ROOTrecipe に文書化されています。現在の HyperFrames の作業には関係ありません。
引き継ぎ
preflightで不足しているアセットが見つかった場合 → アートディレクタープレイブックに従って再生成。- タイミングがずれている場合(VO ≠ scenario.duration) → シナリオライタープレイブックに従ってシーンを再タイミング。
final-render後、それがバッチの一部である場合 → プロデューサープレイブック。- 新しい HyperFrames パターンの場合 → hyperframes playbook と関連スキル本文 (
gsap、lottie、animejs、…) をコードを書く前に参照。 - 再コンポーズ/再生成中に同じ軸でシーンが2回失敗した場合 → アートディレクタープレイブック → 再生成する代わりにシーンを分割する を参照。再プロンプトを停止し、同じスロット予算内でマイクロショットに分割します。