본문으로 건너뛰기

Sora 2에서 Veo 3.1로 전환하기: API 차이, 비용, 작업 처리 방법

8 분 소요AI 영상 생성

Sora 2의 생성 요청을 Veo 3.1로 옮길 때는 모델명뿐 아니라 영상 길이, 입력 이미지, 작업 상태 조회와 파일 저장 방식도 바꿔야 합니다. 공식 종료 일정과 API 요금을 기준으로 대체 가능성을 판단하고, 기존 서비스에 연결하는 방법을 설명합니다.

기존 Sora 작업과 새 Veo 요청을 나눠 처리하고 파일 저장과 재생 확인으로 마무리하는 API 전환 흐름

Sora 2로 영상 생성 기능을 운영하고 있다면 2026년 9월 24일 전에 새 생성 요청을 처리할 대안을 준비해야 합니다. OpenAI는 3월 24일 공지에서 Videos API와 sora-2, sora-2-pro 및 해당 스냅샷의 종료일을 9월 24일로 명시했습니다. 2026년 9월 5일 기준으로는 종료 예정이며, 공지일에 이미 API가 중단된 것은 아닙니다. 이 일정은 API에 관한 것으로, 소비자용 앱의 이용 조건과 구분해야 합니다. OpenAI 지원 종료 공지

Veo 3.1은 검토할 수 있는 대체 모델입니다. 다만 OpenAI가 공식 후속 모델로 지정한 것은 아니며, 기존 Sora 작업과 출력 품질을 그대로 옮겨 주는 변환 기능도 아닙니다. 전환 가능성을 판단하려면 먼저 필요한 장면을 만들 수 있는지, 그다음 생성한 파일을 기존 서비스가 안정적으로 전달할 수 있는지를 확인해야 합니다.

이 글은 OpenAI API에서 Gemini Developer API의 Veo 3.1로 옮기는 경우를 다룹니다. Vertex AI나 별도 API 제공 서비스를 사용한다면 인증, 요청 형식, 과금 기준을 해당 서비스 문서에 맞춰 다시 확인해야 합니다.

기존 Sora 기능 중 무엇을 바꿔야 하나요?

가장 먼저 확인할 항목은 영상 길이입니다. 현재 Sora 가이드에는 두 모델 모두 16초와 20초 생성이 포함돼 있지만, Veo 3.1과 Fast의 기본 생성 길이는 4초·6초·8초입니다. 기존 서비스에서 20초 영상을 하나의 생성 요청으로 만들었다면 그대로 대응하는 설정값이 없습니다. Sora 영상 생성 가이드, Veo API 사양

기존 기능 또는 요구사항Veo 3.1로 옮길 때의 판단
8초 이내의 가로·세로 영상16:9와 9:16을 지원합니다. 기존 픽셀 크기 설정을 화면 비율과 해상도 설정으로 나눕니다.
16초·20초짜리 연속 장면짧은 장면으로 나누거나 Veo의 영상 확장을 검토합니다. 장면의 연속성을 별도로 확인해야 합니다.
1080p 또는 4K 출력Veo 3.1과 Fast에서 지원하며, 생성 길이는 8초여야 합니다. 출력은 24fps이므로 60fps로 가정하면 안 됩니다.
첫 이미지를 움직이는 영상으로 만들기Sora의 input_reference와 Veo의 image는 모두 시작 화면을 지정하는 용도로 검토할 수 있습니다. 파일 전달 형식은 별도로 구현합니다.
여러 장면에 동일한 제품이나 피사체 사용Veo의 참조 이미지 기능을 평가합니다. 기존 캐릭터 ID를 옮겨 넣는 방식은 지원되지 않습니다.
음성이 포함된 영상Veo 3.1은 오디오와 함께 영상을 생성합니다. 이 API에서 일반적인 오디오 끄기 옵션을 전제로 설계하지 않습니다.

위 사양은 대체 가능성을 거르는 기준입니다. 4K를 지원한다는 사실만으로 움직임, 제품 형태, 대사 전달력이 더 좋다고 판단할 수는 없습니다. 기존 서비스의 대표 장면을 사용해 요구사항별로 확인해야 합니다.

