Seedance 2.0 画像から動画 API:あらゆる画像を完全制御でアニメーション化
Seedance 2.0 API で画像をアニメーション化する方法を解説——単一画像、最初と最後のフレーム、マルチ画像ワークフロー。完全な Python コード、@tag 構文、EC デモを収録。

Seedance 2.0 画像から動画 API:あらゆる画像を完全制御でアニメーション化
ハードドライブに眠っている1枚の商品写真では、エンゲージメントはゼロです。しかし、その商品がスタジオ照明の下で回転し、同期された音声が付いた10秒の動画であれば、クリック、シェア、そして売上を生み出します。Seedance 2.0 の画像から動画 API は、たった1回の POST リクエストで、あらゆる静止画像を完全に制御可能な動画に変換します。
このガイドでは、3つの異なる画像から動画モードを解説します:単一画像アニメーション、最初と最後のフレーム補間、そして @tag 参照を使ったマルチ画像合成です。各セクションには、完全に実行可能な Python コード、実際のデモ出力、そしてそれらを生成した正確なプロンプトが含まれています。
Seedance 2.0 の画像から動画が他と異なる理由
主要な AI 動画プラットフォームはすべて、何らかの画像から動画生成機能を提供しています。Sora は単一画像を開始フレームとして受け取ります。Kling は基本的なモーション制御による画像アニメーションを提供します。Veo 2 はスタイルガイダンスのための画像コンディショニングをサポートしています。これらはすべて同じ表面的な問題を解決しています:画像を動くピクセルに変換するということです。
Seedance 2.0 はまったく異なる問題を解決します。単一の生成リクエスト内で複数の画像に対する構成的制御を提供します。そして、これを他の API では現在実現できないタグシステムによって行います。
主な違い
| 機能 | Sora | Kling | Veo 2 | Seedance 2.0 |
|---|---|---|---|---|
| 単一画像 → 動画 | ✅ | ✅ | ✅ | ✅ |
| 最初と最後のフレーム制御 | ❌ | ✅ (限定的) | ❌ | ✅ |
| マルチ画像合成 | ❌ | ❌ | ❌ | ✅ (最大9枚) |
| 画像ごとの役割割り当て | ❌ | ❌ | ❌ | ✅ (@Image1, @Image2…) |
| ミックスメディア (画像 + 動画 + 音声) | ❌ | ❌ | ❌ | ✅ (最大12ファイル) |
| ネイティブ音声生成 | ❌ | ❌ | ❌ | ✅ |
| API ファーストアクセス | ウェイトリスト | ✅ | 限定的 | ✅ |
@tag システムが Seedance 2.0 の優位性を発揮するポイントです。3枚の画像をアップロードする際、次のようなプロンプトを書くことができます:
@Image1 is the main character. @Image2 is the background environment.
@Image3 is the art style reference. The character walks through the environment
in the style of @Image3.
各画像に特定の意味的役割が割り当てられます。モデルはどの画像がキャラクターでどの画像が背景かを推測する必要がありません。明示的に指示するからです。このタグシステムの詳細については、マルチモーダル @Tags ガイドをご覧ください。
開発者にとって @Tags が重要な理由
他の画像から動画 API を使ったことがある方なら、そのフラストレーションをご存知でしょう:複数の画像をアップロードして、モデルが意図を理解してくれることを期待するしかありません。背景画像がキャラクターとして使われることもあります。すべての画像が一貫性のない混合物に融合されることもあります。モデルが各入力をどのように解釈するかを制御できないため、デバッグする方法がありません。
@tag システムはこの不確実性を排除します。本質的には変数バインディングシステムです。各入力に名前を付け、指示の中で明示的に参照します。これにより、画像から動画の生成が決定論的で再現可能になります。同じ入力、同じタグ、同じプロンプトで、常に同じ意味的解釈が得られます。
本番パイプラインにおいて、これは「試して結果を見る」と「設定してそのままデプロイする」の違いです。テンプレートを構築し、出力を検証し、構成全体が予測不能に変化することなく特定の要素を反復的に改善できます。
ネイティブ音声が出力を変える
ほとんどの AI 画像から動画ツールは無音のクリップを生成します。その後、別の音声生成ステップ、別の API コール、そして音声を合成するための動画編集パスが必要になります。Seedance 2.0 は generate_audio: true を設定することで、同じリクエストの一部として同期された音声を生成します。足音は歩行動作に一致します。風の音は屋外シーンに一致します。これにより、ポストプロダクションの工程がまるごと不要になります。
できないこと
Seedance 2.0 は画像から動画生成において、リアルな人間の顔をサポートしていません。入力画像にフォトリアリスティックな人間の顔が含まれている場合、API は自動的にリクエストを拒否します。イラストキャラクター、様式化された顔、アニメキャラクター、フォトリアリスティックでないポートレートはすべて問題なく動作します。これは技術的な制限ではなく、意図的な安全上の制約です。
クイックセットアップ:API キーと環境構築
必要なものは3つだけです:EvoLink アカウント、API キー、そして requests ライブラリです。セットアップ全体は1分以内で完了します。
ステップ 1:API キーを取得する
- evolink.ai にアクセスして無料アカウントを作成します
- ダッシュボードの API Keys セクションに移動します
- 新しいキーを生成してコピーします
キーは sk- で始まり、次のような形式です:sk-XpXn...Ms1N
ステップ 2:依存関係をインストールする
pip install requests
以上です。SDK のインストールも、複雑な認証フローも不要です。API は標準的な REST と Bearer トークン認証を使用します。
ステップ 3:Python 環境を設定する
import requests
import time
import json
API_KEY = "YOUR_API_KEY"
BASE_URL = "https://api.evolink.ai/v1"
HEADERS = {
"Authorization": f"Bearer {API_KEY}",
"Content-Type": "application/json"
}
このガイドのすべてのコード例は、これら3つの変数を基盤としています。YOUR_API_KEY を実際のキーに置き換えれば、生成の準備は完了です。
ポーリングヘルパー
動画生成には60〜180秒かかるため、完了を確認するためのポーリング関数が必要です。このヘルパーは3つの画像から動画モードすべてで動作します:
def wait_for_video(task_id, interval=5, max_wait=300):
"""Poll the task endpoint until the video is ready."""
url = f"{BASE_URL}/tasks/{task_id}"
elapsed = 0
while elapsed < max_wait:
resp = requests.get(url, headers=HEADERS)
data = resp.json()
status = data["status"]
if status == "completed":
video_url = data["output"]["video_url"]
print(f"Video ready: {video_url}")
return data
elif status == "failed":
print(f"Generation failed: {data.get('error', 'Unknown error')}")
return data
print(f"Status: {status} ({elapsed}s elapsed)")
time.sleep(interval)
elapsed += interval
print("Timed out waiting for video")
return None
タスクステータスはシンプルなライフサイクルに従います:pending → processing → completed または failed。レスポンス内の動画 URL は24時間後に期限切れになります。それまでにダウンロードまたは配信してください。
API の基礎(テキストから動画、パラメータ、エラーハンドリング)の完全なウォークスルーについては、スタートガイドをご覧ください。
モード 1:単一画像アニメーション
単一画像アニメーションは、最も一般的な画像から動画のワークフローです。1枚の画像と、希望するモーションを記述するプロンプトを提供します。モデルは画像のビジュアルコンテンツを保持しながら、リアルな動き、カメラモーション、環境エフェクトを追加します。
仕組み
image_urls に URL を1つだけ渡すと、Seedance 2.0 はそれを主要なビジュアルリファレンスとして扱います。モデルは最初のフレームを画像に固定し、プロンプトに基づいて前方への動きを生成します。出力では以下が保持されます:
- ソース画像のカラーパレット
- 構図とフレーミング
- 被写体のアイデンティティ(服装、形状、特徴)
- アートスタイル(イラスト、3Dレンダリング、写真)
プロンプトは変化する部分を制御します:動き、カメラアングル、照明の変化、環境のダイナミクスです。
完全なコード:単一画像から動画
import requests
import time
API_KEY = "YOUR_API_KEY"
BASE_URL = "https://api.evolink.ai/v1"
HEADERS = {
"Authorization": f"Bearer {API_KEY}",
"Content-Type": "application/json"
}
def wait_for_video(task_id, interval=5, max_wait=300):
url = f"{BASE_URL}/tasks/{task_id}"
elapsed = 0
while elapsed < max_wait:
resp = requests.get(url, headers=HEADERS)
data = resp.json()
status = data["status"]
if status == "completed":
print(f"Video ready: {data['output']['video_url']}")
return data
elif status == "failed":
print(f"Failed: {data.get('error', 'Unknown error')}")
return data
print(f"Status: {status} ({elapsed}s)")
time.sleep(interval)
elapsed += interval
return None
# --- Single Image Animation ---
payload = {
"model": "seedance-2.0",
"prompt": (
"The woman in the painting slowly reaches for a coffee cup on the table, "
"lifts it to her lips, and takes a quiet sip. Soft morning light filters "
"through a nearby window. Gentle steam rises from the cup. "
"Painterly brushstroke texture preserved throughout."
),
"image_urls": [
"https://example.com/painting-woman.jpg"
],
"duration": 8,
"quality": "1080p",
"aspect_ratio": "16:9",
"generate_audio": True
}
resp = requests.post(
f"{BASE_URL}/videos/generations",
headers=HEADERS,
json=payload
)
result = resp.json()
print(f"Task ID: {result['task_id']}")
# Poll until complete
video_data = wait_for_video(result["task_id"])
ご自身の API キーで実行してください。
image_urlsの値を任意の公開アクセス可能な画像 URL に差し替えるだけです。
デモ:絵画が命を吹き込まれる
使用したプロンプト: "The woman in the painting slowly reaches forward, picks up a coffee cup from the table, and takes a quiet sip. Soft indoor lighting. Painterly brushstroke style maintained. Subtle steam rises from the cup."
このデモでは、1枚の油絵風ポートレートを @Image1(キャラクターリファレンス)として使用しています。モデルは油絵の美的表現を維持しながら、自然な腕の動きと蒸気の物理表現を生成します。
デモ:スタイル転写アニメーション
使用したプロンプト: "A young girl walks along a winding path through a Van Gogh-style village. Swirling sky with thick brushstrokes. Vibrant yellows and blues. The girl's dress and hair flow in the wind. Camera slowly follows her from behind."
入力画像のゴッホ風の筆致がすべてのフレームに反映されていることに注目してください。渦巻く空、建物のインパスト質感、色の関係性などです。単一画像アニメーションは、スタイルに一貫性のあるモーション生成に優れています。
単一画像モードのプロンプトベストプラクティス
プロンプトがアニメーションの品質を決定します。静的な記述は静的な動画を生み出します。モーション豊かなプロンプトがダイナミックな出力を生み出します。
弱いプロンプト:
A cat sitting on a windowsill
強いプロンプト:
The cat stretches lazily on the windowsill, yawns wide showing tiny teeth,
then curls back into a ball. Afternoon sunlight shifts slowly across the fur.
Dust motes float in the light beam. Camera holds steady, slight depth of field.
違いは、強いプロンプトが連続的なアクション(伸びる → あくびする → 丸まる)、環境の動き(日光が移動する、塵が浮遊する)、カメラの振る舞い(固定、被写界深度)を指定していることです。
単一画像プロンプトの主要原則:
| 原則 | 例 |
|---|---|
| 外見ではなく動きを記述する | "walks forward"("a person standing" ではなく) |
| 2〜3のアクションを連続させる | "picks up → examines → sets down" |
| 環境のダイナミクスを加える | "wind rustles leaves", "rain beads on glass" |
| カメラの動きを指定する | "slow pan left", "camera pulls back to reveal" |
| 画像のアートスタイルに合わせる | "painterly strokes preserved", "3D render quality" |
完全なプロンプトエンジニアリングのリファレンスについては、Seedance 2.0 プロンプトガイドをご覧ください。カメラ固有のテクニックについては、カメラムーブメントガイドをご覧ください。
モード 2:最初と最後のフレーム制御
単一画像モードは動画の始まりを固定します。最初と最後のフレームモードは両端を固定します。開始フレームと終了フレームの2枚の画像を提供し、Seedance 2.0 がその間のスムーズなトランジションを生成します。
仕組み
image_urls にちょうど2つの URL が含まれている場合、モデルはそれらを次のように解釈します:
- 最初の URL → 開始フレーム
- 2番目の URL → 終了フレーム
モデルは、自然で物理的に妥当なトランジションを作成する中間フレームを生成します。プロンプトはトランジションのスタイルをガイドします。スムーズなモーフ、ナラティブな旅程、またはドラマチックな変換のいずれであるかを指示します。
ユースケース
最初と最後のフレーム制御は、単一画像モードでは解決できない問題を解決します:
- ビフォーアフター表現:リノベーション、メイクアップ、季節の変化
- タイムラプスシミュレーション:夜明けから夕暮れ、空の部屋から家具付きの部屋
- シーントランジション:ある場所が別の場所にモーフィング
- 商品変換:閉じたパッケージから開いた商品ディスプレイ
- モーフィングエフェクト:あるキャラクターやスタイルが別のものに変化
完全なコード:最初と最後のフレーム補間
import requests
import time
API_KEY = "YOUR_API_KEY"
BASE_URL = "https://api.evolink.ai/v1"
HEADERS = {
"Authorization": f"Bearer {API_KEY}",
"Content-Type": "application/json"
}
def wait_for_video(task_id, interval=5, max_wait=300):
url = f"{BASE_URL}/tasks/{task_id}"
elapsed = 0
while elapsed < max_wait:
resp = requests.get(url, headers=HEADERS)
data = resp.json()
status = data["status"]
if status == "completed":
print(f"Video ready: {data['output']['video_url']}")
return data
elif status == "failed":
print(f"Failed: {data.get('error', 'Unknown error')}")
return data
print(f"Status: {status} ({elapsed}s)")
time.sleep(interval)
elapsed += interval
return None
# --- First-Last Frame Control ---
payload = {
"model": "seedance-2.0",
"prompt": (
"Smooth cinematic transition. The real-world landscape gradually "
"transforms into a traditional Chinese ink wash painting. Mountains "
"dissolve from photorealistic to brushstroke. Water becomes flowing ink. "
"Sky shifts from blue to rice-paper white. Slow, meditative pace."
),
"image_urls": [
"https://example.com/real-landscape.jpg",
"https://example.com/ink-wash-painting.jpg"
],
"duration": 10,
"quality": "1080p",
"aspect_ratio": "16:9"
}
resp = requests.post(
f"{BASE_URL}/videos/generations",
headers=HEADERS,
json=payload
)
result = resp.json()
print(f"Task ID: {result['task_id']}")
video_data = wait_for_video(result["task_id"])
デモ:現実から水墨画へ
使用したプロンプト: "The real-world mountain landscape gradually transforms into a traditional Chinese ink wash (山水画) painting. Photorealistic textures dissolve into flowing brushstrokes. Colors fade from vivid to monochrome ink tones. Water surfaces become calligraphic ink flows. Slow, contemplative transition."
最初のフレームはフォトリアリスティックな山岳風景です。最後のフレームは同様のシーンの伝統的な水墨画です。モデルは、写真的な質感が徐々に筆致へと溶けていくシームレスな変換を作成します。After Effects で手作業で行えば何時間もかかるエフェクトです。
最初と最後のフレームモードのヒント
フレーム間の構図を合わせましょう。 最初のフレームの左側に山がある場合、最後のフレームにも同じ位置に同様の構造要素を配置すべきです。両方のフレームがおおよそ同じレイアウトを共有している場合、モデルはより良いトランジションを生成します。
端点だけでなく、トランジションを記述しましょう。 モデルは開始と終了がどのように見えるかをすでに知っています。画像があるからです。プロンプトでは A から B への移行の方法を記述すべきです。
# Weak: just describes the endpoints
"A sunrise and a sunset"
# Strong: describes the journey
"The golden dawn light gradually warms to midday brightness,
then softens through amber afternoon hues into deep sunset oranges.
Shadows rotate clockwise. Cloud formations shift and reform."
複雑なトランジションにはより長い尺を使用しましょう。 シンプルな色の変化は4秒で機能します。スタイル変換(フォトリアリスティック → イラスト)は8〜12秒が有効です。短い尺での急激な変化は不自然に見えます。
| トランジションの種類 | 推奨尺 |
|---|---|
| 色/照明の変化 | 4〜6秒 |
| カメラ位置の変更 | 6〜8秒 |
| スタイル変換 | 8〜12秒 |
| ナラティブなシーン転換 | 10〜15秒 |
モード 3:@Tags を使ったマルチ画像合成
これは Seedance 2.0 の最も強力な画像から動画モードであり、競合する API が提供していないものです。最大9枚の画像を提供し、プロンプト内の @Image タグを使って各画像に意味的な役割を割り当て、モデルがそれらを1つの一貫した動画に合成します。
@Tags の仕組み
image_urls に複数の URL を含めると、Seedance 2.0 は配列の位置に基づいて順番にタグを割り当てます:
image_urls[0] → @Image1
image_urls[1] → @Image2
image_urls[2] → @Image3
...
image_urls[8] → @Image9
プロンプトでこれらのタグを参照して、各画像の使い方をモデルに正確に伝えます:
@Image1 is the main character running through the city.
@Image2 is the city skyline in the background.
@Image3 defines the color grading and visual mood.
タグがなければ、モデルはどの画像がキャラクターでどの画像が背景かを推測しなければなりません。タグがあれば、曖昧さはありません。これは、画像が視覚的に似ている場合や、特定の画像でコンテンツではなくスタイルを制御したい場合に特に重要です。
完全なコード:マルチ画像合成
import requests
import time
API_KEY = "YOUR_API_KEY"
BASE_URL = "https://api.evolink.ai/v1"
HEADERS = {
"Authorization": f"Bearer {API_KEY}",
"Content-Type": "application/json"
}
def wait_for_video(task_id, interval=5, max_wait=300):
url = f"{BASE_URL}/tasks/{task_id}"
elapsed = 0
while elapsed < max_wait:
resp = requests.get(url, headers=HEADERS)
data = resp.json()
status = data["status"]
if status == "completed":
print(f"Video ready: {data['output']['video_url']}")
return data
elif status == "failed":
print(f"Failed: {data.get('error', 'Unknown error')}")
return data
print(f"Status: {status} ({elapsed}s)")
time.sleep(interval)
elapsed += interval
return None
# --- Multi-Image Composition with @Tags ---
payload = {
"model": "seedance-2.0",
"prompt": (
"@Image1 is a parkour runner in dark athletic gear. "
"@Image2 is a futuristic city rooftop at twilight. "
"@Image3 is a neon-lit alleyway. "
"@Image4 is a glass skyscraper facade. "
"@Image5 provides the cyberpunk color grading reference. "
"The runner (@Image1) sprints across the rooftop (@Image2), "
"leaps over the edge, flips through the alleyway (@Image3), "
"and wall-runs along the skyscraper (@Image4). "
"Dynamic handheld camera follows the action. "
"Cyberpunk neon color palette from @Image5 throughout."
),
"image_urls": [
"https://example.com/runner.jpg",
"https://example.com/rooftop.jpg",
"https://example.com/alley.jpg",
"https://example.com/skyscraper.jpg",
"https://example.com/cyberpunk-ref.jpg"
],
"duration": 10,
"quality": "1080p",
"aspect_ratio": "16:9",
"generate_audio": True
}
resp = requests.post(
f"{BASE_URL}/videos/generations",
headers=HEADERS,
json=payload
)
result = resp.json()
print(f"Task ID: {result['task_id']}")
video_data = wait_for_video(result["task_id"])
デモ:5枚の画像リファレンスによるシティパルクール
使用したプロンプト: "@Image1 is the parkour runner. @Image2 is the rooftop environment. @Image3 is the neon alley. @Image4 is the glass building. @Image5 is the color palette reference. The runner (@Image1) sprints across the rooftop (@Image2), leaps, flips through the alley (@Image3), wall-runs along the building (@Image4). Dynamic tracking camera. Cyberpunk color grading from @Image5."
5枚の別々の画像(キャラクター、3つの環境、スタイルリファレン��)が1つの連続したアクションシーケンスに統合されています。各 @Image タグがモデルに対し、どのビジュアル要素がシーンのどの部分を制御するかを正確に指示しています。
一般的な @Tag の役割割り当て
@tag システムは柔軟です。最も効果的なパターンを紹介します:
| 役割 | プロンプトでのタグ使用 | 目的 |
|---|---|---|
| キャラクター | @Image1 is the main character | アイデンティティ、服装、特徴を保持 |
| 背景 | @Image2 is the environment | シーンの場所を設定 |
| スタイルリファレンス | @Image3 defines the art style | レンダリングの美的表現を制御 |
| オブジェクト/小道具 | @Image4 is the product on the table | シーンに特定のアイテムを配置 |
| カラーグレーディング | @Image5 is the color palette | リファレンスから雰囲気/トーンを適用 |
| テクスチャリファレンス | @Image6 provides surface textures | マテリアル/テクスチャの転写 |
デモ:スタイルリファレンス付きキャラクター
使用したプロンプト: "@Image1 is the character — a mysterious figure in a red coat. The character runs through rain-soaked city streets at night. Neon reflections on wet pavement. Camera tracks alongside at medium distance. Cinematic atmosphere, shallow depth of field."
1枚のキャラクターリファレンス画像がアイデンティティを制御し、プロンプトが環境とアクションを駆動します。赤いコート、体のプロポーション、動きのスタイルはすべて @Image1 から導き出されています。
@tag の完全なリファレンス(動画タグや音声タグ、ミックスメディアの組み合わせ、高度な役割パターンを含む)については、マルチモーダル @Tags ガイドをご覧ください。
ショット間でキャラクターの一貫性を維持する
1つの生成クリップは便利です。異なるシーンにわたって同じキャラクターが登場するクリップの連続は、ストーリーになります。キャラクターの一貫性は AI 動画生成における最も難しい問題であり、Seedance 2.0 の @tag システムは API を通じて利用可能な最も信頼性の高いソリューションを提供します。
キャラクターロックパターン
複数のショットで同じキャラクターを維持するには、すべての生成リクエストで同じキャラクターリファレンス画像を @Image1 として使用します。プロンプトと背景/環境画像のみを変更します。
CHARACTER_IMAGE = "https://example.com/my-character.jpg"
shots = [
{
"prompt": (
"@Image1 is the main character. She walks into a cozy library, "
"looks around with wonder, and reaches for a book on the top shelf. "
"Warm golden lighting. Camera at eye level, slow push in."
),
"extra_images": [],
"duration": 8
},
{
"prompt": (
"@Image1 is the main character. She sits at a wooden reading table, "
"opens the book, and pages start glowing with magical light. "
"Dust particles float in warm lamplight. Camera orbits slowly around her."
),
"extra_images": [],
"duration": 10
},
{
"prompt": (
"@Image1 is the main character. She steps out of the library into "
"a fantastical world that matches the book's illustrations. "
"Vibrant colors replace the muted library tones. "
"Camera pulls back to reveal the vast landscape. Wide shot."
),
"extra_images": [],
"duration": 10
},
]
def generate_shot(shot):
image_urls = [CHARACTER_IMAGE] + shot["extra_images"]
payload = {
"model": "seedance-2.0",
"prompt": shot["prompt"],
"image_urls": image_urls,
"duration": shot["duration"],
"quality": "1080p",
"aspect_ratio": "16:9"
}
resp = requests.post(
f"{BASE_URL}/videos/generations",
headers=HEADERS,
json=payload
)
return resp.json()["task_id"]
# Generate all shots
task_ids = [generate_shot(shot) for shot in shots]
print(f"Submitted {len(task_ids)} shots: {task_ids}")
# Poll each shot
for i, task_id in enumerate(task_ids):
print(f"\nWaiting for Shot {i+1}...")
wait_for_video(task_id)
デモ:図書館ストーリーシーケンス
使用したプロンプト: "@Image1 is a young girl with braids. She enters a grand old library, runs her fingers along the spines of ancient books, pulls one out, and opens it. Golden dust motes swirl in shaft of light from a high window. Warm, magical atmosphere. Camera follows her at child's eye level."
キャラクター(おさげの少女)は、同じリファレンス画像がすべてのショットを固定しているため、視覚的に一貫しています。モデルは、異なるアクションと環境を生成しながら、彼女のプロポーション、服装、視覚的特徴を保持します。
一貫性のヒント
明瞭で照明の良いキャラクターリファレンスを使用しましょう。 モデルはリファレンス画像からアイデンティティの特徴を抽出します。ぼやけた、照明の暗い、または大部分が隠された画像では、モデルが作業できる情報が少なくなります。正面向き、全身または上半身のショットで、きれいな背景のものが最も良い一貫性を生み出します。
プロンプトでのキャラクター記述は最小限にしましょう。 @Image1 がすでに青いドレスの女の子を示している場合、プロンプトで「赤いドレスを着た女の子」と書かないでください。矛盾する記述はモデルに画像とテキストのどちらかを選ばせることになり、一貫性が低下します。
ショット間で同じアスペクト比を維持しましょう。 シーケンスの途中で 16:9 から 9:16 に切り替えると、異なるフレーミングが強制され、キャラクターの見え方が変わる可能性があります。1つの比率を選び、それを維持してください。
環境画像は別の @tags として追加しましょう。 背景をすべてテキストで記述する代わりに、背景のリファレンス画像を @Image2 として提供します。これにより、キャラクターと環境の両方を視覚的に分離したまま正確に制御できます。
# Shot 1: Character in library
"image_urls": [CHARACTER_IMAGE, "https://example.com/library.jpg"]
# Prompt: "@Image1 is the character. @Image2 is the library environment."
# Shot 2: Character in forest
"image_urls": [CHARACTER_IMAGE, "https://example.com/forest.jpg"]
# Prompt: "@Image1 is the character. @Image2 is the forest environment."
このパターン(キャラクターには固定の @Image1、環境には可変の @Image2)は、現在の AI 動画 API の中で最も信頼性の高いマルチショットワークフローです。
上級編:マルチショットナラティブパイプライン
より長いナラティブ(30秒以上)の場合、複数のクリップを生成してつなぎ合わせる必要があります。ここでは、パイプライン全体を管理する構造化されたアプローチを紹介します。ショットリストの定義、並列生成、順序付きの出力です:
import concurrent.futures
import requests
import time
import json
API_KEY = "YOUR_API_KEY"
BASE_URL = "https://api.evolink.ai/v1"
HEADERS = {
"Authorization": f"Bearer {API_KEY}",
"Content-Type": "application/json"
}
CHARACTER_REF = "https://example.com/story-character.jpg"
SHOT_LIST = [
{
"shot_id": "01_entrance",
"prompt": (
"@Image1 is the main character. "
"She pushes open a heavy wooden door and steps into a dimly lit room. "
"Dust swirls in the doorway light. "
"Camera follows her from behind, over-the-shoulder angle."
),
"env_images": [],
"duration": 6
},
{
"shot_id": "02_discovery",
"prompt": (
"@Image1 is the main character. @Image2 is the room interior. "
"She walks to the center of the room and discovers a glowing object on a pedestal. "
"Her face shows surprise. Blue light illuminates her features. "
"Camera pushes in from medium shot to close-up on her expression."
),
"env_images": ["https://example.com/mysterious-room.jpg"],
"duration": 8
},
{
"shot_id": "03_transformation",
"prompt": (
"@Image1 is the main character. "
"She reaches out and touches the glowing object. "
"Light radiates outward from the point of contact. "
"The room transforms — walls dissolve into a starfield. "
"Camera rapidly pulls back to extreme wide shot."
),
"env_images": [],
"duration": 10
},
]
def submit_shot(shot):
"""Submit a single shot for generation."""
image_urls = [CHARACTER_REF] + shot["env_images"]
payload = {
"model": "seedance-2.0",
"prompt": shot["prompt"],
"image_urls": image_urls,
"duration": shot["duration"],
"quality": "1080p",
"aspect_ratio": "16:9",
"generate_audio": True
}
resp = requests.post(f"{BASE_URL}/videos/generations", headers=HEADERS, json=payload)
task_id = resp.json()["task_id"]
return {"shot_id": shot["shot_id"], "task_id": task_id}
def poll_until_done(task_id, max_wait=300):
"""Block until task completes or fails."""
url = f"{BASE_URL}/tasks/{task_id}"
elapsed = 0
while elapsed < max_wait:
data = requests.get(url, headers=HEADERS).json()
if data["status"] in ("completed", "failed"):
return data
time.sleep(5)
elapsed += 5
return None
# Submit all shots in parallel
results = []
for shot in SHOT_LIST:
result = submit_shot(shot)
results.append(result)
print(f"Submitted {result['shot_id']} → {result['task_id']}")
time.sleep(0.5)
# Collect results in order
final_videos = []
for r in results:
print(f"\nPolling {r['shot_id']}...")
data = poll_until_done(r["task_id"])
if data and data["status"] == "completed":
video_url = data["output"]["video_url"]
final_videos.append({"shot_id": r["shot_id"], "url": video_url})
print(f" Done: {r['shot_id']}: {video_url}")
else:
print(f" Failed: {r['shot_id']}: generation failed")
# Output the ordered shot list
print("\n=== Final Shot List ===")
for v in final_videos:
print(f"{v['shot_id']}: {v['url']}")
このパイプラインは、任意の動画エディタや自動ステッチングツール(FFmpeg、MoviePy など)に入力できる、順序付きの動画 URL リストを生成します。すべてのリクエストが同じ CHARACTER_REF を @Image1 として使用するため、キャラクターはすべてのショットで一貫性を保ちます。
一貫性のエッジケースへの対処
同じリファレンス画像を使用しても、ショット間でわずかなバリエーションが生じることがあります。キャラクターの服の色が数シェード変化したり、極端なワイドショットでプロポーションがわずかに変わったりすることがあります。これらのバリエーションを最小限に抑える戦略を紹介します:
すべてのプロンプトでキャラクターの詳細を再記述しましょう。 キャラクターが特定の服装を着ている場合、簡潔に言及します:「@Image1 is the main character wearing a blue denim jacket.」これにより、リファレンス画像からのビジュアルアンカーが強化されます。
ショット間での極端なアングル変更を避けましょう。 正面のミディアムショットに続くトップダウンの極端なワイドショットは、最も多くのバリエーションを引き起こします。段階的に移行しましょう:ミディアムショット → やや広めのショット → ワイドショット。
同じクオリティとアスペクト比を使用しましょう。 ショット間で 720p と 1080p を混在させると、微妙なレンダリングの違いが生じることがあります。ショットリスト全体ですべてのパラメータを統一してください。
EC 商品動画:エンドツーエンドのワークフロー
商品写真は高価です。商品の動画撮影はさらに高価です。スタジオ、ターンテーブル、適切な照明、カメラマン、編集時間が必要です。Seedance 2.0 の画像から動画 API は、そのパイプラインのほとんどを1回の API コールで置き換えます。
商品動画の課題
EC プラットフォームはますます動画コンテンツを優遇しています。Amazon では動画付きの商品リスティングがより高いコンバージョン率を示すと報告されています。Instagram と TikTok は動画ファーストのプラットフォームです。しかし、シンプルな10秒の商品回転動画を従来の方法で制作するには、以下が必要です:
- 物理的なターンテーブルのセットアップ
- 適切な照明機材
- 撮影者(または慎重な DIY)
- 編集とカラーコレクション
- エクスポートとアップロード
Seedance 2.0 では、パイプラインは次のようになります:
- 商品写真を撮る(すでにお持ちのはずです)
- 1回の API コールを実行する
- 動画をダウンロードする
単一商品:腕時計の広告
単一の商品画像から商品ショーケース動画を生成するための完全なワークフローを紹介します:
import requests
import time
API_KEY = "YOUR_API_KEY"
BASE_URL = "https://api.evolink.ai/v1"
HEADERS = {
"Authorization": f"Bearer {API_KEY}",
"Content-Type": "application/json"
}
def wait_for_video(task_id, interval=5, max_wait=300):
url = f"{BASE_URL}/tasks/{task_id}"
elapsed = 0
while elapsed < max_wait:
resp = requests.get(url, headers=HEADERS)
data = resp.json()
status = data["status"]
if status == "completed":
print(f"Video ready: {data['output']['video_url']}")
return data
elif status == "failed":
print(f"Failed: {data.get('error', 'Unknown error')}")
return data
print(f"Status: {status} ({elapsed}s)")
time.sleep(interval)
elapsed += interval
return None
# --- Product Video: Luxury Watch ---
payload = {
"model": "seedance-2.0",
"prompt": (
"@Image1 is a luxury wristwatch. "
"The watch rotates slowly on a dark marble surface. "
"Dramatic side lighting highlights the metal bracelet and crystal face. "
"Light reflections move across the polished surfaces as the watch turns. "
"Subtle lens flare. Extreme close-up with shallow depth of field. "
"Premium product advertisement aesthetic."
),
"image_urls": [
"https://example.com/watch-product.jpg"
],
"duration": 8,
"quality": "1080p",
"aspect_ratio": "16:9",
"generate_audio": False
}
resp = requests.post(
f"{BASE_URL}/videos/generations",
headers=HEADERS,
json=payload
)
result = resp.json()
print(f"Task ID: {result['task_id']}")
video_data = wait_for_video(result["task_id"])
デモ:腕時計の商品動画
使用したプロンプト: "@Image1 is a luxury wristwatch. The watch rotates slowly under dramatic studio lighting on a dark reflective surface. Light catches the polished metal case and sapphire crystal. Slow cinematic rotation. Premium advertisement quality."
1枚の商品写真から、API はスタジオ品質の照明による回転商品ショーケースを生成します。文字盤の目盛り、ブレスレットのリンク、ケースの形状など、腕時計のデザインディテールはすべてリファレンス画像から取得されています。
マルチカラー商品バリエーション
多くの商品には複数のカラーバリエーションがあります。各バリエーションを個別に撮影する代わりに、@tag システムを使ってすべてのバリエーションを1本の動画でショーケースできます:
# --- Multi-Color Product: Headphones ---
payload = {
"model": "seedance-2.0",
"prompt": (
"@Image1 shows premium over-ear headphones in four different colors "
"arranged on a clean surface. The camera slowly pans across all four "
"variants. Each headphone catches the studio light differently. "
"Smooth dolly movement from left to right. "
"Clean white background with subtle shadows. "
"Product catalog video style."
),
"image_urls": [
"https://example.com/headphones-all-colors.jpg"
],
"duration": 10,
"quality": "1080p",
"aspect_ratio": "16:9"
}
resp = requests.post(
f"{BASE_URL}/videos/generations",
headers=HEADERS,
json=payload
)
result = resp.json()
print(f"Task ID: {result['task_id']}")
video_data = wait_for_video(result["task_id"])
デモ:ヘッドホンのカラーバリエーション
使用したプロンプト: "@Image1 shows over-ear headphones in four color variants. The camera pans smoothly across each variant under clean studio lighting. Soft reflections on the ear cups. Minimal white background. Product showcase cinematography."
1枚の商品ラインナップ写真が、スムーズなパンニングショーケース動画になります。各カラーバリエーションに出番があり、スタジオ照明の美的表現はプロの商品動画撮影に匹敵します。
商品カタログのバッチ生成
数十から数百の商品がある場合、生成ロジックをバッチプロセッサでラップします:
import csv
import time
import requests
API_KEY = "YOUR_API_KEY"
BASE_URL = "https://api.evolink.ai/v1"
HEADERS = {
"Authorization": f"Bearer {API_KEY}",
"Content-Type": "application/json"
}
def generate_product_video(product_name, image_url, style="premium"):
"""Generate a product video from a single product image."""
style_prompts = {
"premium": (
f"@Image1 is a {product_name}. "
"The product rotates slowly under dramatic studio lighting "
"on a dark reflective surface. Cinematic close-up. "
"Light reveals surface details and textures. "
"Premium advertisement quality."
),
"lifestyle": (
f"@Image1 is a {product_name}. "
"The product is shown in a lifestyle setting — "
"a modern living space with natural light. "
"Camera slowly pushes in to reveal product details. "
"Warm, inviting atmosphere."
),
"minimal": (
f"@Image1 is a {product_name}. "
"Clean white background. The product rotates 360 degrees. "
"Even, shadowless lighting. E-commerce product spin."
),
}
payload = {
"model": "seedance-2.0",
"prompt": style_prompts[style],
"image_urls": [image_url],
"duration": 8,
"quality": "1080p",
"aspect_ratio": "1:1"
}
resp = requests.post(
f"{BASE_URL}/videos/generations",
headers=HEADERS,
json=payload
)
data = resp.json()
return data["task_id"]
# Example: process a CSV product catalog
# CSV format: product_name, image_url, style
products = [
("Wireless Earbuds", "https://example.com/earbuds.jpg", "premium"),
("Leather Wallet", "https://example.com/wallet.jpg", "lifestyle"),
("Running Shoes", "https://example.com/shoes.jpg", "minimal"),
]
tasks = []
for name, url, style in products:
task_id = generate_product_video(name, url, style)
tasks.append((name, task_id))
print(f"Submitted: {name} → {task_id}")
time.sleep(1) # Rate limiting courtesy
print(f"\nSubmitted {len(tasks)} product videos")
print("Poll each task_id to retrieve the completed video URLs")
このバッチパターンはあらゆるカタログサイズに対応できます。ポーリングの代わりにコールバック URL(callback_url パラメータ)を使って拡張することもできます。大量バッチの場合はこちらの方が効率的です。各動画が完了すると、API がエンドポイントに POST を送信します。
商品動画のプロンプトテンプレート
一般的な EC 動画ニーズに対応する、実証済みのプロンプトテンプレートを紹介します:
PRODUCT_TEMPLATES = {
"rotation_360": (
"@Image1 is the product. "
"Full 360-degree rotation on a clean background. "
"Consistent studio lighting throughout the rotation. "
"Smooth, steady turntable motion. "
"Product catalog photography style."
),
"unboxing_reveal": (
"@Image1 is the product. "
"The product emerges from soft tissue paper inside a premium box. "
"Hands carefully lift it into view. "
"Camera slowly pushes in as the product is revealed. "
"Luxury unboxing experience. Warm lighting."
),
"hero_shot": (
"@Image1 is the product. "
"Dramatic hero shot. The product rises into frame against a dark background. "
"Volumetric light beams hit the product from the side. "
"Slow motion. Particles float in the light. "
"Epic product launch trailer aesthetic."
),
"in_use": (
"@Image1 is the product. "
"Someone picks up the product and uses it naturally. "
"Lifestyle setting with soft natural window light. "
"Medium close-up. The camera follows the interaction. "
"Authentic, relatable product usage."
),
}
よくある間違いとその修正方法
数百回の API コールを経て、何がうまくいき何が失敗するかの明確なパターンが見えてきます。最も一般的な間違いとその修正方法を紹介します。
間違い 1:リアルな人間の顔写真を使用する
何が起こるか: API が 400 エラーまたは failed タスクステータスを返します。
理由: Seedance 2.0 はフォトリアリスティックな人間の顔画像からの画像から動画生成をブロックします。これはバグではなく、安全ポリシーです。
修正方法: 代わりにイラスト、様式化された、またはカートゥーンスタイルのキャラクター画像を使用してください。アニメキャラクター、油絵のポートレート、3D レンダリングされたキャラクター、シルエットはすべて完璧に動作します。ワークフローで人間のキャラクターが必要な場合は、まずフォトリアリスティックでないスタイルのテキストから画像モデルを使って生成してください。
# Will be rejected
"image_urls": ["https://example.com/real-person-photo.jpg"]
# Works fine
"image_urls": ["https://example.com/illustrated-character.png"]
"image_urls": ["https://example.com/3d-rendered-character.jpg"]
"image_urls": ["https://example.com/anime-character.png"]
間違い 2:外見のみを記述する静的なプロンプト
何が起こるか: 生成された動画にほとんどまたはまったく動きがありません。被写体が静止したまま、またはわずかなカメラドリフトのみが発生します。
理由: モデルはプロンプトを文字通りに受け取ります。静的なシーンを記述すると(「a cat on a windowsill」)、ほぼ静止した動画が得られます。
修正方法: 常に動作動詞、連続的なアクション、環境のダイナミクスを含めてください。
# Static: produces near-still video
"prompt": "A beautiful sunset over the ocean with golden light"
# Dynamic: produces engaging video
"prompt": (
"Waves crash against rocky coastline during golden sunset. "
"Water sprays upward, catching the warm light. "
"Camera slowly descends from sky level to water level. "
"Seabirds glide across the frame. "
"Light shifts from golden to deep amber."
)
間違い 3:コンテンツに対して間違った尺
何が起こるか: シンプルなアクションが引き伸ばされて不自然に感じられるか、複雑なシーケンスが急ぎ足で途切れ途切れに感じられます。
理由: 尺はプロンプトの複雑さに合わせる必要があります。シンプルな商品回転に15秒は必要ありません。マルチアクションのキャラクターシーケンスは4秒では機能しません。
修正方法: 尺をプロンプトの複雑さに合わせます:
| プロンプトの複雑さ | 記述されたアクション | 推奨尺 |
|---|---|---|
| シンプル(1つの動き) | 1つのアクション | 4〜6秒 |
| 中程度(2〜3のアクション) | 2〜3の連続アクション | 6〜10秒 |
| 複雑(ナラティブ) | 4つ以上のアクション、シーン転換 | 10〜15秒 |
間違い 4:画像 URL の問題
何が起こるか: API が無効な画像に関するエラーを返すか、処理中にタスクが失敗します。
理由: いくつかの一般的な URL の問題があります:
- URL に認証が必要(公開アクセスできない)
- URL が画像ファイルではなくウェブページを指している
- 画像フォーマットがサポートされていない(WebP は時々失敗する)
- 画像が大きすぎる(超高解像度ファイルはタイムアウトする可能性がある)
- URL が期限切れ(時間制限付きのプリサインド URL)
修正方法: 画像 URL が以下の条件を満たしていることを確認してください:
- 公開アクセス可能 — ダウンロードに認証ヘッダーが不要
- 直接の画像リンク —
.jpg、.pngなどで終わる(HTML ページではない) - 標準フォーマット — JPEG と PNG が最も安全
- 適切なサイズ — 画像あたり 10MB 未満
- 永続的 — 処理中に期限切れにならない
# Problem URLs
"https://drive.google.com/file/d/abc123/view" # Requires auth
"https://example.com/product-page" # HTML page, not image
"https://storage.com/image.jpg?token=abc&exp=1h" # Might expire
# Good URLs
"https://cdn.example.com/images/product.jpg" # Direct CDN link
"https://i.imgur.com/abc123.png" # Public image host
間違い 5:複数画像で @Tags を使用しない
何が起こるか: @Image タグを使わずに3枚以上の画像を渡すと、モデルがどの画像がどの目的に使われるかを推測します。結果は予測不能です。背景画像がキャラクターとして使われたり、スタイルリファレンスがシーン要素として扱われたりすることがあります。
修正方法: 複数の画像を渡す場合は、常に @Image タグを使用してください。各画像の役割を明示的に指定しましょう。
# Ambiguous: model guesses roles
"prompt": "A character walks through a forest in watercolor style"
"image_urls": [character.jpg, forest.jpg, watercolor_ref.jpg]
# Explicit: model knows each role
"prompt": (
"@Image1 is the character. @Image2 is the forest environment. "
"@Image3 defines the watercolor art style. "
"The character (@Image1) walks through the forest (@Image2) "
"rendered in the watercolor style of @Image3."
)
"image_urls": [character.jpg, forest.jpg, watercolor_ref.jpg]
間違い 6:動画 URL の期限切れを忘れる
何が起こるか: 動画を生成し、URL を保存し、翌日アクセスしようとすると 403 または 404 が返ります。
理由: 生成された動画 URL は24時間後に期限切れになります。
修正方法: 生成完了後すぐに動画ファイルをダウンロードしてください。ポーリング関数にダウンロードステップを追加します:
import os
def download_video(video_url, output_path):
"""Download a video before the URL expires."""
resp = requests.get(video_url, stream=True)
resp.raise_for_status()
with open(output_path, "wb") as f:
for chunk in resp.iter_content(chunk_size=8192):
f.write(chunk)
print(f"Saved to {output_path}")
# After generation completes:
video_url = video_data["output"]["video_url"]
download_video(video_url, "output/my-product-video.mp4")
間違い 7:プロンプトと画像コンテンツの矛盾
何が起こるか��� 出力動画が混乱した見た目になります。画像の要素とプロンプトの要素が支配権を争い、視覚的なアーティファクトや一貫性のないシーンが生じます。
理由: リファレンス画像と直接矛盾する内容をプロンプトに記述しています。例えば、画像が赤い車を示しているのに、プロンプトで「a blue sports car races down the highway」と書いた場合です。
修正方法: プロンプトは画像を補完すべきであり、矛盾させるべきではありません。リファレンス画像ですでに定義されている要素の外見ではなく、アクション、カメラの動き、環境の変化を記述してください。
# Contradicts image (image shows red car)
"prompt": "A blue sports car races down the highway at sunset"
# Complements image (lets the image define appearance)
"prompt": (
"@Image1 is the car. The car accelerates down an open highway. "
"Camera tracks alongside at speed. Sunset light reflects off the hood. "
"Road stretches to the horizon. Motion blur on the asphalt."
)
API パラメータリファレンス
画像から動画生成に関連するすべてのパラメータを1つのリファレンステーブルにまとめました:
| パラメータ | 型 | 必須 | デフォルト | 説明 |
|---|---|---|---|---|
model | string | はい | — | "seedance-2.0" を指定する必要があります |
prompt | string | はい | — | オプションの @Image タグを含むモーション記述 |
image_urls | array | はい (i2v の場合) | [] | 1〜9個の公開アクセス可能な画像 URL |
duration | integer | いいえ | 5 | 動画の長さ(秒)(4〜15) |
quality | string | いいえ | "720p" | 出力解像度:"480p"、"720p"、"1080p" |
aspect_ratio | string | いいえ | "16:9" | 出力比率:"16:9"、"9:16"、"1:1"、"4:3"、"3:4" |
generate_audio | boolean | いいえ | false | 同期された音声トラックを生成 |
video_urls | array | いいえ | [] | 0〜3個の動画リファレンス URL(ミックスメディア用) |
audio_urls | array | いいえ | [] | 0〜3個の音声リファレンス URL(ミックスメディア用) |
callback_url | string | いいえ | — | 完了通知用の Webhook URL |
制限: リクエストあたり最大9枚の画像 + 3本の動画 + 3つの音声ファイル。すべてのメディアタイプの合計は12を超えることができません。タグは配列の位置で割り当てられます:image_urls[0] → @Image1、video_urls[0] → @Video1、audio_urls[0] → @Audio1。
FAQ
Seedance 2.0 の画像から動画 API では、どの画像フォーマットでも使用できますか?
JPEG と PNG は完全にサポートされており、推奨されています。GIF(最初のフレームのみ)、BMP、TIFF は一般的に動作しますが、テストが少ないです。WebP のサポートは一貫していないため���信頼性の高い結果を得るには JPEG または PNG に変換してください。すべての画像は、認証なしで公開 URL 経由でアクセスできる必要があります。
画像から動画の生成にはどのくらい時間がかかりますか?
一般的な生成時間は、尺、品質設定、現在のサーバー負荷に応じて60〜180秒です。480p の4秒クリップは、1080p の15秒クリップよりも速く生成されます。ポーリングエンドポイント(GET /v1/tasks/{task_id})を使用するか、callback_url を設定して処理完了時に通知を受け取ることができます。
1回のリクエストで使用できる画像の最大数は?
image_urls に最大9枚の画像を含めることができます。すべてのメディアタイプ(画像 + 動画 + 音声)の合計ファイル数はリクエストあたり12に制限されています。つまり、9枚の画像を使用している場合でも、動画や音声のリファレンスを最大3つ追加できます。
画像から動画と音声生成を組み合わせることはできますか?
はい。リクエストペイロードで image_urls とともに generate_audio: true を設定してください。モデルはビジュアルコンテンツに一致する同期された音声を生成します。歩行シーンには足音、自然シーンには環境音、商品回転には機械音などです。audio_urls を通じて独自の音声を提供し、プロンプトで @Audio1 として参照することもできます。
本番環境で動画 URL の期限切れをどう処理すればよいですか?
生成された動画 URL は24時間後に期限切れになります。本番システムでは、パイプラインに即時ダウンロードステップを実装してください。タスクステータスが completed に変わったら、URL をアプリケーションに返す前に、動画ファイルを自分のストレージ(S3、GCS、またはローカルディスク)にダウンロードしてください。API が生成した URL を永続的な参照として保存しないでください。callback_url を使用している場合は、Webhook ハンドラーの処理ロジックにダウンロードステップを含めてください。
Seedance 2.0 の画像から動画をアニメーションロゴやブランドイントロに使用できますか?
はい。これは最も強力なユースケースの1つです。ロゴやブランドマークを @Image1 としてアップロードし、希望するアニメーションスタイルをプロンプトで指定します。パーティクルアセンブリ、リキッドリビール、3D 回転などです。ロゴはグラフィック要素(フォトリアリスティックな顔ではない)であるため、画像から動画パイプラインで完璧に動作します。generate_audio: true を設定して、リビールに同期されたサウンドエフェクトを追加できます。
画像から動画のリクエストが拒否されたのはなぜですか?
最も一般的な拒否理由は、入力画像にフォトリアリスティックな人間の顔が含まれていることです。Seedance 2.0 は安全上の理由から、リアルな顔画像を自動的に検出してブロックします。その他の拒否原因としては、アクセスできない画像 URL、サポートされていないファイルフォーマット、9枚の画像制限の超過、またはメディアファイルの合計数が12を超えていることが挙げられます。具体的な詳細については、failed タスクレスポンスのエラーメッセージを確認してください。
画像のアニメーション化を始めましょう
ここまでで、Seedance 2.0 API を通じて静止画を動画に変換する3つの異なる方法を習得しました:素早いキャラクターやシーンモーションのための単一画像アニメーション、正確な開始から終了へのトランジションのための最初と最後のフレーム制御、そして複雑で役割を割り当てたシーンのための @tags を使ったマルチ画像合成です。
このガイド全体を通じたコード例は完全に実行可能です。いずれかをコピーし、API キーを挿入し、ご自身の画像を指定するだけで、数分以内に生成された動画が得られます。
プロダクトチームにとっては、バッチ生成ワークフローがスタジオなしで商品カタログ全体を動画アセットに変換します。クリエイティブチームにとっては、キャラクター一貫性パターンが1枚のキャラクターリファレンスからマルチショットストーリーテリングを可能にします。開発者にとっては、@tag システムが他の AI 動画 API では現在提供されていないレベルの構成的制御を提供します。
画像のアニメーション化を始めましょう。EvoLink に無料登録 →
このガイドは Seedance 2.0 チュートリアルシリーズの一部です。関連記事:Seedance 2.0 プロンプトガイド、スタートガイド、マルチモーダル @Tags ガイド、カメラムーブメントガイド。