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

使用 Sora 生成视频(预览版)

注释

本文档引用 Microsoft Foundry (经典) 门户。

🔄 如果你使用的是新门户,请切换到 Microsoft Foundry(新)文档

注释

本文档指的是 Microsoft Foundry(新) 门户网站。

Sora 是 OpenAI 的 AI 模型,它基于文本说明和/或输入图像或视频创建真实和富有想象力的视频场景。 模型可以生成广泛的视频内容,包括逼真的场景、动画和特殊效果。 它支持多个视频分辨率和持续时间。

Azure OpenAI 支持两个版本的 Sora:

  • Sora (或 Sora 1):早期预览版中作为 API 发布的 Azure OpenAI 特定实现。
  • Sora 2:最新的基于 OpenAI 的 API,现在可用于 Azure OpenAI v1 API

Capabilities

  • 形式:文本→视频、图像→视频、视频(生成)→视频

  • 音频:Sora 2 支持输出视频中的音频生成(类似于 Sora 应用)。

  • Remix:Sora 2 引入了通过进行有针对性的调整而不是从头重新生成来混合现有视频的功能。

  • 负责任的 AI 和视频生成:Azure OpenAI 的视频生成模型包括内置的负责任的 AI (RAI) 保护,以帮助确保安全且合规的使用。 Sora 2 会阻止所有 IP 和逼真的内容。 此外,Azure 还提供所有映像生成模型的输入和输出审查,以及特定于 Azure 的安全措施,例如内容筛选和滥用监视。 这些系统有助于检测和防止生成或滥用有害、不安全或违反策略的内容。

    客户可以详细了解这些安全措施以及如何在 内容筛选 页面上对其进行自定义。

负责任的 AI 和视频生成

Azure OpenAI 的映像生成模型包括内置的负责任的 AI (RAI) 保护,以帮助确保安全且合规的使用。

此外,Azure 还提供所有映像生成模型的输入和输出审查,以及特定于 Azure 的安全措施,例如内容筛选和滥用监视。 这些系统有助于检测和防止生成或滥用有害、不安全或违反策略的内容。

目前,Sora 2 API 强制实施多个内容限制:

  • 仅适合 18 岁以下受众的内容(将来将提供绕过此限制的设置)。
  • 版权字符和版权音乐将被拒绝。
  • 无法生成真实的人,包括公众人物。
  • 目前拒绝具有人脸的输入图像。 使用此 表单申请权限。

确保提示、引用图像和文字记录遵循这些规则,以避免生成失败。

注释

我们允许按案例为托管客户上传人脸。 请参阅 Azure OpenAI 模型中对 Sora Human Uploads 的请求访问权限

索拉 1 vs. 索拉 2

方面 Sora 1 (Azure OpenAI) Sora 2 (基于 OpenAI 的 API)
模型类型 特定于 Azure 的 API 实现 使用 v1 API 调整 OpenAI 的最新 Sora API
可用性 仅在 Azure OpenAI 上提供(预览版) 在 Azure 上推出; Sora 2 Pro 稍后推出
支持的形式 文本→视频、图像→视频、视频→视频 文本→视频、图像→视频、 视频(已生成)→视频
音频生成 ❌ 不支持 ✅ 在输出中受支持
Remix 功能 ❌ 不支持 ✅ 支持 - 对现有视频进行有针对性的编辑
API 行为 使用特定于 Azure 的 API 架构 与 OpenAI 的原生 Sora 2 模式保持一致
性能与保真度 早期预览;有限的真实感和动作范围 增强现实主义、物理和时态一致性
预期用途 企业预览版部署 通过改进的 API 一致性提高开发人员的可用性
账单 根据持续时间和解决方案收取不同的费用 每秒计费信息

Sora 2 API

提供 5 个终结点,每个终结点具有不同的功能。

  • 创建视频:根据提示启动一个新的渲染任务,可选择添加参考输入或使用合成 ID。
  • 获取视频状态:检索呈现作业的当前状态并监视其进度
  • 下载视频:完成作业后提取已完成的 MP4。
  • 列出视频:使用分页方式枚举视频,以便用于历史记录、仪表板或日常维护。
  • 删除视频:从 Azure OpenAI 的存储中删除单个视频 ID

API 参数

