Примечание.
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
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.
Необходимые условия
- Подписка Azure. Создайте его бесплатно.
- Python версии 3.8 или более поздней. Рекомендуется использовать Python 3.10 или более поздней версии, но требуется по крайней мере Python 3.8. Если у вас нет подходящей версии Python, вы можете выполнить инструкции, описанные в руководстве по VS Code Python для простого способа установки Python в операционной системе.
- Ресурс OpenAI Azure, созданный в одном из поддерживаемых регионов. Дополнительные сведения о доступности регионов см. в документации по моделям и версиям.
- Затем необходимо развернуть модель
sora(Sora 2) с помощью ресурса Azure OpenAI. Дополнительные сведения см. в разделе Создание ресурса и развертывание модели с помощью Azure OpenAI.
предварительные требования Microsoft Entra ID
Для рекомендуемой проверки подлинности без ключа с помощью Microsoft Entra ID необходимо:
- Установите Azure CLI, который используется для безключевой аутентификации в Microsoft Entra ID.
- Назначьте
Cognitive Services Userроль вашей учетной записи пользователя. Роли можно назначить на портале Azure в разделе Access control (IAM)>Add role assignment.
Установка
Создайте новую папку
video-generation-quickstartи перейдите в папку быстрого запуска с помощью следующей команды:mkdir video-generation-quickstart && cd video-generation-quickstartСоздание виртуальной среды. Если у вас уже установлена Python 3.10 или более поздней версии, можно создать виртуальную среду с помощью следующих команд:
Windows
py -3 -m venv .venv .venv\scripts\activateLinux
python3 -m venv .venv source .venv/bin/activateMacos
python3 -m venv .venv source .venv/bin/activateАктивация среды Python означает, что при запуске
pythonилиpipиз командной строки используется интерпретатор Python, содержащийся в папке.venvприложения. Вы можете использоватьdeactivateкоманду для выхода из виртуальной среды Python, а затем повторно активировать ее при необходимости.Совет
Рекомендуется создать и активировать новую среду Python для установки пакетов, необходимых для работы с этим руководством. Не устанавливайте пакеты в глобальную установку Python. При установке пакетов python всегда следует использовать виртуальную среду или среду conda, в противном случае можно нарушить глобальную установку Python.
Установите необходимые пакеты.
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 поддерживает три режима ввода:
| Тип входных данных | Лучше всего для | Пример варианта использования |
|---|---|---|
| Только текстовый запрос | Создание совершенно новых сцен из описаний | "Кот играет на фортепиано в джазовом баре" |
| Изображение и текстовый запрос | Анимация статического изображения или его использование в качестве исходного кадра | Оживить фотографию продукта |
| Видео + текстовый запрос | Расширение или изменение существующих видеоматериалов | Добавление визуальных эффектов в существующие клипы |
Настройка проверки подлинности
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. 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}")Запустите файл 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)
Необходимые условия
- Подписка Azure. Создайте его бесплатно.
- Ресурс OpenAI Azure, созданный в поддерживаемом регионе. См. сведения о доступности региона. Дополнительные сведения см. в разделе Создание ресурса и развертывание модели с помощью Azure OpenAI.
Перейдите на портал 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 квотах и ограничениях.