Создание видео с Sora 2 (предварительная версия)

Sora 2 — это модель искусственного интеллекта из OpenAI, которая создает реалистичные и образные видео сцены из текстовых инструкций и (или) входных изображений или видео. Модель может создавать широкий спектр видеоконтентов, включая реалистичные сцены, анимации и специальные эффекты. Она поддерживает несколько разрешений видео и длительности.

Возможности

  • Модальности: текстовое → видео, изображение → видео, видео (создано) → видео

  • Звук: Sora 2 поддерживает создание звука в выходных видео (аналогично приложению Sora).

  • Ремикс: Sora 2 представляет возможность ремикс существующих видео, делая целевые корректировки вместо повторного создания с нуля.

  • Ответствующее создание ИИ и видео: модели создания видео в OpenAI Azure включают встроенные средства защиты ответственного ИИ (RAI), чтобы обеспечить безопасное и соответствующее использование. Sora 2 блокирует все IP-адреса и фотореалистическое содержимое.

    Кроме того, Azure обеспечивает модерацию входных и выходных данных во всех моделях создания изображений, а также меры защиты Azure, такие как фильтрация содержимого и мониторинг злоупотреблений. Эти системы помогают обнаруживать и предотвращать создание или неправильное использование вредного, небезопасного или нарушающего политику содержимого.

    Клиенты могут узнать больше об этих мерах защиты и о том, как настроить их на странице фильтрации содержимого .

Сведения о модели

Sora 2 использует API Azure OpenAI v1, которое соответствует собственной схеме Sora 2, разработанной OpenAI.

Аспект Сора 2
Тип модели Адаптация последнего API Sora 2 OpenAI с помощью API версии 1
Поддерживаемые модалы текст → видео, изображение → видео, видео (сгенерировано) → видео
Создание звука ✅ Поддерживается в выходных данных
Возможность Remix ✅ Поддерживается— создание целевых изменений для существующих видео
Производительность и точность Улучшенная реалистичность, физика и темпоральная согласованность
Биллинг Сведения о выставлении счетов в секунду

Краткое руководство

Создайте видеоролики с помощью службы OpenAI Azure. Создание видео — это асинхронный процесс. Вы создаете запрос задания с помощью спецификаций текстового запроса и формата видео, а модель обрабатывает запрос в фоновом режиме. Вы проверяете состояние задания создания видео и после завершения извлекаете созданное видео с помощью URL-адреса скачивания. В примере используется модель Sora 2.

Необходимые условия

предварительные требования Microsoft Entra ID

Для рекомендуемой проверки подлинности без ключа с помощью Microsoft Entra ID необходимо:

  • Установите Azure CLI, который используется для безключевой аутентификации в Microsoft Entra ID.
  • Назначьте Cognitive Services User роль вашей учетной записи пользователя. Роли можно назначить на портале Azure в разделе Access control (IAM)>Add role assignment.

Установка

  1. Создайте новую папку video-generation-quickstart и перейдите в папку быстрого запуска с помощью следующей команды:

    mkdir video-generation-quickstart && cd video-generation-quickstart
    
  2. Создание виртуальной среды. Если у вас уже установлена Python 3.10 или более поздней версии, можно создать виртуальную среду с помощью следующих команд:

    Windows

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

    Linux

    python3 -m venv .venv
    source .venv/bin/activate
    

    Macos

    python3 -m venv .venv
    source .venv/bin/activate
    

    Активация среды Python означает, что при запуске python или pip из командной строки используется интерпретатор Python, содержащийся в папке .venv приложения. Вы можете использовать deactivate команду для выхода из виртуальной среды Python, а затем повторно активировать ее при необходимости.

    Совет

    Рекомендуется создать и активировать новую среду Python для установки пакетов, необходимых для работы с этим руководством. Не устанавливайте пакеты в глобальную установку Python. При установке пакетов python всегда следует использовать виртуальную среду или среду conda, в противном случае можно нарушить глобальную установку Python.

  3. Установите необходимые пакеты.

    Microsoft Entra ID

    pip install requests azure-identity
    

    Пакет azure-identity обеспечивает DefaultAzureCredential безопасную аутентификацию без использования ключей.

    Ключ API

    pip install requests
    

    Библиотека запросов обрабатывает HTTP-вызовы к REST API.