参数 类型 索拉 2
提示 字符串(必需) 镜头的自然语言描述。 包括镜头类型、主题、动作、设置、照明和任何所需的相机运动,以减少歧义。 保持 单一用途 ,以获得最佳遵守。
型号 字符串 (可选) Sora-2(默认值)
大小(宽度×高度的输出分辨率) 字符串 (可选) 肖像:720×1280
景观: 1280×720
默认值: 720×1280
字符串 (可选) 4 / 8 / 12
默认值: 4
输入参考 文件(可选) 用作第一帧的视觉定位点的单个引用图像。
接受的 MIME 类型: image/jpegimage/pngimage/webp。 大小必须完全匹配。
Remix_video_id 字符串 (可选) 先前完成的视频的 ID(例如 video_...),用于重复使用结构、动作和取景。 与索拉 2 相同

Sora 2 API 使用 v1 API ,其结构与 OpenAI API 相同。

videos.create()

需要使用 pip install openai --upgrade 更新到最新版本的 OpenAI 客户端,以防止出现 AttributeError: 'OpenAI' object has no attribute 'videos'

from openai import OpenAI
from azure.identity import DefaultAzureCredential, get_bearer_token_provider

token_provider = get_bearer_token_provider(
    DefaultAzureCredential(), "https://cognitiveservices.azure.com/.default"
)

client = OpenAI(  
  base_url = "https://YOUR-RESOURCE-NAME.openai.azure.com/openai/v1/",  
  api_key=token_provider,
)

video = client.videos.create(
    model="sora-2", # Replace with Sora 2 model deployment name
    prompt="A video of a cool cat on a motorcycle in the night",
)

print("Video generation started:", video)

创建视频和轮询作业状态

使用创建调用返回的 ID 调用 GET /videos/{video_id}。 响应显示作业的当前状态、进度百分比和任何错误。

预期状态为queuedin_progresscompletedfailed

同步:

如果在 Jupyter Notebook 中进行测试,请使用此版本以避免 RuntimeError: asyncio.run() cannot be called from a running event loop

import time
from openai import OpenAI
from azure.identity import DefaultAzureCredential, get_bearer_token_provider

token_provider = get_bearer_token_provider(
    DefaultAzureCredential(), "https://cognitiveservices.azure.com/.default"
)

client = OpenAI(  
    base_url = "https://YOUR-RESOURCE-NAME.openai.azure.com/openai/v1/",  
    api_key=token_provider,
)

# Create the video (don't use create_and_poll)
video = client.videos.create(
    model="sora-2", # Replace with Sora 2 model deployment name
    prompt="A video of a cat on a motorcycle",
)

print(f"Video creation started. ID: {video.id}")
print(f"Initial status: {video.status}")

# Poll every 20 seconds
while video.status not in ["completed", "failed", "cancelled"]:
    print(f"Status: {video.status}. Waiting 20 seconds...")
    time.sleep(20)
    
    # Retrieve the latest status
    video = client.videos.retrieve(video.id)

# Final status
if video.status == "completed":
    print("Video successfully completed!")
    print(video)
else:
    print(f"Video creation ended with status: {video.status}")
    print(video)

异步:

import asyncio
from openai import AsyncOpenAI
from azure.identity import DefaultAzureCredential, get_bearer_token_provider

token_provider = get_bearer_token_provider(
    DefaultAzureCredential(), "https://cognitiveservices.azure.com/.default"
)

client = AsyncOpenAI(  
  base_url = "https://YOUR-RESOURCE-NAME.openai.azure.com/openai/v1/",  
  api_key=token_provider,
)

async def main() -> None:
    video = await client.videos.create_and_poll(
        model="sora-2", # Replace with Sora 2 model deployment name
        prompt="A video of a cat on a motorcycle",
    )

    if video.status == "completed":
        print("Video successfully completed: ", video)
    else:
        print("Video creation failed. Status: ", video.status)


asyncio.run(main())

下载视频

from openai import OpenAI
from azure.identity import DefaultAzureCredential, get_bearer_token_provider

token_provider = get_bearer_token_provider(
    DefaultAzureCredential(), "https://cognitiveservices.azure.com/.default"
)

client = OpenAI(  
  base_url = "https://YOUR-RESOURCE-NAME.openai.azure.com/openai/v1/",  
  api_key=token_provider,
)

video_id = "your_video_id_here"

content = client.videos.download_content(video_id, variant="video")
content.write_to_file("video.mp4")

print("Saved video.mp4")

来自参考源的视频生成