첫 프레임, 참조 이미지, 영상 확장은 서로 다릅니다

Veo에서 image는 첫 프레임을 지정합니다. 첫 장면과 마지막 장면을 함께 제어하려면 첫 이미지와 끝 이미지 입력을 조합합니다. Python SDK에서는 끝 이미지에 last_frame을 사용합니다. reference_images는 최대 세 장의 참조 이미지를 전달하는 별도 기능이며, 첫 프레임을 지정하는 것과 역할이 다릅니다. 참조 이미지를 사용하는 생성은 8초 조건도 확인해야 합니다. Veo 이미지 입력과 매개변수

예를 들어 기존 Sora 서비스가 신발 사진으로 짧은 광고를 만들었다면, 첫 화면에 그 사진을 그대로 배치해야 하는지, 여러 각도에서 신발의 특징을 유지하는 것이 중요한지부터 구분하세요. 전자는 첫 프레임 입력, 후자는 참조 이미지 기능을 우선 검토할 수 있습니다. 사진을 재사용할 수 있어도 Sora의 프로젝트나 캐릭터 설정이 함께 이전되는 것은 아닙니다.

Veo의 영상 확장은 Veo로 생성한 영상을 입력으로 사용하며 7초씩, 최대 20회 확장할 수 있습니다. 확장 출력은 720p입니다. 따라서 저장해 둔 Sora MP4를 그대로 넣어 이어 만드는 방법으로 계획하면 안 됩니다. 기존 Sora 영상은 최종 편집에 활용하고, 이어질 장면을 Veo에서 새로 생성하는 방안과 처음부터 Veo로 다시 만드는 방안을 비교해야 합니다. Veo 영상 확장 설명

API 연결보다 먼저 작업 데이터를 분리하세요

OpenAI의 기본 흐름은 POST /v1/videos로 작업을 만들고, GET /v1/videos/{id}queued, in_progress, completed, failed 상태를 확인한 뒤, 완료된 작업의 /content에서 MP4를 받는 방식입니다. video.completedvideo.failed 웹훅도 제공합니다. 기존 구현을 점검할 때는 영상 생성 API를 기준으로 봐야 하며, 일반적인 chat.completions 호출을 Sora의 공식 영상 인터페이스로 간주하면 안 됩니다. OpenAI 영상 API 사용법

Gemini Developer API는 모델의 predictLongRunning 메서드로 생성 요청을 받고, 응답의 name으로 작업을 조회합니다. REST 응답에서는 done과 오류 여부를 확인한 뒤 response.generateVideoResponse.generatedSamples 안의 영상 주소를 내려받습니다. Python SDK는 generate_videosclient.operations.get을 사용합니다. 요청 주소와 응답 구조가 다르므로 API 키와 모델명만 바꾸는 전환은 성립하지 않습니다. Veo 비동기 작업 처리

기존 데이터베이스에 sora_video_id 하나로 작업과 파일을 모두 관리했다면, 서비스 자체의 작업 번호를 기준으로 다음 정보를 나누는 편이 좋습니다.

  • 생성 요청: 제공사, 정확한 모델 ID, 입력 자료, 요청한 길이·화면 비율·해상도
  • 제공사 작업: Sora의 작업 ID 또는 Google의 작업 name, 최근 조회 시각, 원본 오류
  • 저장 결과: 다운로드 상태, 저장한 파일 주소, 실제 영상 길이·해상도, 재생 확인 결과
  • 사용자 처리 결과: 검토 대기, 채택, 재생성 요청 등 서비스에서 사용하는 상태

이 구분은 생성이 성공했는데 저장 서버의 일시적인 오류로 다운로드가 실패한 경우에 특히 중요합니다. 생성부터 다시 실행하면 새 비용이 발생할 수 있습니다. 작업이 성공한 기록을 유지하고 다운로드만 다시 시도할 수 있어야 합니다.

