Observação
O acesso a essa página exige autorização. Você pode tentar entrar ou alterar diretórios.
O acesso a essa página exige autorização. Você pode tentar alterar os diretórios.
O Sora 2 é um modelo de IA do OpenAI que cria cenas de vídeo realistas e imaginativas a partir de instruções de texto e/ou imagens de entrada ou vídeo. O modelo pode gerar uma ampla gama de conteúdo de vídeo, incluindo cenas realistas, animações e efeitos especiais. Ele dá suporte a várias resoluções e durações de vídeo.
Capacidades
Modalidades: texto → vídeo, imagem → vídeo, vídeo (gerado) → vídeo
Áudio: o Sora 2 dá suporte à geração de áudio em vídeos de saída (semelhante ao aplicativo Sora).
Remix: Sora 2 apresenta a capacidade de remixar vídeos existentes fazendo ajustes direcionados em vez de regenerar do zero.
Responsible AI e geração de vídeo: os modelos de geração de vídeo do Azure OpenAI incluem proteções internas de IA Responsável (RAI) para ajudar a garantir o uso seguro e compatível. O Sora 2 bloqueia todo o IP e o conteúdo fotorealista.
Além disso, Azure fornece moderação de entrada e saída em todos os modelos de geração de imagem, juntamente com proteções específicas Azure, como filtragem de conteúdo e monitoramento de abuso. Esses sistemas ajudam a detectar e impedir a geração ou o uso indevido de conteúdo prejudicial, não seguro ou que viola a política.
Os clientes podem saber mais sobre essas proteções e como personalizá-las na página filtragem de conteúdo .
Detalhes do modelo
O Sora 2 usa a API Azure OpenAI v1, alinhando-se ao esquema sora 2 nativo do OpenAI.
| Aspecto | Sora 2 |
|---|---|
| Tipo de modelo | Adapta a API sora 2 mais recente do OpenAI usando a API v1 |
| Modalidades com suporte | texto → vídeo, imagem → vídeo, vídeo (gerado) → vídeo |
| Geração de áudio | ✅ Suportado em saídas |
| Funcionalidade de remix | ✅ Com suporte – faça edições direcionadas para vídeos existentes |
| Desempenho e fidelidade | Realismo aprimorado, física e consistência temporal |
| Faturamento | Informações de cobrança por segundo |
Início Rápido
Gere clipes de vídeo usando o serviço Azure OpenAI. A geração de vídeo é um processo assíncrono. Você cria uma solicitação de trabalho com o prompt de texto e as especificações de formato de vídeo e o modelo processa a solicitação em segundo plano. Você verifica o status do trabalho de geração de vídeo e, depois de concluir, recupera o vídeo gerado por meio de uma URL de download. O exemplo usa o modelo Sora 2.
Pré-requisitos
- Uma assinatura Azure. Crie um gratuitamente.
- Python versão 3.8 ou posterior. É recomendável usar Python 3.10 ou posterior, mas ter pelo menos Python 3.8 é necessário. Se você não tiver uma versão adequada do Python instalada, poderá seguir as instruções no tutorial VS Code Python Tutorial para a maneira mais fácil de instalar Python em seu sistema operacional.
- Um recurso Azure OpenAI criado em uma das regiões com suporte. Para obter mais informações sobre a disponibilidade da região, consulte a documentação de modelos e versões.
- Em seguida, você precisa implantar um modelo
sora(Sora 2) com seu recurso Azure OpenAI. Para obter mais informações, consulte Criar um recurso e implantar um modelo com Azure OpenAI.
Microsoft Entra ID pré-requisitos
Para a autenticação sem chave recomendada com Microsoft Entra ID, você precisa:
- Instale o CLI do Azure usado para autenticação sem chave com Microsoft Entra ID.
- Atribua a
Cognitive Services Userfunção à sua conta de usuário. Você pode atribuir funções no portal do Azure em Controle de Acesso (IAM)>Adicionar atribuição de função.
Configuração
Crie uma nova pasta
video-generation-quickstarte vá para a pasta de início rápido com o seguinte comando:mkdir video-generation-quickstart && cd video-generation-quickstartCrie um ambiente virtual. Se você já tiver Python 3.10 ou superior instalado, poderá criar um ambiente virtual usando os seguintes comandos:
Windows
py -3 -m venv .venv .venv\scripts\activateLinux
python3 -m venv .venv source .venv/bin/activateMacos
python3 -m venv .venv source .venv/bin/activateAtivar o ambiente de Python significa que, ao executar
pythonoupipda linha de comando, use o interpretador de Python contido na pasta.venvdo aplicativo. Você pode usar odeactivatecomando para sair do ambiente virtual do Python e, posteriormente, reativar quando necessário.Dica
Recomendamos que você crie e ative um novo ambiente de Python a ser usado para instalar os pacotes necessários para este tutorial. Não instale pacotes na instalação global do Python. Você sempre deve usar um ambiente virtual ou conda ao instalar pacotes python, caso contrário, poderá interromper a instalação global de Python.
Instale os pacotes necessários.
Microsoft Entra ID
pip install requests azure-identityO pacote azure-identity fornece
DefaultAzureCredentialautenticação segura e sem chave.Chave de API
pip install requestsA biblioteca de solicitações manipula chamadas HTTP para a API REST.
Recuperar informações do recurso
Você precisa recuperar as seguintes informações para autenticar seu aplicativo com seu Azure recurso OpenAI:
| Nome da variável | Valor |
|---|---|
AZURE_OPENAI_ENDPOINT |
Esse valor pode ser encontrado na seção Keys e Endpoint ao examinar o recurso do portal Azure. |
AZURE_OPENAI_DEPLOYMENT_NAME |
Esse valor corresponderá ao nome personalizado escolhido para sua implantação quando você implantou um modelo. Esse valor pode ser encontrado em Resource Management>Model Deployments no portal Azure. |
Saiba mais sobre autenticação sem chave e configuração de variáveis de ambiente.
Gerar vídeo com Sora 2
Você pode gerar um vídeo com o modelo Sora 2 criando um trabalho de geração de vídeo, verificando seu status e obtendo o vídeo gerado. O código a seguir mostra como fazer isso por meio da API REST usando Python.
Escolha seu tipo de entrada
O Sora 2 dá suporte a três modos de entrada:
| Tipo de entrada | Melhor para | Exemplo de caso de uso |
|---|---|---|
| Somente prompt de texto | Criando cenas totalmente novas a partir de descrições | "Um gato tocando piano em um bar de jazz" |
| Imagem + prompt de texto | Animando uma imagem parada ou usando-a como um quadro inicial | Dar vida a uma foto de produto |
| Vídeo + prompt de texto | Estendendo ou modificando imagens de vídeo existentes | Adicionar efeitos visuais a clipes existentes |
Configurar a autenticação
Crie o
sora-quickstart.pyarquivo e adicione o seguinte código para autenticar seu recurso: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" }Chave de 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" }
Criar a tarefa de geração de vídeo
Adicione o código para criar e monitorar o trabalho de geração de vídeo. Escolha o tipo de entrada que corresponde ao seu caso de uso.
Prompt de texto
# 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}")Prompt de imagem
Substitua o campo
"file_name"no"inpaint_items"pelo nome do arquivo de imagem de entrada. Substitua também a construção dafilesmatriz, que associa o caminho ao arquivo real com o nome de arquivo que a API usa.Use os
"crop_bounds"dados (distâncias de corte de imagem, de cada direção, como uma fração do total de dimensões de imagem) para especificar qual parte da imagem deve ser usada na geração de vídeo.Opcionalmente, você pode definir o valor de
"frame_index"para o quadro no vídeo gerado onde sua imagem deve aparecer (o padrão é 0, que representa o início do vídeo).O
"n_variants"parâmetro especifica quantas variações de vídeo diferentes gerar do mesmo prompt (1 a 4). Cada variante fornece uma interpretação exclusiva da sua entrada.# 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}")Prompt de vídeo
Substitua o campo
"file_name"em"inpaint_items"pelo nome do arquivo de vídeo de entrada. Substitua também a construção dafilesmatriz, que associa o caminho ao arquivo real com o nome de arquivo que a API usa.Use os
"crop_bounds"dados (distâncias de corte de imagem, de cada direção, como uma fração das dimensões totais do quadro) para especificar qual parte do quadro de vídeo deve ser utilizada na geração de vídeo.Opcionalmente, você pode definir o quadro
"frame_index"no vídeo gerado onde o vídeo de entrada deve começar (o padrão é 0, o início).# 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}")Execute o arquivo Python.
python sora-quickstart.pyA geração de vídeo normalmente leva de 1 a 5 minutos , dependendo da resolução e da duração. Você deverá ver atualizações de status em seu terminal à medida que o trabalho progride por
queued, ,preprocessing,runningeprocessingpor fimsucceeded.
Saída
A saída mostrará o JSON completo da resposta à solicitação de criação do trabalho de geração de vídeo, incluindo a ID e o status do trabalho.
{
"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
}
O vídeo gerado será salvo como output.mp4 no diretório atual.
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"
Solucionando problemas
Se você encontrar problemas, verifique os seguintes problemas e soluções comuns:
| Erro | Causa | Solução |
|---|---|---|
401 Unauthorized |
Credenciais inválidas ou expiradas | Para Microsoft Entra ID, execute az login para atualizar seu token. Para chave de API, verifique se AZURE_OPENAI_API_KEY está correto. |
403 Forbidden |
Falta de atribuição de função | Atribua a função Cognitive Services User à sua conta no portal Azure. |
404 Not Found |
Nome de implantação ou endpoint incorreto | Verifique se AZURE_OPENAI_ENDPOINT inclui o nome do recurso e AZURE_OPENAI_DEPLOYMENT_NAME está de acordo com a distribuição do Sora 2. |
429 Too Many Requests |
Limite de taxa excedido | Aguarde e repita ou solicite um aumento de cota no portal Azure. |
400 Bad Request com erro de dimensão |
Resolução sem suporte | Use uma resolução com suporte: 480×480, 720×720, 1080×1080, 1280×720 ou 1920×1080. |
Status do trabalho failed |
Violação de política de conteúdo ou erro interno | Verifique na resposta failure_reason. Modifique o prompt se ele disparou a filtragem de conteúdo. |
| Tempo limite durante a votação | Longo tempo de geração | Os vídeos podem levar até 5 minutos. Aumente o tempo limite de consulta ou verifique o status da tarefa manualmente. |
Dica
Para depurar problemas de autenticação, teste suas credenciais com uma chamada de API simples primeiro:
# 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)
Pré-requisitos
- Uma assinatura Azure. Crie um gratuitamente.
- Um recurso OpenAI Azure criado em uma região suportada. Consulte a disponibilidade da região. Para obter mais informações, consulte Criar um recurso e implantar um modelo com Azure OpenAI.
Ir para o portal do Microsoft Foundry
Navegue até o portal Foundry e entre com as credenciais associadas ao recurso Azure OpenAI. Durante ou após o fluxo de trabalho de entrada, selecione o diretório apropriado, a assinatura do Azure e o recurso Azure OpenAI.
Na página inicial do Foundry, crie ou selecione um novo projeto. Navegue até a página Modelos + pontos de extremidade na navegação à esquerda. Selecione Implantar modelo e escolha o modelo de geração de vídeo sora 2 na lista. Conclua o processo de implantação.
Na página do modelo, selecione Abrir no playground.
Experimentar a geração de vídeo
Comece a explorar a geração de vídeo do Sora 2 com uma abordagem sem código por meio do playground de vídeo. Insira o prompt na caixa de texto e selecione Gerar. Normalmente, a geração de vídeo leva de 1 a 5 minutos , dependendo das configurações. Quando o vídeo gerado por IA estiver pronto, ele será exibido na página.
Nota
As APIs de geração de conteúdo vêm com um filtro de moderação de conteúdo. Se Azure OpenAI reconhecer seu prompt como conteúdo prejudicial, ele não retornará um vídeo gerado. Para obter mais informações, consulte Filtragem de conteúdo.
No playground Video, você também pode exibir exemplos de código Python e cURL, que são pré-preenchidos de acordo com suas configurações. Selecione o botão de código na parte superior do painel de reprodução de vídeo. Você pode usar esse código para escrever um aplicativo que conclua a mesma tarefa.
Limpar recursos
Se você quiser limpar e remover um recurso Azure OpenAI, poderá excluir o recurso. Antes de excluir o recurso, primeiro você deve excluir todos os modelos implantados.
Geração responsável de IA e vídeo
Os modelos de geração de imagem do Azure OpenAI incluem proteções internas de IA Responsável (RAI) para ajudar a garantir o uso seguro e em conformidade.
Além disso, Azure fornece moderação de entrada e saída em todos os modelos de geração de imagem, juntamente com proteções específicas Azure, como filtragem de conteúdo e monitoramento de abuso. Esses sistemas ajudam a detectar e impedir a geração ou o uso indevido de conteúdo prejudicial, não seguro ou que viola a política.
Atualmente, a API sora 2 impõe várias restrições de conteúdo:
- Somente o conteúdo adequado para públicos menores de 18 anos (uma configuração para ignorar essa restrição estará disponível no futuro).
- Personagens protegidos por direitos autorais e músicas com direitos autorais serão rejeitados.
- Pessoas reais, incluindo figuras públicas, não podem ser geradas.
- No momento, as imagens de entrada com rostos de humanos são rejeitadas.
Verifique se as solicitações, as imagens de referência e as transcrições respeitam essas regras para evitar gerações com falha.
Referência da API do Sora 2
A API do Sora 2 fornece 5 pontos de extremidade, cada um com funcionalidades distintas.
- Criar vídeo: inicie um novo trabalho de renderização a partir de um prompt, com entradas de referência opcionais ou uma ID de remix.
- Obter Status do Vídeo: recuperar o estado atual de um trabalho de renderização e monitorar seu progresso
- Baixar Vídeo: Buscar o MP4 concluído após a conclusão do trabalho.
- Listar vídeos: enumere seus vídeos com paginação para fins de histórico, painéis de controle ou organização.
- Excluir vídeos: Excluir uma ID de vídeo individual do armazenamento do Azure OpenAI
Parâmetros de API
| Parâmetro | Tipo | Sora 2 |
|---|---|---|
| Prompt | String (obrigatório) | Descrição em linguagem natural do disparo. Inclua tipo de captura, assunto, ação, configuração, iluminação e qualquer movimento desejado da câmera para reduzir a ambiguidade. Mantenha-o de uso único para melhor adesão. |
| Modelo | Cadeia de caracteres (opcional) |
Sora-2 (padrão) |
| Tamanho (Resolução de saída na largura × altura) | Cadeia de caracteres (opcional) | Retrato: 720×1280 Paisagem: 1280×720 Padrão: 720×1280 |
| Segundos | Cadeia de caracteres (opcional) | 4 / 8 / 12 Padrão: 4 |
| Referência de entrada | Arquivo (opcional) | Imagem de referência única usada como uma âncora visual para o primeiro quadro. Tipos MIME aceitos: image/jpeg, , image/pngimage/webp. Deve corresponder exatamente ao tamanho. |
| Remix_video_id | Cadeia de caracteres (opcional) | ID de um vídeo concluído anteriormente (por exemplo, video_...) para reutilizar estrutura, movimento e enquadramento. O mesmo que Sora 2 |
A API do Sora 2 usa a API v1 e tem a mesma estrutura que a API OpenAI.
videos.create()
Você precisará atualizar para a versão mais recente do cliente OpenAI com pip install openai --upgrade para evitar 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://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)
Criar um vídeo e verificar o status do trabalho
Ligue GET /videos/{video_id} com a ID retornada da chamada de criação. A resposta mostra o status atual do trabalho, a porcentagem de progresso e quaisquer erros.
Os estados esperados são queued, in_progress, completede failed.
Síncrono:
Use esta versão se estiver testando no Jupyter Notebooks para evitar 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())
Baixar vídeo
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")
Geração de vídeo da fonte de referência
O input_reference parâmetro permite transformar imagens existentes usando o Sora 2. A resolução da imagem de origem e do vídeo final deve corresponder. Os valores com suporte são 720x1280, e 1280x720.
Arquivo de referência local:
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)
Arquivo de referência baseado em 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)
Vídeo remix
O recurso remix permite que você modifique aspectos específicos de um vídeo existente, preservando seus elementos principais. Ao referenciar o vídeo id anterior de uma geração concluída com êxito e fornecer um prompt atualizado, o sistema mantém a estrutura, as transições de cena e o layout visual do vídeo original durante a implementação das alterações solicitadas. Para obter resultados ideais, limite suas modificações a um ajuste claramente articulado: edições estreitas e precisas mantêm maior fidelidade ao material de origem e minimizam a probabilidade de gerar defeitos visuais.
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)
Práticas recomendadas para comandos
Escreva prompts de texto em inglês ou em outros idiomas que utilizam o alfabeto latino para maximizar o desempenho na geração de vídeo.
Limitações
Limitações de qualidade de conteúdo
O Sora 2 pode ter dificuldade com física complexa, relações causais (por exemplo, marcas de mordida em um biscoito), raciocínio espacial (por exemplo, conhecimento do que é esquerda e direita), e sequenciamento preciso de eventos temporais, como o movimento da câmera.
Limitações técnicas
A geração de vídeo do Sora 2 está atualmente em versão prévia. Tenha em mente as seguintes limitações:
- O Sora 2 dá suporte às seguintes dimensões de resolução de saída: 480x480, 480x854, 854x480, 720x720, 720x1280, 1280x720, 1080x1080, 1080x1920, 1920x1080.
- O Sora 2 pode produzir vídeos entre 1 e 20 segundos.
- Você pode solicitar várias variantes de vídeo em um único trabalho: para resoluções de 1080p, esse recurso está desabilitado; para 720p, o máximo é duas variantes; para outras resoluções, o máximo é de quatro variantes.
- Você pode ter dois trabalhos de criação de vídeo em execução ao mesmo tempo. Você deve aguardar a conclusão de um dos trabalhos antes de criar outro.
- Os trabalhos ficam disponíveis por até 24 horas depois de serem criados. Depois disso, você deve criar um novo trabalho para gerar o vídeo novamente.
- Você pode usar até duas imagens como entrada (o vídeo gerado interpola o conteúdo entre elas).
- Você pode usar um vídeo de até cinco segundos como entrada.
Conteúdo relacionado
- Saiba mais sobre tipos de implantação do Azure OpenAI .
- Saiba mais sobre Azure openai quotas e limites.