モデルガイド

Kling Motion Control API:キャラクターに動画の動きをコピーさせる

Kling Motion Controlは、1枚の画像のキャラクターを、実際の動画の動きに当てはめます。このガイドでは、何を送るか、1秒あたりの課金の仕組み、Kling 3.0と2.6のMotion Controlを1つのAPIで呼び出す方法を解説します。

モーションコントロールでできること

Kling Motion Controlは、キャラクターの画像と、動いている人の動画の2つを受け取ります。画像のキャラクターが、動画の動きを、同じタイミング、ジェスチャー、ボディランゲージで演じる新しいクリップを作成します。キャラクター自体を撮影せずに、実際の俳優のように動くダンストレンド、マスコット動画、商品のスポークスパーソンを作るための方法です。

Revanaでは、2つのバージョンを提供しています:

Kling Motion Controlのバージョン比較
モデルモデルID解像度1秒あたりの料金ルート
Kling 3.0 Motion Controlkling-3.0-motion-control720p, 1080p720pで$0.13、1080pで$0.172ルート
Kling 2.6 Motion Controlkling-2.6-motion-control720p, 1080p720pで$0.07、1080pで$0.122ルート

Kling 3.0は新しいモデルです。Kling 2.6は720pで約半額なので、まず手持ちの素材で試す価値があります。

送るもの

  • image_url:キャラクターです。できれば全身で、カメラのほうを向き、無地の背景のものが理想です。結果に登場する人物になります。
  • video_url:モーション用クリップです。人物が1人で、はっきり映っており、カメラが安定しているものが最適です。結果は、このクリップの長さに従います。
  • resolution:720p または 1080p です。毎回指定してください。
  • prompt:任意です。画像にない背景や詳細を説明するために使います。

どちらのファイルも、APIが取得できるリンクである必要があります。パソコン上のファイルを送るには、先に POST /v1/uploads でアップロードし(クリップは50 MBまで)、返されたリンクを使います。リンクは14日間有効です。

モーションコントロールの課金(2026年10月)

料金は動画1秒あたりで、長さはモーション用クリップによって決まり、次の整数秒に切り上げられます。7.4秒のダンスクリップは、8秒として課金されます。

Kling Motion Controlのクリップの長さ別の費用
モデル解像度5秒のクリップ10秒のクリップ15秒のクリップ
Kling 3.0 Motion Control720p$0.65$1.30$1.95
Kling 3.0 Motion Control1080p$0.85$1.70$2.55
Kling 2.6 Motion Control720p$0.35$0.70$1.05
Kling 2.6 Motion Control1080p$0.60$1.20$1.80

送信する前に、モーション用クリップを必要な部分にトリミングしてください。余分な1秒ごとに課金されます。クリップの長さに応じて、支払ってもよい上限額を max_cost_usd に設定すると、それを超える費用になるジョブは、実行されずに拒否されます。失敗したジョブは無料で、クレジットはサブスクリプションなしの$10からの前払いです。料金ページをご覧ください。

モーションコントロールのクリップを作る

両方のリンクを付けて POST /v1/generations を送信し、ジョブが succeeded または failed になるまでポーリングします。10秒のモーション用クリップで720pの場合、$1.30です。

cURL
export REVANA_API_KEY="sr_live_..."

# 1. Submit the job (returns 202 with the generation id)
curl https://api.revana.si/v1/generations \
  -H "Authorization: Bearer $REVANA_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "model": "kling-3.0-motion-control",
    "input": {
      "prompt": "The mascot dances on a sunny rooftop, city skyline behind.",
      "image_url": "https://example.com/mascot-full-body.png",
      "video_url": "https://example.com/dance-10s.mp4",
      "resolution": "720p"
    },
    "max_cost_usd": 1.6
  }'

# 2. Poll with the id from step 1 until status is "succeeded" or "failed"
curl https://api.revana.si/v1/generations/gen_01JC2V8K5T \
  -H "Authorization: Bearer $REVANA_API_KEY"
Python
import os
import time

import requests

API = "https://api.revana.si/v1"
HEADERS = {"Authorization": f"Bearer {os.environ['REVANA_API_KEY']}"}