기존 Sora 작업은 기존 방식으로 끝까지 조회하고, 새로 접수하는 작업부터 Veo로 보내세요. Sora의 ID를 Google 작업 조회에 전달하거나, 전환일에 과거 작업의 제공사를 일괄 변경하면 진행 중인 작업을 추적할 수 없게 됩니다.

요청 한 번부터 파일 저장까지 연결하는 REST 예제

아래 코드는 공식 REST 흐름을 바탕으로 작업 식별자를 파일에 남기는 예제입니다. requests 패키지와 환경 변수 GEMINI_API_KEY가 필요합니다. 이 예제를 실행하면 유료 생성 요청이 발생할 수 있습니다. 사용 모델은 veo-3.1-generate-preview이며, 8초·720p·가로 영상을 요청합니다. 모델명에 preview가 포함된 현재 인터페이스를 기준으로 작성했습니다. Veo 3.1 공식 생성 예제

스크립트를 veo_job.py로 저장하고 python veo_job.py product-001.json처럼 실행합니다. 각 생성 요청에는 고유한 작업 파일명을 지정하고, 같은 작업을 이어 조회할 때만 동일한 파일명을 사용하세요. 예제는 한 프로세스에서 순차 실행하는 용도입니다. Fast로 새 작업을 생성하려면 요청 주소의 모델 ID를 veo-3.1-fast-generate-preview로 바꿉니다. 이미 접수한 작업은 모델 설정을 바꿔 재제출하지 말고 저장된 작업 이름으로 조회하세요.

python
import json import os import sys import time from pathlib import Path import requests base = "https://generativelanguage.googleapis.com/v1beta" headers = {"x-goog-api-key": os.environ["GEMINI_API_KEY"]} job_file = Path(sys.argv[1]) output = job_file.with_suffix(".mp4") def save_job(data): temporary = job_file.with_suffix(".json.tmp") temporary.write_text(json.dumps(data), encoding="utf-8") temporary.replace(job_file) if job_file.exists(): job = json.loads(job_file.read_text(encoding="utf-8")) if not job.get("name"): raise RuntimeError("접수 여부가 불명확합니다. 새 요청 전 확인이 필요합니다.") else: # 응답을 받기 전에 중단돼도 자동으로 새 작업을 만들지 않습니다. save_job({"state": "submitting"}) result = requests.post( f"{base}/models/veo-3.1-generate-preview:predictLongRunning", headers=headers, json={ "instances": [{ "prompt": ( "A slow camera move around a red ceramic cup on a table. " "Soft daylight, quiet room ambience, no speech." ) }], "parameters": { "durationSeconds": 8, "aspectRatio": "16:9", "resolution": "720p", }, }, timeout=60, ) result.raise_for_status() job = {"name": result.json()["name"]} save_job(job) # 20분은 이 예제의 대기 한도이며, 서비스의 생성 시간 보장이 아닙니다. deadline = time.monotonic() + 20 * 60 while True: result = requests.get( f"{base}/{job['name']}", headers=headers, timeout=60 ) result.raise_for_status() status = result.json() if status.get("done"): break if time.monotonic() >= deadline: raise TimeoutError("작업은 취소되지 않았습니다. 같은 파일로 다시 조회하세요.") time.sleep(10) if status.get("error"): raise RuntimeError(json.dumps(status["error"], ensure_ascii=False)) samples = ( status.get("response", {}) .get("generateVideoResponse", {}) .get("generatedSamples", []) ) if not samples or not samples[0].get("video", {}).get("uri"): raise RuntimeError("작업은 끝났지만 다운로드할 영상이 없습니다.") partial = output.with_suffix(".mp4.part") with requests.get( samples[0]["video"]["uri"], headers=headers, stream=True, timeout=120 ) as result: result.raise_for_status() with partial.open("wb") as target: for chunk in result.iter_content(chunk_size=1024 * 1024): target.write(chunk) if partial.stat().st_size == 0: raise RuntimeError("저장한 파일이 비어 있습니다.") partial.replace(output) print(f"다운로드 완료: {output}. 재생 여부를 확인하세요.")

