はじめに
ある画像の顔を別の画像の人物に移し、その過程で 2 枚の肌のトーンを合わせます。どこまで移すかはエンジンが決めます。そのペアで自然に見えるほうを選び、顔だけか頭部全体をなじませるため、生え際が必ずそのまま残るとは限りません。対象画像のポーズ、服装、光、背景は元のままです。
Face Swap Plus は Face Swap シリーズの中で調整できるモデルです。2 枚の画像に加えて、短い文章の指示、出力ファイル形式、seed を受け取り、spicyapi/face-swap-v1-plus/edit に送ります。呼び出しは非同期で、タスク ID が返り、そのタスクをポーリングすると 1 リクエストにつき 1 枚が返ります。課金は出力 1 枚単位で、どの形式を選んでも変わりません。
主な機能とハイライト
肌のトーンを自動で合わせる
顔の入れ替えがいちばん見破られやすいのは境目です。暖かい光で撮った参照画像を寒色の光の対象画像に入れると、あごの周りに輪ができ、首が頭と合わなくなります。このエンジンは入れ替えの過程で 2 枚のトーンを合わせるので、近いけれど同じではない組み合わせでも、たいていは後から色を手直しせずに収まります。光の向きが関係なくなるわけではなく、反対側から照らされた顔はやはり不自然に見えますが、いちばん多い食い違いは任せられます。
どこまでなじませるかはペアごとに決まる
これはスマートな頭部入れ替えです。ペアごとに、顔だけをなじませるか頭部全体をなじませるか、どちらが自然かをエンジンが判断し、どちらかを強制する設定はありません。生え際が常に対象画像側に残るシリーズのほかのモデルとの、実用上の違いはここにあります。予想と少し違う生え際で返ってくることがあるのもそのためで、エンジンが頭部全体のほうが自然だと判断した結果です。
リクエストパラメーター
| パラメーター | 必須 | 説明 |
|---|---|---|
image_url | はい | 差し替えられる画像です。この人物のポーズ、衣装、光、背景は保たれます。 1 文字以上 |
reference_image_url | はい | 顔の造作を供給する画像です。肌の色味はこちらで揃えますが光の向きは揃わないので、反対側から光が当たったリファレンスはやはり顎に継ぎ目を残します。 1 文字以上 |
prompt | いいえ | 任意項目ですが、実際には無いものとして組んでください。モデルはこのフィールドを受け付けます。 200 文字以内 |
output_format | いいえ | 返る画像のファイル形式です。何も指定しなければ JPEG が使われます。 |
output_quality | いいえ | 結果に求める画質を 10〜100 で指定します(既定 95)。料金は変わりません。 |
seed | いいえ | シードを再利用すると、同じ画像ペアに対する 2 回の実行を同一の抽選のもとで比較でき、変えた 1 か所だけが動きます。これは比較の道具であって、まったく同じ結果になる保証ではありません。 |
料金
$0.16 / 枚
ユースケース
アバターやプロフィール画像の大量処理
対象と参照のペアのリストを、ペアごとに 1 回ずつ、プログラムからエンドポイントに流します。再試行を最初の結果と比べられるようにしたいときはペアごとに seed を固定し、結果をそのまま Web に出すなら WebP を選びます。
アップロードフォームの奥にある一般ユーザー向け機能
やり取りは、ユーザーの写真 1 枚と、こちらで用意する画像 1 枚だけです。ユーザーが設定するものも、書くプロンプトもないので、機能全体はフォームの項目 1 つとバックグラウンドのジョブ 1 つで済みます。
カタログやテンプレートの制作
用意した一連の画像に同じ参照の顔を入れれば、どれも作り直すことなく、まとまりのあるシリーズになります。出力形式の設定で、パイプラインが想定している形のままファイルを受け取れます。テンプレートが必要とする小物は、入れ替えの前に画像の中に入れておいてください。
検閲なしのカットで問われるのは、題材ではなく同意
SpicyAPI は独自のコンテンツフィルターを加えず、成人フラグも求めません。画面に何が写っていても、リクエストの本文は同じ項目です。ただし権限の要件は緩みません。その素材でその顔を使うことについて、写っている本人の明示的で十分な説明を受けたうえでの同意が必要です。写真が公開されていることは、同意を意味しません。
プロンプトガイドと実践のヒント
指示の欄はここでは何もしない
prompt は基になるモデルが受け付け、上限は 200 文字ですが、これで何かを変えられたことはありません。
| 送ったもの | 返ってきたもの |
|---|---|
add mirrored aviator sunglasses | サングラスなし。何も送らなかった場合と同じ |
wearing black sunglasses | サングラスなし。何も送らなかった場合と同じ |
restyle the hair into a sleek straight bob | 髪は変わらず |
soften the expression into a faint half smile | 表情は変わらず |
a wide open-mouthed laugh | 表情は変わらず |
2026 年 9 月 20 日に実際に 5 回呼び出し、それぞれ同じリクエストで欄を空にしたものと比べました。エラーも警告も出ないため、値が無視されたことはレスポンスからはわかりません。この欄は使わない前提で組んでください。小物や別の表情が必要なら、入れ替えの前に対象画像に入れておきます。
エンジンが代わりに決めること
このエンドポイントを 2 回通したところ、正反対の判断が返ってきました。それがいちばんわかりやすい例です。
| 対象画像 | 移ったもの |
|---|---|
| きつく結んだ黒いポニーテール | 頭部全体。参照画像の赤い髪が顔立ちと一緒に移った |
| 濡れた髪のオールバック | 顔だけ。対象画像の髪は撮影したまま残った |
小物や別の表情が必要だったら
指示の欄ではそこまで届かないので、変更は入れ替えの前に済ませておく必要があります。
| やりたかったこと | 代わりにやる場所 |
|---|---|
| サングラス、帽子、アクセサリー | このエンドポイントを呼ぶ前に、対象画像の人物に着けておく |
| 別の表情や別の髪型 | 対象画像をその状態で撮影するか生成する。入れ替えはどちらも保つ |
出力形式と seed の選び方
ファイル形式が後工程で問題になるなら output_format を指定してください。後から変換すると再エンコードが必要になるからです。さらに編集する可逆のファイルなら PNG、そのまま Web に出すなら WebP、何も指定しなければ JPEG です。3 つのどれを選んでも料金は変わらないので、安そうに思えるものではなく、パイプラインが求めるものを選びます。seed を固定するのは結果を比べたいときだけにしてください。同じペアの 2 回の実行に同じ乱数が使われるため、動くのは変えた変数 1 つだけになります。あくまで比較のための道具で、バイト単位で同じ画像を約束するものではありません。本番では、毎回新しい乱数を使うのがふつうです。
結果が思いどおりでないとき
| 見えている症状 | まず変えること |
|---|---|
| トーン調整があってもあごに継ぎ目がある | 同じ向きから光が当たった参照画像を使う。トーンは合わせても、向きは合わせない |
| 生え際が変わったが、残したかった | ここでは想定どおり。Face Swap か Face Swap Pro を使う |
| 指示に目に見える効果がなかった | 想定どおり。この欄はここでは効かないので、対象画像のほうを変える |
| 違う人物が変わった | 対象画像を 1 人に切り抜く |
| 顔立ちがぼやけている、または大まか | 顔がより大きく鮮明に写った参照画像を使う |
用途に合ったエンドポイントを選ぶ
| 必要なもの | エンドポイント |
|---|---|
| 肌トーンの調整とファイル形式の選択 | このエンドポイント |
| 特徴点の正確さと元の質感、調整項目なし | Face Swap Pro |
| seed 付きのシンプルな入れ替え、髪には一切触れない | Face Swap |
| 髪を含めた頭部全体を毎回 | Head Swap |
| 動いているクリップ全体で 1 つの顔 | Video Face Swap |
バッチで実行する
必須の項目が 2 つ、既定値のある項目が 3 つなので、バッチはペアのループになります。作成の呼び出しには毎回 Idempotency-Key を付け、タスク ID をその処理のきっかけになったレコードの隣に保存します。接続が切れても、同じキーで再送すれば元のタスクが返り、2 回目の課金を伴う 2 つ目のタスクは始まりません。数秒ごとにポーリングし、結果はそれぞれ自前のストレージにコピーしてください。生成ファイルは 14 日後、アップロードした元画像は 1 日後に削除されます。
API クイックスタート
# Generate the idempotency key once; reuse it when retrying after a lost response.
export SPICY_IDEMPOTENCY_KEY="${SPICY_IDEMPOTENCY_KEY:-$(uuidgen)}"
curl -X POST https://api.spicyapi.ai/api/v1/jobs/createTask \
-H "Authorization: Bearer $SPICY_API_KEY" \
-H "Content-Type: application/json" \
-H "Idempotency-Key: $SPICY_IDEMPOTENCY_KEY" \
-d '{
"model": "spicyapi/face-swap-v1-plus/edit",
"input": {
"image_url": "https://example.com/reference.png",
"output_format": "jpeg",
"reference_image_url": "https://example.com/reference.png"
}
}'
# Copy data.taskId from the response into TASK_ID, then poll the status.
TASK_ID="TASK_ID_FROM_RESPONSE"
curl "https://api.spicyapi.ai/api/v1/jobs/recordInfo?taskId=$TASK_ID" \
-H "Authorization: Bearer $SPICY_API_KEY"
認証、完全なスキーマ、ポーリング、エラー処理は API リファレンスを参照してください。









