你当前正在访问 Microsoft Azure Global Edition 技术文档网站。 如果需要访问由世纪互联运营的 Microsoft Azure 中国技术文档网站,请访问 https://docs.azure.cn

快速入门:使用 Sora 生成视频(预览版)

在本快速入门中,你将使用 Azure OpenAI 服务生成视频剪辑。 该示例使用 Sora 模型,该模型是一个视频生成模型,它基于文本说明创建真实和富有想象力的视频场景。 本指南介绍如何创建视频生成作业、轮询其状态以及检索生成的视频。

有关视频生成的详细信息,请参阅 视频生成概念

先决条件

Microsoft Entra ID 先决条件

若要使用 Microsoft Entra ID 进行推荐的无密钥身份验证,你需要:

  • 安装使用 Microsoft Entra ID 进行无密钥身份验证所需的 Azure CLI
  • Cognitive Services User角色分配给用户帐户。 你可以在 Azure 门户的“访问控制(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 环境意味着当通过命令行运行 pythonpip 时,你将使用应用程序的 .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 门户检查资源时,可在“密钥和终结点”部分中找到此值。
AZURE_OPENAI_DEPLOYMENT_NAME 此值将对应于在部署模型时为部署选择的自定义名称。 Azure 门户中的“资源管理”“模型部署”下提供了此值。>
OPENAI_API_VERSION 详细了解 API 版本

可以在代码中更改版本或使用环境变量。

详细了解无密钥身份验证,以及如何设置环境变量

使用 Sora 生成视频

可以使用 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
    

片刻之后即可获得响应。

输出

输出将显示视频生成作业创建请求的完整响应 JSON,包括作业 ID 和状态。

```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 资源,可以删除该资源。 在删除资源之前,必须先删除所有已部署的模型。