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

Sora 2

Al Secondo:$0.08
Rilasciato:Oct 9, 2025

Modello di generazione di video estremamente potente, con effetti sonori e supporto per il formato chat.

Nuovo
Popolare
Uso commerciale

Playground per Sora 2

Esplora il Playground di Sora 2 — un ambiente interattivo per testare modelli ed eseguire query in tempo reale. Prova prompt, regola parametri e itera istantaneamente per accelerare lo sviluppo e convalidare i casi d'uso.

Caratteristiche principali

  • Realismo fisico e continuità: simulazione migliorata della permanenza degli oggetti, del moto e della fisica per ridurre gli artefatti visivi.
  • Audio sincronizzato: genera dialoghi ed effetti sonori allineati con l’azione a schermo.
  • Controllabilità e gamma stilistica: controllo più fine sull’inquadratura della camera, sulle scelte stilistiche e sul condizionamento del prompt per diverse estetiche.
  • Controlli creativi: sequenze multi-shot più coerenti, realismo fisico e del movimento migliorati e controlli di stile e temporizzazione rispetto a Sora 1.

Dettagli tecnici

OpenAI descrive la famiglia di modelli Sora come basata su processi di diffusione video latente con denoiser basati su transformer e condizionamento multimodale per produrre frame temporalmente coerenti e audio allineato. Sora 2 si concentra sul miglioramento della fisicità del movimento (rispettando quantità di moto e galleggiamento), su riprese più lunghe e coerenti e su una sincronizzazione esplicita tra i contenuti visivi generati e il parlato/gli effetti sonori generati. I materiali pubblici evidenziano la sicurezza a livello di modello e i meccanismi di moderazione dei contenuti (blocchi rigidi per determinati contenuti non consentiti, soglie rafforzate per i minori e flussi di consenso per l’uso delle sembianze).

Limitazioni e considerazioni sulla sicurezza

  • Permangono imperfezioni: Sora 2 commette errori (artefatti temporali, fisica imperfetta in casi limite, errori nella voce/nell’articolazione orale) — Sora 2 è migliorato ma non perfetto. OpenAI segnala esplicitamente che il modello presenta ancora modalità di errore.
  • Rischi d’uso improprio: Generazione di sembianze senza consenso, deepfake, problemi di copyright, e rischi per il benessere/coinvolgimento degli adolescenti. OpenAI sta implementando flussi di consenso, autorizzazioni più rigorose per i cameo, soglie di moderazione per i minori e team di moderazione umana.
  • Limiti di contenuto e legali: L’app e il modello bloccano contenuti espliciti/violenti e limitano la generazione di sembianze di personaggi pubblici senza consenso; è stato inoltre riportato che OpenAI utilizza meccanismi di opt-out per fonti protette da copyright. I professionisti dovrebbero valutare i rischi di proprietà intellettuale e di privacy/legali prima dell’uso in produzione.
  • le implementazioni attuali enfatizzano clip brevi (le funzionalità dell’app fanno riferimento a ~10-second creative clip), e i caricamenti fotorealistici pesanti o non limitati sono ridotti durante

Casi d’uso principali e pratici

  • Creazione social e clip virali: generazione e remix rapidi di brevi clip verticali per i feed social (caso d’uso dell’app Sora).
  • Prototipazione e previsualizzazione: mockup rapidi di scene, storyboard, concept visivi con audio temporaneo sincronizzato per i team creativi.
  • Pubblicità e contenuti short-form: test creativi di proof-of-concept e asset per piccole campagne laddove siano garantite le autorizzazioni etiche/legali.
  • Ricerca e potenziamento della catena di strumenti: strumento per i laboratori media per studiare la modellazione del mondo e l’allineamento multimodale (soggetto a licenza e misure di sicurezza).

FAQ

Prezzi per Sora 2

Esplora i prezzi competitivi per Sora 2, progettato per adattarsi a vari budget e necessità di utilizzo. I nostri piani flessibili garantiscono che paghi solo per quello che usi, rendendo facile scalare man mano che i tuoi requisiti crescono. Scopri come Sora 2 può migliorare i tuoi progetti mantenendo i costi gestibili.

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

Codice di esempio e API per Sora 2

Sora 2 è il sistema di punta di OpenAI per la generazione di video e audio a partire da testo, progettato per produrre brevi clip cinematografiche con dialoghi sincronizzati, effetti sonori, persistenza dello stato della scena e un realismo fisico nettamente migliorato. Sora 2 rappresenta un passo avanti di OpenAI nella produzione di brevi video controllabili con audio sincronizzato (parlato ed effetti sonori), una maggiore plausibilità fisica (movimento, quantità di moto, galleggiamento) e controlli di sicurezza più rigorosi rispetto ai precedenti sistemi da testo a video.

# 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);