Unlock exclusive introductory pricing for the newly launched Gemini 3.5 Flash.
O

Sora 2

Par Seconde:$0.08
Publié:Oct 9, 2025

Modèle de génération vidéo ultra-puissant, avec des effets sonores, prend en charge le format conversationnel.

Nouveau
Populaire
Usage commercial

Playground pour Sora 2

Explorez le Playground de Sora 2 — un environnement interactif pour tester les modèles et exécuter des requêtes en temps réel. Essayez des invites, ajustez les paramètres et itérez instantanément pour accélérer le développement et valider les cas d'utilisation.

Fonctionnalités clés

  • Réalisme physique et continuité : simulation améliorée de la permanence des objets, des mouvements et de la physique pour moins d'artefacts visuels.
  • Audio synchronisé : génère des dialogues et effets sonores qui s'alignent sur l'action à l'écran.
  • Pilotabilité et gamme stylistique : contrôle plus fin du cadrage caméra, des choix stylistiques et du conditionnement des prompts pour différentes esthétiques.
  • Contrôles créatifs : des séquences multi-plans plus cohérentes, un réalisme de la physique et des mouvements amélioré, et des contrôles du style et du timing par rapport à Sora 1.

Détails techniques

OpenAI décrit les modèles de la famille Sora comme tirant parti de processus de diffusion vidéo latente avec des débruiteurs basés sur des Transformers et un conditionnement multimodal afin de produire des images cohérentes dans le temps et un audio aligné. Sora 2 se concentre sur l'amélioration du réalisme des mouvements (respect de l'inertie, de la flottabilité), des plans plus longs et cohérents, et une synchronisation explicite entre les visuels générés et la voix/les effets sonores générés. Les documents publics mettent l'accent sur la sécurité au niveau du modèle et sur des mécanismes de modération de contenu (blocages stricts pour certains contenus interdits, seuils renforcés pour les mineurs et parcours de consentement pour la ressemblance).

Limitations et considérations de sécurité

  • Des imperfections subsistent : Sora 2 commet des erreurs (artefacts temporels, physique imparfaite dans des cas limites, erreurs de voix/d'articulation orale) — Sora 2 est amélioré mais pas parfait. OpenAI indique explicitement que le modèle présente encore des modes de défaillance.
  • Risques d'usage abusif : génération de ressemblance non consentie, deepfakes, préoccupations liées au droit d'auteur, et risques pour le bien-être/engagement des adolescents. OpenAI déploie des workflows de consentement, des autorisations de caméo plus strictes, des seuils de modération pour les mineurs et des équipes de modération humaines.
  • Limites de contenu et juridiques : l'application et le modèle bloquent les contenus explicites/violents et limitent la génération de la ressemblance de figures publiques sans consentement ; il est également rapporté qu'OpenAI utilise des mécanismes d'opt-out pour les sources protégées par droit d'auteur. Les praticiens doivent évaluer les risques de PI et de confidentialité/juridiques avant une utilisation en production.
  • les déploiements actuels mettent l'accent sur des clips courts (les fonctionnalités de l'application font référence à des clips créatifs de ~10 secondes), et les importations photoréalistes lourdes ou non restreintes sont limitées pendant

Cas d'utilisation principaux et pratiques

  • Création sociale et clips viraux : génération et remixage rapides de courts clips verticaux pour les fils sociaux (cas d'usage de l'application Sora).
  • Prototypage et prévisualisation : maquettes rapides de scènes, storyboards, visuels conceptuels avec audio temporaire synchronisé pour les équipes créatives.
  • Publicité et formats courts : tests créatifs de preuve de concept et ressources de petites campagnes, lorsque les autorisations éthiques/juridiques sont assurées.
  • Recherche et augmentation de la chaîne d'outils : outil pour les laboratoires médias afin d'étudier la modélisation du monde et l'alignement multimodal (sous réserve de licence et de garde-fous de sécurité).

FAQ

Tarification pour Sora 2

Découvrez des tarifs compétitifs pour Sora 2, conçus pour s'adapter à différents budgets et besoins d'utilisation. Nos formules flexibles garantissent que vous ne payez que ce que vous utilisez, ce qui facilite l'adaptation à mesure que vos besoins évoluent. Découvrez comment Sora 2 peut améliorer vos projets tout en maîtrisant les coûts.

Model NameTagsOrientationResolutionPrice
sora-2videosPortrait720x1280$0.08 / sec
sora-2videosLandscape1280x720$0.08 / sec
sora-2-all-Universal / All-$0.08000

Exemple de code et API pour Sora 2