Получение сведений о ресурсе

Чтобы проверить подлинность приложения с помощью ресурса OpenAI Azure, необходимо получить следующие сведения:

Имя переменной Значение
AZURE_OPENAI_ENDPOINT Это значение можно найти в разделе Keys и Endpoint при изучении ресурса на портале Azure.
AZURE_OPENAI_DEPLOYMENT_NAME Это значение будет соответствовать пользовательскому названию, которое вы выбрали при развертывании модели. Это значение можно найти в разделе Resource Management>Model Deployments на портале Azure.

Дополнительные сведения о бессерверной проверке подлинности и настройке переменных среды.

Создание видео с помощью Sora 2

Вы можете создать видео с помощью модели Sora 2, создав задачу по генерации видео, проверяя его статус и получая созданное видео. В следующем коде показано, как это сделать с помощью REST API с помощью Python.

Выбор типа входных данных

Sora 2 поддерживает три режима ввода:

Тип входных данных Лучше всего для Пример варианта использования
Только текстовый запрос Создание совершенно новых сцен из описаний "Кот играет на фортепиано в джазовом баре"
Изображение и текстовый запрос Анимация статического изображения или его использование в качестве исходного кадра Оживить фотографию продукта
Видео + текстовый запрос Расширение или изменение существующих видеоматериалов Добавление визуальных эффектов в существующие клипы

Настройка проверки подлинности

  1. sora-quickstart.py Создайте файл и добавьте следующий код для проверки подлинности ресурса:

    Microsoft Entra ID

    import json
    import requests
    import time
    import os
    from azure.identity import DefaultAzureCredential
    
    # Set environment variables or edit the corresponding values here.
    endpoint = os.environ.get('AZURE_OPENAI_ENDPOINT')
    deployment_name = os.environ.get('AZURE_OPENAI_DEPLOYMENT_NAME')
    if not endpoint or not deployment_name:
        raise ValueError("Set AZURE_OPENAI_ENDPOINT and AZURE_OPENAI_DEPLOYMENT_NAME.")
    
    # Keyless authentication
    credential = DefaultAzureCredential()
    token = credential.get_token("https://ai.azure.com/.default")
    
    # Video generation uses 'preview' as the API version during the preview period
    api_version = 'preview'
    headers= { "Authorization": f"Bearer {token.token}", "Content-Type": "application/json" }
    

    Ключ API

    import json
    import requests
    import time
    import os
    
    # Set environment variables or edit the corresponding values here.
    endpoint = os.environ.get('AZURE_OPENAI_ENDPOINT')
    deployment_name = os.environ.get('AZURE_OPENAI_DEPLOYMENT_NAME')
    api_key = os.environ.get('AZURE_OPENAI_API_KEY')
    if not endpoint or not deployment_name or not api_key:
        raise ValueError(
            "Set AZURE_OPENAI_ENDPOINT, AZURE_OPENAI_DEPLOYMENT_NAME, and AZURE_OPENAI_API_KEY."
        )
    
    # Video generation uses 'preview' as the API version during the preview period
    api_version = 'preview'
    headers= { "api-key": api_key, "Content-Type": "application/json" }
    

