Sora 2 Character API 核心要点
| 要点 | 説明 | 価値 |
|---|---|---|
| キャラクター抽出 | 動画からキャラクターの特徴を抽出 | 再利用可能なキャラクターアセットを作成 |
| キャラクターID | 一意のキャラクター識別子を取得 | 複数の動画で同じキャラクターを呼び出し |
| timestamps パラメータ | キャラクターが登場する時間範囲を指定 | ターゲットキャラクターを正確に特定 |
| 2つの作成方法 | 動画URLまたはタスクID | 様々なシーンに柔軟に対応 |
Sora 2 Character API とは?
Sora 2 Character API は OpenAI Sora 2 のキャラクター管理機能インターフェースで、開発者は以下のことができます:
- 動画からキャラクターを抽出: 動画内の特定の時間帯に登場するキャラクターを指定し、その特徴を抽出
- キャラクターIDを取得: システムが一意のキャラクター識別子(character_id)を返却
- 動画間での再利用: 後続の動画生成で @character_id を使ってそのキャラクターを呼び出し
- 一貫性の維持: 同じキャラクターが異なるシーン、異なる動画で外見を一貫して保持
シリーズ動画、ブランドIPアニメーション、連続ストーリーコンテンツを制作する必要があるクリエイターにとって、これは革命的な機能です。

