テイスト蒸留 (Taste Distillation)
このスタンドアロンスキルは、実装を scripts/ に含みます。その後の生成またはローカルテイク編集には taste-application を使用してください。各ジャンルは独自のパックにまとめてください。Flash Ethereal の測定値を、Fluid Sketch や 3D Cyber Glitch に黙って再利用してはいけません。測定値がゼロの場合は有効なデータであり、欠落フィールドと区別してください。
ローカル依存関係は scripts/requirements.txt にあります。別途認可されたプロバイダーワークには、scripts/requirements-live.txt、認証情報、および明示的な TASTE_FORGE_ALLOW_LIVE=1 が必要です。--dry-run では認証情報を読み取らず、ジョブも送信しません。ワークフローがローカルエンドポイント名から保存されたと推測しないでください。実際のプロバイダー側のワークフローまたはリクエストの証拠を使用してください。
リファレンス動画をスタイルパックに変換します。これは、後続のステージが決定論的に消費する測定値とアセットのフォルダです。
いつ起動するか
- 「これらのクリップのルックをキャプチャしたい」「雰囲気を抽出したい」「これを再現可能にしたい」
- ユーザーがリファレンス映像を持っており、LUT、グレード、またはマッチするペーシングを必要としている
- ジャンルごとにルックのライブラリを構築している
- 「スタイルをプロンプトで説明する」が答えになるようなリクエスト
核心的な発見
プロンプトではグレードを提供できません。測定ならできます。
実際の映像で測定しました:エスカレートするカラー指示を使った3回の有料生成では、ミッドトーンa*が +1.9 → +2.8 → +0.3 と変化したのに対し、ターゲットは +24.9 でした。またコントラストは 34.7 のターゲットに対して約19から動きませんでした。同じ映像に測定済みパックを適用すると、色差MAE 1.88、コントラスト 33.7 を1回の決定論的パスで、無料で達成しました。
つまり、分担は次の通りです:モデルはコンテンツ、モーション、照明構造を提供し、パックはルックを提供します。 生成プロンプトに色の単語を入れるのは無駄どころか有害です。お金がかかり、LUTが望むニュートラルベースからレンダリングを遠ざけます。プロンプトに明示的に次のように記述してください:「色:なし。ニュートラルにレンダリング。グレーディングは後で適用されます。」
パックの内容
stylepacks/<genre>/
grade.json 測定された色統計(下記参照)
cadence.json 検出されたすべてのショット境界と導出された分布
look.cube 33^3 LUT、ResolveにノードLUTとして直接ドラッグ可能
spec.json VLMによる説明、測定値に基づく
grounding.txt VLMに与えられた測定値の事実
stills/ 最長ショットからのフル解像度フレーム(条件付け画像)
plates/ 黒背景に抽出されたスクリーンブレンド用オーバーレイ要素
props/ ミントされたGLBメッシュ
pack.json マニフェスト
実行方法
python mint.py --genre <name> --refs a.mov b.mov c.mov # オフライン、APIキー不要
python distill.py --genre <name> # VLM呼び出し1回
mint.py は純粋な数値分析です。ネットワークなし、キー不要、決定論的なので、バックアップの代わりにパックを再生成できます。
重要な測定項目
色度は輝度ゾーンごとに、グローバルではない
カラーのアイデンティティは通常、1つの輝度帯にあります。グローバルなa*/b*オフセットは、数学的にスプリットトーニングを表現できません。ゾーン内で色度を測定します(L* エッジ [0,15,35,55,75,100])。
実際の特徴:L25でバイオレット(a +24.9、b* −17.5)、両端はほぼニュートラル。最も暗いゾーンと最も明るいゾーンのみを報告すると、「均一なキャスト」と誤認されます — 常に全曲線を出力してください。
中央値 + MAD、平均 + 標準偏差ではない
実際のリファレンスセットにおける色度は強い右歪みを持ちます。ある測定リールでは、ミッドトーン色度の平均は36.9、中央値は17.5でした。そのため、平均ベースのLUTは素材が正当化するよりも約3倍強い色を押し出しました。
コントラストはstd(L*)、白マイナス黒ではない
白−黒レンジはほぼ全ての実際の映像で約100であり、何も識別しません。
背景シェアは第一級の統計量
L*10未満のピクセルの割合を記録します。分布のモーメントではこれを捉えられません。クリップは正しい平均、標準偏差、色度を持ちながら、黒がグレーに持ち上げられている可能性があります。これはまさに、あるグレードがMAE 1.88 / コントラスト 33.7 をスコアしながら、実際のフレームが濁った紫色の混乱だった理由です。
測定前にインターフェースをマスクする
画面録画されたリファレンスには、静的な家具(レターボックスバー、ステータスバー、いいねアイコン、キャプションテキスト)が含まれます。これらはすべて、あたかもルックであるかのように統計に反映されます。黒バーはシャドウの重みを膨らませ、赤いハートはa*をマゼンタに歪めます。時間的分散(Temporal variance) がこれらをきれいに分離します — 映像は動き、インターフェースは動きません。そのため、手動で調整されたクロップは不要です。実際の素材では、これにより約65%のピクセルが保持されます。
カデンスには適応的閾値が必要
適切なコンテンツ検出器の閾値は素材に依存します。ハイコントラストのアクションリファレンスは30でも十分にカットを検出しますが、ムーディーなものはカットを隠してしまいます。閾値を降下させながら、最も感度の高い設定で見つかるショットの90%以上をまだ回復する最も高い閾値を採用します。これにより、ノイズではなく実際のカットに偏ります。異常なカット率(>100/分)を示す閾値は拒否します。連続的なカメラ移動は検出器を毎フレーム誤作動させます。
スイープ全体を共有のStatsManagerで1回のデコードパスで実行します。ナイーブなバージョンは閾値ごとに再デコードするため、60fpsソースでは秒と分の違いになります。
オーバーレイプレート:スクリーンショットではなくアセット
静止画はフレーム全体です。コンポジットしても別の画像を重ねるだけです。プレートは、リファレンスのグラフィック語彙(フレア、ストリーク、グリッチフラグメント)を黒背景に抽出したもので、キーイングなしでスクリーンブレンドできます。
実際の素材で遭遇した2つの落とし穴:
- 絶対閾値は失敗する。 明るいリファレンスでは
L>55 AND chroma>12の選択がフレームの約90%を占め、「プレート」は画像そのものになります。認識可能な顔も含みます。パーセンタイル(〜上位3%) で選択し、フレームの約22%以上を覆うプレートは拒否してください。 - 明るさではなく、分離度でランク付けする。 「明るく飽和したピクセルの割合」では、色あせたフレームが上位に、実際の特徴である黒背景に1つの強いフレアがあるフレームは下位になります。
p99.5(エネルギー) / median(エネルギー)でスコアリングします。
また、スコアリング前にマスクします。焼き付きタイポグラフィは明るく、飽和しており、ハイコントラストです。マスクなしで実行すると、他人のタイトルカードの完璧なプレートが生成されます。
VLMのグラウンディング
説明を要求する前に、測定値をシステムプロンプトにフィードします。グラウンディングされていないVLMは、+24.9のa*キャストがある映像に対して「カラーグレーディングなし、ニュートラル」と報告します。グラウンディングされると、キャストを正しく説明し、二次的なアクセントを独立して推測します。
回避語(varied, mixed, dynamic, some, often, neutral, or)を禁止します — モデルは「変化する照明」をレンダリングできません。コードで禁止を強制し、プロンプトだけに頼らないでください。 おおよそ3回に1回の実行で違反が発生しました。フィールドごとに再質問し、N回の試行後、最も曖昧でない回答を保持します。失敗するよりも良いです。
ユーザーに述べるべき注意点:仕様が測定値にグラウンディングされると、それらに対する独立したチェックではなくなります。
LUTベイキングの落とし穴
- LUTはピクセル単位のRGB関数のみをエンコードできます。分布に依存するもの(ヒストグラムマッチング、パーセンタイルアンカー)は、ベイクする前に定数に削減する必要があります。さもないと、映像ではなく均一なLUTグリッドを静かに測定します。
cv2.cvtColor(LAB2RGB)は内部でクランプするため、これを使用して色域外テストを行うと0%と報告されます。Lab→線形sRGBは手動で変換してください。実際の測定では83.3%が色域外でした。- 色度の転送はオフセットで行い、アフィンでは行わないでください。アフィンはソースのσで除算し、オーバーシュートします。実際の映像ではb*を+11.6に反転させ、ターゲットは−17.5でした。オフセットによりMAEは6.23から2.13に改善されました。
- 色域圧縮は、同一のMAEに対して3.8倍の実行時間がかかりました。オプトインにしてください。
アンチパターン
| しないこと | 理由 |
|---|---|
| 合成テスト映像で調整する | 1つのプロジェクトで4つの誤った結論を招き、実際の映像ですべてが覆された |
| MAEだけを信頼する | MAE 1.88は、視覚的に壊れたフレームで成功のように見えた |
| 色度に平均/標準偏差を使用する | 右歪み; 約3倍強く押し出す |
| エンドポイントゾーンのみを比較する | 両端は構造的にほぼニュートラル |
| ルックを説明して終了する | 仕様はコンテンツと構造用、パックはルック用 |
ハンドオフ
パックがインターフェースです。一旦パックが存在すれば、taste-application スキルを使用して生成・アセンブルするか、look.cube を直接カラーリストに渡します。
バンドルされたコード
このスキルの scripts/ は、疑似コードではなく、動作する実装です。プロジェクト固有の前提はありません。任意のリファレンス動画をポイントするだけでパックを生成します。
pip install -r scripts/requirements.txt
export FAL_KEY=... # fal を呼び出すステージでのみ必要
すべてのネットワーク呼び出しは、TASTE_FORGE_DRY_RUN=1 または --dry-run でスタブ化されるため、お金をかけずに計画、プロンプト、トラックレイアウト、マニフェストを検査できます。