Создание задания создания видео

  1. Добавьте код для создания и мониторинга задания создания видео. Выберите тип ввода, соответствующий вашему варианту использования.

    Текстовый запрос

    # 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": deployment_name
    }
    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}")
    

    Запрос изображения

    Замените поле "file_name" в "inpaint_items" именем вашего входного файла изображения. Кроме того, замените построение массива files , которое связывает путь к фактическому файлу с именем файла, который использует API.

    "crop_bounds" Используйте данные (расстояния обрезки изображения в каждом направлении, выраженные как доля от общих размеров изображения), чтобы указать, какая часть изображения должна использоваться в создании видео.

    При необходимости можно установить "frame_index" на кадр в созданном видео, где должно появляться изображение (значение по умолчанию — 0, начало видео).

    Параметр "n_variants" указывает, сколько различных вариантов видео для создания из одного запроса (от 1 до 4). Каждый вариант предоставляет уникальную интерпретацию входных данных.

    # 1. Create a video generation job with image inpainting (multipart upload)
    create_url = f"{endpoint}/openai/v1/video/generations/jobs?api-version={api_version}"
    
    # Flatten the body for multipart/form-data
    data = {
        "prompt": "A serene forest scene transitioning into autumn",
        "height": str(1080),
        "width": str(1920),
        "n_seconds": str(10),
        "n_variants": str(1),
        "model": deployment_name,
        # inpaint_items must be JSON string
        "inpaint_items": json.dumps([
            {
                "frame_index": 0,
                "type": "image",
                "file_name": "dog_swimming.jpg",
                "crop_bounds": {
                    "left_fraction": 0.1,
                    "top_fraction": 0.1,
                    "right_fraction": 0.9,
                    "bottom_fraction": 0.9
                }
            }
        ])
    }
    
    # Replace with your own image file path
    with open("dog_swimming.jpg", "rb") as image_file:
        files = [
            ("files", ("dog_swimming.jpg", image_file, "image/jpeg"))
        ]
        multipart_headers = {k: v for k, v in headers.items() if k.lower() != "content-type"}
        response = requests.post(
            create_url,
            headers=multipart_headers,
            data=data,
            files=files
        )
    
    if not response.ok:
        print("Error response:", response.status_code, response.text)
        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)
        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:
            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}")
    

    Запрос видео

    Замените поле "file_name" в "inpaint_items" на имя вашего входного видеофайла. Кроме того, замените построение массива files , которое связывает путь к фактическому файлу с именем файла, который использует API.

    Используйте данные "crop_bounds" (расстояния обрезки изображения, со всех сторон, как доля от общего размера кадра), чтобы определить, какая часть кадра видео должна использоваться при генерации видео.

    При необходимости можно задать "frame_index" кадр в сгенерированном видео, с которого должно начинаться ваше входное видео (по умолчанию это 0, то есть начало).

    # 1. Create a video generation job with video inpainting (multipart upload)
    create_url = f"{endpoint}/openai/v1/video/generations/jobs?api-version={api_version}"
    
    # Flatten the body for multipart/form-data
    data = {
        "prompt": "A serene forest scene transitioning into autumn",
        "height": str(1080),
        "width": str(1920),
        "n_seconds": str(10),
        "n_variants": str(1),
        "model": deployment_name,
        # inpaint_items must be JSON string
        "inpaint_items": json.dumps([
            {
                "frame_index": 0,
                "type": "video",
                "file_name": "dog_swimming.mp4",
                "crop_bounds": {
                    "left_fraction": 0.1,
                    "top_fraction": 0.1,
                    "right_fraction": 0.9,
                    "bottom_fraction": 0.9
                }
            }
        ])
    }
    
    # Replace with your own video file path
    with open("dog_swimming.mp4", "rb") as video_file:
        files = [
            ("files", ("dog_swimming.mp4", video_file, "video/mp4"))
        ]
        multipart_headers = {k: v for k, v in headers.items() if k.lower() != "content-type"}
        response = requests.post(
            create_url,
            headers=multipart_headers,
            data=data,
            files=files
        )
    
    if not response.ok:
        print("Error response:", response.status_code, response.text)
        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)
        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:
            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
    

    Создание видео обычно занимает 1–5 минут в зависимости от разрешения и длительности. Вы должны увидеть обновления статуса в вашем терминале, по мере того как задача продвигается через queued, preprocessing, running, processing и, наконец, succeeded.

Выход

Выходные данные будут отображать полный ответ 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": "<your-deployment-name>",
    "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"

Устранение неполадок

При возникновении проблем проверьте следующие распространенные проблемы и решения:

Ошибка Причина Решение
401 Unauthorized Недопустимые или истекшие учетные данные Для Microsoft Entra ID выполните команду az login чтобы обновить токен. Для ключа API убедитесь, что AZURE_OPENAI_API_KEY указан правильно.
403 Forbidden Отсутствующее назначение ролей Назначьте роль пользователя Cognitive Services учетной записи на портале Azure.
404 Not Found Неправильное имя конечной точки или развертывания Убедитесь, что AZURE_OPENAI_ENDPOINT включает ваше имя ресурса, а AZURE_OPENAI_DEPLOYMENT_NAME соответствует развертыванию Sora 2.
429 Too Many Requests Превышено ограничение скорости Подождите и повторите попытку или запросите увеличение квоты на портале Azure.
400 Bad Request с ошибкой размерности Неподдерживаемое разрешение Используйте поддерживаемое разрешение: 480×480, 720×720, 1080×1080, 1280×720 или 1920×1080.
Состояние задания failed Нарушение политики содержимого или внутренняя ошибка Проверьте failure_reason в ответе. Измените запрос, если он активировал фильтрацию содержимого.
Время ожидания во время опроса Длительное время генерации Видео может занять до 5 минут. Увеличьте время ожидания опроса или проверьте состояние задания вручную.

