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

Sora 2

Per sekund:$0.08
Utgitt:Oct 9, 2025

Superkraftig videogenereringsmodell med lydeffekter som støtter chatformat.

Ny
Populær
Kommersiell bruk

Playground for Sora 2

Utforsk Sora 2's Playground — et interaktivt miljø for å teste modeller og kjøre spørringer i sanntid. Prøv prompts, juster parametere og iterer umiddelbart for å akselerere utvikling og validere brukstilfeller.

Nøkkelfunksjoner

  • Fysisk realisme og kontinuitet: forbedret simulering av objektpermanens, bevegelse og fysikk for færre visuelle artefakter.
  • Synkronisert lyd: genererer dialog og lydeffekter som samsvarer med handlingen på skjermen.
  • Styrbarhet og stilspenn: finere kontroll over kamerainnr­amming, stilistiske valg og prompt‑kondisjonering for ulike estetiske uttrykk.
  • Kreative kontroller: Mer konsistente sekvenser med flere opptak, forbedret fysikk- og bevegelsesrealisme, og kontroller for stil og timing sammenlignet med Sora 1.

Tekniske detaljer

OpenAI beskriver modellene i Sora‑familien som utnyttende latent videodiffusjon med transformer‑baserte denoisere og multimodal kondisjonering for å produsere tidsmessig koherente bilderuter og samstemt lyd. Sora 2 fokuserer på å forbedre bevegelsens fysiskhet (etterlevelse av bevegelsesmengde, oppdrift), lengre konsistente opptak, og eksplisitt synkronisering mellom genererte visuelle elementer og generert tale/lydeffekter. Offentlige materialer vektlegger sikkerhet på modellenivå og innholdsmodereringsmekanismer (harde blokkeringer for visse typer ikke‑tillatt innhold, skjerpede terskler for mindreårige og samtykkearbeidsflyter for portrettlikhet).

Begrensninger og sikkerhetshensyn

  • Ufullkommenheter består: Sora 2 gjør feil (temporale artefakter, ufullkommen fysikk i randtilfeller, stemme-/muntlig artikulasjonsfeil) — Sora 2 er forbedret, men ikke perfekt. OpenAI påpeker eksplisitt at modellen fortsatt har feiltyper.
  • Misbruksrisiko: Ikke‑konsensuell generering av likhet, deepfakes, opphavsrettsbekymringer, og risikoer for unges trivsel/engasjement. OpenAI ruller ut samtykkearbeidsflyter, strengere cameo‑tillatelser, modereringsterskler for mindreårige og menneskelige modereringsteam.
  • Innholds- og juridiske begrensninger: Appen og modellen blokkerer eksplisitt/voldelig innhold og begrenser generering av offentlig person‑likhet uten samtykke; det er også rapportert at OpenAI bruker opt‑out‑mekanismer for opphavsrettsbeskyttede kilder. Praktikere bør vurdere IP og personvern-/juridisk risiko før produksjonsbruk.
  • nåværende utrullinger vektlegger korte klipp (app‑funksjoner refererer til ~10‑sekunders kreative klipp), og tunge eller ubegrensede fotorealistiske opplastinger er innskrenket under

Primære og praktiske bruksområder

  • Sosialt innhold og virale klipp: rask generering og remiksing av korte vertikale klipp for sosiale feeder (brukstilfelle i Sora‑appen).
  • Prototyping og previsualisering: raske sceneutkast, storyboarding, konseptvisualer med synkronisert midlertidig lyd for kreative team.
  • Reklame og kortformatinnhold: proof‑of‑concept kreativ testing og mindre kampanjeressurser der etiske/juridiske tillatelser er sikret.
  • Forskning og forsterkning av verktøykjeder: verktøy for medielaboratorier til å studere verdensmodellering og multimodal tilpasning (underlagt lisens og sikkerhetsmessige vern).

FAQ

Priser for Sora 2

Utforsk konkurransedyktige priser for Sora 2, designet for å passe ulike budsjetter og bruksbehov. Våre fleksible planer sikrer at du bare betaler for det du bruker, noe som gjør det enkelt å skalere etter hvert som kravene dine vokser. Oppdag hvordan Sora 2 kan forbedre prosjektene dine samtidig som kostnadene holdes håndterbare.

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

Eksempelkode og API for Sora 2

Sora 2 er OpenAIs flaggskipsystem for tekst-til-video og lydgenerering, utviklet for å produsere korte filmatiske klipp med synkronisert dialog, lydeffekter, vedvarende scenetilstand og markant forbedret fysisk realisme. Sora 2 representerer et skritt fremover for OpenAI når det gjelder å produsere korte, kontrollerbare videoer med synkronisert lyd (tale og lydeffekter), forbedret fysisk plausibilitet (bevegelse, bevegelsesmengde, oppdrift) og strengere sikkerhetskontroller sammenlignet med tidligere tekst-til-video-systemer.

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