Sora 2 est le système phare d’OpenAI de génération texte‑vers‑vidéo et audio, conçu pour produire de courts clips cinématographiques avec des dialogues synchronisés, des effets sonores, un état de scène persistant et un réalisme physique nettement amélioré. Sora 2 représente une avancée d’OpenAI dans la production de courtes vidéos contrôlables avec un audio synchronisé (voix et effets sonores), une plausibilité physique accrue (mouvement, quantité de mouvement, flottabilité) et des contrôles de sécurité plus stricts par rapport aux systèmes texte‑vers‑vidéo antérieurs.

# Create a video with sora-2
# Step 1: Submit the video generation request
echo "Submitting video generation request..."
response=$(curl -s https://api.cometapi.com/v1/videos \
  -H "Authorization: Bearer $COMETAPI_KEY" \
  -F "model=sora-2" \
  -F "prompt=A calico cat playing a piano on stage")

echo "Response: $response"

# Extract video_id from response (handle JSON with spaces like "id": "xxx")
video_id=$(echo "$response" | tr -d '
' | sed 's/.*"id"[[:space:]]*:[[:space:]]*"\([^"]*\)".*/\1/')
echo "Video ID: $video_id"

# Step 2: Poll for progress until 100%
echo ""
echo "Checking video generation progress..."
while true; do
  status_response=$(curl -s "https://api.cometapi.com/v1/videos/$video_id" \
    -H "Authorization: Bearer $COMETAPI_KEY")

  # Parse progress from "progress": "0%" format
  progress=$(echo "$status_response" | grep -o '"progress":"[^"]*"' | head -1 | sed 's/"progress":"//;s/"$//')
  # Parse status from the outer level
  status=$(echo "$status_response" | grep -o '"status":"[^"]*"' | head -1 | sed 's/"status":"//;s/"$//')

  echo "Progress: $progress, Status: $status"

  if [ "$progress" = "100%" ]; then
    echo "Video generation completed!"
    break
  fi

  if [ "$status" = "FAILURE" ] || [ "$status" = "failed" ]; then
    echo "Video generation failed!"
    echo "$status_response"
    exit 1
  fi

  sleep 10
done

# Step 3: Download the video to output directory
echo ""
echo "Downloading video to ./output/$video_id.mp4..."
mkdir -p ./output
curl -s "https://api.cometapi.com/v1/videos/$video_id/content" \
  -H "Authorization: Bearer $COMETAPI_KEY" \
  -o "./output/$video_id.mp4"

if [ -f "./output/$video_id.mp4" ]; then
  echo "Video saved to ./output/$video_id.mp4"
  ls -la "./output/$video_id.mp4"
else
  echo "Failed to download video"
  exit 1
fi

cURL Code Example

# Create a video with sora-2
# Step 1: Submit the video generation request
echo "Submitting video generation request..."
response=$(curl -s https://api.cometapi.com/v1/videos \
  -H "Authorization: Bearer $COMETAPI_KEY" \
  -F "model=sora-2" \
  -F "prompt=A calico cat playing a piano on stage")

echo "Response: $response"

# Extract video_id from response (handle JSON with spaces like "id": "xxx")
video_id=$(echo "$response" | tr -d '\n' | sed 's/.*"id"[[:space:]]*:[[:space:]]*"\([^"]*\)".*/\1/')
echo "Video ID: $video_id"

# Step 2: Poll for progress until 100%
echo ""
echo "Checking video generation progress..."
while true; do
  status_response=$(curl -s "https://api.cometapi.com/v1/videos/$video_id" \
    -H "Authorization: Bearer $COMETAPI_KEY")
  
  # Parse progress from "progress": "0%" format
  progress=$(echo "$status_response" | grep -o '"progress":"[^"]*"' | head -1 | sed 's/"progress":"//;s/"$//')
  # Parse status from the outer level
  status=$(echo "$status_response" | grep -o '"status":"[^"]*"' | head -1 | sed 's/"status":"//;s/"$//')
  
  echo "Progress: $progress, Status: $status"
  
  if [ "$progress" = "100%" ]; then
    echo "Video generation completed!"
    break
  fi
  
  if [ "$status" = "FAILURE" ] || [ "$status" = "failed" ]; then
    echo "Video generation failed!"
    echo "$status_response"
    exit 1
  fi
  
  sleep 10
done

# Step 3: Download the video to output directory
echo ""
echo "Downloading video to ./output/$video_id.mp4..."
mkdir -p ./output
curl -s "https://api.cometapi.com/v1/videos/$video_id/content" \
  -H "Authorization: Bearer $COMETAPI_KEY" \
  -o "./output/$video_id.mp4"

if [ -f "./output/$video_id.mp4" ]; then
  echo "Video saved to ./output/$video_id.mp4"
  ls -la "./output/$video_id.mp4"
else
  echo "Failed to download video"
  exit 1
fi

Python Code Example

# Create a video with sora-2 using raw HTTP requests
import os
import time
import requests

