Communitygithub.com

uttamongithb/REEL-FROM-SCRIPT · v7

スクリプトと参考動画から、アートディレクションされた9:16リールを生成するスキルです。毎回新しいチャットで、壊れてしまうことがありません。

REEL-FROM-SCRIPT · v7 とは?

このスキルは、提供されたスクリプトと参考動画から、プロフェッショナルな9:16リール動画を自動生成するためのものです。v7は、実際のリール制作で得た教訓を反映し、6色のフィールドサイクル、カバーポスター、シーンごとのカードアニメーション、連続シーンスパン、アダプティブワイプ、オーディオトラップの回避、そして品質チェックを自動化する`./build.sh` + `scripts/qc.py`を備えています。ユーザーが編集するのは`PARAMS.json`のみで、`prepare.py` / `qc.py`が品質を保証します。9:16をはじめ、4:5、1:1、720pなどのフォーマットに対応し、Node.js 22以降とHyperframesライブラリ上で動作します。VO(ナレーション)の計測を起点に、レイアウト、アニメーション、サウンドデザインまでを一貫して生成し、再現性の高い出力を実現します。

対応✓Claude Code~Codex CLI~Cursor
npx skills add https://github.com/uttamongithb/video-skill/tree/HEAD/skills/reel-from-script-v7

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

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

ドキュメント

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秒
3VOを最初にpython3 scripts/process_vo.pytimeline.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] lint0エラーがゲート
9目視確認npx … snapshot --at "0,1.5,4,…"「正しいが見苦しい」をキャッチする唯一のステップ
10レンダリングnpx … render --output renders/_raw.mp432秒の1080×1920で約1分45秒、ソフトウェアGL
11ミックスpython3 scripts/mix_audio.pyVO + ベッド + キュー → renders/master.wav(-14 LUFS)
12マックス + 納品build.sh ステップ6〜7mp4 + .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 · オーディオプレイブック

瞬間キューゲイン
すべてのカットpop0.50
最大の2つのターンriser カットの0.3秒前0.28–0.30
UI要素の着地click, key0.38–0.45
リストの刻み込みkey ×N、0.12秒間隔0.40
リビール / スコアchime0.36–0.42
CTAnotify、その後1.7秒後に ping0.32–0.40
間違い / 拒否error(控えめに—コメディとして一度だけ読まれる)0.30

キューオフセットはセクション相対でassets/sfx/cues.jsonにあります("vo7+1.68")。そのため、録り直したVOはデザインを無効にしません。単語の最初の音節にキューを決して置かないでください。ティックは20〜60 ms 属します。

...(翻訳対象として切り詰められました)

Individual skills in this repo

This repo contains 1 individual skill — each has its own dedicated page.

関連スキル