テイスト蒸留 は何をしますか?
このスタンドアロンスキルは、その実装を 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からほとんど動きませんでした。測定されたパックを同じ映像に適用すると、1回の決定論的パスで、クロマMAE 1.88、コントラスト 33.7 を無料で達成しました。
つまり、分割は次の通りです:モデルはコンテンツ、モーション、照明構造を提供し、パックはルックを提供します。 生成プロンプト内の色に関する単語は役に立たないどころか、コストがかかり、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> # 1回のVLM呼び出し
mint.py は純粋な数値解析です。ネットワーク不要、キー不要、決定論的なので、パックはバックアップではなく再生成できます。
重要な測定項目
クロマは輝度ゾーンごとに、グローバルではなく
カラーのアイデンティティは通常、1つの輝度帯に存在します。グローバルなa*/b*オフセットは、数学的に分割トーンを表現できません。ゾーン内でクロマを測定します(L* edges [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*をマゼンタ方向に歪めます。時間的分散はこれらをきれいに分離します。映像は動き、インターフェースは動きません。そのため、手動で調整されたクロップは不要です。実際の素材では、これにより約65%のピクセルが保持されます。
カデンスには適応的閾値が必要
適切なコンテンツ検出器の閾値は素材に依存します。ハイコントラストのアクションリファレンスは30でも十分にカットを検出しますが、ムーディーなリファレンスはその下にカットを隠します。降順の閾値をスイープし、最も感度の高い設定で見つかるショットの≥90%を依然として回復する最も高い閾値を採用します。これにより、ノイズよりも実際のカットに偏ります。不合理なカット率(>100/分)を暗示する閾値は拒否します。連続的なカメラ移動は、検出器を毎フレーム誤動作させます。
スイープ全体を共有の StatsManager による1回のデコードパスで実行します。ナイーブなバージョンは閾値ごとに再デコードするため、60fpsソースでは秒と分の差が生じます。
オーバーレイプレート:スクリーンショットではなくアセット
スチルはフレーム全体です。スチルを合成すると、ただ別の画像を上に重ねるだけです。プレートは、リファレンスのグラフィックボキャブラリ(フレア、ストリーク、グリッチフラグメント)を黒ベースに抽出したもので、キーイングなしでスクリーンブレンドできます。
実際の素材で遭遇した2つの落とし穴:
- 絶対閾値は失敗する。 明るいリファレンスでは、
L>55 AND chroma>12の選択範囲がフレームの約90%を占め、「プレート」は画像そのものになります。認識可能な顔も含まれます。パーセンタイル(約上位3%)で選択し、フレームの約22%以上を覆うプレートは拒否します。 - 明るさではなく、分離度でランク付けする。 「明るく飽和したピクセルの割合」でランク付けすると、くすんだフレームが上位になり、1つの強烈なフレアがある黒いフレーム(実際のシグネチャ)が下位になります。スコアは
p99.5(energy) / median(energy)を使用します。
また、スコアリング前にマスクします。焼き付きタイポグラフィは明るく、飽和しており、ハイコントラストです。そのため、マスクなしの実行では、誰かのタイトルカードの完璧なプレートが生成されます。
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*をターゲットの−17.5に対して+11.6に反転させました。オフセットはMAEを6.23から2.13に改善しました。
- ガマット圧縮は、同一のMAEに対して3.8倍の実行時間を要しました。オプトインにしてください。
アンチパターン
| してはいけないこと | 理由 |
|---|---|
| 合成テスト映像に対してチューニングする | 1つのプロジェクトで4つの誤った結論を招き、実際の映像がそのすべてを覆した |
| MAEだけを信頼する | 視覚的に壊れたフレームで1.88のMAEが成功のように見えた |
| クロマに平均/標準偏差を使用する | 右裾分布のため、約3倍強くプッシュする |
| エンドポイントゾーンのみを比較する | 両端は構築上ほぼニュートラルである |
| ルックを説明して終了する | スペックはコンテンツと構造のため、パックは色のためである |
引き継ぎ
パックがインターフェースです。パックが存在すれば、taste-application スキルを使用して生成および組み立てを行うか、look.cube をカラリストに直接渡します。
同梱コード
このスキルの scripts/ は、擬似コードではなく動作する実装です。プロジェクト固有の前提条件はありません。任意のリファレンス動画を指定すれば、パックが生成されます。
pip install -r scripts/requirements.txt
export FAL_KEY=... # falを呼び出すステージにのみ必要
すべてのネットワーク呼び出しは、TASTE_FORGE_DRY_RUN=1 または --dry-run の下でスタブ化されるため、プラン、プロンプト、トラックレイアウト、マニフェストをコストをかけずに検査できます。