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

Sora 2

Per Detik:$0.08
Dirilis:Oct 9, 2025

Model generasi video yang sangat canggih, dengan efek suara, mendukung format chat.

Baru
Populer
Penggunaan komersial

Playground untuk Sora 2

Jelajahi Playground Sora 2 — lingkungan interaktif untuk menguji model dan menjalankan kueri secara real-time. Coba prompt, sesuaikan parameter, dan iterasi secara instan untuk mempercepat pengembangan dan memvalidasi kasus penggunaan.

Fitur utama

  • Realisme fisik & kontinuitas: simulasi permanensi objek, gerakan, dan fisika yang lebih baik untuk mengurangi artefak visual.
  • Audio tersinkronisasi: menghasilkan dialog dan efek suara yang selaras dengan aksi di layar.
  • Keterkendalian & rentang gaya: kontrol yang lebih halus atas pembingkaian kamera, pilihan gaya, dan pengkondisian prompt untuk estetika yang berbeda.
  • Kontrol kreatif: Rangkaian multi-shot yang lebih konsisten, peningkatan realisme fisika dan gerak, serta kontrol untuk gaya dan waktu dibandingkan dengan Sora 1.

Detail teknis

OpenAI menggambarkan keluarga model Sora sebagai memanfaatkan proses difusi video laten dengan denoiser berbasis transformer dan pengkondisian multimodal untuk menghasilkan frame yang koheren secara temporal dan audio yang selaras. Sora 2 berfokus pada peningkatan fisikalitas gerak (mematuhi momentum, daya apung), bidikan yang lebih panjang dan konsisten, serta sinkronisasi eksplisit antara visual yang dihasilkan dan ucapan/efek suara yang dihasilkan. Materi publik menekankan keselamatan pada tingkat model dan kait moderasi konten (pemblokiran keras untuk konten terlarang tertentu, ambang yang diperketat untuk anak di bawah umur, serta alur persetujuan untuk kemiripan).

Keterbatasan & pertimbangan keamanan

  • Ketidaksempurnaan tetap ada: Sora 2 masih membuat kesalahan (artefak temporal, fisika yang tidak sempurna dalam kasus tepi, kesalahan artikulasi suara/lisan) —Sora 2 lebih baik namun belum sempurna. OpenAI secara eksplisit mencatat model ini masih memiliki mode kegagalan.
  • Risiko penyalahgunaan: Pembuatan kemiripan tanpa persetujuan, deepfake, kekhawatiran hak cipta, serta risiko kesejahteraan/keterlibatan remaja. OpenAI meluncurkan alur persetujuan, izin cameo yang lebih ketat, ambang moderasi untuk anak di bawah umur, dan tim moderasi manusia.
  • Batas konten & legal: Aplikasi dan model memblokir konten eksplisit/kekerasan dan membatasi pembuatan kemiripan tokoh publik tanpa persetujuan; OpenAI juga dilaporkan menggunakan mekanisme opt-out untuk sumber berhak cipta. Praktisi harus mengevaluasi risiko IP dan privasi/hukum sebelum penggunaan produksi.
  • penerapan saat ini menekankan klip pendek (fitur aplikasi merujuk pada klip kreatif ~10 detik), dan unggahan fotorealistik yang berat atau tidak terbatas dibatasi selama

Kasus penggunaan utama dan praktis

  • Kreasi sosial & klip viral: pembuatan dan remix cepat klip vertikal pendek untuk feed sosial (use case aplikasi Sora).
  • Prototipe & previsualisasi: mockup adegan cepat, storyboard, visual konsep dengan audio sementara yang tersinkron untuk tim kreatif.
  • Periklanan & konten bentuk pendek: pengujian kreatif proof-of-concept dan aset kampanye kecil di mana izin etis/legal telah diamankan.
  • Riset & augmentasi toolchain: alat bagi lab media untuk mempelajari pemodelan dunia dan penyelarasan multimodal (tergantung lisensi dan pagar pembatas keamanan).

FAQ

Harga untuk Sora 2

Jelajahi harga kompetitif untuk Sora 2, dirancang untuk berbagai anggaran dan kebutuhan penggunaan. Paket fleksibel kami memastikan Anda hanya membayar untuk apa yang Anda gunakan, memudahkan untuk meningkatkan skala seiring berkembangnya kebutuhan Anda. Temukan bagaimana Sora 2 dapat meningkatkan proyek Anda sambil menjaga biaya tetap terkendali.

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

Kode contoh dan API untuk Sora 2

Sora 2 adalah sistem generatif teks-ke-video dan audio andalan OpenAI yang dirancang untuk menghasilkan klip sinematik pendek dengan dialog tersinkron, efek suara, status adegan yang persisten, serta realisme fisik yang meningkat secara signifikan. Sora 2 merepresentasikan langkah maju OpenAI dalam memproduksi video pendek yang dapat dikendalikan dengan audio tersinkron (ucapan dan efek suara), kewajaran fisik yang ditingkatkan (gerak, momentum, daya apung), serta kontrol keamanan yang lebih kuat dibandingkan sistem teks-ke-video sebelumnya.

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