Совет

Чтобы выполнить отладку проблем с проверкой подлинности, сначала проверьте учетные данные с помощью простого вызова API:

# Test endpoint connectivity
test_url = f"{endpoint}/openai/deployments?api-version=2024-02-01"
response = requests.get(test_url, headers=headers)
print(response.status_code, response.text)

Необходимые условия

Перейдите на портал Microsoft Foundry

Перейдите на портал Foundry и войдите с учетными данными, связанными с ресурсом OpenAI Azure. Во время или после рабочего процесса входа выберите соответствующую директорию, подписку Azure и ресурс Azure OpenAI.

На целевой странице Foundry создайте или выберите новый проект. Перейдите на страницу "Модели + конечные точки" на левой панели навигации. Выберите "Развернуть модель " и выберите модель создания видео Sora 2 из списка. Завершите процесс развертывания.

На странице модели выберите "Открыть на детской площадке".

Попробуйте создание видео

Начните изучать создание видео Sora 2 с no-code-подходом через видеопесочницу. Введите запрос в текстовое поле и нажмите кнопку "Создать". Создание видео обычно занимает от 1 до 5 минут в зависимости от параметров. Когда видео, созданное СИ, будет готово, оно отображается на странице.

Примечание

API для создания содержимого сопровождаются фильтром модерации содержимого. Если Azure OpenAI распознает запрос как вредное содержимое, он не возвращает созданное видео. Дополнительные сведения см. в разделе "Фильтрация содержимого".

В песочнице Video вы также можете просмотреть примеры кода на Python и cURL, которые предварительно заполнены в соответствии с вашими настройками. Нажмите кнопку кода в верхней части области воспроизведения видео. Этот код можно использовать для записи приложения, которое завершает ту же задачу.

Очистка ресурсов

Если вы хотите очистить и удалить ресурс Azure OpenAI, можно удалить его. Перед удалением ресурса необходимо сначала удалить все развернутые модели.

Ответственное создание ИИ и видео

В моделях генерации изображений Azure OpenAI предусмотрены встроенные средства защиты ответственного использования искусственного интеллекта (RAI), чтобы обеспечить их безопасное и соответствующее применение.

Кроме того, Azure обеспечивает модерацию входных и выходных данных во всех моделях создания изображений, а также меры защиты Azure, такие как фильтрация содержимого и мониторинг злоупотреблений. Эти системы помогают обнаруживать и предотвращать создание или неправильное использование вредного, небезопасного или нарушающего политику содержимого.

В настоящее время API Sora 2 применяет несколько ограничений содержимого:

  • Только содержимое, подходящее для аудитории в возрасте до 18 лет (параметр обхода этого ограничения будет доступен в будущем).
  • Персонажи, на которые есть авторские права, и музыка, на которую есть авторские права, будут отклонены.
  • Реальные люди, в том числе общественные деятели, не могут быть созданы.
  • Входные изображения с лицами людей в настоящее время отклоняются.

Убедитесь, что запросы, эталонные изображения и расшифровки соблюдают эти правила, чтобы избежать неудачных поколений.

Справочник по API Sora 2

API Sora 2 предоставляет 5 конечных точек, каждая из которых имеет различные возможности.

  • Создание видео: запуск нового задания отрисовки из запроса с необязательными входными данными или идентификатором remix.
  • Получение состояния видео: получение текущего состояния задания отрисовки и мониторинг его хода выполнения
  • Скачайте видео: получите готовый MP4-файл после завершения задания.
  • Список видео: Перечислите свои видео с разбивкой на страницы для истории, панелей мониторинга или упорядочивания данных.
  • Delete Video: удаление отдельного идентификатора видео из хранилища OpenAI Azure

Параметры API

