🪪

Sora2 でAPIを使うまでの、必要な設定とエラー解決方法

に公開

全体の流れ

APIキー設定だけではなく、事前に色々な設定が必要でした。まとめると、この順番です。

  1. OpenAI PlatformでAPIキーを作成する。
  2. 5ドル課金してTier 1にする。
  3. Organization Verification(本人確認)をする。
  4. プログラムからAPIを叩く。

※クレジットカード、スマホ、身分証明書が必要です。
※「Tier 1」「Organization Verification」は独自用語です、各章で解説します。
※Sora2のAPIは0.1ドル/秒かかります。

1. OpenAI PlatformでAPIキーを作成する。

このページからAPIキーを作成できます。
APIキーは1回しか表示されないので注意しましょう。
https://platform.openai.com/api-keys

そして、私は動画生成プログラムを実行したのですが、色々エラーが出ました。2と3で解説します。

2. 5ドル課金してTier 1にする。

私の場合はまず、下記のようなエラーが出ました。

openai.BadRequestError: Error code: 400 - {'error': {'message': 'Billing hard limit has been reached.', 'type': 'billing_limit_user_error', 'param': None, 'code': 'billing_hard_limit_reached'}}

この原因は、OpenAI APIの課金額の扱いで「Free Tier」(未課金)だったことでした。Sora2のAPIは、課金している「Tier 1」以上のユーザのみに提供されているようです。

下記ページの「Edit Budget」から5ドル課金すれば、「Free Tier」から「Tier 1」へ格上げされます。

https://platform.openai.com/settings/organization/limits

3. Organization Verification(本人確認)をする。

次に、下記のようなエラーが出ました。

openai.PermissionDeniedError: Error code: 403 - {'error': {'message': 'Your organization must be verified to use the model `sora-2`. Please go to: https://platform.openai.com/settings/organization/general and click on Verify Organization. If you just verified, it can take up to 15 minutes for access to propagate.', 'type': 'invalid_request_error', 'param': None, 'code': None}}

この原因は、OpenAI Platform上で本人確認が未完了だったためでした。

下記のページから本人確認できます。
スマホと身分証明書を準備して、「Verify Organization」のボタンから画面遷移し、指示に従って身分証明書と顔を撮影しましょう。(本人確認の別ページがスマホで開きます)
https://platform.openai.com/settings/organization/general

うまくいくと、下記画像のようにステータスが変化します。

4. プログラムからAPIを叩く。

下記のPythonプログラムをローカルに保存し、APIキーを指定して実行してみましょう。
OpenAIのSora2のAPIを叩き、生成中はログを出し、生成が終わったらローカルに保存するという挙動をします。

うまくいけば動画が、プログラムと同じディレクトリ配下に出てくれます。
(ダメだったらChatGPTにエラーログを入れて聞いてみましょう。)

SoraGenerateVideo.py
import time
from openai import OpenAI

API_KEY = "sk-XXXXXXXXXXXXXXXXX" # ✅ 自身のAPIキーを指定
PROMPT = "夜にアメ車をドライブするファンキーな猫の動画" # ✅ プロンプトを設定
OUTPUT_FILE = "sora_output.mp4"

client = OpenAI(api_key=API_KEY)

# 1️⃣ 生成
print(f"🎬 動画生成開始: {PROMPT}")
video = client.videos.create(
    model="sora-2",
    prompt=PROMPT,
    size="1280x720",  # ✅ 横向き16:9を指定
    seconds="4"        # ✅ 数字ではなく文字列で指定(例: "4" / "8" / "12")
)
video_id = video.id
print("🆔 Video ID:", video_id)

# 2️⃣ ステータス監視
while True:
    result = client.videos.retrieve(video_id)
    print("📡 状態:", result.status)
    if result.status == "completed":
        print("✅ 動画生成が完了しました!")
        break
    elif result.status == "failed":
        print("❌ 生成に失敗:", result.error)
        exit(1)
    time.sleep(10)

# 3️⃣ ダウンロード(新仕様)
print("💾 ダウンロード中...")
video_data = client.videos.download_content(video_id)

with open(OUTPUT_FILE, "wb") as f:
    f.write(video_data.read())

print(f"🎉 保存完了: {OUTPUT_FILE}")

うまくいくと、このような正常に生成開始したログが出て、今いるディレクトリに動画ファイルが生成・保存されます。

🎬 動画生成開始: 夜にアメ車をドライブするファンキーな猫の動画
🆔 Video ID: video_XXXXXXXXXXXXXXXXXXX
📡 状態: in_progress
📡 状態: queued
📡 状態: queued
📡 状態: in_progress
📡 状態: in_progress
📡 状態: in_progress
📡 状態: completed
✅ 動画生成が完了しました!
💾 ダウンロード中...
🎉 保存完了: sora_output.mp4

生成結果

ウォーターマークなしで綺麗に出てくれていますね。ファンキーな猫です。
https://www.youtube.com/watch?v=YltHchZCpR0

皆さんも良きSora2 APIライフを!

Accenture Japan (有志)

Discussion