Kling Motion Control API:キャラクターに動画の動きをコピーさせる
Kling Motion Controlは、1枚の画像のキャラクターを、実際の動画の動きに当てはめます。このガイドでは、何を送るか、1秒あたりの課金の仕組み、Kling 3.0と2.6のMotion Controlを1つのAPIで呼び出す方法を解説します。
モーションコントロールでできること
Kling Motion Controlは、キャラクターの画像と、動いている人の動画の2つを受け取ります。画像のキャラクターが、動画の動きを、同じタイミング、ジェスチャー、ボディランゲージで演じる新しいクリップを作成します。キャラクター自体を撮影せずに、実際の俳優のように動くダンストレンド、マスコット動画、商品のスポークスパーソンを作るための方法です。
Revanaでは、2つのバージョンを提供しています:
| モデル | モデルID | 解像度 | 1秒あたりの料金 | ルート |
|---|---|---|---|---|
| Kling 3.0 Motion Control | kling-3.0-motion-control | 720p, 1080p | 720pで$0.13、1080pで$0.17 | 2ルート |
| Kling 2.6 Motion Control | kling-2.6-motion-control | 720p, 1080p | 720pで$0.07、1080pで$0.12 | 2ルート |
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秒として課金されます。
| モデル | 解像度 | 5秒のクリップ | 10秒のクリップ | 15秒のクリップ |
|---|---|---|---|---|
| Kling 3.0 Motion Control | 720p | $0.65 | $1.30 | $1.95 |
| Kling 3.0 Motion Control | 1080p | $0.85 | $1.70 | $2.55 |
| Kling 2.6 Motion Control | 720p | $0.35 | $0.70 | $1.05 |
| Kling 2.6 Motion Control | 1080p | $0.60 | $1.20 | $1.80 |
送信する前に、モーション用クリップを必要な部分にトリミングしてください。余分な1秒ごとに課金されます。クリップの長さに応じて、支払ってもよい上限額を max_cost_usd に設定すると、それを超える費用になるジョブは、実行されずに拒否されます。失敗したジョブは無料で、クレジットはサブスクリプションなしの$10からの前払いです。料金ページをご覧ください。
モーションコントロールのクリップを作る
両方のリンクを付けて POST /v1/generations を送信し、ジョブが succeeded または failed になるまでポーリングします。10秒のモーション用クリップで720pの場合、$1.30です。
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"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 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 に渡します。