input_reference 参数允许你使用 Sora 2 转换现有图像。 源图像和最终视频的分辨率必须匹配。 支持的值为 720x12801280x720

本地引用文件:

from openai import OpenAI
from azure.identity import DefaultAzureCredential, get_bearer_token_provider

token_provider = get_bearer_token_provider(
    DefaultAzureCredential(), "https://cognitiveservices.azure.com/.default"
)

client = OpenAI(  
  base_url = "https://YOUR-RESOURCE-NAME.openai.azure.com/openai/v1/",  
  api_key=token_provider,
)

# With local file
video = client.videos.create(
    model="sora-2",
    prompt="Describe your desired output within the context of the reference image/video",
    size="1280x720",
    seconds=8,
    input_reference=open("test.png", "rb"), # This assumes the image test.png is in the same directory as the executing code
)

print("Video generation started:", video)

基于 URL 的参考文件:

from openai import OpenAI
from azure.identity import DefaultAzureCredential, get_bearer_token_provider
import requests
from io import BytesIO

token_provider = get_bearer_token_provider(
    DefaultAzureCredential(), "https://cognitiveservices.azure.com/.default"
)

client = OpenAI(  
  base_url = "https://YOUR-RESOURCE-NAME.openai.azure.com/openai/v1/",  
  api_key=token_provider,
)

# With image URL
image_url = "https://path-to-your-file/image_file_name.jpg"
response = requests.get(image_url)
image_data = BytesIO(response.content)
image_data.name = "image_file_name.jpg"

video = client.videos.create(
    model="sora-2",
    prompt="Describe your desired output within the context of the reference image/video",
    size="1280x720",
    seconds=8,
    input_reference=image_data,
)

print("Video generation started:", video)

重新混合视频

利用重新混合功能,可以修改现有视频的特定方面,同时保留其核心元素。 通过参考之前一个成功完成生成的视频id,并提供更新的提示词,系统在实现您请求的更改的同时保持原始视频的框架、场景转换和视觉布局。 为了获得最佳结果,请将修改限制为一个清晰明确的调整- 窄而精确的编辑将保留对源材料更高的保真度,并最大程度地降低生成视觉缺陷的可能性。

from openai import OpenAI
from azure.identity import DefaultAzureCredential, get_bearer_token_provider

token_provider = get_bearer_token_provider(
    DefaultAzureCredential(), "https://cognitiveservices.azure.com/.default"
)

client = OpenAI(  
  base_url = "https://YOUR-RESOURCE-NAME.openai.azure.com/openai/v1/",  
  api_key=token_provider,
)

video = client.videos.remix(
    video_id="<previous_video_id>",
    prompt="Shift the color palette to teal, sand, and rust, with a warm backlight."
)

print("Video generation started:", video)

工作原理

视频生成是一个异步过程。 使用文本提示和视频格式规范创建作业请求,模型在后台处理请求。 可以检查视频生成作业的状态,完成后,通过下载 URL 检索生成的视频。

提示的最佳做法

以英语或其他拉丁语脚本语言编写文本提示,以获得最佳视频生成性能。

局限性

内容质量限制

Sora 在理解复杂的物理学、因果关系(例如饼干上的咬痕)、空间推理(例如区分左右)以及精确的基于时间的事件顺序(例如相机移动)方面可能会遇到困难。

Sora 2 技术限制

  • 请参阅上面的 Sora 2 API 详细信息
  • 作业在创建后最多 24 小时可用。 之后,必须创建新作业才能再次生成视频。
  • 可以同时运行两个视频创建作业。 必须先等待其中一个作业完成,然后才能创建另一个作业。

Sora 1 技术限制

  • Sora 支持以下输出分辨率尺寸:480x480、480x854、854x480、720x720、720x1280、1280x720、1080x1080、1080x1920、1920x1080。
  • Sora 可以制作长达 1 到 20 秒的视频。
  • 可以在单个作业中请求多个视频变体:对于 1080p 分辨率,此功能处于禁用状态;对于 720p,最大值为两个变体;对于其他分辨率,最大值为四个变体。
  • 可以同时运行两个视频创建作业。 必须先等待其中一个作业完成,然后才能创建另一个作业。
  • 作业在创建后最多 24 小时可用。 之后,必须创建新作业才能再次生成视频。
  • 最多可以使用两个图像作为输入(生成的视频将内容插在它们之间)。
  • 最多可以使用一个视频 5 秒作为输入。