Sora 2는 짧은 클립을 동기화된 오디오와 함께 만들어 내는 OpenAI의 영상 생성 모델로, 대사·효과음·음악이 영상과 나란히 생성됩니다.
- 입력
- 텍스트 이미지
- 출력
- 동영상
- 가격
- $0.1/s
가격 수준 비교
같은 종류의 모델 5개 중 가격 위치
이 막대는 Synthorai에 있는 같은 종류의 모델 가운데 이 모델의 가격이 어디쯤인지 보여 줍니다. 양쪽 끝에는 가장 싼 모델과 가장 비싼 모델의 이름이 있습니다. 기본 요율 기준이며 배치·리전·캐시 쓰기 할인은 가격 페이지에 있습니다.
사양 및 제한
동영상
| 해상도 | 720p |
|---|---|
| 길이 | 4-12 s 연속 범위이며 고정된 선택지가 아닙니다. |
| 프레임 레이트 | 24 fps |
| 화면 비율 | 16:9 · 9:16 |
| 동영상 입력 | 텍스트 기반 영상 생성 · 이미지 기반 영상 생성(참조 이미지 1장) |
| 네이티브 오디오 | 지원, 사운드까지 생성 |
| 포맷 | .mp4 |
모델
| 모달리티 | 텍스트 + 이미지 → 동영상 |
|---|
동기화된 오디오(대사, 효과음, 음악)와 함께 영상을 생성하는 OpenAI의 Sora 2 영상 모델. Synthorai는 비동기 /v1/videos 작업 API로 720p, 24 fps, 4-12초, 16:9 또는 9:16으로 제공하며 출력 초 단위로 과금합니다.
출처: OpenAI 공식 문서 ↗
프롬프트 하나, 게이트웨이를 거쳐 측정
Sora 2
모델이 반환한 크기 720×1280 길이 4s 지연 시간 68 s
프롬프트 하나에 모델당 요청 한 번, 재시도도 골라내기도 없이 각 모델이 처음 반환한 결과입니다. 크기와 길이는 고정하지 않고 모델마다 기본값을 그대로 썼습니다. 모든 모델에 맞춘 요청은 어느 모델의 장점도 살리지 못하기 때문입니다. 여기 있는 파일은 웹용으로 다시 인코딩한 것이므로, 압축 품질이 아니라 구도와 프롬프트 반영 정도를 보고 판단하세요.
30초 만에 Sora 2 사용하기
비동기 작업 API입니다. 작업을 만든 뒤 폴링하거나, Prefer: wait로 연결을 유지한 채 완료를 기다립니다. POST /v1/videos
import time
import requests
BASE = "https://synthorai.io/v1"
HEADERS = {"Authorization": "Bearer sk-syn-..."}
# 1) create the video generation job (POST /v1/videos)
task = requests.post(
f"{BASE}/videos",
headers=HEADERS,
json={
"model": "sora-2",
"prompt": "a watercolor lighthouse at dawn, waves rolling in, camera pulling back",
"resolution": "720p",
"duration": 5,
},
).json()
# 2) poll the job until it reaches a terminal state
while task["status"] in ("queued", "in_progress"):
time.sleep(5)
task = requests.get(f"{BASE}/videos/{task['id']}", headers=HEADERS).json()
# 3) completed → signed video URL (valid ~24h - download and store it promptly)
if task["status"] == "completed":
print(task["data"][0]["url"])
else:
print(task["error"])const HEADERS = {
Authorization: "Bearer sk-syn-...",
"Content-Type": "application/json",
};
interface VideoTask {
id: string;
status: "queued" | "in_progress" | "completed" | "failed" | "cancelled";
data?: Array<{ url: string }>;
error?: { code: string; message: string };
}
// 1) create the video generation job (POST /v1/videos)
const created = await fetch("https://synthorai.io/v1/videos", {
method: "POST",
headers: HEADERS,
body: JSON.stringify({
model: "sora-2",
prompt: "a watercolor lighthouse at dawn, waves rolling in, camera pulling back",
resolution: "720p",
duration: 5,
}),
});
let task = (await created.json()) as VideoTask;
// 2) poll the job until it reaches a terminal state
while (task.status === "queued" || task.status === "in_progress") {
await new Promise((r) => setTimeout(r, 5000));
const res = await fetch(`https://synthorai.io/v1/videos/${task.id}`, { headers: HEADERS });
task = (await res.json()) as VideoTask;
}
// 3) completed → signed video URL (valid ~24h — download and store it promptly)
if (task.status === "completed") console.log(task.data?.[0]?.url);
else console.error(task.error);# Create the job; "Prefer: wait" holds the request up to 60s and returns the
# completed task when generation finishes in time (else the queued task).
curl https://synthorai.io/v1/videos \
-H "Authorization: Bearer sk-syn-..." \
-H "Content-Type: application/json" \
-H "Prefer: wait=60" \
-d '{
"model": "sora-2",
"prompt": "a watercolor lighthouse at dawn, waves rolling in, camera pulling back",
"resolution": "720p",
"duration": 5
}'
# Still queued / in_progress? Poll until completed → data[0].url (valid ~24h).
curl https://synthorai.io/v1/videos/vid_9f2e8c1a4b7d \
-H "Authorization: Bearer sk-syn-..."package main
import (
"bytes"
"encoding/json"
"fmt"
"net/http"
"time"
)
const base = "https://synthorai.io/v1"
type videoTask struct {
ID string `json:"id"`
Status string `json:"status"`
Data []struct {
URL string `json:"url"`
} `json:"data"`
}
func call(method, url string, body []byte) (t videoTask) {
req, _ := http.NewRequest(method, url, bytes.NewReader(body))
req.Header.Set("Authorization", "Bearer sk-syn-...")
req.Header.Set("Content-Type", "application/json")
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()
json.NewDecoder(resp.Body).Decode(&t)
return t
}
func main() {
// 1) create the video generation job (POST /v1/videos)
payload, _ := json.Marshal(map[string]any{
"model": "sora-2",
"prompt": "a watercolor lighthouse at dawn, waves rolling in, camera pulling back",
"resolution": "720p",
"duration": 5,
})
task := call("POST", base+"/videos", payload)
// 2) poll the job until it reaches a terminal state
for task.Status == "queued" || task.Status == "in_progress" {
time.Sleep(5 * time.Second)
task = call("GET", base+"/videos/"+task.ID, nil)
}
// 3) completed → signed video URL (valid ~24h — download and store promptly)
if task.Status == "completed" {
fmt.Println(task.Data[0].URL)
}
}import java.net.URI;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;
// JDK built-in HttpClient — no extra dependency needed.
HttpClient http = HttpClient.newHttpClient();
// 1) create the job; "Prefer: wait=60" holds the request up to 60s and
// returns the completed task when generation finishes in time
HttpRequest create = HttpRequest.newBuilder(URI.create("https://synthorai.io/v1/videos"))
.header("Authorization", "Bearer sk-syn-...")
.header("Content-Type", "application/json")
.header("Prefer", "wait=60")
.POST(HttpRequest.BodyPublishers.ofString("""
{"model": "sora-2",
"prompt": "a watercolor lighthouse at dawn, waves rolling in, camera pulling back",
"resolution": "720p", "duration": 5}"""))
.build();
String task = http.send(create, HttpResponse.BodyHandlers.ofString()).body();
System.out.println(task); // {"id":"vid_…","status":…} — completed → data[0].url
// 2) still queued / in_progress? Poll GET https://synthorai.io/v1/videos/{id} until the
// status turns completed, then download data[0].url (valid ~24h).Sora 2 소개
- 텍스트 프롬프트나 참조 이미지로부터, 제어 가능하고 물리적으로 근거 있는 스타일의 영상을 만듭니다.
- OpenAI는 이 티어를 속도와 유연성으로 포지셔닝하며, 톤이나 구조, 비주얼 스타일을 실험하면서 완벽한 충실도보다 빠른 피드백을 원하는 탐색 단계의 모델이라고 부릅니다.
- 프로덕션 품질 출력에 문서상 권장되는 선택지는 Pro 티어입니다.
- 참조 이미지는 목표 영상의 크기와 일치해야 하고 JPEG, PNG, WebP로 제공해야 합니다.
- 단일 생성 외에도 OpenAI는 완성된 클립에 추가 영상을 이어 붙이는 확장 플로와 전체를 다시 생성하지 않고 부분을 조정하는 편집 엔드포인트를 문서화하며, 여러 클립에 걸쳐 피사체를 일관되게 유지하는 재사용 가능한 캐릭터도 제공하는데 영상당 두 개로 제한됩니다.
- 콘텐츠 규칙은 엄격하고 업스트림에서 강제됩니다.
- 공인을 포함한 실존 인물은 생성할 수 없고, 사람 얼굴이 포함된 입력 이미지는 거부되며, 저작권이 있는 캐릭터와 음악은 거절되고, 출력은 일반 시청자에게 적합해야 합니다.
- Synthorai는 비동기 /v1/videos 작업 API로 720p, 24 fps, 4~12초, 16:9 또는 9:16으로 Sora 2를 서빙하며 출력 초 단위로 과금합니다.
- 작업을 생성한 뒤 폴링하거나 Prefer: wait로 요청을 열어 둔 채, 서명된 영상 URL이 준비될 때까지 기다리십시오.
자주 묻는 질문
Sora 2 API는 무료로 사용해 볼 수 있나요?
네. 신규 계정에는 체험 호출 10회와 최대 $1의 무료 크레딧을 드리며, 카드 등록은 필요 없습니다. 결제 수단을 추가하기 전에 실제 워크로드로 Sora 2를 충분히 시험해 볼 수 있는 양입니다.
Sora 2는 어떤 작업에 가장 강한가요?
동기화 오디오를 갖춘 OpenAI 영상 모델, 텍스트 기반 영상 생성·이미지 기반 영상 생성, 720p, 24 fps, 4~12초. 자세한 내용은 공급자의 공식 릴리스 노트를 바탕으로 정리한 소개 섹션에서 확인하세요.
Sora 2 가격은 얼마인가요?
Synthorai에서 Sora 2 가격은 생성한 동영상 1초당 $0.1입니다. 생성에 성공한 경우에만 과금됩니다. 종량제이며 플랫폼 마진도, 구독도 없습니다.
Sora 2 API로 동영상을 어떻게 생성하나요?
Synthorai의 /v1/videos로 POST 요청(model="sora-2")을 보내 비동기 작업을 만듭니다. 그런 다음 작업을 폴링하거나, Prefer: wait 헤더로 연결을 유지한 채 기다리면 동영상 URL을 받을 수 있습니다. 공급자 SDK는 필요 없습니다.
Sora 2는 어떻게 이용하나요?
쓰던 OpenAI SDK에서 base_url="https://synthorai.io/v1", model="sora-2"만 지정하면 됩니다. API 키 하나로 게이트웨이의 모든 모델을 쓸 수 있습니다.
관련 모델
비교
이 페이지의 모든 값은 공급자 공식 문서(위 링크)에서 그대로 옮겨 적었으며, 확인한 날짜를 함께 표기합니다. 가격은 카탈로그 전체와 비교해 보여 주지만, 공급자마다 정의가 다른 사양 값은 차이만 밝히고 차트로 비교하지 않습니다. 저희가 직접 측정한 수치는 없고, 점수도 매기지 않습니다.