次の方法で共有


クイック スタート: ソラを使用してビデオを生成する (プレビュー)

このクイック スタートでは、Azure OpenAI サービスを使用してビデオ クリップを生成します。 この例では、テキスト命令から現実的で想像力豊かなビデオ シーンを作成するビデオ生成モデルであるソラ モデルを使用しています。 このガイドでは、ビデオ生成ジョブを作成し、その状態をポーリングし、生成されたビデオを取得する方法について説明します。

ビデオ生成の詳細については、「 ビデオ生成の概念」を参照してください。

[前提条件]

Microsoft Entra ID の前提条件

Microsoft Entra ID で推奨されるキーレス認証の場合、次のことを行う必要があります。

  • Microsoft Entra ID でのキーレス認証に使われる Azure CLI をインストールします。
  • ユーザー アカウントに Cognitive Services User ロールを割り当てます。 Azure portal の [アクセス制御 (IAM)]>[ロールの割り当ての追加] で、ロールを割り当てることができます。

セットアップ

  1. video-generation-quickstart新しいフォルダーを作成し、次のコマンドを使用してクイック スタート フォルダーに移動します。

    mkdir video-generation-quickstart && cd video-generation-quickstart
    
  2. 仮想環境を作成します。 Python 3.10 以降が既にインストールされている場合は、次のコマンドを使用して仮想環境を作成できます:

    py -3 -m venv .venv
    .venv\scripts\activate
    

    Python 環境をアクティブ化するということは、コマンド ラインから python または pip を実行する際に、アプリケーションの .venv フォルダーに含まれている Python インタープリターを使用するということを意味します。 deactivate コマンドを使用して Python 仮想環境を終了し、必要に応じて、それを後で再アクティブ化できます。

    ヒント

    新しい Python 環境を作成してアクティブにし、このチュートリアルに必要なパッケージのインストールに使うことをお勧めします。 グローバルな Python インストールにパッケージをインストールしないでください。 Python パッケージをインストールするときは、常に仮想または Conda 環境を使う必要があります。そうしないと、Python のグローバル インストールが損なわれる可能性があります。

  3. Microsoft Entra ID で推奨されるキーレス認証の場合、次を使って azure-identity パッケージをインストールします。

    pip install azure-identity
    

リソース情報の取得

Azure OpenAI リソースでアプリケーションを認証するには、次の情報を取得する必要があります。

変数名 価値
AZURE_OPENAI_ENDPOINT この値は、Azure portal からリソースを調べる際の キーとエンドポイント セクションにあります。
AZURE_OPENAI_DEPLOYMENT_NAME この値は、モデルのデプロイ時にデプロイに対して選択したカスタム名に対応します。 この値は、Azure portal の [リソース管理]>[モデル デプロイ] にあります。
OPENAI_API_VERSION API バージョンの詳細を参照してください。

コードでバージョンを変更することも、環境変数を使用することもできます。

キーレス認証環境変数の設定の詳細を参照してください。

ソラでビデオを生成する

動画生成ジョブを作成してその状態を確認し、生成された動画を取得することで、Soraモデルを使用して動画を生成できます。 次のコードは、Python を使用して REST API を使用してこれを行う方法を示しています。

  1. 次のコードを使用して sora-quickstart.py ファイルを作成します。

    import requests
    import base64 
    import os
    from azure.identity import DefaultAzureCredential
    
    # Set environment variables or edit the corresponding values here.
    endpoint = os.environ['AZURE_OPENAI_ENDPOINT']
    
    # Keyless authentication
    credential = DefaultAzureCredential()
    token = credential.get_token("https://cognitiveservices.azure.com/.default")
    
    api_version = 'preview'
    headers= { "Authorization": f"Bearer {token.token}", "Content-Type": "application/json" }
    
    # 1. Create a video generation job
    create_url = f"{endpoint}/openai/v1/video/generations/jobs?api-version={api_version}"
    body = {
        "prompt": "A cat playing piano in a jazz bar.",
        "width": 480,
        "height": 480,
        "n_seconds": 5,
        "model": "sora"
    }
    response = requests.post(create_url, headers=headers, json=body)
    response.raise_for_status()
    print("Full response JSON:", response.json())
    job_id = response.json()["id"]
    print(f"Job created: {job_id}")
    
    # 2. Poll for job status
    status_url = f"{endpoint}/openai/v1/video/generations/jobs/{job_id}?api-version={api_version}"
    status=None
    while status not in ("succeeded", "failed", "cancelled"):
        time.sleep(5)  # Wait before polling again
        status_response = requests.get(status_url, headers=headers).json()
        status = status_response.get("status")
        print(f"Job status: {status}")
    
    # 3. Retrieve generated video 
    if status == "succeeded":
        generations = status_response.get("generations", [])
        if generations:
            print(f"✅ Video generation succeeded.")
            generation_id = generations[0].get("id")
            video_url = f"{endpoint}/openai/v1/video/generations/{generation_id}/content/video?api-version={api_version}"
            video_response = requests.get(video_url, headers=headers)
            if video_response.ok:
                output_filename = "output.mp4"
                with open(output_filename, "wb") as file:
                    file.write(video_response.content)
                    print(f'Generated video saved as "{output_filename}"')
        else:
            raise Exception("No generations found in job result.")
    else:
        raise Exception(f"Job didn't succeed. Status: {status}")
    
  2. Python ファイルを実行します。

    python sora-quickstart.py
    

応答が返されるまで少し時間がかかります。

アウトプット

出力には、ジョブ ID と状態を含む、ビデオ生成ジョブ作成要求からの完全な応答 JSON が表示されます。

```json
{
    "object": "video.generation.job",
    "id": "task_01jwcet0eje35tc5jy54yjax5q",
    "status": "queued",
    "created_at": 1748469875,
    "finished_at": null,
    "expires_at": null,
    "generations": [],
    "prompt": "A cat playing piano in a jazz bar.",
    "model": "sora",
    "n_variants": 1,
    "n_seconds": 5,
    "height": 480,
    "width": 480,
    "failure_reason": null
}

生成されたビデオは、現在のディレクトリに output.mp4 として保存されます。

Job created: task_01jwcet0eje35tc5jy54yjax5q
Job status: preprocessing
Job status: running
Job status: processing
Job status: succeeded
✅ Video generation succeeded.
Generated video saved as "output.mp4"

リソースをクリーンアップする

Azure OpenAI リソースをクリーンアップして削除したい場合は、リソースを削除できます。 リソースを削除する前に、まずデプロイされたモデルを削除する必要があります。