Remarque
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de vous connecter ou de modifier des répertoires.
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de modifier des répertoires.
Sora 2 est un modèle IA d’OpenAI qui crée des scènes vidéo réalistes et imaginatifs à partir d’instructions textuelles et/ou d’images d’entrée ou de vidéo. Le modèle peut générer un large éventail de contenus vidéo, notamment des scènes réalistes, des animations et des effets spéciaux. Il prend en charge plusieurs résolutions vidéo et durées.
Capacités
Modalités : texte → vidéo, image → vidéo, vidéo (générée) → vidéo
Audio : Sora 2 prend en charge la génération audio dans les vidéos de sortie (similaires à l’application Sora).
Remix : Sora 2 introduit la possibilité de remixer des vidéos existantes en effectuant des ajustements ciblés au lieu de régénérer à partir de zéro.
Responsible AI et génération vidéo : Les modèles de génération vidéo d'Azure OpenAI incluent des protections intégrées d'IA Responsable (RAI) pour garantir une utilisation sécurisée et conforme. Sora 2 bloque tout le contenu IP et photoréaliste.
En outre, Azure fournit une modération d’entrée et de sortie sur tous les modèles de génération d’images, ainsi que des protections spécifiques à Azure telles que le filtrage de contenu et la surveillance des abus. Ces systèmes permettent de détecter et d’empêcher la génération ou l’utilisation abusive de contenu dangereux, dangereux ou en violation de stratégie.
Les clients peuvent en savoir plus sur ces protections et comment les personnaliser sur la page de filtrage de contenu .
Détails du modèle
Sora 2 utilise l'API Azure OpenAI v1, en s'alignant sur le schéma Sora 2 natif d'OpenAI.
| Aspect | Sora 2 |
|---|---|
| Type de modèle | Adapte la dernière API Sora 2 d’OpenAI à l’aide de l’API v1 |
| Modalités prises en charge | texte → vidéo, image → vidéo, vidéo (générée) → vidéo |
| Génération audio | ✅ Pris en charge dans les résultats |
| Fonctionnalité Remix | ✅ Prise en charge — effectuez des modifications ciblées sur les vidéos existantes |
| Performances et fidélité | Réalisme amélioré, physique et cohérence temporelle |
| Facturation | Informations de facturation par seconde |
Démarrage rapide
Générez des clips vidéo à l’aide du service OpenAI Azure. La génération de vidéos est un processus asynchrone. Vous créez une demande de travail avec vos spécifications d’invite de texte et de format vidéo, et le modèle traite la demande en arrière-plan. Vous vérifiez l’état du travail de génération de vidéos et, une fois terminé, récupérez la vidéo générée via une URL de téléchargement. L’exemple utilise le modèle Sora 2.
Conditions préalables
- Un abonnement Azure. Créez-en un gratuitement.
- Python version 3.8 ou ultérieure. Nous vous recommandons d’utiliser Python 3.10 ou version ultérieure, mais au moins Python 3.8 est nécessaire. Si vous n'avez pas de version appropriée de Python installée, vous pouvez suivre les instructions du didacticiel Python pour VS Code pour le moyen le plus simple d'installer Python sur votre système d'exploitation.
- Une Azure ressource OpenAI créée dans l’une des régions prises en charge. Pour plus d’informations sur la disponibilité des régions, consultez la documentation sur les modèles et versions.
- Ensuite, vous devez déployer un modèle
sora(Sora 2) avec votre ressource OpenAI Azure. Pour plus d’informations, consultez Créer une ressource et déployer un modèle avec Azure OpenAI.
Prérequis Microsoft Entra ID
Pour l’authentification sans clé recommandée avec Microsoft Entra ID, vous devez :
- Installez le Azure CLI utilisé pour l’authentification sans clé avec Microsoft Entra ID.
- Attribuez le
Cognitive Services Userrôle à votre compte d’utilisateur. Vous pouvez attribuer des rôles dans le portail Azure sous Access control (IAM)>Add role assignment.
Configuration
Créez un dossier
video-generation-quickstartet accédez au dossier de démarrage rapide avec la commande suivante :mkdir video-generation-quickstart && cd video-generation-quickstartCréez un environnement virtuel. Si vous avez déjà installé Python 3.10 ou version ultérieure, vous pouvez créer un environnement virtuel à l’aide des commandes suivantes :
Windows
py -3 -m venv .venv .venv\scripts\activateLinux
python3 -m venv .venv source .venv/bin/activateMacos
python3 -m venv .venv source .venv/bin/activateL’activation de l’environnement Python signifie que lorsque vous exécutez
pythonoupipà partir de la ligne de commande, vous utilisez ensuite l’interpréteur Python contenu dans le dossier.venvde votre application. Vous pouvez utiliser ladeactivatecommande pour quitter l’environnement virtuel Python et la réactiver ultérieurement si nécessaire.Conseil
Nous vous recommandons de créer et d’activer un nouvel environnement Python à utiliser pour installer les packages dont vous avez besoin pour ce didacticiel. N’installez pas de packages dans votre installation globale de Python. Vous devez toujours utiliser un environnement virtuel ou conda lors de l’installation de packages python ; sinon, vous pouvez interrompre votre installation globale de Python.
Installez les packages requis.
Microsoft Entra ID
pip install requests azure-identityLe package azure-identity fournit une
DefaultAzureCredentialauthentification sécurisée sans clé.Clé API
pip install requestsLa bibliothèque de requêtes gère les appels HTTP à l’API REST.
Récupérer des informations sur les ressources
Vous devez récupérer les informations suivantes pour authentifier votre application avec votre ressource OpenAI Azure :
| Nom de la variable | Valeur |
|---|---|
AZURE_OPENAI_ENDPOINT |
Cette valeur se trouve dans la section Keys et Endpoint lors de l’examen de votre ressource à partir du portail Azure. |
AZURE_OPENAI_DEPLOYMENT_NAME |
Cette valeur correspond au nom personnalisé que vous avez choisi pour votre déploiement lorsque vous avez déployé un modèle. Cette valeur se trouve sous Resource Management>Model Deployments dans le portail Azure. |
En savoir plus sur l’authentification sans clé et la définition des variables d’environnement.
Générer une vidéo avec Sora 2
Vous pouvez générer une vidéo avec le modèle Sora 2 en créant un travail de génération de vidéo, en vérifiant son statut et en récupérant la vidéo générée. Le code suivant montre comment procéder via l’API REST à l’aide de Python.
Choisir votre type d’entrée
Sora 2 prend en charge trois modes d’entrée :
| Type d’entrée | Idéal pour | Exemple de cas d’usage |
|---|---|---|
| Invite de texte uniquement | Création de scènes entièrement nouvelles à partir de descriptions | « Un chat jouant du piano dans un bar jazz » |
| Image + suggestion textuelle | Animer une image fixe ou l'utiliser comme cadre de départ | Donner vie à une photo de produit |
| Vidéo + invite de texte | Extension ou modification de séquences vidéo existantes | Ajouter des effets visuels à des clips existants |
Configurer l’authentification
Créez le
sora-quickstart.pyfichier et ajoutez le code suivant pour authentifier votre ressource :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" }Clé 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" }
Créer le travail de génération de vidéos
Ajoutez le code pour créer et surveiller le travail de génération de vidéos. Choisissez le type d’entrée qui correspond à votre cas d’usage.
Invite de texte
# 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}")Demande d'image
Remplacez le
"file_name"champ par"inpaint_items"le nom de votre fichier image d’entrée. Remplacez également la construction dufilestableau, qui associe le chemin d’accès au fichier réel avec le nom de fichier que l’API utilise.Utilisez les
"crop_bounds"données (distances de rognage d’image, à partir de chaque direction, en tant que fraction des dimensions totales de l’image) pour spécifier quelle partie de l’image doit être utilisée dans la génération vidéo.Vous pouvez éventuellement définir le cadre
"frame_index"dans la vidéo générée où votre image doit apparaître (la valeur par défaut étant 0, soit le début de la vidéo).Le
"n_variants"paramètre spécifie le nombre de variantes vidéo différentes à générer à partir de la même invite (1 à 4). Chaque variante fournit une interprétation unique de votre entrée.# 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}")Commande vidéo
Remplacez le
"file_name"champ par"inpaint_items"le nom de votre fichier vidéo d’entrée. Remplacez également la construction dufilestableau, qui associe le chemin d’accès au fichier réel avec le nom de fichier que l’API utilise.Utilisez les
"crop_bounds"données (distances de rognage d’image, à partir de chaque direction, en tant que fraction des dimensions totales de l’image) pour spécifier la partie de l’image vidéo à utiliser dans la génération vidéo.Vous pouvez éventuellement définir le cadre
"frame_index"dans la vidéo générée comme point de départ de votre vidéo d’entrée (la valeur par défaut est 0, le début).# 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}")Exécutez le fichier Python.
python sora-quickstart.pyLa génération de vidéos prend généralement 1 à 5 minutes en fonction de la résolution et de la durée. Vous devez voir les mises à jour d’état dans votre terminal à mesure que le travail progresse à travers
queued,preprocessing,running,processing, et enfinsucceeded.
Sortie
La sortie affichera le JSON de réponse complet de la requête de création de tâche de génération de vidéo, y compris l’ID de tâche et son statut.
{
"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
}
La vidéo générée est enregistrée comme output.mp4 dans le répertoire actif.
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"
Dépannage
Si vous rencontrez des problèmes, vérifiez les problèmes courants et les solutions suivants :
| Erreur | Cause | Solution |
|---|---|---|
401 Unauthorized |
Informations d’identification non valides ou expirées | Pour Microsoft Entra ID, exécutez az login pour actualiser votre jeton. Pour la clé API, vérifiez AZURE_OPENAI_API_KEY qu’elle est correcte. |
403 Forbidden |
Attribution de rôle manquante | Attribuez le rôle utilisateur Cognitive Services à votre compte dans le portail Azure. |
404 Not Found |
Nom de point de terminaison ou de déploiement incorrect | Vérifiez que AZURE_OPENAI_ENDPOINT inclut votre nom de ressource et que AZURE_OPENAI_DEPLOYMENT_NAME est conforme à votre déploiement Sora 2. |
429 Too Many Requests |
Limite de débit dépassée | Attendez et réessayez ou demandez une augmentation du quota dans le portail Azure. |
400 Bad Request avec erreur de dimension |
Résolution non prise en charge | Utilisez une résolution prise en charge : 480×480, 720×720, 1080×1080, 1280×720 ou 1920×1080. |
État du travail failed |
Violation de stratégie de contenu ou erreur interne | Vérifiez failure_reason dans la réponse. Modifiez votre invite si elle a déclenché le filtrage de contenu. |
| Délai d’expiration pendant l’interrogation | Temps de génération long | Les vidéos peuvent prendre jusqu’à 5 minutes. Augmentez votre délai d’interrogation ou vérifiez l’état du travail manuellement. |
Conseil
Pour déboguer les problèmes d’authentification, testez d’abord vos informations d’identification avec un appel d’API simple :
# 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)
Conditions préalables
- Un abonnement Azure. Créez-en un gratuitement.
- Ressource OpenAI Azure créée dans une région prise en charge. Consultez la disponibilité de la région. Pour plus d’informations, consultez Créer une ressource et déployer un modèle avec Azure OpenAI.
Accédez au portail Microsoft Foundry
Accédez au portail Foundry et connectez-vous avec les informations d’identification associées à votre ressource OpenAI Azure. Pendant ou après le flux de travail de connexion, sélectionnez le répertoire approprié, l'abonnement Azure et la ressource Azure OpenAI.
Dans la page d’accueil Foundry, créez ou sélectionnez un projet. Accédez à la page Modèles + points de terminaison dans le volet de navigation gauche. Sélectionnez Déployer le modèle , puis choisissez le modèle de génération vidéo Sora 2 dans la liste. Terminez le processus de déploiement.
Dans la page du modèle, sélectionnez Ouvrir dans le terrain de jeu.
Tester la génération de vidéos
Commencez à explorer la génération de vidéos Sora 2 avec une approche sans code par le biais du terrain de jeu vidéo. Entrez votre invite dans la zone de texte, puis sélectionnez Générer. La génération de vidéos prend généralement 1 à 5 minutes en fonction de vos paramètres. Lorsque la vidéo générée par l’IA est prête, elle apparaît sur la page.
Note
Les API de génération de contenu sont fournies avec un filtre de modération de contenu. Si Azure OpenAI reconnaît votre invite comme contenu dangereux, elle ne retourne pas de vidéo générée. Pour plus d’informations, consultez filtrage de contenu.
Dans le terrain de jeux Video, vous pouvez également afficher des exemples de code Python et cURL, qui sont préremplis en fonction de vos paramètres. Sélectionnez le bouton de code en haut du volet de lecture vidéo. Vous pouvez utiliser ce code pour écrire une application qui termine la même tâche.
Nettoyer les ressources
Si vous souhaitez nettoyer et supprimer une ressource OpenAI Azure, vous pouvez supprimer la ressource. Avant de supprimer la ressource, vous devez d’abord supprimer tous les modèles déployés.
Génération d’IA responsable et de vidéos
Les modèles de génération d'images d'Azure OpenAI incluent des protections intégrées de l'IA Responsable (RAI) pour garantir une utilisation sûre et conforme.
En outre, Azure fournit une modération d’entrée et de sortie sur tous les modèles de génération d’images, ainsi que des protections spécifiques à Azure telles que le filtrage de contenu et la surveillance des abus. Ces systèmes permettent de détecter et d’empêcher la génération ou l’utilisation abusive de contenu dangereux, dangereux ou en violation de stratégie.
Actuellement, l’API Sora 2 applique plusieurs restrictions de contenu :
- Seul le contenu adapté aux audiences de moins de 18 (un paramètre permettant de contourner cette restriction sera disponible à l’avenir).
- Les caractères protégés par le droit d’auteur et la musique protégée par copyright seront rejetés.
- Les gens réels, y compris les personnalités publiques, ne peuvent pas être générés.
- Les images d’entrée avec des visages des humains sont actuellement rejetées.
Assurez-vous que les requêtes, les images de référence et les transcriptions respectent ces règles afin d’éviter tout échec de génération.
Informations de référence sur l’API Sora 2
L’API Sora 2 fournit 5 points de terminaison, chacun avec des fonctionnalités distinctes.
- Créer une vidéo : lancez un nouveau rendu à partir d'une commande, avec des entrées de référence facultatives ou un ID de remix.
- Obtenir l’état de la vidéo : récupérer l’état actuel d’un travail de rendu et surveiller sa progression
- Télécharger la vidéo : récupérez le MP4 terminé une fois le travail terminé.
- Répertorier les vidéos : Énumérez vos vidéos avec pagination pour l’historique, les tableaux de bord ou le nettoyage.
- Delete Videos : Supprimer un ID vidéo individuel du stockage Azure OpenAI
Paramètres d’API
| Paramètre | Type | Sora 2 |
|---|---|---|
| Prompt | Chaîne (obligatoire) | Description de la séquence en langage naturel. Incluez le type de capture, le sujet, l’action, la définition, l’éclairage et tout mouvement de caméra souhaité pour réduire l’ambiguïté. Gardez-le à but unique pour une meilleure adhésion. |
| Modèle | Chaîne (facultatif) |
Sora-2 (par défaut) |
| Taille (résolution de sortie en largeur × hauteur) | Chaîne (facultatif) | Portrait: 720×1280 Paysage: 1280×720 Valeur par défaut : 720×1280 |
| Secondes | Chaîne (facultatif) | 4 / 8 / 12 Valeur par défaut : 4 |
| Référence d'entrée | Fichier (facultatif) | Image de référence unique utilisée comme ancre visuelle pour le premier frame. Types MIME acceptés : image/jpeg, image/png, image/webp. Doit correspondre exactement en taille. |
| Remix_video_id | Chaîne (facultatif) | ID d’une vidéo précédemment terminée (par exemple video_...) pour réutiliser la structure, le mouvement et le cadrage. Identique à Sora 2 |
L’API Sora 2 utilise l’API v1 et a la même structure que l’API OpenAI.
videos.create() (fonction pour créer des vidéos)
Vous devez effectuer une mise à jour vers la dernière version du client OpenAI avec pip install openai --upgrade pour empêcher 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)
Créer une vidéo et interroger l’état du travail
Appelez GET /videos/{video_id} avec l’ID qui a été retourné par l’appel de création. La réponse indique l’état actuel du travail, le pourcentage de progression et toutes les erreurs.
Les états attendus sont queued, in_progress, completedet failed.
Synchrone:
Utilisez cette version si vous effectuez des tests dans Jupyter Notebooks pour éviter 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())
Télécharger la vidéo
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")
Génération de vidéos à partir de la source de référence
Le input_reference paramètre vous permet de transformer des images existantes à l’aide de Sora 2. La résolution de l’image source et de la vidéo finale doit correspondre. Les valeurs prises en charge sont 720x1280, et 1280x720.
Fichier de référence 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)
Fichier de référence basé sur l’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 vidéo
La fonctionnalité remix vous permet de modifier des aspects spécifiques d’une vidéo existante tout en préservant ses éléments principaux. En se référant à la vidéo précédente id issue d'une génération réussie, et en fournissant une invite mise à jour, le système préserve la structure originale de la vidéo, les transitions de scène et la disposition visuelle tout en implémentant les modifications que vous avez demandées. Pour obtenir des résultats optimaux, limitez vos modifications à un ajustement clairement articulé : les modifications étroites et précises conservent une plus grande fidélité au matériau source et réduisent la probabilité de générer des défauts visuels.
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)
Bonnes pratiques relatives aux requêtes
Écrivez des suggestions textuelles en anglais ou dans d’autres langues utilisant l’alphabet latin pour obtenir les meilleures performances de génération de vidéos.
Limitations
Limitations de la qualité du contenu
Sora 2 peut avoir des difficultés avec la physique complexe, les relations causales (par exemple, les marques de morsure sur un cookie), le raisonnement spatial (par exemple, connaître la gauche de droite) et le séquencement d’événements précis basé sur le temps, comme le mouvement de caméra.
Limitations techniques
La génération vidéo Sora 2 est actuellement en préversion. Gardez à l’esprit les limitations suivantes :
- Sora 2 prend en charge les dimensions de résolution de sortie suivantes : 480x480, 480x854, 854x480, 720x720, 720x1280, 1280x720, 1080x1080, 1080x1920, 1920x1080.
- Sora 2 peut produire des vidéos entre 1 et 20 secondes.
- Vous pouvez demander plusieurs variantes vidéo dans un seul travail : pour les résolutions 1080p, cette fonctionnalité est désactivée ; pour 720p, le maximum est de deux variantes ; pour les autres résolutions, le maximum est de quatre variantes.
- Vous pouvez avoir deux travaux de création vidéo en même temps. Vous devez attendre la fin de l’un des travaux avant de pouvoir en créer un autre.
- Les travaux sont disponibles jusqu’à 24 heures après leur création. Après cela, vous devez créer une nouvelle tâche pour générer à nouveau la vidéo.
- Vous pouvez utiliser jusqu’à deux images comme entrée (la vidéo générée interpole le contenu entre eux).
- Vous pouvez utiliser une vidéo jusqu’à cinq secondes comme entrée.
Contenu connexe
- En savoir plus sur les types de déploiement OpenAI d'Azure.
- En savoir plus sur Azure OpenAI quotas et limites.