resp = requests.post(f"{API}/generations", headers=HEADERS, json={
    "model": "kling-3.0-motion-control",
    "input": {
        "prompt": "The mascot dances on a sunny rooftop, city skyline behind.",
        "image_url": "https://example.com/mascot-full-body.png",
        "video_url": "https://example.com/dance-10s.mp4",
        "resolution": "720p",
    },
    "max_cost_usd": 1.6,
})
resp.raise_for_status()
job = resp.json()

while job["status"] in ("queued", "running"):
    time.sleep(5)
    job = requests.get(f"{API}/generations/{job['id']}", headers=HEADERS).json()

if job["status"] == "succeeded":
    print(job["output"]["urls"], job["cost_usd"])
else:
    print("Failed:", job["error"])
Node.js
// Node 18 or later. Save as generate.mjs and run: node generate.mjs
const API = "https://api.revana.si/v1";
const headers = {
  Authorization: `Bearer ${process.env.REVANA_API_KEY}`,
  "Content-Type": "application/json",
};

const res = await fetch(`${API}/generations`, {
  method: "POST",
  headers,
  body: JSON.stringify({
    model: "kling-3.0-motion-control",
    input: {
      prompt: "The mascot dances on a sunny rooftop, city skyline behind.",
      image_url: "https://example.com/mascot-full-body.png",
      video_url: "https://example.com/dance-10s.mp4",
      resolution: "720p",
    },
    max_cost_usd: 1.6,
  }),
});
if (!res.ok) throw new Error(`${res.status} ${await res.text()}`);
let job = await res.json();

while (job.status === "queued" || job.status === "running") {
  await new Promise((r) => setTimeout(r, 5000));
  job = await (await fetch(`${API}/generations/${job.id}`, { headers })).json();
}

if (job.status === "succeeded") console.log(job.output.urls, job.cost_usd);
else console.error("Failed:", job.error);
レスポンス
{
  "id": "gen_01JC2V8K5T",
  "model": "kling-3.0-motion-control",
  "status": "succeeded",
  "output": {
    "urls": [
      "https://cdn.revana.si/g/gen_01JC2V8K5T/0.mp4"
    ],
    "duration_s": 10
  },
  "cost_usd": 1.3,
  "attempts": 1,
  "error": null,
  "created_at": "2026-10-28T10:14:02Z",
  "completed_at": "2026-10-28T10:15:31Z"
}

きれいな結果を得るには

  • フレーミングを合わせる。全身のキャラクターには全身のダンスクリップを使うほうが、バストアップのポートレートに全身のクリップを使うより、はるかにうまくいきます。
  • 動く人は1人。動く人が1人のクリップを使います。群衆やカットがあると、どの動きをコピーするか判断できなくなります。
  • 安定したカメラ。固定、またはゆっくり動くカメラなら、背景が安定します。
  • ドラフトは720pで。Kling 2.6の720pで動きの転写を確認してから、採用するものをKling 3.0の1080pでレンダリングします。

Klingのテキストから動画・画像から動画のモデルについては、Kling 3.0 APIガイドをご覧ください。2つのモーションコントロールモデルはモデルページにあり、すべてのフィールドはドキュメントに記載されています。試すには、APIキーを取得してください。

よくある質問

Kling Motion Controlの料金はいくらですか?

2026年10月時点で、Kling 3.0 Motion Controlは、1秒あたり720pが$0.13、1080pが$0.17です。Kling 2.6 Motion Controlは$0.07と$0.12です。長さは、モーション用クリップによって決まります。

Kling Motion Controlには何が必要ですか?

image_url にキャラクターの画像、video_url にモーション用クリップ、そして720pまたは1080pの解像度です。プロンプトは任意です。

Kling Motion Controlの動画は、どのくらいの長さになりますか?

送信したモーション用クリップと同じ長さです。その秒数に応じて、1秒単位に切り上げて課金されます。

Kling 3.0とKling 2.6のMotion Controlの違いは何ですか?

Kling 3.0は新しいモデルです。Kling 2.6は1秒あたりの料金が安くなっています。どちらも同じ入力を受け付け、720pと1080pに対応しています。

自分のモーション動画をアップロードできますか?

はい。POST /v1/uploads でアップロードし(動画は50 MBまで)、返されたリンクを video_url に渡します。

1つのキーでKling Motion Controlを試す

2つのモーションコントロールモデルとそのほかのすべての動画・画像モデルを、1つのAPIキーで利用できます。前払いクレジットは$10から、納品されたクリップにのみ課金されます。