GIFの顔交換をアップロードせずローカルで行う方法
GIFは画像コンテナに入ったアニメーションであり、顔交換ツールはこの二つを別々に扱います。それさえ分かれば、ローカルでの手順は短く、そのまま再現できます。

結論: GIFをMP4に変換し、その動画に顔交換をかけ、結果からGIFを組み直します。すべて自分のPC内で完結し、二つの変換はそれぞれffmpegの1コマンドで済みます。この方法なら、パレットとフレームレートを自分で決められるぶん、多くのオンラインGIF顔交換サイトより結果も良くなります。
多くの解説はいきなりアップロードボタンから始まります。しかし仕上がりを実際に決めているのは、交換モデルではなく前後にある二つの変換です。
現時点のDeep Face CamとGIFの関係
始める前に現状をはっきりさせておきます。ファイル選択では .gif を受け付けますが、画像処理の経路では静止画1枚として扱われます。画像の書き出し形式はPNG・JPG・BMP、動画はMP4またはMKVです。アニメーションGIFの読み込みと書き出しは現行ビルドでは未対応のため、ワンクリックのGIFモードはまだありません。ネイティブ対応が入るまでは、以下の手順が確実なローカルワークフローです。
1. GIFが単なる「短い動画」ではない理由
GIFは動画のように見えて、ファイルとしては画像のように振る舞います。このずれこそが、ボタン一つではなくワークフローが必要になる理由です。
- 画像コンテナである。拡張子で処理を振り分けるツールは、GIFを静止画の経路に送り、1フレーム目だけを処理しがちです。
- パレットは1フレームあたり最大256色。これは形式そのものの制限で、肌のグラデーションはパレット量子化が最も苦手とする対象です。
- 音声トラックがないため、MP4を経由して戻しても失われるものはありません。
- 効率が悪い。10秒のGIFは、同じ映像のH.264版の何倍にもなり得ます。
- 表示時間がフレームごとに指定されるため、変換したGIFは明示的に指定するまで整ったフレームレートを持たないことがよくあります。
GIFを一時的にMP4にしてしまえば、これらはすべて問題でなくなります。顔交換は他の短い動画とまったく同じように動き、調整と確認もローカル動画顔交換ガイドと同じ方法で済みます。
素材は自分のもの、または明確に許可を得たものだけを使ってください。リアクションGIFはたいてい実在の識別可能な人物の映像です。加工済みであることをどう表示するかを決め、なりすまし、嫌がらせ、同意のない性的表現には使用しないでください。責任ある利用をご確認ください。
2. ローカルでのGIFワークフロー全体
手順は5つ、そのうち2つはffmpegの1行コマンドです。Deep Face Camはデスクトップ版に自身の動画処理用としてffmpegバイナリを同梱していますが、以下のコマンドはターミナルからffmpegを直接実行するため、PATHに無ければ別途インストールしてください。
- 元のGIFをMP4に変換する。
- MP4をターゲットとしてアプリに読み込み、ソース顔を設定する。
- 交換後の動画を書き出し、GIFに戻す前に確認する。
- 交換後の動画からカラーパレットを生成する。
- そのパレットを使って最終的なGIFをエンコードする。
3. 実際のコマンド
手順1 — GIFからMP4へ。scaleフィルターで幅と高さを偶数に揃えます。yuv420pのH.264ではこれが必要です。
ffmpeg -i input.gif -movflags faststart -pix_fmt yuv420p \
-vf "scale=trunc(iw/2)*2:trunc(ih/2)*2" input.mp4手順2 — 顔交換。アプリを開き、ソース写真を追加し、input.mp4をターゲットにして書き出します。この工程にGIF固有の作業はありません。複数人が映る場合は複数人ガイドの割り当て手順を使ってください。
手順3 — パレットを生成します。汎用の色テーブルではなく、このクリップに合った色をGIFに割り当てるためです。
ffmpeg -i swapped.mp4 \
-vf "fps=15,scale=480:-1:flags=lanczos,palettegen=stats_mode=diff" \
-y palette.png手順4 — GIFをエンコードします。fpsとscaleは手順3とまったく同じ値にしてください。
ffmpeg -i swapped.mp4 -i palette.png \
-lavfi "fps=15,scale=480:-1:flags=lanczos,paletteuse=dither=bayer:bayer_scale=5:diff_mode=rectangle" \
-y output.gif| パラメーター | 制御する内容 | 実務上の目安 |
|---|---|---|
fps=15 | GIFのフレームレート、つまりフレーム数。 | 最も効果的な容量調整。リアクションGIFなら12〜15で足りることが多いです。 |
scale=480:-1 | 出力幅。高さは自動で追従します。 | 幅を半分にすると画素数は4分の1になります。 |
flags=lanczos | 拡大縮小時のリサンプリング品質。 | そのままで構いません。GIFのサイズなら負荷は無視できます。 |
palettegen=stats_mode=diff | フレーム間で変化する領域を重視してパレットを作ります。 | 静止した背景で顔が動く映像に適した既定値です。 |
dither=bayer:bayer_scale=5 | 秩序ディザのパターン強度。 | 誤差拡散よりファイルが小さく、フレーム間のノイズも少なくなります。 |
diff_mode=rectangle | フレームごとに変化した矩形だけを再エンコードします。 | 背景が静止していれば効果は明確です。 |
4. コストはフレーム数であり、それは自分で決められる
顔交換はフレーム単位で課金され、GIFのフレーム数は再生時間×フレームレートです。だからこそ、交換の「後」ではなく「前」にフレームレートを決める価値があります。
| クリップ | フレームレート | 処理するフレーム数 | 推論回数(1顔・補正あり) |
|---|---|---|---|
| 3 s | 12 FPS | 36 | 108 |
| 3 s | 15 FPS | 45 | 135 |
| 5 s | 15 FPS | 75 | 225 |
| 5 s | 24 FPS | 120 | 360 |
| 10 s | 15 FPS | 150 | 450 |
| 10 s | 30 FPS | 300 | 900 |
最終列は1フレームあたり検出1回・交換1回・補正1回として数えています。人物が1人増えれば交換と補正の列は倍になります。詳しくは複数人ガイドを参照してください。GIFは短いので通常は高速ですが、最終的に150フレームしか使わないのに300フレームを処理する理由もない、ということでもあります。
5. 顔に見えるGIFに仕上げる
GIFの顔交換が破綻するのは256色制限のところで、交換モデルとは関係ありません。肌は滑らかなグラデーションであり、滑らかなグラデーションを量子化すると目に見える縞が出ます。
- パレットは交換後のクリップから作る。元動画からではありません。変わったのは顔です。
- 背景が賑やかなら変換前に寄せてトリミングする。競合する色が減るほど、パレットを顔に多く割けます。
- 補正は控えめに。過度に平滑化した顔は、量子化に最も耐えるテクスチャを失います。顔補正ガイドを参照。
- 出力時に拡大しない。320px素材から480pxのGIFを作っても容量が増えるだけです。
- MP4ではなくGIFで判断する。中間の動画は常に良く見えます。納品物はGIFです。
6. GIFではローカル処理の意味がさらに大きい
オンラインのGIF顔交換ツールはアップロードを前提とします。そしてGIFが中立的な素材であることはめったにありません。リアクションGIFは実在の人物の映像であり、多くは映画、テレビ、あるいは誰かの個人的な動画から切り出されています。それをWebサービスに送るということは、元映像と加工結果の両方を、その日に適用される保存ポリシーのもとで第三者に渡すということです。
上記の手順は自分のPCから一歩も出ません。ffmpegもローカル、交換もローカル、出力先も自分が選んだフォルダーです。インストーラーとモデルのダウンロードは通信を使います。この区別はプライバシーに関する説明とリアルタイムガイドで扱っています。
トラブルシューティング
| 症状 | 原因 | 対処 |
|---|---|---|
| 1フレーム目しか処理されない | GIFが動画ではなく画像の経路に入った。 | 先にMP4へ変換する。GIFそのものをターゲットに読み込まない。 |
| 寸法エラーで変換に失敗する | yuv420pのH.264は幅・高さとも偶数である必要がある。 | 上記のtrunc(iw/2)*2フィルターを使う。 |
| 肌に縞やまだらが出る | 256色パレットによる量子化。 | 交換後のクリップからパレットを作り直し、寄せてトリミングし、幅を下げる。 |
| GIFの容量が巨大になる | フレームが多すぎる、幅が広すぎる、ディザが強すぎる。 | fpsとscaleを下げ、diff_mode=rectangleは残す。 |
| 再生が速すぎる・遅すぎる | 元GIFのフレーム表示時間が不揃いだった。 | パレット生成とエンコードの両方でfpsフィルターを明示する。 |
| フレーム間で色が揺れる | フレームごとのパレット上でのディザノイズ。 | 誤差拡散ではなく秩序ディザ(bayer)を使う。 |
| 顔がちらつく | GIFではなく交換品質の問題。 | 動画の段階で直す。GIFにすると目立つだけです。 |
よくある質問
Deep Face CamはアニメーションGIFをそのまま処理できますか?
現行ビルドではできません。選択画面は.gifを受け付けますが、画像処理の経路では静止画として扱われ、書き出しは画像がPNG・JPG・BMP、動画がMP4・MKVです。ネイティブ対応が入るまでは、上記のGIF→MP4→交換→GIFの手順を使ってください。
MP4を経由すると画質は落ちますか?
実用上は落ちません。妥当な設定のH.264は、入口の256色GIFよりも出口の256色GIFよりもはるかに忠実です。画質を決めるのはMP4の工程ではなくパレットの工程です。
GIFを容量制限内に収めるには?
フレーム数、幅、パレット処理の順で効きます。フレームレートを下げ、クリップを短くし、幅を減らし、diff_mode=rectangle付きの秩序ディザを使ってください。
複数人が映るGIFでも顔交換できますか?
できます。MP4になった時点で通常の複数人処理と同じです。レンダリング前に各人へソース顔を割り当ててください。
GIFの顔交換は動画より遅いですか?
GIFは短いので通常はずっと速く済みます。5秒・15FPSのGIFは75フレーム、1分・30FPSの動画は1,800フレームです。
GIFも元素材も自分の端末に置いたまま
変換も交換も組み直しもローカルで。アップロードは不要で、仕上がりを実際に左右するフレームレートとパレットは自分の手に残ります。