예제는 오류를 숨기지 않고 중단합니다. 생성 요청 중 연결이 끊겨 작업 이름을 받지 못했다면, 서버가 요청을 접수했는지 알 수 없습니다. 이때 작업 파일을 지우고 자동 재실행하는 로직을 붙이면 중복 생성으로 이어질 수 있습니다. 접수 여부가 불명확한 요청은 따로 보관하고 확인해야 합니다. 작업 이름을 확보한 뒤의 조회 또는 다운로드 오류는 같은 작업 파일로 다시 실행할 수 있습니다.

실제 서비스에서는 작업 파일 대신 데이터베이스를 사용하고, 동일 요청을 두 작업자가 동시에 제출하지 못하도록 제어하세요. 조회와 다운로드에는 상태 코드에 따른 재시도 간격과 최대 대기 시간을 두되, 생성 요청 재전송과 같은 규칙으로 처리하지 않는 것이 좋습니다.

파일 크기가 0보다 크다는 확인만으로 정상 영상이 증명되지는 않습니다. 사용자에게 완료를 표시하기 전에는 미디어 검사 도구로 파일이 열리는지, 영상 스트림과 요구한 길이·해상도가 있는지 확인하고, 필요한 경우 음성도 재생해 보세요. Google은 생성한 영상을 서버에 2일간 보관하므로, 임시 영상 주소만 데이터베이스에 저장해 두지 말고 자체 저장소로 신속히 내려받아야 합니다. Veo 제한사항

작업 이름을 저장한 뒤 완료 확인, 다운로드, 재생 검사를 진행하고 조회나 저장 실패 시 같은 작업으로 재시도하는 절차

같은 길이와 해상도로 비용을 비교하세요

API 이전 비용은 앱 구독료가 아니라 실제로 호출할 모델의 초당 요금으로 계산해야 합니다. 다음은 2026년 9월 5일 확인한 공식 API 가격이며 모두 미국 달러 기준입니다. Sora 2의 720p 요금은 초당 0.10달러이고, Pro는 출력 크기에 따라 달라집니다. Sora 2 요금, Sora 2 Pro 요금

Veo 3.1은 무료 등급에서 제공되지 않습니다. 아래 Google 요금은 Gemini Developer API의 오디오 포함 영상 생성 기준으로, Vertex AI나 별도 API 제공 서비스의 가격과 섞어서 비교하면 안 됩니다. Gemini API 공식 요금표

모델과 출력 조건초당 요금8초 영상 1개 계산값
Sora 2, 1280×720 또는 720×1280$0.10$0.80
Sora 2 Pro, 1280×720 또는 720×1280$0.30$2.40
Sora 2 Pro, 1792×1024 또는 1024×1792$0.50$4.00
Sora 2 Pro, 1920×1080 또는 1080×1920$0.70$5.60
Veo 3.1, 720p·1080p$0.40$3.20
Veo 3.1, 4K$0.60$4.80
Veo 3.1 Fast, 720p$0.10$0.80
Veo 3.1 Fast, 1080p$0.12$0.96
Veo 3.1 Fast, 4K$0.30$2.40
Veo 3.1 Lite, 720p$0.05$0.40
Veo 3.1 Lite, 1080p$0.08$0.64

이 표만으로도 “Veo로 옮기면 무조건 저렴하다”는 결론은 성립하지 않습니다. Sora 2의 720p와 Veo 3.1 Fast의 720p는 같은 초당 요금이며, Veo 3.1 일반 모델은 더 비쌉니다. Lite의 가격이 낮아도 필요한 입력 기능을 모두 지원하는지는 별도 확인해야 합니다. 4K 출력은 Lite에서 제공하지 않습니다.

운영 예산에는 채택한 영상 한 개를 얻는 데 든 비용을 추가하세요. 예를 들어 8초·1080p Fast 영상 100개를 성공적으로 생성하면 생성비는 96달러입니다. 그중 실제로 사용할 수 있는 영상이 60개라면 채택 영상당 생성비는 96 ÷ 60 = 1.60달러입니다. 이는 계산 예시이며 실제 채택률이 아닙니다. Google은 성공한 생성에 과금하므로, 정상 생성됐지만 연출이 마음에 들지 않아 버린 영상도 비용에 포함됩니다. 편집·저장·전송 비용은 이 계산과 별도입니다.