api_key = os.environ.get("COMETAPI_KEY")
base_url = "https://api.cometapi.com/v1"

headers = {"Authorization": f"Bearer {api_key}"}

# Step 1: Submit the video generation request
print("Submitting video generation request...")
response = requests.post(
    f"{base_url}/videos",
    headers=headers,
    files={
        "model": (None, "sora-2"),
        "prompt": (None, "A calico cat playing a piano on stage"),
    },
)

result = response.json()
print(f"Response: {result}")

video_id = result.get("id")
print(f"Video ID: {video_id}")

# Step 2: Poll for progress until 100%
print("\nChecking video generation progress...")
while True:
    try:
        status_response = requests.get(f"{base_url}/videos/{video_id}", headers=headers)
        status_result = status_response.json()

        # Parse progress and status from response
        data = status_result.get("data", {})
        if data is None:
            data = {}
        progress = data.get("progress", "0%")
        status = data.get("status", "unknown")

        print(f"Progress: {progress}, Status: {status}")

        if status in ["FAILURE", "failed"]:
            print("Video generation failed!")
            print(status_result)
            exit(1)

        if progress == "100%":
            print("Video generation completed!")
            break
    except Exception as e:
        print(f"Temporary error: {e}, retrying...")

    time.sleep(10)

# Step 3: Download the video to output directory
print(f"\nDownloading video to ./output/{video_id}.mp4...")
os.makedirs("./output", exist_ok=True)

video_response = requests.get(f"{base_url}/videos/{video_id}/content", headers=headers)

output_path = f"./output/{video_id}.mp4"
with open(output_path, "wb") as f:
    f.write(video_response.content)

if os.path.exists(output_path):
    file_size = os.path.getsize(output_path)
    print(f"Video saved to {output_path}")
    print(f"File size: {file_size} bytes")
else:
    print("Failed to download video")
    exit(1)

JavaScript Code Example

// Create a video with sora-2 using raw HTTP requests
import fs from "fs";
import path from "path";

const apiKey = process.env.COMETAPI_KEY;
const baseUrl = "https://api.cometapi.com/v1";

async function sleep(ms) {
  return new Promise((resolve) => setTimeout(resolve, ms));
}

async function main() {
  // Step 1: Submit the video generation request
  console.log("Submitting video generation request...");

  const formData = new FormData();
  formData.append("model", "sora-2");
  formData.append("prompt", "A calico cat playing a piano on stage");

  const submitResponse = await fetch(`${baseUrl}/videos`, {
    method: "POST",
    headers: {
      Authorization: `Bearer ${apiKey}`,
    },
    body: formData,
  });

  const result = await submitResponse.json();
  console.log("Response:", JSON.stringify(result, null, 2));

  const videoId = result.id;
  console.log("Video ID:", videoId);

  // Step 2: Poll for progress until 100%
  console.log("\nChecking video generation progress...");

  while (true) {
    try {
      const statusResponse = await fetch(`${baseUrl}/videos/${videoId}`, {
        headers: {
          Authorization: `Bearer ${apiKey}`,
        },
      });

      const text = await statusResponse.text();
      if (text.startsWith("<")) {
        console.log("Temporary server error, retrying...");
        await sleep(10000);
        continue;
      }

      const statusResult = JSON.parse(text);

      // Parse progress and status from response
      const data = statusResult.data || {};
      const progress = data.progress || "0%";
      const status = data.status || "unknown";

      console.log(`Progress: ${progress}, Status: ${status}`);

      if (status === "FAILURE" || status === "failed") {
        console.log("Video generation failed!");
        console.log(JSON.stringify(statusResult, null, 2));
        process.exit(1);
      }

      if (progress === "100%") {
        console.log("Video generation completed!");
        break;
      }
    } catch (e) {
      console.log(`Temporary error: ${e.message}, retrying...`);
    }

    await sleep(10000);
  }

  // Step 3: Download the video to output directory
  console.log(`\nDownloading video to ./output/${videoId}.mp4...`);

  const outputDir = "./output";
  if (!fs.existsSync(outputDir)) {
    fs.mkdirSync(outputDir, { recursive: true });
  }

  const videoResponse = await fetch(`${baseUrl}/videos/${videoId}/content`, {
    headers: {
      Authorization: `Bearer ${apiKey}`,
    },
  });

  const outputPath = path.join(outputDir, `${videoId}.mp4`);
  const videoBuffer = Buffer.from(await videoResponse.arrayBuffer());
  fs.writeFileSync(outputPath, videoBuffer);

  if (fs.existsSync(outputPath)) {
    const stats = fs.statSync(outputPath);
    console.log(`Video saved to ${outputPath}`);
    console.log(`File size: ${stats.size} bytes`);
  } else {
    console.log("Failed to download video");
    process.exit(1);
  }
}

main().catch(console.error);