vfx について
vfxは、Pika MCP経由でSeedanceの参照動画生成を使う、動画向けVFXワークフローのスキルです。全フレームと音声を分析して元のショットを保つプロンプトを作成し、生成前にユーザーの承認を求めます。
主な機能
- 01全フレームの抽出と分析
- 02台詞・音楽・効果音の分析
- 03元のショットを保つプロンプト作成
- 04音声の合図や時刻に合わせたVFX
- 05生成前のプロンプトと費用提示
活用シーン
- 01合図に合わせて広場を砂漠に変更
- 02既存クリップに雪や炎を追加
- 03衣服を光るアーマーに変換
- 04動きや構図を保ってシーンを変更
MCP 対応
Pika MCPを通じて、アップロード、メディア解析、音声文字起こし、費用見積もり、参照動画生成を行います。生成前にプロンプト、解像度、費用への明示的な承認が必要です。
インストール
コマンドをコピーしてターミナルで実行します。
npx skills add https:/ / github.com/ pika-labs/ pika-plugins --skill vfxインストール後、Claude Code で/vfxを入力して読み込まれたか確認します。
詳細
vfx
動画から動画へのVFX処理をPika MCPのSeedanceリファレンス動画生成に適用します。デフォルトは1080pです(ユーザーから希望があった場合のみ、4Kに上げるか720pに下げます)。ユーザーからクリップと変更内容を受け取り、すべてのフレームを読み取り(ローカルでffmpegを使って抽出し、コンタクトシートにタイル状に配置)、音声を理解します(セリフ+音楽+効果音+環境音)。Seedanceに忠実なプロンプトを作成して元の映像(顔、ジェスチャー、カメラの動き)を維持し、変更を適切なビートにタイムコードで指定してから、VFXを合成した同じショットを再レンダリングします。1回の実行で、依頼された変更を1つ反映したクリップを1本生成します。
解像度を選択せず、4K専用のバージョンを使う場合は、
/pika:4k-vfxを参照してください。
仕組み — なぜすべてのフレーム(および音声)を読み取ることが重要なのか(読み取り工程を省略しないでください)
Seedanceはリファレンス動画を動きやスタイルのアンカーとして扱います。ピクセル単位で固定されたベースではありません。入力フレームをそのままコピーするのではなく、プロンプトをガイドとしてショットを再生成します。そのため、忠実度を左右するのはプロンプトです。元の映像(被写体の識別情報、正確なジェスチャー、カメラの動き、フレーミング、ライティング、色調、衣装)と音声(セリフ+リップシンク、音楽や効果音のビート)を徹底的に記述するほど、どの解像度でも、変更を重ねた後に同じショットとして認識されやすくなります。**すべてのフレームを読むこと(サンプルではありません)が、その詳細な記述を作る方法です。**ローカルでffmpegを使ってすべてのフレームを抽出し、25フレームずつコンタクトシート(5×5)にタイル状に配置して、すべてのシートを分析します。これにより、数枚の静止画ではなく、タイムライン全体をもとにプロンプトを作成できます。読み取りを省略したり、サンプルだけ読んだりすると、出力にずれが生じます。顔が変わる、カメラの動きが変わる、部屋が変わる、動きのビートを見落とす、といったことが起こります。すべてのフレームと音声を確認する読み取り工程こそが、このスキルの本質です。
前提条件
実行環境でpika MCPが利用可能であり、ローカルのffmpegが必要です(すべてのフレームの抽出とコンタクトシートの作成に使用します)。ユーザーから受け取る入力は2つです。(1)動画クリップ(ローカルファイルまたは公開URL)と、(2)適用したいVFXの変更内容です。3つ目の入力として、(3)解像度を指定することもできます。指定がない場合は1080pがデフォルトです。使用するツール:upload_asset、probe_media、analyze_media、transcribe_audio、estimate_cost、generate_reference_video、task_status(フレームの抽出とタイル配置は、MCPツールではなくローカルのffmpegで行います)。
ステージ 0 — 入力を集める(まずここを確定します)
生成前に必要なものは、暗黙のデフォルトを除いて、ちょうど 2 つです。
- 動画 — 変換する元のクリップです。ローカルファイルが指定されている場合はアップロードします(ステップ 1)。公開 URL が指定されている場合は、そのまま使用します。
- 変更内容/VFX — 出力で何を変えるかです(例:「指を鳴らした瞬間に広場を開けた砂漠に変える」「雪を降らせる」「私の背後の部屋に火をつける」「私のジャケットを光る鎧に変形させる」)。
- 解像度(
state.resolution) — ユーザーのリクエストで別途指定されていない限り、1080pをデフォルトにします。明示的な指定を確認してください。「4K」「highest quality」「max resolution」ならstate.resolution = "4k"、「720p」「cheaper」「faster」「lower res is fine」ならstate.resolution = "720p"です。指定がない場合は1080pのままにします。「どの解像度にしますか?」とは尋ねず、デフォルトを黙って適用し、ステップ 6 の確認ゲートで選択肢を提示して確認してもらいます。ステップ 6 で引用するため、すぐにstate.resolutionに応じてstate.seedance_modelを設定します。1080pまたは4kではstandard(fast/miniは 720p まで — 必須)、720pではfast(より安価で高速、その解像度には十分)を設定します。
動画または変更内容のどちらかが不足している場合は、ほかのことをする前にそれを尋ねてください。変更内容を勝手に考えたり、アクセスできないクリップを使って進めたりしないでください。両方がそろったら、これから行うことを 1 行で伝えます(「クリップの全フレームを読み取り、指を鳴らすと砂漠に変わる 1080p 用のプロンプトを作成します…」など)。その後、追加確認を挟まずにステップ 1〜5 を実行します。ただし、生成前にステップ 6 の合意確認ゲートで必ず止めてください。レンダリングはコストが高く、取り消せない処理であり、ユーザーがプロンプト、解像度、コストを承認した後にのみ実行します。
ステップ 1 — クリップをアップロードする(upload_asset)
実際の動画はアップロードする必要があります。インラインの base64 が使えるのは小さなアセット(約 3MB 未満)のみのため、実際のクリップはすべて署名付きアップロードの手順を使用します。
filename、mime_type(mp4 の場合はvideo/mp4)、size_bytes(ファイルのバイトサイズ)を指定してupload_assetを呼び出します。- 返された
presigned_urlに生のバイトデータを PUT します。 - 返された
public_urlをstate.clip_urlに設定します。
ユーザーがすでに公開 URLを指定している場合は、このステップを省略し、state.clip_url にその URL を設定します。
ステップ 2 — メディアを調べる(probe_media)
state.clip_url に対して probe_media を呼び出し、長さ、fps、寸法、アスペクト比を読み取ります。これらを使って、(a)ステップ 3 で全フレームを抽出できているか確認します(長さ × fps ≈ フレーム総数 ≈ シート数 × 25)。また、(b)ここで出力の aspect_ratio と duration をソースに合わせて選択します。ステップ 6 の確認ゲートでは、この選択内容(ステージ 0 で設定した state.resolution と併せて)をユーザーに提示し、ステップ 7 ではその設定で処理を実行します。
ステップ 3 — すべてのフレームをローカルで抽出し、コンタクトシートにタイル状に配置する(ffmpeg)
動画の全体を読み取ります。サンプルだけを使ってはいけません。ローカルの ffmpeg でソースと同じフレームレートですべてのフレームを抽出し(間引きなし、例外なし)、各 analyze_media 呼び出しで連続する 25 フレームを一度にカバーできるよう、読みやすいコンタクトシート(1 シートあたり 25 フレーム、5×5 グリッド)に配置します。
相対作業ディレクトリを使用してください(絶対パスのシステム一時ディレクトリは使用しないでください)。
mkdir -p frames sheets
ffmpeg -i INPUT -vsync 0 frames/f_%05d.png # every frame, no drops
次に、25 フレームずつのコンタクトシート(5×5)を作成します。シートを読みやすくするため各フレームを縮小し、各タイルにフレーム番号を刻印します。
ffmpeg -i INPUT -vf "scale=480:-1,drawtext=text='%{n}':x=4:y=4:fontsize=20:fontcolor=yellow:box=1:[email protected],tile=5x5" sheets/sheet_%03d.png
drawtext=text='%{n}' は各タイルにフレーム番号を刻印するため、分析時に正確なフレームを参照できます。tile=5x5 は連続する 25 フレームを 1 枚のシートにまとめます。ローカルの ffmpeg ビルドで drawtext が使用できない場合は、scale=480:-1,tile=5x5 に切り替えます。INPUT はローカルのクリップ(または URL から保存したローカルコピー)です。シート数がステップ 2 の確認結果と一致することを確認してください。例外なく、すべてのフレームをシートに含める必要があります。
ステップ 4 — すべてのシートを読み取り、音声を把握する(upload_asset、analyze_media、transcribe_audio)
これは忠実度を高めるステップで、必須の作業が 2 つあります。すべてのフレームを読み取ることと、音声を把握することです。どちらも省略できません。
4a — すべてのフレームを読む(すべてのシート)
ステップ3で作成したすべてのコンタクトシートについて(例外なくすべてを確認してください。すべてのフレームがシートに含まれています):upload_assetでアップロードします(シートは画像なので、URLを取得するにはアップロードが必要です)。次に、そのシートのURLを指定してanalyze_mediaを呼び出し、25フレーム全体の進行を読み取るqueryを指定します。プロンプトで固定すべき要素をすべて抽出します。
- 被写体/身元 — フレームに映っている人や物。顔、髪、体格、見分ける特徴。
- 正確な動作とジェスチャー — スタンプ付きのフレームインデックスを参照しながら、被写体の動きを拍ごとに記述します(例:「フレーム0048付近で右手を上げ、フレーム0072付近で指を鳴らす」)。
- カメラワーク — 固定/パン/プッシュイン/手持ち/オービット、およびそのタイミング。
- フレーミング — ショットサイズ(クローズ/ミディアム/ワイド)、被写体の位置、ヘッドルーム。
- ライティング — 光の方向、硬さ、色温度、時間帯。
- 色調 — 主要な色、雰囲気。
- 衣装/小道具/設定 — 服装、物、背景。
すべてのシートを通して内容を読み取り、サンプリングされた中盤だけでなく、最初から最後までのタイムライン全体を把握してください。
4b — 音声を理解する(必須。セリフだけではありません)
音声は必ず読み取ってください。省略はできません。2回の処理を行います。
transcribe_audioでセリフとタイムスタンプ(発話内容と発話時刻)を取得し、プロンプトでセリフとリップシンクのタイミングを維持できるようにします。- 音声(または動画URL)に対して
analyze_mediaを実行し、セリフ以外の音声も把握します。音楽、効果音、環境音、雰囲気、リズム/拍などです。
音声の内容を、必要な箇所でプロンプトに反映します。誰かが話している場合はセリフとリップシンクを維持し、VFXの変化が単なるタイムスタンプではなく、音楽や音(例:指を鳴らす音、ヒット音、ダウンビート)に合わせるべき場合は、音声の拍/効果音に合わせて変化のタイミングを指定します。
すべてのフレームの読み取り結果と音声の読み取り結果をひとつにまとめ、元の内容を忠実に記述します。その記述がステップ5の素材になります。
ステップ5 — Seedanceプロンプトを書く(作成ステップ。絶対に省略しないでください)
プロンプトを1つ作成します。元の内容を忠実かつ網羅的に記述した内容(固定する要素)+ユーザーが希望する変更(タイムコード付き)+入力クリップへの参照としての**@Video1**トークンを含めます。詳細に記述してください。ステップ4で読み取った内容をひとつでも省くと、その詳細はSeedanceが自由に変更できるようになります。
テンプレート — ステップ4の読み取り結果を使って[SLOTS]を埋めます([RESOLUTION LABEL]はstate.resolutionに合わせて4K/1080p/720pを指定します):
Re-render this exact shot @Video1 in cinematic [RESOLUTION LABEL]. LOCK the original: [SUBJECT/IDENTITY — face, hair, build, wardrobe], performing [EXACT GESTURES, beat by beat]. Keep the SAME camera move ([CAMERA: static / pan / push-in / handheld], [timing]), the SAME framing ([SHOT SIZE + subject position]), the SAME lighting ([direction, hardness, color temp, time of day]) and the SAME palette ([dominant colors / mood]). CHANGE: [the VFX], time-coded — at [t0]–[t1]s [what the scene looks like before the change], then at [t2]s [the change triggers / VFX appears] and [how the scene reads after]. Everything not described by the change stays identical to @Video1. Photorealistic, high detail, consistent identity throughout.
変更にタイムコードを付け、固定する動作に対していつ変化が起きるかをSeedanceに伝えます(例:「0~3秒は、被写体が手を上げる間、広場に変化はありません。3秒、指を鳴らす音と同時に、広場が開けた砂漠へと溶け込み、建物が砂と陽炎に置き換わります。その間、被写体、カメラワーク、フレーミングは同じままです」)。変更内容を示すタイムコード付きの節を、より具体的かつ明確にするほど、Seedanceが変更を無視しにくくなります。
ステップ 6 — 承認ゲート(estimate_cost)— 生成前に必須
レンダリングは費用のかかる工程で、実行した後に取り消すことはできません。このセッションでユーザーから明示的な承認を得ずに、generate_reference_video を呼び出してはいけません。1 つのメッセージで、次の内容を提示します。
- ステップ 5 のプロンプト全文 — そのまま掲載し、費用が発生する前にユーザーが誤った詳細(顔、ジェスチャー、タイミングなど)を見つけられるようにします。
- 生成設定 — プロバイダーは
seedance、モデルはstate.seedance_model、解像度はstate.resolution(ユーザーが別の解像度を希望していない限り、これは1080pであることを明記します)、さらにステップ 2 の確認で選んだaspect_ratioとduration。 - 推定コスト — ステップ 7 の
generate_reference_video呼び出しについてestimate_costを呼び出し、その結果を提示します。推定でエラーが発生した場合は、コストが不明であることを伝え、選択されている解像度が 4K の場合は最も高額な価格帯であることを明示します。金額を黙って省略してはいけません。
その後、返答を待ちます。結果は次の 3 通りです。
- 承認 → 変更せずにステップ 7 に進みます。
- 修正 — ユーザーが詳細、変更内容、または解像度を訂正した場合は、ステップ 5 のプロンプトを更新し(訂正に必要であれば該当するシートを再確認して)、承認ゲートを再提示します。
- 中止/返答なし → 生成してはいけません。無言を承認と見なしてはいけません。
ユーザーがこのセッションで費用の発生を明示的に事前承認している場合(「確認せずにそのまま実行して」など、確認なしでレンダリングするという継続的な指示がある場合)に限り、このゲートを省略できます。クリップと変更内容が提供されているだけでは事前承認にあたりません。それはステージ 0 の入力にすぎません。
ステップ 7 — 生成(Seedance の参照動画からの動画生成)(generate_reference_video)
state.resolution に合わせた設定で generate_reference_video を呼び出します。
provider:seedanceseedance_model:state.seedance_model— ステージ 0 で設定済みです(1080p/4kではstandard。fast/miniは 720p が上限のため、必須です。720pではfast)。resolution:state.resolution— ステージ 0 またはステップ 6 のゲートで4kまたは720pに決定されていない限り、1080p。reference_videos:[state.clip_url]— 動き/スタイルの基準として元の映像を指定します(Seedance は動画を最大 3 本まで受け付けます)。reference_images: 任意 — スタイル/クリーチャー/アイデンティティの基準となる画像(例:生成した参照画像)がある場合に限り指定します。prompt: ステップ 5 のプロンプト(入力クリップを参照する@Video1トークンを使用します。文字数の上限はないため、詳細に記述します)。aspect_ratio:auto(またはステップ 2 のソースに合わせます)。duration: ソースに合わせるか、auto_duration:trueを設定します。
negative_prompt を渡してはいけません(seedance ではサポートされておらず、呼び出しが拒否されます)。また、fps パラメーターを渡してはいけません(そのようなパラメーターは存在しません)。
ステップ 8 — 提供
呼び出しがインラインで結果を返した場合は、動画 URL を取得できます。{ task_id, status: running/background } が返された場合は、task_status(task_id) を完了するまで/失敗するまで/キャンセルされるまで、間隔を詰めてポーリングします。完了したら、ユーザーに動画 URLを返します。注:出力 CDN への接続は、このセッション内でのダウンロード時にブロックされる場合があります。そのため、バイトデータをローカルで取得しようとせず、URL 自体を提供してください。
失敗しやすいケース
| 症状 | 原因 → 対処 |
|---|---|
| クリップが長すぎる/大きすぎる | 大きなファイルでもアップロードは機能します。Seedance が長さを理由に拒否する場合は、重要な部分に合わせて元の動画をトリミングするか、auto_duration: true を設定して、より短い duration に合わせてください。 |
| 読み取りで顔/被写体が見つからない | シートでは被写体がはっきり見えない場合があります。被写体が見えるフレームを含む特定のシートで analyze_media を再実行するか(スタンプされたフレームインデックスを使用)、ディテールが保たれるように縮小せずシートを作り直してください。サンプリング抽出に切り替えないでください。すべてのフレームをシートに残してください。 |
ffmpeg が見つからない/drawtext が利用できない | 実行環境にローカルの ffmpeg が必要です。ビルドに drawtext フィルターがない場合は、scale=480:-1,tile=5x5 にフォールバックしてください(フレームインデックスのスタンプなしのシートになりますが、それでもすべてのフレームを読み取ります)。 |
| 出力で同一性/ショットがずれる(異なる顔、部屋、またはカメラの動きになる) | プロンプトの説明が十分に網羅的ではありませんでした。ステップ4~5に戻り、コンタクトシートの読み取りから不足している固定ディテール(顔、ジェスチャー、カメラの動き、照明など)を追加してください。Seedance が維持するのは、プロンプトで明示された内容だけです。再レンダリングには新たな費用が発生します。再度実行する前に、修正したプロンプトでステップ6の承認ゲートを通してください。 |
| 要求した解像度が拒否される/出力の解像度が下がる | 1080p または 4k には seedance_model を standard にする必要があります。fast/mini では、通知なく 720p に制限されます。誤ったパラメーターでの呼び出しがすでに完了して課金された場合、修正した呼び出しは2回目のレンダリングとなるため、再実行前にステップ6の承認ゲートを通してください。呼び出しが完全に拒否されていて課金されていない場合は、当初の承認のもとで修正した呼び出しを再実行してください。 |
| 音声/オーディオが維持されない、または変更のタイミングがずれる | transcribe_audio(音声とタイミング)と、オーディオに対する analyze_media(音楽/効果音/環境音)の両方を実行してください。その後、プロンプトでセリフとリップシンクのタイミングを説明し、タイムコード付きの変更を適切な音声の合図/ビートに合わせて指定し、再レンダリングでも同期が保たれるようにしてください。 |
| Seedance が要求した変更を無視する | ステップ5のタイムコード付き変更指示を強化し、より具体的にするとともに、時間を明示的に指定してください(「N秒時点で変更が始まる」)。修正したプロンプトは新しい未承認のプロンプトであり、再レンダリングには新たな費用が発生します。再度実行する前に、ステップ6の承認ゲートを通してください。 |
| 長時間の実行後にジョブが失敗する | 失敗までに数分かかっていた場合、コンテンツはすでに安全性チェックを通過しています。失敗はインフラに起因するものです。同じ呼び出しを再実行してください(ステップ6でのユーザーの承認は、すでに承認された同一の呼び出しの再試行も対象とするため、承認ゲートを通し直す必要はありません)。 |
まとめ
ffmpeg でローカルにすべてのフレームを抽出 → 1シートあたり25フレーム(5×5)のコンタクトシートにタイル状に配置して、すべてのシートを分析 → 音声を把握(セリフを書き起こし、音楽/効果音/環境音を分析) → 元の映像を維持し、適切な音声のビートに合わせてタイムコード付きで変更を指定する、Seedance に忠実な網羅的プロンプトを作成 → 合意ゲート:プロンプト+レシピ(デフォルトの解像度は 1080p、要望に応じて 4K/720p)+estimate_cost を提示し、承認を待つ → generate_reference_video(seedance、解像度に合わせたモデル、reference_videos として元の動画、プロンプト内に @Video1、negative_prompt なし)を使って同じショットを再レンダリング。