方法1: 動画URLからキャラクターを抽出
この方法は、既存の動画ファイルがある場合に使用します。動画のURLと、キャラクターが登場する時間範囲を指定するだけです。
基本的な実装コード
import requests
import json
# APIYIのベースURL(実際のAPIキーに置き換えてください)
base_url = "https://api.apiyii.com"
api_key = "your_apiyii_api_key"
# Character API のエンドポイント
url = f"{base_url}/sora/v1/characters"
# リクエストヘッダー
headers = {
"Authorization": f"Bearer {api_key}",
"Content-Type": "application/json"
}
# リクエストボディ:動画URLからキャラクターを作成
payload = {
"model": "sora-2-character",
"prompt": "プロフェッショナルなビジネススーツを着た黒髪の若い女性", # オプション:キャラクターの説明
"input": {
"url": "https://your-video-cdn.com/video.mp4", # 動画のURL
"timestamps": "5,8" # 5秒~8秒の時間範囲
}
}
# APIリクエストを送信
response = requests.post(url, headers=headers, json=payload)
# 結果を解析
if response.status_code == 200:
result = response.json()
character_id = result.get("id")
print(f"キャラクターID作成成功: {character_id}")
print(f"完全なレスポンス: {json.dumps(result, indent=2, ensure_ascii=False)}")
else:
print(f"エラー: {response.status_code}")
print(response.text)
パラメータ詳細解説
| パラメータ | 必須/オプション | 説明 | 例 |
|---|---|---|---|
model |
必須 | 使用するモデル、固定値 | "sora-2-character" |
prompt |
オプション | キャラクターの説明、より正確な抽出に役立つ | "黒髪の若い女性" |
input.url |
必須(方法1) | 動画ファイルのURL、HTTPSアクセス可能である必要がある | "https://cdn.com/video.mp4" |
input.timestamps |
必須 | キャラクターが登場する時間範囲、カンマ区切り | "5,8" (5秒~8秒) |
timestamps パラメータの使い方
timestamps は最も重要なパラメータで、どの時間範囲からキャラクターを抽出するかを決定します:
- 形式:
"開始秒,終了秒"(文字列型、秒単位) - 推奨範囲: 3~5秒、十分なキャラクター特徴が含まれることを確保
- 選択のコツ:
- キャラクターが正面を向いている時間帯を選ぶ
- キャラクターが最も鮮明な画面を選ぶ
- 照明条件が良い時間帯を選ぶ
- 他のキャラクターによる遮蔽を避ける
# 良い例:
"timestamps": "5,8" # 5秒~8秒、3秒間
"timestamps": "10,15" # 10秒~15秒、5秒間
# 避けるべき:
"timestamps": "5,6" # 時間が短すぎる、特徴が不十分
"timestamps": "5,30" # 時間が長すぎる、キャラクターの外観が変化する可能性
方法2: タスクIDからキャラクターを再利用
この方法は、Sora 2で動画を生成したばかりで、その動画からキャラクターを抽出したい場合に適しています。動画URLをアップロードする必要がなく、直接タスクIDを使用できます。
実装コード
import requests
import json
base_url = "https://api.apiyii.com"
api_key = "your_apiyii_api_key"
url = f"{base_url}/sora/v1/characters"
headers = {
"Authorization": f"Bearer {api_key}",
"Content-Type": "application/json"
}
# リクエストボディ:タスクIDからキャラクターを作成
payload = {
"model": "sora-2-character",
"prompt": "プロフェッショナルなビジネススーツを着た黒髪の若い女性",
"input": {
"from_task": "video_f751ab2c789d4e8fa1b5c6d3e2f4a9b8", # Sora 2の動画タスクID
"timestamps": "5,8"
}
}
response = requests.post(url, headers=headers, json=payload)
if response.status_code == 200:
result = response.json()
character_id = result.get("id")
print(f"キャラクターID作成成功: {character_id}")
else:
print(f"エラー: {response.status_code}")
print(response.text)
タスクIDの取得方法
タスクIDは、Sora 2で動画を生成した際のレスポンスから取得できます:
# Sora 2で動画を生成
generate_response = requests.post(
f"{base_url}/sora/v1/generations",
headers=headers,
json={
"model": "sora-2",
"prompt": "ビジネススーツを着た女性が街を歩く",
"size": "1920x1080"
}
)
if generate_response.status_code == 200:
task_data = generate_response.json()
task_id = task_data.get("id") # これがタスクID
print(f"動画タスクID: {task_id}")
# このタスクIDを使ってキャラクターを作成
# ...
方法1と方法2の比較
| 比較項目 | 方法1(動画URL) | 方法2(タスクID) |
|---|---|---|
| 適用シーン | 既存の動画ファイルがある | 動画を生成したばかり |
| 必要な準備 | 動画をCDNにアップロード | なし、タスクIDを直接使用 |
| 処理速度 | やや遅い(動画のダウンロードが必要) | やや速い |
| コスト | CDNストレージコストが必要 | 追加コストなし |
| 推奨度 | 既存素材の処理に適している | 新規生成のワークフローに適している |
完全なワークフロー:キャラクターIDの作成から使用まで
ここでは、**方法2(タスクID)**を例に、完全なワークフローを示します:
ステップ1: 動画を生成してタスクIDを取得
import requests
import time
base_url = "https://api.apiyii.com"
api_key = "your_apiyii_api_key"
# 動画を生成
generate_response = requests.post(
f"{base_url}/sora/v1/generations",
headers={
"Authorization": f"Bearer {api_key}",
"Content-Type": "application/json"
},
json={
"model": "sora-2",
"prompt": "プロフェッショナルなビジネススーツを着た黒髪の若い女性が、現代的なオフィス街を自信を持って歩く。彼女は書類を手に持ち、カメラを見て微笑む。",
"size": "1920x1080",
"duration": 10
}
)
if generate_response.status_code == 200:
task_data = generate_response.json()
task_id = task_data.get("id")
print(f"動画タスクID: {task_id}")
# 動画生成の完了を待つ
while True:
status_response = requests.get(
f"{base_url}/sora/v1/generations/{task_id}",
headers={"Authorization": f"Bearer {api_key}"}
)
status = status_response.json().get("status")
if status == "succeeded":
print("動画生成完了!")
break
elif status == "failed":
print("動画生成失敗")
exit()
print(f"生成中...ステータス: {status}")
time.sleep(5)
ステップ2: タスクIDを使ってキャラクターIDを作成
# キャラクターIDを作成
character_response = requests.post(
f"{base_url}/sora/v1/characters",
headers={
"Authorization": f"Bearer {api_key}",
"Content-Type": "application/json"
},
json={
"model": "sora-2-character",
"prompt": "プロフェッショナルなビジネススーツを着た黒髪の若い女性",
"input": {
"from_task": task_id, # ステップ1で取得したタスクID
"timestamps": "3,7" # 3秒~7秒の時間範囲
}
}
)
if character_response.status_code == 200:
character_data = character_response.json()
character_id = character_data.get("id")
print(f"キャラクターID作成成功: {character_id}")
print(f"キャラクターID: @{character_id}")
else:
print(f"キャラクター作成失敗: {character_response.text}")
ステップ3: キャラクターIDを使って新しい動画を生成
# キャラクターIDを使って新しいシーンの動画を生成
new_video_response = requests.post(
f"{base_url}/sora/v1/generations",
headers={
"Authorization": f"Bearer {api_key}",
"Content-Type": "application/json"
},
json={
"model": "sora-2",
"prompt": f"@{character_id} コーヒーショップに座り、笑顔でラップトップを操作している。窓際の席で、柔らかな自然光が差し込んでいる。",
"size": "1920x1080",
"duration": 10
}
)
if new_video_response.status_code == 200:
new_task_data = new_video_response.json()
new_task_id = new_task_data.get("id")
print(f"新しい動画タスクID: {new_task_id}")
print("同じキャラクターが新しいシーンに登場します!")
よくある質問と解決策
1. timestamps の設定方法は?
質問: キャラクターが動画全体に登場する場合、timestampsをどう設定すればよいですか?
回答:
- 最も鮮明な3~5秒を選択することをお勧めします
- キャラクターが正面を向いていて、顔の特徴が最も鮮明な部分を選択
- 照明条件が良く、遮蔽物がない時間帯を選択
# 良い例:キャラクターが鮮明な時間帯を選択
"timestamps": "3,7" # 3秒~7秒、4秒間
# 避けるべき:全体の時間範囲を選択
"timestamps": "0,30" # 時間が長すぎる、キャラクターの姿勢や角度が大きく変化する可能性
2. 複数のキャラクターがいる場合はどうするか?
質問: 動画に複数のキャラクターがいる場合、どのように特定のキャラクターを抽出しますか?
回答:
- prompt パラメータを詳しく記述して、ターゲットキャラクターを説明
- ターゲットキャラクターのみが登場する時間帯を選択
# 複数のキャラクターのシーン
payload = {
"model": "sora-2-character",
"prompt": "黒髪の若い女性、ビジネススーツを着ている、画面左側に立っている", # 詳細な説明
"input": {
"from_task": task_id,
"timestamps": "5,8" # この時間帯は彼女だけが登場
}
}
3. キャラクターIDの有効期限は?
質問: 作成したキャラクターIDはいつまで使用できますか?
回答:
- キャラクターIDは永続的に保存されます
- いつでも
@character_idで呼び出し可能 - ただし、OpenAIがポリシーを変更したり、キャラクターがポリシーに違反している場合は削除される可能性があります
4. キャラクターの外観を修正できるか?
質問: 抽出したキャラクターの髪の色や服装を変更した
Sora 2 Character API 2つの作成方法
方法1:動画URLから文字を抽出
これは最も直接的な方法で、既存の動画素材がある場合に適しています。
リクエストパラメータ説明:
| パラメータ | 型 | 必須 | 説明 |
|---|---|---|---|
model |
string | ✅ | 固定値 sora-2-character |
url |
string | ✅ | 公開アクセス可能な動画のURL |
timestamps |
string | ✅ | キャラクターが登場する時間範囲、フォーマット "開始秒,終了秒" |
完全なリクエスト例:
curl https://api.apiyi.com/sora/v1/characters \
-H "Content-Type: application/json" \
-H "Authorization: Bearer sk-your-api-key" \
-d '{
"model": "sora-2-character",
"url": "https://your-cdn.com/video/character-source.mp4",
"timestamps": "5,8"
}'
⚠️ 重要な注意事項:
- 動画URLは公開アクセス可能である必要があります: OpenAIサーバーがその動画を読み取れる必要があります
- CDNはグローバル設定に: OSS/CDNを使用する場合は、グローバルアクセラレーションを設定し、OpenAIサーバー(通常は海外)がアクセスできないという問題を回避してください
- timestampsの時間範囲:
- 最小差分:1秒
- 最大差分:3秒
- 例:
"5,8"は動画の5秒から8秒を表します
方法2:タスクIDでキャラクターを再利用
以前にSora 2 APIで動画を生成したことがある場合は、その動画のタスクIDを直接使用してキャラクターを抽出でき、動画を再度アップロードする必要はありません。
リクエストパラメータ説明:
| パラメータ | 型 | 必須 | 説明 |
|---|---|---|---|
model |
string | ✅ | 固定値 sora-2-character |
from_task |
string | ✅ | 以前に生成した動画のタスクID |
timestamps |
string | ✅ | キャラクターが登場する時間範囲 |
完全なリクエスト例:
curl https://api.apiyi.com/sora/v1/characters \
-H "Content-Type: application/json" \
-H "Authorization: Bearer sk-your-api-key" \
-d '{
"model": "sora-2-character",
"from_task": "video_f751abfd-87a9-46e2-9236-1d94743c5e3e",
"timestamps": "5,8"
}'
この方法の利点:
- ✅ 追加の動画アップロードが不要で、帯域幅を節約
- ✅ 既に生成された動画アセットを直接再利用
- ✅ ワークフローがよりスムーズで、バッチ処理に適している
- ✅ 動画URLの期限切れやアクセスの問題を回避
おすすめ: APIYI apiyi.com 経由でSora 2 Character APIを呼び出すことで、プラットフォームが安定した接続サービスと無料テストクレジットを提供しています。
Sora 2 Character API 2つの方法の比較