Veo 3.1 Fast로 8초 1080p 영상 100개를 생성하고 60개를 채택했을 때 채택 영상당 생성비가 1.60달러가 되는 계산 예시

더 넓은 예산 항목은 AI 영상 생성 비용 안내를 참고하되, 이번 API 전환에 적용할 단가는 위 공식 요금표로 확인하세요.

한국어 영상과 실제 서비스 전환을 확인하는 순서

대한민국은 Gemini API 공식 지원 지역에 포함됩니다. 다만 지역 목록에 있다는 사실과 특정 계정의 결제 설정, 연령 확인, 사용량 한도는 별개입니다. 운영에 사용할 프로젝트에서 필요한 모델을 호출할 수 있는지 먼저 확인해야 합니다. Gemini API 지원 지역

한국어 대사가 중요한 서비스라면 별도의 품질 확인이 필요합니다. Google은 Veo에서 영어를 완전히 지원하며 다른 언어는 평가되지 않아 결과가 달라질 수 있다고 설명합니다. 한국어 입력이 가능하다는 경험만으로 한국어 발음, 숫자 읽기, 고유명사 또는 입 모양의 정확도를 보장할 수는 없습니다. 오디오 필터 때문에 영상이 반환되지 않는 경우도 고려해야 합니다. Veo 언어·오디오 제한사항

전환 전 확인에는 기존 서비스에서 실제로 쓰는 장면을 포함하세요. 제품의 형태와 색을 유지하는 영상, 움직임이 많은 영상, 한국어 설명이 있는 영상은 실패 양상이 다르므로 각각 판단하는 편이 좋습니다. 예를 들어 “제품명과 가격을 정확히 읽어야 한다”가 납품 조건이라면 영상 재생 성공과 대사 정확도를 별도 항목으로 기록해야 합니다.

전환 작업은 다음 순서로 진행할 수 있습니다.

  1. 기존 작업을 정리합니다. 진행 중인 Sora 작업, 아직 내려받지 않은 파일, 다시 생성해야 할 소재를 구분합니다. 종료 공지가 자산 이전이나 보관 연장을 약속한 것으로 해석하지 않습니다.
  2. 새 입력 규칙을 확정합니다. 지원하지 않는 길이, 해상도 조합, Sora 전용 ID를 요청 단계에서 걸러 냅니다. 긴 장면이 필요하면 분할·확장 후의 결과까지 확인합니다.
  3. 성공과 실패를 함께 시험합니다. 생성 성공뿐 아니라 작업 조회 중단, 결과 없음, 다운로드 실패, 저장 후 재생 실패를 구분해 처리하는지 확인합니다. 대기 시간 초과를 생성 취소로 표시하면 안 됩니다.
  4. 새 작업 일부를 전환합니다. Veo로 접수한 작업의 저장 성공률, 대기 시간, 채택률과 비용을 기존 요구사항에 비춰 봅니다. 이 값은 실제 운영 자료로 측정해야 합니다.
  5. 전체 전환 후에도 미완료 작업을 추적합니다. 과거 작업은 해당 제공사에서 마무리하고, 새 작업은 선택한 모델로 처리합니다. Sora 종료일 이후를 Sora로 되돌릴 수 있는 기간으로 계획하면 안 됩니다.

Veo 3.1로의 이전이 완료됐다고 판단할 시점은 첫 API 응답을 받았을 때가 아닙니다. 필요한 장면을 생성하고, 오류가 나도 작업을 잃지 않으며, 사용자에게 재생 가능한 파일을 전달할 수 있을 때입니다. 그 기준으로 모델의 기능 차이와 비용을 비교하면 기존 Sora 서비스에서 유지할 기능과 다시 설계할 기능이 분명해집니다.

#Sora 2#Veo 3.1#영상 생성 API#API 마이그레이션
Share: