キャラクター置換 – 生成

namifusion/character-swap/generate

namifusion/character-swap/generate. 画像・動画・顔交換のモデル API を閲覧。試してから統一 REST API で統合。

パラメータ

名前型既定制約説明
track_manifest_url *トラックマニフェスト URLtext——対応する analyze リクエストで返された track_manifest_url です。別の動画のマニフェストは使用しないでください。
mappings *置換マッピングarray<object>——分析結果の obj_id と 1 枚以上の参照画像 URL を関連付けるマッピングオブジェクトです。
↳obj_id *オブジェクト IDnumber——対応する analyze リクエストで返されたオブジェクト識別子です。
↳img_urls *参照画像image_upload—1–3 itemsこの検出オブジェクトに関連付ける参照画像 URL です。
resolution解像度select720p480p | 720p出力解像度またはプロバイダーの生成モードを選択します。高い設定ほど処理時間が長くなる場合があります。
seedシード値number——結果を再現するための任意の乱数シードです。空欄の場合はランダム値を使用します。

出力フィールド

フィールド型説明
videosarray

API

統一 REST API でこのモデルを呼び出せます。API Keys ページでキーを取得してください。

cURL
# 1) Submit — returns { "task_uuid": "..." }
curl -X POST "https://www.namifusion.com/api/v1/marketplace/run/namifusion/character-swap/generate" \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
  "input": {
    "track_manifest_url": "ANALYZE_OUTPUT.track_manifest_url",
    "mappings": [
      {
        "obj_id": 0,
        "img_urls": [
          "https://assets-public.namifusion.com/marketplace/images/2026-06-12/638e1ee18ac7.jpeg"
        ]
      }
    ],
    "resolution": "720p"
  }
}'

# 2) Poll until status is "completed", then read the output URLs
curl "https://www.namifusion.com/api/v1/marketplace/run/tasks/TASK_UUID" \
  -H "Authorization: Bearer YOUR_API_KEY"
Python
import time, requests

API_KEY = "YOUR_API_KEY"
HEADERS = {"Authorization": f"Bearer {API_KEY}"}

# 1) Submit
resp = requests.post(
    "https://www.namifusion.com/api/v1/marketplace/run/namifusion/character-swap/generate",
    headers=HEADERS,
    json={
        "input": {
            "track_manifest_url": "ANALYZE_OUTPUT.track_manifest_url",
            "mappings": [
                {
                    "obj_id": 0,
                    "img_urls": [
                        "https://assets-public.namifusion.com/marketplace/images/2026-06-12/638e1ee18ac7.jpeg"
                    ]
                }
            ],
            "resolution": "720p"
        }
    },
)
resp.raise_for_status()  # 401/402/429/5xx stop here instead of polling a bad task
task = resp.json()

# 2) Poll until a terminal state (completed / failed / cancelled).
#    This model is allowed up to 7200s server-side.
deadline = time.time() + 7260
while task.get("status") not in ("completed", "failed", "cancelled"):
    if time.time() > deadline:
        raise TimeoutError(f"still {task.get('status')} — keep the task_uuid and poll later")
    time.sleep(3)
    poll = requests.get(f"https://www.namifusion.com/api/v1/marketplace/run/tasks/{task['task_uuid']}", headers=HEADERS)
    poll.raise_for_status()
    task = poll.json()

print(task["status"], task.get("output"))
JavaScript
const API_KEY = "YOUR_API_KEY";
const HEADERS = { Authorization: `Bearer ${API_KEY}` };

// 1) Submit
const resp = await fetch("https://www.namifusion.com/api/v1/marketplace/run/namifusion/character-swap/generate", {
  method: "POST",
  headers: { ...HEADERS, "Content-Type": "application/json" },
  body: JSON.stringify({
    "input": {
      "track_manifest_url": "ANALYZE_OUTPUT.track_manifest_url",
      "mappings": [
        {
          "obj_id": 0,
          "img_urls": [
            "https://assets-public.namifusion.com/marketplace/images/2026-06-12/638e1ee18ac7.jpeg"
          ]
        }
      ],
      "resolution": "720p"
    }
  }),
});
if (!resp.ok) throw new Error(`submit failed: ${resp.status} ${await resp.text()}`);
let task = await resp.json();

// 2) Poll until a terminal state (completed / failed / cancelled).
//    This model is allowed up to 7200s server-side.
const deadline = Date.now() + 7260 * 1000;
while (!["completed", "failed", "cancelled"].includes(task.status)) {
  if (Date.now() > deadline) throw new Error(`still ${task.status} — keep the task_uuid and poll later`);
  await new Promise((r) => setTimeout(r, 3000));
  const poll = await fetch(`https://www.namifusion.com/api/v1/marketplace/run/tasks/${task.task_uuid}`, { headers: HEADERS });
  if (!poll.ok) throw new Error(`poll failed: ${poll.status}`);
  task = await poll.json();
}

console.log(task.status, task.output);

ドキュメント

Character Swap - Generate

分析済み動画の人物を参照画像のキャラクターへ置き換え、元の音声を保持した動画を生成します。

Character Swap Generate は 2 段階ワークフローの第 2 段階です。Analyze が返した track_manifest_url と obj_id を使用し、選択した人物ごとに 1~3 枚の参照画像を割り当てます。入力動画は Analyze に送信したものと同一でなければならず、解像度も両ステップで一致させる必要があります。

主な特長

  • 人物単位の置換:Analyze の obj_id を使い、置換対象を明示的に選択できます。
  • 複数人物に対応:mappings へ複数項目を追加し、動画内の複数キャラクターを個別に設定できます。
  • 1~3 枚の参照画像:人物ごとに複数の外観参照を指定し、角度や特徴の情報を補えます。
  • 元の音声を保持:生成された動画では入力動画の音声トラックを維持します。
  • 480p / 720p 出力:用途と既存の料金区分に合わせて選択できます。

技術仕様

項目内容
ワークフローCharacter Swap のステップ 2
必須入力video_url、track_manifest_url、mappings
mappings{obj_id, img_urls} の配列
参照画像1 人物あたり 1~3 URL
解像度480p、720p(デフォルト)
動画の上限30 秒
任意入力seed
出力元の音声を保持した動画 URL

基本フロー

  1. 同じ動画を Character Swap Analyze で処理します。
  2. 結果の objects から置換対象の obj_id を選びます。
  3. 各 obj_id と参照画像 URL を mappings に設定します。
  4. Analyze の track_manifest_url と同じ video_url を送信し、完了までポーリングします。

価格

既存文書の価格は 480p が 5 秒単位で 40 クレジット、720p が 5 秒単位で 75 クレジットです。動画は最大 30 秒です。この日本語文書の追加では価格設定を変更しません。

活用のポイント

各人物について、正面だけでなく少し異なる角度の鮮明な参照画像を用意すると外観の一貫性を高めやすくなります。obj_id、動画、マニフェストは必ず同じ Analyze 結果から取得してください。解像度を途中で変更したり、別動画のマニフェストを再利用したりしないでください。