| 比較項目 | 動画URL方式 | タスクID方式 |
|---|---|---|
| 適用シーン | 既存の動画素材がある | Sora生成動画を再利用 |
| パラメータ | url |
from_task |
| アップロード要否 | 公開アクセス可能な動画URLが必要 | 不要、タスクIDを直接参照 |
| ネットワーク要件 | CDNはグローバルアクセス必須 | 追加要件なし |
| ワークフロー | 独立した素材処理 | 動画生成フローと連携 |
| 推奨シーン | 外部動画キャラクターのインポート | シリーズ動画のバッチ生成 |
どちらを選ぶべきか?
動画URL方式を選ぶ場合:
- 既存の動画素材がある(実写動画や他のプラットフォームからダウンロードした動画など)
- Sora以外で生成された動画からキャラクターを抽出する必要がある
タスクID方式を選ぶ場合:
- Sora 2 APIを使用してバッチで動画を生成している
- 既に生成した動画からキャラクターを抽出し、後続のシリーズ動画に使用したい
- よりスムーズな自動化ワークフローを求めている
Sora 2 Character API timestamps パラメータ詳細解説
timestamps は Character API の最も重要なパラメータで、動画のどの時間帯からキャラクターを抽出するかを決定します。
timestamps フォーマット規則
| 規則 | 説明 | 例 |
|---|---|---|
| フォーマット | "開始秒,終了秒" |
"5,8" |
| 型 | string(文字列) | 引用符で囲む必要があります |
| 最小差分 | 1秒 | "3,4" ✅ |
| 最大差分 | 3秒 | "5,8" ✅ |
| 制限超過 | エラーが発生します | "1,10" ❌ |
timestamps 設定のコツ
- キャラクターがはっきり見える部分を選ぶ: キャラクターが画面内に完全に表示され、遮られていない部分を選びましょう
- 素早い動きの部分は避ける: キャラクターが比較的静止しているか、ゆっくり動いている時間帯を選びましょう
- 十分な照明を確保: 明るい部分を選ぶことで、より正確なキャラクター特徴を抽出できます
- 正面向きを優先: 可能であれば、キャラクターがカメラに向いている部分を選びましょう
シナリオ例:
10秒の動画で、キャラクターが2〜4秒で正面を向いており、6〜9秒で横向きに動いている場合:
// 推奨:正面がはっきり見える部分を選択
{
"timestamps": "2,4"
}
// 非推奨:キャラクターが横向きで動いている
{
"timestamps": "6,9"
}
Sora 2 Character API 完全ワークフロー
Python コード例
import requests
import time
# APIYI インターフェース設定
API_BASE = "https://api.apiyi.com/sora/v1"
API_KEY = "sk-your-api-key"
headers = {
"Content-Type": "application/json",
"Authorization": f"Bearer {API_KEY}"
}
def create_character_from_url(video_url: str, timestamps: str) -> dict:
"""方法1:動画URLからキャラクターを作成"""
response = requests.post(
f"{API_BASE}/characters",
headers=headers,
json={
"model": "sora-2-character",
"url": video_url,
"timestamps": timestamps
}
)
return response.json()
def create_character_from_task(task_id: str, timestamps: str) -> dict:
"""方法2:タスクIDからキャラクターを作成"""
response = requests.post(
f"{API_BASE}/characters",
headers=headers,
json={
"model": "sora-2-character",
"from_task": task_id,
"timestamps": timestamps
}
)
return response.json()
# 使用例
# 方法1:動画URLから作成
result1 = create_character_from_url(
video_url="https://your-cdn.com/video/hero.mp4",
timestamps="5,8"
)
print(f"キャラクター作成タスク: {result1}")
# 方法2:タスクIDから作成
result2 = create_character_from_task(
task_id="video_f751abfd-87a9-46e2-9236-1d94743c5e3e",
timestamps="2,4"
)
print(f"キャラクター作成タスク: {result2}")
完全なキャラクター作成・使用フローコードを見る
import requests
import time
API_BASE = "https://api.apiyi.com/sora/v1"
API_KEY = "sk-your-api-key"
headers = {
"Content-Type": "application/json",
"Authorization": f"Bearer {API_KEY}"
}
def create_character(video_url: str, timestamps: str) -> str:
"""キャラクターを作成してキャラクターIDを返す"""
# 1. キャラクター作成リクエストを送信
response = requests.post(
f"{API_BASE}/characters",
headers=headers,
json={
"model": "sora-2-character",
"url": video_url,
"timestamps": timestamps
}
)
task_data = response.json()
task_id = task_data.get("task_id")
# 2. タスク完了をポーリング
while True:
status_response = requests.get(
f"{API_BASE}/characters/{task_id}",
headers=headers
)
status_data = status_response.json()
if status_data.get("status") == "completed":
return status_data.get("character_id")
elif status_data.get("status") == "failed":
raise Exception(f"キャラクター作成失敗: {status_data}")
time.sleep(5) # 5秒ごとに確認
def generate_video_with_character(prompt: str, character_id: str) -> str:
"""キャラクターを使って動画を生成"""
# promptで@character_idを使ってキャラクターを参照
full_prompt = f"@{character_id} {prompt}"
response = requests.post(
f"{API_BASE}/videos",
headers=headers,
json={
"model": "sora-2",
"prompt": full_prompt,
"duration": 8,
"resolution": "1080p"
}
)
return response.json()
# 完全なフロー例
if __name__ == "__main__":
# ステップ1:キャラクターを作成
character_id = create_character(
video_url="https://your-cdn.com/video/hero.mp4",
timestamps="5,8"
)
print(f"キャラクター作成成功、ID: {character_id}")
# ステップ2:キャラクターを使ってシリーズ動画を生成
scenes = [
"walking through a futuristic city at night",
"sitting in a coffee shop, reading a book",
"running on a beach at sunset"
]
for i, scene in enumerate(scenes):
result = generate_video_with_character(scene, character_id)
print(f"動画{i+1}生成タスク: {result}")
ヒント: APIYI apiyi.com を通じて Sora 2 Character API にアクセスすると、完全なキャラクター管理機能と技術サポートが提供されます。
よくある質問
Q1: 動画URLにアクセスできない場合はどうすればいいですか?
動画URLが以下の条件を満たしていることを確認してください:
- パブリックアクセス可能: イントラネットアドレスやログインが必要なリンクは使用できません
- CDNグローバル高速化: Alibaba Cloud OSS、AWS S3などを使用する場合は、グローバル高速化またはグローバルCDNを有効にする必要があります
- URLの有効期限: 一時的な署名URLの場合、有効期限が十分に長いことを確認してください
- 対応フォーマット: MP4形式の使用を推奨します
Q2: timestampsパラメータのエラーはどう対処すればいいですか?
よくあるエラーと解決策:
- 時間範囲が3秒を超える: 範囲を1〜3秒以内に縮小します。例:
"5,8"→"5,7" - 時間範囲が1秒未満: 開始と終了が最低1秒の差があることを確認してください
- フォーマットエラー: 文字列形式
"5,8"である必要があり、配列や数値は使用できません - 動画の長さを超過: 時間範囲が動画の総再生時間内にあることを確認してください
Q3: 作成したキャラクターを動画生成でどのように使用しますか?
キャラクターの作成が完了すると、character_idが取得できます。その後の動画生成リクエストでは、プロンプト内で@character_idの形式でそのキャラクターを参照します。例:
@char_abc123xyz が未来都市を歩いている、ネオンが点滅している
システムは自動的にそのキャラクターの特徴を生成される動画に適用し、キャラクターの外観の一貫性を保ちます。
まとめ
Sora 2 Character APIの重要ポイント:
- 2つの作成方法: 動画URL抽出とタスクID再利用、様々なシーンに柔軟に対応
- timestampsパラメータ: 時間範囲は1〜3秒、キャラクターがはっきり見える部分を選択
- キャラクターの再利用: 一度作成すれば、複数の動画で使用可能、キャラクターの一貫性を維持
- CDN設定: 動画URL方式を使用する場合は、グローバルアクセスを確保
Character APIをマスターすれば、以下のことが可能になります:
- ブランドIPのために再利用可能なバーチャルキャラクターを作成
- キャラクターが一貫したシリーズ動画コンテンツを制作
- プロフェッショナルレベルの連続性のあるナラティブ動画を実現
Sora 2 Character APIの導入には、APIYI apiyi.comの利用をお勧めします。安定したサービスと無料テスト枠を提供しており、キャラクター作成機能を素早く使いこなすことができます。
📚 参考資料
⚠️ リンク形式について: すべての外部リンクは
資料名: domain.comの形式で表記しています。コピーは簡単ですがクリックでの遷移はできません。SEO評価の流出を防ぐための措置です。
-
OpenAI Sora 2 公式リリース: Sora 2の機能と特性紹介
- リンク:
openai.com/index/sora-2/ - 説明: Sora 2の公式情報とキャラクター機能について
- リンク:
-
OpenAI ヘルプセンター – Characters機能: キャラクター作成・使用ガイド
- リンク:
help.openai.com/en/articles/12435986-generating-content-with-characters - 説明: 公式のキャラクター機能利用マニュアル
- リンク:
-
OpenAI API ドキュメント – Video Generation: Sora API 技術仕様書
- リンク:
platform.openai.com/docs/guides/video-generation - 説明: APIインターフェースの仕様とパラメータ解説
- リンク:
-
OpenAI Sora Characters ページ: キャラクター機能プロダクト紹介
- リンク:
openai.com/sora/characters/ - 説明: キャラクター機能の製品コンセプトと活用シーン
- リンク:
著者: 技術チーム
技術交流: コメント欄でのディスカッションを歓迎します。詳しい資料は APIYI apiyi.com 技術コミュニティでご覧いただけます
