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

Sora 2

Mỗi Giây:$0.08
Ngày phát hành:Oct 9, 2025

Mô hình tạo video siêu mạnh mẽ, kèm hiệu ứng âm thanh, hỗ trợ định dạng chat.

Mới
Phổ biến
Sử dụng thương mại

Playground cho Sora 2

Khám phá Playground của Sora 2 — môi trường tương tác để kiểm tra mô hình và chạy truy vấn theo thời gian thực. Thử prompts, điều chỉnh tham số và lặp lại ngay lập tức để tăng tốc phát triển và xác thực các trường hợp sử dụng.

Tính năng chính

  • Tính chân thực vật lý & tính liên tục: mô phỏng tốt hơn về sự bền vững của vật thể, chuyển động và vật lý để giảm lỗi hình ảnh.
  • Âm thanh đồng bộ: tạo thoại và hiệu ứng âm thanh khớp với hành động trên màn hình.
  • Khả năng điều hướng & dải phong cách: kiểm soát tinh hơn đối với khung hình máy quay, lựa chọn phong cách và điều kiện hóa prompt cho các thẩm mỹ khác nhau.
  • Điều khiển sáng tạo: chuỗi nhiều cảnh nhất quán hơn, cải thiện tính chân thực về vật lý và chuyển động, và các điều khiển về phong cách và thời gian so với Sora 1.

Chi tiết kỹ thuật

OpenAI mô tả các mô hình thuộc họ Sora là tận dụng các quy trình khuếch tán video trong miền ẩn với bộ khử nhiễu dựa trên Transformer và điều kiện hóa đa phương thức để tạo ra các khung hình nhất quán theo thời gian và âm thanh được căn chỉnh. Sora 2 tập trung vào việc cải thiện tính vật lý của chuyển động (tuân thủ quán tính, lực nổi), các cú máy dài nhất quán hơn, và đồng bộ hóa rõ ràng giữa hình ảnh sinh ra và giọng nói/hiệu ứng âm thanh sinh ra. Tài liệu công khai nhấn mạnh an toàn ở cấp mô hình và các cơ chế kiểm duyệt nội dung (chặn cứng một số nội dung bị cấm, ngưỡng tăng cường đối với người chưa thành niên, và quy trình xin phép đối với hình ảnh cá nhân).

Hạn chế & cân nhắc an toàn

  • Vẫn còn khiếm khuyết: Sora 2 vẫn mắc lỗi (tạo tác theo thời gian, vật lý không hoàn hảo trong các trường hợp biên, lỗi giọng nói/khẩu hình) — Sora 2 đã cải thiện nhưng chưa hoàn hảo. OpenAI nêu rõ mô hình vẫn còn các kiểu lỗi.
  • Rủi ro lạm dụng: Tạo hình ảnh cá nhân không có sự đồng ý, deepfake, lo ngại về bản quyền, và rủi ro đối với sức khỏe/tương tác của thanh thiếu niên. OpenAI đang triển khai quy trình xin phép, quyền cameo nghiêm ngặt hơn, ngưỡng kiểm duyệt cho người chưa thành niên, và đội ngũ kiểm duyệt con người.
  • Giới hạn nội dung & pháp lý: Ứng dụng và mô hình chặn nội dung khiêu dâm/bạo lực và hạn chế tạo hình ảnh người của công chúng khi không có sự đồng ý; cũng có báo cáo rằng OpenAI sử dụng cơ chế từ chối tham gia (opt-out) đối với nguồn có bản quyền. Người thực hành nên đánh giá rủi ro SHTT và quyền riêng tư/pháp lý trước khi đưa vào sản xuất.
  • các triển khai hiện tại tập trung vào clip ngắn (tính năng ứng dụng tham chiếu ~clip sáng tạo 10 giây), và việc tải lên nội dung ảnh chân thực dung lượng lớn hoặc không bị hạn chế đang bị thu hẹp trong

Trường hợp sử dụng chính và thực tiễn

  • Sáng tạo xã hội & clip lan truyền: tạo và phối lại nhanh các clip dọc ngắn cho nguồn cấp mạng xã hội (trường hợp sử dụng ứng dụng Sora).
  • Dự mẫu & tiền trực quan hóa: phác thảo nhanh cảnh, storyboard, hình ảnh khái niệm với âm thanh tạm thời đồng bộ cho đội ngũ sáng tạo.
  • Quảng cáo & nội dung định dạng ngắn: thử nghiệm sáng tạo dạng bằng chứng khái niệm và tài sản chiến dịch nhỏ trong các trường hợp đã đảm bảo quyền/cho phép về đạo đức/pháp lý.
  • Nghiên cứu & bổ trợ chuỗi công cụ: công cụ cho các phòng thí nghiệm truyền thông nghiên cứu mô hình hóa thế giới và căn chỉnh đa phương thức (tuân theo giấy phép và hàng rào an toàn).

Câu Hỏi Thường Gặp

Giá cả cho Sora 2

Khám phá mức giá cạnh tranh cho Sora 2, được thiết kế để phù hợp với nhiều ngân sách và nhu cầu sử dụng khác nhau. Các gói linh hoạt của chúng tôi đảm bảo bạn chỉ trả tiền cho những gì bạn sử dụng, giúp dễ dàng mở rộng quy mô khi yêu cầu của bạn tăng lên. Khám phá cách Sora 2 có thể nâng cao các dự án của bạn trong khi vẫn kiểm soát được chi phí.

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

Mã mẫu và API cho Sora 2

Sora 2 là hệ thống tạo sinh video và âm thanh từ văn bản hàng đầu của OpenAI, được thiết kế để tạo ra các đoạn clip ngắn mang phong cách điện ảnh với lời thoại và hiệu ứng âm thanh được đồng bộ, trạng thái cảnh được duy trì xuyên suốt, và tính hiện thực vật lý được cải thiện rõ rệt. Sora 2 đánh dấu bước tiến của OpenAI trong việc tạo ra các video ngắn, có thể điều khiển, với âm thanh đồng bộ (lời nói và hiệu ứng âm thanh), tính hợp lý về mặt vật lý được nâng cao (chuyển động, động lượng, lực nổi), và các biện pháp kiểm soát an toàn mạnh mẽ hơn so với các hệ thống chuyển văn bản thành video trước đây.

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