I2V前チェック:静止画ゲートを疑似コードで
MixVio の Image-to-Video(I2V)で短尺プルーフを回す前に、ソース静止画がゲートを通るかを機械的に確認する手順です。ソフトな製品言及は文中〜文末の MixVio リンク3本に限り、本文の主眼は技術チェックリストと最小の疑似コード/テスト例です。クレジット数字はモデルページのアンカーのみを使い、Generate 前は必ず live 見積を読みます。争点になっているツールページのマーケティング既定値は現在の事実として書きません。
対象読者:プロンプト作文より先に、入力検証をコードやチェックリストで固めたい人。
前提(製品事実のみ)
- 入力モードは Image / Text / Reference。被写体が1枚に固定なら Image to Video が初心者既定。
- 受け付け形式:JPEG / PNG / WebP。推奨ブラウザ:Chrome。
- アップロード・プロンプト・完成クリップは private workspace assets。プロバイダは各ルールで処理。
- Free 動画は評価用のみ。有料は MixVio ToS と各プロバイダ規約の下で商用可の場合あり。
- 公開 I2V はおおむね 3–15 秒。Seedance 2.5 は 4–30 秒、Veo 3.1 / Fast は 4 / 6 / 8 秒固定など。正確なチップはジェネレーター表示が正。
入口の確認は MixVio から。
人間向けソースゲート
アップロード前に目視でも次を通します。
- 被写体が1つ読める(コラージュ過多は却下)
- 奥行きがある(手前/中/奥)
- 短いプッシュインに耐える解像度
- 微小ロゴ・細字が少ない
- 強い圧縮ノイズがない
- 権利 OK(プラン下で公開してよい静止画)
クリアな被写体 vs 弱いソース — our_generated。
最小疑似コード:ゲート関数
メタデータを辞書で渡し、失敗したチェック名のリストを返します。空ならパス。
from typing import Any
REQUIRED_FMTS = {"jpeg", "png", "webp"}
def source_gate(meta: dict[str, Any]) -> list[str]:
"""Return failed check ids. Empty list means pass."""
fails: list[str] = []
if meta.get("subjects", 0) != 1:
fails.append("clear_subject")
if not meta.get("has_depth"):
fails.append("depth")
# heuristic: short side for a gentle push-in proof
if int(meta.get("min_side_px", 0)) < 720:
fails.append("resolution")
if meta.get("micro_text_dense"):
fails.append("sparse_text")
if meta.get("heavy_compression"):
fails.append("compression")
if not meta.get("rights_ok"):
fails.append("rights")
fmt = str(meta.get("fmt", "")).lower()
if fmt not in REQUIRED_FMTS:
fails.append("format")
return fails
def assert_pass(meta: dict[str, Any]) -> None:
failed = source_gate(meta)
if failed:
raise AssertionError(f"source_gate failed: {failed}")
# happy path
assert_pass({
"subjects": 1,
"has_depth": True,
"min_side_px": 1080,
"micro_text_dense": False,
"heavy_compression": False,
"rights_ok": True,
"fmt": "png",
})
# expected fails
assert "clear_subject" in source_gate({"subjects": 3, "has_depth": True,
"min_side_px": 1080, "micro_text_dense": False, "heavy_compression": False,
"rights_ok": True, "fmt": "jpeg"})
運用メモ:min_side_px の閾値はチーム方針で変えて構いません。ここでの 720 は「短いプッシュインの第一プルーフ」用のヒューリスティックであり、MixVio が固定で拒否する値ではありません。最終的な可否は作業場の表示と live 見積が正です。
ゲート通過後のジョブ契約
Chrome で I2Vワークスペース を開き、静止画をドロップします。
- 1ジョブ=所有の先頭フレーム(対応ルートなら任意の最終フレーム)
- マルチ参照パックを同じ I2V ジョブに混ぜない
- Prefill は可。Generate までクレジット消費なし
プロンプト契約(短く固定)
静止画が同一性を持つので、プロンプトは動きだけを書きます。
prompt := camera_move + subject_action + environment + mood
# bad
"make it move"
"cinematic video of this image"
# better examples
"Slow push-in on the subject; soft wind in the trees; calm daylight."
"Gentle left-to-right pan; clouds drift; steady horizon."
クレジット・アンカー表(live 必須)
| モデル | アンカー | credits(ページ例) |
|---|---|---|
| Seedance 2.0 | Mini 4s · 480p | 6 |
| Seedance 2.0 | Standard from | ~26 |
| Seedance 2.0 | Standard 5s · 720p | 70 |
| Kling 4.0 | default 5s · 720p | 50 (was 55) |
| Seedance 2.5 | 4s · 480p | 38 |
生成前に live 見積を確認。 ページ例はアンカー、Generate の予約が請求です。失敗/セーフティ取消は予約解放(料金ページ表現)。ベンダー資料:Kling 4.0 user guide / Seedance 2.5。MixVio の上限と見積が最終正です。
採点→再試行(1変数)
def decide_rerun(score: dict[str, bool]) -> str:
"""Return exactly one change recommendation."""
if score.get("warp"):
return "soften_camera_or_shorter_or_lower_res"
if score.get("over_motion"):
return "one_move_only"
if score.get("static"):
return "stronger_camera_verb"
if score.get("identity_drift"):
return "clearer_subject_lock"
return "raise_length_xor_resolution_once"
初回は短尺・低解像度で動きを証明し、通ってから長さ または 解像度を一度だけ上げます。
テスト観点(手動)
- ゲート失敗メタで
source_gateが空でないこと - 権利フラグ false で必ず落ちること
- プロンプトが4スロット構造であること
- Generate 前に live 見積を読んだ記録があること(スクリーンでもメモでも可)
- Free 成果物を商用に出していないこと
ジョブ入力の不変条件(文書化用)
チームの runbook に次の不変条件を書いておくと、レビューが速くなります。
INV-1: mode == ImageToVideo when subject_locked_in_still
INV-2: files == {start} ∪ optional{last} # not a multi-reference pack
INV-3: browser == Chrome
INV-4: fmt ∈ {jpeg, png, webp}
INV-5: credits_checked == live_quote_before_generate
INV-6: free_plan_output.commercial_use == forbidden
INV-2 は特に重要です。Reference レーンの複数ファイルと、I2V の「先頭+任意最終」は別契約です。同じジョブに混ぜると、同一性やクレジットの期待が崩れます。
メタ収集の例(ローカル前処理)
実ファイルから粗いメタを集める例です(Pillow 等は任意。ここは概念コード)。
def rough_meta(path: str, rights_ok: bool) -> dict:
# Pseudocode — wire to your image library
width, height = probe_size(path) # noqa: F821
fmt = probe_format(path).lower() # noqa: F821
return {
"subjects": estimate_subjects(path), # noqa: F821 — human override OK
"has_depth": human_flag_depth(path), # noqa: F821
"min_side_px": min(width, height),
"micro_text_dense": human_flag_text(path), # noqa: F821
"heavy_compression": looks_blocky(path), # noqa: F821
"rights_ok": rights_ok,
"fmt": fmt,
}
人間フラグ(奥行き・細字・権利)は自動化しきれないので、フォームで明示します。ゲートは「機械+人間」のハイブリッドが現実的です。
クレジット比較のメモ書き方
スプレッドシート列の例:
| run_id | model | duration_s | res | page_anchor | live_quote | delta | result |
|---|---|---|---|---|---|---|---|
| r1 | Kling 4.0 | 5 | 720p | 50 (was 55) | (記入) | ||
| r2 | Seedance 2.0 Mini | 4 | 480p | 6 | (記入) | ||
| r3 | Seedance 2.5 | 4 | 480p | 38 | (記入) |
delta = live_quote - page_anchor を残すと、古いチュートリアル数字の混入に気づけます。Seedance 2.0 Standard 5s·720p のページ例は 70、Standard 下限は約 26 です。ツールページの争点値は列に置かないでください。
失敗時の請求メモ
料金ページ表現を正とする:予約 → 失敗/セーフティ取消で解放。Kling 4.0 ページの「失敗ランは予約クレジットを返す」は互換です。ノートには「release / return reserved」のどちらで書いてもよいが、社内用語は pricing-page に揃えると混乱が減ります。
ベンダー参照(外链):Kling 4.0 user guide、Seedance 2.5。
受け入れテスト(PR テンプレ)
プルリク説明に貼れる短文:
## I2V source gate
- [ ] source_gate(meta) == []
- [ ] mode = Image-to-Video
- [ ] live quote recorded before Generate
- [ ] one-variable rerun policy followed
- [ ] Free output not used commercially
なぜゲートをコードにするのか
創作者向けチュートリアルでは「きれいな写真を選ぼう」で終わりがちです。エンジニア向けに書くなら、失敗理由を列挙可能にするほうが再現性があります。source_gate が返す文字列は、そのままチケットのラベルや CI のアノテーションにできます。
たとえばデザインから渡された静止画がコラージュだったとき、「なんとなく弱い」ではなく clear_subject で差し戻せます。権利フラグが false なら Generate 以前に止められます。これはプロンプト技術ではなく、入力バリデーションです。
ゲートを厳しくしすぎると現場が迂回します。min_side_px の 720 は第一プルーフ用の目安であり、プロダクト写真が 1000px 短辺でも構図が強ければ人間レビューでパスしてよい、といった例外ルールを runbook に一文書いておくと運用が楽です。
プロンプトをスロット化するとレビューが速い
自由文のままだと、「シネマティック」「美麗」「ドラマチック」などの形容が増え、カメラ動詞が消えます。スロット(カメラ/被写体/環境/ムード)に分けると、レビュアーは欠けているスロットだけ指摘できます。英語プロンプトでも日本語プロンプトでも、スロット構造は共通です。
悪い例は「動かして」だけではありません。「この画像を動画にして」も、静止画の内容を再記述しているだけで動きの指示になりません。Identity は画像側、Motion はプロンプト側、という分担をチーム内で共有してください。
マルチモデル作業場での選び方(初心者)
MixVio はマルチモデルです。初日は全モデルを試す必要はありません。短尺・低解像度で動きが通るルートを1つ決め、通ってから別モデルへ横展開します。モデルページのアンカーは比較用の付箋であり、請求は live 見積です。
Seedance 2.0 の Mini 4s·480p=6 は安価なプルーフ向きの例です。Standard は約 26 から、Standard 5s·720p=70 です。Kling 4.0 の既定 5s·720p=50(was 55)は、カメラを強めたいときの参照点になります。Seedance 2.5 の 4s·480p=38 はページ例です。いずれも Generate 前に画面の数字を読んでください。
セーフティと失敗ラン
失敗やセーフティ取消で予約が解放される、という料金ページの表現を正とします。ノートに「失敗したら課金された」と残す前に、予約が戻ったかをアカウント履歴で確認する手順を1行入れておくと、サポート問い合わせが減ります。
商用判定チェック
Free プランの動画は評価専用です。社内デモ、広告、クライアント納品のどれに使うかをラン記録の commercial_plan 列で明示します。有料プランでも、MixVio の利用規約とモデルプロバイダ規約の両方を確認する必要があります。透かしや保持期間は料金 FAQ を見ます。
まとめに代わる運用一文
「ゲートを通す → 短尺低解像度 → live 見積 → 1変数再試行 → 通ってから伸ばす」。この一文を PR テンプレの先頭に置けば、長い説明を毎回書かずに済みます。
よくある差し戻しコメント集
-
clear_subject: ヒーローが複数。1つにクロップして再提出。 -
sparse_text: UI 細字が残っている。ロゴを隠すか製品だけ残す。 -
compression: SNS 再圧縮版を使っている。原書き出しに戻す。 -
rights: 許諾がチケットに無い。Generate しない。 - プロンプトレビュー: カメラ動詞が無い。スロットを埋めて再提出。
- 設定レビュー: 初回が長尺高解像度。短尺低解像度のはしごに戻す。
- 見積レビュー: live 見積の記録が無い。スクショまたは表の列を埋める。
差し戻しは人格攻撃にせず、ゲート ID と次アクションだけ書きます。これでレビュー時間が短縮され、創作者側も修正箇所が明確になります。
Image-to-Video は中間フレームを発明します。ソースが弱いとドリフトが増えるため、プロンプト職人技より先にゲートを通す、という順序をチームの共通言語にしてください。
ゲート通過後の最初の Generate は、成功体験より「計測」が目的です。動いたかどうか、歪んだかどうか、同一性が保たれたかどうかを短く記録し、次の一手を1つに絞ります。長く美しいクリップは、その後で十分です。
まとめ(再掲)
ゲート関数で入力を落とし、ジョブ契約とプロンプト契約を固定し、live 見積を読んでから短尺プルーフを回す。チェックリスト運用は チェックリストを回す。