Параметр Тип Сора 2
Подсказка Строка (обязательно) Описание естественного языка выстрела. Включите тип снимка, тему, действие, настройку, освещение и любое требуемое движение камеры, чтобы уменьшить неоднозначность. Сохраняйте его с одной целью для лучшего соответствия.
Модель Строка (необязательно) Sora-2 (по умолчанию)
Размер (разрешение выходных данных в ширине × высоты) Строка (необязательно) Портрет: 720×1280
Пейзаж: 1280×720
По умолчанию: 720×1280
Секунд Строка (необязательно) 4 / 8 / 12
По умолчанию: 4
Справочник по входным данным Файл (необязательно) Один эталонный образ, используемый в качестве визуальной привязки для первого кадра.
Принятые типы MIME: image/jpeg, image/pngimage/webp. Должен точно соответствовать размеру.
Remix_video_id Строка (необязательно) Идентификатор ранее завершенного видео (например, video_...) для повторного использования структуры, движения и обрамления. То же, что и Сора 2

API Sora 2 использует API версии 1 и имеет ту же структуру, что и API OpenAI.

видео.create()

Чтобы предотвратить AttributeError: 'OpenAI' object has no attribute 'videos', необходимо обновить клиента OpenAI до последней версии с помощью pip install openai --upgrade.

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

token_provider = get_bearer_token_provider(
    DefaultAzureCredential(), "https://ai.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)

Создайте видео и проверьте статус задания

Вызов GET /videos/{video_id} с идентификатором, возвращенным из вызова создания. Ответ показывает текущее состояние задания, процент хода выполнения и все ошибки.

Ожидаемые состояния: queued, in_progresscompletedи failed.

Синхронный:

Используйте эту версию при тестировании в 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://ai.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)

Async:

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

token_provider = get_bearer_token_provider(
    DefaultAzureCredential(), "https://ai.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://ai.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. Разрешение исходного изображения и окончательного видео должно соответствовать. Поддерживаемые значения: 720x1280и 1280x720.

Локальный ссылочный файл:

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

token_provider = get_bearer_token_provider(
    DefaultAzureCredential(), "https://ai.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://ai.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)

Видео Remix

Функция remix позволяет изменять определенные аспекты существующего видео при сохранении его основных элементов. Ссылаясь на предыдущее видео id из успешно завершенного поколения и предоставив обновленный запрос, система поддерживает платформу исходного видео, переходы сцен и визуальный макет при реализации запрошенных изменений. Чтобы обеспечить оптимальные результаты, ограничьте изменения одной четко сформулированной корректировки— узкие, точные изменения сохраняют большую точность исходного материала и свести к минимуму вероятность создания визуальных дефектов.

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

token_provider = get_bearer_token_provider(
    DefaultAzureCredential(), "https://ai.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)

Рекомендации по запросам

Писать текстовые запросы на английском или других языках, использующих латинский алфавит, для достижения наилучшей производительности при создании видео.

Ограничения

Ограничения качества содержимого

Sora 2 может иметь трудности со сложной физикой, причинно-следственными связями (например, со следами от укусов на печенье), пространственным мышлением (например, различением левой и правой стороны) и точной временной последовательностью событий, таких как перемещение камеры.

Технические ограничения

Создание видео Sora 2 в настоящее время находится в предварительной версии. Имейте в виду следующие ограничения:

  • Sora 2 поддерживает следующие измерения разрешения выходных данных: 480x480, 480x854, 854x480, 720x720, 720x1280, 1280x720, 1080x1080, 1080x1920, 1920x1080.
  • Sora 2 может создавать видео в диапазоне от 1 до 20 секунд.
  • Вы можете запросить несколько вариантов видео в одном задании: для разрешения 1080p эта функция отключена; для 720p максимальный — два варианта; для других разрешений максимальное число вариантов составляет четыре варианта.
  • Одновременно можно выполнять два задания создания видео. Прежде чем создать другое, необходимо дождаться завершения одного из заданий.
  • Задания доступны до 24 часов после их создания. После этого необходимо создать новое задание, чтобы создать видео еще раз.
  • Вы можете использовать до двух изображений в качестве входных данных (созданное видео интерполирует содержимое между ними).
  • В качестве входных данных можно использовать одно видео до пяти секунд.
  • Дополнительные сведения о типах развертывания Azure OpenAI .
  • Дополнительные сведения об Azure OpenAI квотах и ограничениях.