REEL-FROM-SCRIPT · v7 は何をしますか?
あなたが書いていないスクリプト、リバースエンジニアリングする必要がある参考動画、そして前回の記憶がない新しいチャットから、アートディレクションされ、決して壊れることのない9:16リールを作成するスキルです。
v5ではレイアウトを出荷し、デザインをハードコードしました。v6ではすべての数値をPARAMS.jsonに移動し、レンダリングの前にバリデーターを配置しました。v7は、実際の2本のリールがv6に教えたことです。— 6色のフィールドサイクル、カバーポスター、シーンごとのカードアニメーション、連続シーンスパン、アダプティブワイプ、オーディオの落とし穴、そして不良な納品物を拒否する単一の./build.sh + scripts/qc.py。
約束: 人間が編集する唯一のファイルは
PARAMS.jsonです。ノーと言うことを許された唯一のものはprepare.py/qc.pyです。他のすべては生成され、生成されたものはすべて1つのコマンドから再現可能です。
0 · 初めての方へ:最初の10分間
export PATH=/home/user/node22/bin:$PATH # Node >= 22
cd <project> && ./build.sh --from render # または§3を最初から実行
次に、この順序で読んでください:§1(ルックの構築方法)→ §3(パイプライン)→ §6(デザインプレイブック)→ §9(失敗カタログ)。レイアウトを自分で発明しないでください:スケルトンがデザインです。
絶対にしてはいけない4つのこと: 長さを手入力する(VOを測定する)、コンポジションに16進数やpxを貼り付ける(PARAMS.jsonを変更する)、index.htmlを手書きする(生成する)、またはコンタクトシートを見ずに出荷する。
1 · 出力がデザインされて見える理由(7つの法則)
これらは、このシリーズのすべての良いフレームの背後にある実際の決定事項です。これらはルールであり、好みではありません。
1. 固定されたアンカーグリッド。 キッカー → ヒーロー → ボディ → チップ → プレゼンター。下半分は決して動きません:チップは常に同じy位置にあり、プレゼンターは常に同じ場所でフレームによって切り抜かれます。上半分だけが再構成されます。だからこそ、9つの異なるシーンが1つのフィルムとして読まれます。
2. ヒーローは単語であって、文章ではない。 1〜3語の単語で、凝縮されたディスプレイフェイスでフレーム幅の約17〜25%、タイトラインターハイト(0.88)で設定します。完全な行はチップ(3〜6語、ミュートされた視聴者が読むもの)に入り、詳細はカードに入ります。3語で言えない場合、そのビートは2ビートです。
3. すべてのビートは異なる背景を持つ。 6つのフィールド(クリーム / マルーン / ニアブラック / セージ / ネイビー / ラベンダー)が、隣り合う2つが一致しないように循環します。色の変化そのものがトランジションのもう半分です。prepare.pyは、連続する2つのシーンがフィールドを共有している場合、ビルドを失敗させます。
4. 証明であり、装飾ではない。 カードは、ファイルリスト、差分、ブラウザ、アップロード、メーターなど、何かを示すために存在します。ビートにアーティファクトがない場合、それはtype-ledであり、カードはありません。2行しかないカードは壊れて見えます。4〜6行は意図的に見えます(またはカードの55%以上を占めるモックアップ)。
5. 最初のフレームはポスターである。 シーン1はt=0(data-cover="1")で構成されます。キッカー、ヒーロー、カード、キャラクターがすでに画面に表示され、チップは0.65秒で着地します。空のフィールドで始まるリールはスクロールを失います。
6. モーションはtransformのみで、早めに着地する。 エントランスは0.24〜0.34秒、power2/3/4.outで、ビートの前半で終了します。テキストコンテンツをアニメーション化したり、数値をトゥイーンしたり、1.5秒のシーンが0.6秒もワイプに費やしたりしないでください。ヒーローのゆっくりとしたドリフトが最後の1秒を生き生きとさせます。
7. サウンドは句読点であり、壁紙ではない。 1秒あたり1キュー以下:カットごとにポップ、UIのキーティック、最大の2つのターンにライザー、リビールにチャイム、CTAに通知/ピング。ベッドは-16 LUFSのVOの下で0.15。マスタリングは-14 LUFS / ≤ -1 dBTP。
2 · 契約:固定されているものと、あなたのもの
不変 — 検証済み、雰囲気で編集不可
| 不変条件 | 強制方法 |
|---|---|
| すべてのテキスト/背景ペアが読み取り可能 | WCAG ≥ 4.5:1(10個のレンダリングペア + 6個のフィールドペアでテスト) |
| ヒーローはヒーローであり、常に収まる | ≥ 120 px、派生サイズ、--hero-band内の--hero-linesに収まる必要あり |
| ヒーローはキッカーと重ならず、カードに触れない | 派生バンド + --gap、ハードフェイル |
| ボディコピーがスマートフォンで読み取り可能 | ≥ 24 px かつ ≥ bodyMin |
| プラットフォームUIの下に何も隠れない | チップ底部 ≤ セーフゾーン底部、≥ 55%使用可能 |
| チップがカードと衝突しない | cardTop + cardHmax ≤ chipTop |
| プレゼンターはフレームで切り抜かれ、チップの上に重ならない | presenterTop + h > 1.0、presenterTop ≥ chipBottom |
| 連続する2つのシーンがフィールドを共有しない | data-fieldがすべてのコンポジションから読み取られる |
| フレーム0はカバーである | data-cover + スナップショットゲート |
| すべてのシーンで異なるポーズ | シーンごとに1つのポーズファイル、レビュー時にチェック |
| 納品物が再生可能で十分な音量である | qc.py:解像度、fps、フレーム数、LUFS、トゥルーピーク、無音の穴 |
変数 — 本当にあなたのもの: パレット値(6フィールド + 4ペーパートーン、コントラスト許容)· フォーマット(9:16、4:5、1:1、720p)· セーフゾーンインセット · フロア内のすべてのグリッドとタイプ比 · シーンごとのアーキタイプ · シーン数 · 単語 · 長さ · ポーズセット · キューシート · ディスク上のフォント。
バリデーターがチェックできないレイアウトが必要な場合は、スケルトンとチェックを追加します。それが自由の代償であり、出力が悪くなり得ない理由です。
3 · パイプライン(順序は交渉不可)
| # | ステップ | コマンド | 理由 |
|---|---|---|---|
| 0 | 参考動画をリバースエンジニアリングする | §4 | 測定していないルックを一致させることはできない |
| 1 | 事実 | — | 後から来たクレームは録り直しを強制する |
| 2 | スクリプト → セクション | assets/vo/sections.json | ビートごとに1つのアイデア、1.2〜9秒 |
| 3 | VOを最初に | python3 scripts/process_vo.py | timeline.jsonが時計であり、映像はそれに合わせてカットされる |
| 4 | ルック | PARAMS.json | パレット、フォーマット、グリッド、タイプフロア |
| 5 | ゲート | python3 scripts/prepare.py | コントラスト / タイプ / 衝突 / フィールドリズムで失敗 |
| 6 | シーン | ./scenes.sh | ビートごとに1つのnew_scene.py呼び出し、トークンが注入される |
| 7 | ルート | python3 scripts/build_index.py | 連続スパン、アダプティブワイプ、手書きindex.htmlなし |
| 8 | リント | npx --yes [email protected] lint | 0エラーがゲート |
| 9 | 目視確認 | npx … snapshot --at "0,1.5,4,…" | 「正しいが見苦しい」をキャッチする唯一のステップ |
| 10 | レンダリング | npx … render --output renders/_raw.mp4 | 32秒の1080×1920で約1分45秒、ソフトウェアGL |
| 11 | ミックス | python3 scripts/mix_audio.py | VO + ベッド + キュー → renders/master.wav(-14 LUFS) |
| 12 | マックス + 納品 | build.sh ステップ6〜7 | mp4 + .srt + サムネイル、その後 qc.py |
./build.sh は3→12を一度に実行します。./build.sh --from render は、VOがすでに測定されている場合にVOをスキップします。
ステップ3の詳細 — VOは時計
# セクションごとに1クリップ、assets/vo/ に vo1.mp3 … voN.mp3 として保存
python3 scripts/process_vo.py
無音をトリミングし、script_targetが設定されている場合のみ atempoを適用し、各テイクを-16 LUFSにラウドノーマライズし、assets/vo/timeline.jsonを書き込みます:セクションごとに start/dur/end + root_duration。下流のものは、このファイルにない長さを知ることは許されません。
デーヴァナーガリーのsayと、ラテン文字の英語のテクニカルワード(resume、job description、ATS score、DM)— hi-INの音声がプロソディを正しく取得し、それでも英語の単語を発音します。captionは.srtが表示するものです。
ステップ7の詳細 — ルートは機械的
build_index.pyは、compositions/s*.htmlを数値順に見つけ、測定されたスパンを読み取り、それらを連続にし(0 → cut → cut → … → root、これによりVOに0.30秒のギャップがある場合にブラックホールが表示されない)、各カットの0.36秒前に、到着するシーンの色のワイプを発火させ、最後のシーンをオーディオテールを通して保持します。ワイプは短いシーンの長さの34〜62%に短縮されます— 1.4秒のシーンは0.62秒のワイプを保持できません。
ステップ11の詳細 — 2つのオーディオトラップ
alimiterはデフォルトでlevel=trueです:自動的に天井までレベルを戻すため、「リミッター」がコンプレッサー+メイクアップゲインになり、ミックスが-14を目指しているのに-12.5 LUFSになります。常にlevel=falseにしてください。- 1回の線形パスでの
loudnormはオーバーシュートします。ebur128で測定し、正確にtarget − measuredだけ移動してからリミットします。検証可能な算術は、推測するフィルターに勝ります。
4 · フェーズ0 — 参考動画のリバースエンジニアリング
「これを見て合わせて」という指示があった場合、測定してください。10分、5つのコマンド:
ffprobe -v error -show_entries format=duration:stream=width,height,r_frame_rate,codec_type -of default=nw=1 ref.mp4
ffmpeg -i ref.mp4 -vf "fps=1,scale=400:-1,tile=6x6" -frames:v 1 sheet.jpg # フィルム全体を1枚の画像として
python3 - <<'P' # フィールドパレット、1秒ごと
from PIL import Image; import glob
for f in sorted(glob.glob("frames/f_*.jpg"))[::2]:
im = Image.open(f).convert("RGB"); w,h = im.size
print(f[-7:-4], im.getpixel((3,3)), im.getpixel((w-4,3)))
P
ffmpeg -i ref.mp4 -vn -ac 1 -ar 16000 -c:a pcm_s16le audio.wav # スクリプト用
これから読み取るもの:長さとカットリズム(各ビートの長さ)、フィールドパレット(中央ではなく、コーナーをサンプリング)、タイプ動作(凝縮された大文字?単語ごとのビルド?ハイライトボックス?)、レイアウト(キャラクターの位置、テキストブロックの位置)、UIアーティファクト(どのモックアップか)、サウンド(キューの密度)。これらの6つの数字がアートディレクション全体です。
ブリーフが参考動画を提供したがスクリプトがなかった場合、参考動画がスクリプトです:オーディオを文字起こしし(faster-whisper、int8、baseモデル→ヒングリッシュの32秒で約7秒)、フレームから画面上のコピーを読み取ります。コピーを書き換えないでください—シリーズには声があります。
コピーせずに翻訳してください。 ここでの参考動画は1280×720でした。納品物は1080×1920でした。同じパレット、同じタイプ、同じモックアップ—しかし、ヒーローバンド、チップアンカー、プレゼンタークロップは比率として再導出されました。9:16では、参考動画の8〜10ワードブロックは24pxのボディフロアを下回るため、コピーは異なる方法で分割されます:ヒーロー1〜3ワード、チップに行、カードに詳細。
5 · ファイル
PARAMS.json 唯一のデザインファイル
tokens.css 生成されたレシート(編集しないでください)
index.html build_index.py によって生成(編集しないでください)
SKILL.md · COMPONENTS.md · README.md
build.sh パイプライン全体
scenes.sh すべてのシーン、再現可能
components/ 7つのカードボディ。--card-body @… で渡すことができます
compositions/
_scene-base.html.tmpl スケルトン — リテラルな16進数、リテラルなpxはゼロ
wipe.html 唯一のトランジション
sN-*.html new_scene.py によって生成
_examples/ 3つの実例シーン(マウントされていません:build_indexはcompositions/s*.htmlのみを読み取ります)
scripts/
process_vo.py VO → timeline.json
prepare.py ゲート:フロア + トークン注入
new_scene.py ベーステンプレート → 正しいシーン
build_index.py タイムライン + シーン → ルート
mix_audio.py VO + ベッド + キュー → master.wav
make_deliverables.py .srt + サムネイル
qc.py 1つのコマンド、10ゲートでPASS/FAIL
cutout.py · gen_sfx.py アセット
assets/{fonts,presenter,vo,sfx,music}/
6 · デザインプレイブック(実際に何を選ぶか)
ビート → アーキタイプ。 証明 → card-led。数字 → stat-led(走行距離計、--digits)。声明、トランジション、ブランドカード → type-led。フックとCTAはほとんどの場合card-ledです。なぜなら、両方にアーティファクトが必要だからです(問題を証明するファイルリスト、CTAを証明するコメントスレッド)。
ビート → フィールド。 暖色と寒色を交互に。決して繰り返さない。6フィールドの実用的なサイクル:accent → ground → ink → secondary → tertiary → quaternary。暗いフィールド(ink、tertiary)はプレゼンターを消すので、ハローはそこでは0.20→0.42になります(スケルトンはdata-fieldからこれを行います)。ツールのリビールと「AIが仕事をする」ビートに使用します。そこではドラマが役立ちます。
ビート → ポーズ。 同じキャラクター、同じ服装、シーンごとに1つのポーズ、ラインの感情に一致:肩をすくめる(質問)、顔を手で覆う(問題)、提示する(提案)、顎(好奇心)、記憶(回想)、親指(勝利)、指差す(ステップ)、アイデア(ひらめき)、CTA(依頼)。ベース画像から不足しているポーズを生成し、cutout.pyでマット処理します。白いグラウンドルールと太もも中間のクロップを維持して、きれいに切り抜けるようにします。
画面上の単語。 ヒーロー:感情的な動詞または数字(SAME RESUME?、CUSTOMIZE KARO、TAILOR、ATS SCORE)。チップ:ミュートされた視聴者が知る必要のある文(har company mein bhej rahe ho?)。カードタイトル:アーティファクトが何であるか(applied / 12 companies)。カードメタ:小さな真実の事実(this week、matched 3 of 7)。
ビートが短すぎてデザインできない場合(1〜2秒)。 シーンを維持し、2番目のレイヤーを削除します:ヒーロー + チップ + プレゼンター、type-led、1つのリビール。カードと千鳥リストを1.4秒に詰め込まないでください—グリッチとして読み取られます。
ビートが長い場合(8〜9秒、通常はCTA)。 3つのリビールを1.8〜2秒間隔でステージングし(コメント → DM → リンク)、ゆっくりとしたドリフトでテールを運びます。8秒の静止フレームは、「安っぽく見える」最も一般的な原因です。
トランジション。 1つのワイプ、0.34〜0.62秒、色=到着するシーンのフィールド、方向を交互に。他のトランジションタイプはありません:一貫性こそが、8つのカットを作者の意図したものに見せるものです。
最後の1秒。 最終フレームは、ハンドルとサイトが表示されたデザインされたフレームでなければなりません。そこで一時停止した視聴者がアクションを起こせるように。
7 · オーディオプレイブック
| 瞬間 | キュー | ゲイン |
|---|---|---|
| すべてのカット | pop | 0.50 |
| 最大の2つのターン | riser カットの0.3秒前 | 0.28–0.30 |
| UI要素の着地 | click, key | 0.38–0.45 |
| リストの刻み込み | key ×N、0.12秒間隔 | 0.40 |
| リビール / スコア | chime | 0.36–0.42 |
| CTA | notify、その後1.7秒後に ping | 0.32–0.40 |
| 間違い / 拒否 | error(控えめに—コメディとして一度だけ読まれる) | 0.30 |
キューオフセットはセクション相対でassets/sfx/cues.jsonにあります("vo7+1.68")。そのため、録り直したVOはデザインを無効にしません。単語の最初の音節にキューを決して置かないでください。ティックは20〜60 ms 属します。
...(翻訳対象として切り詰められました)