vidia-blueprint@1 — 영상 설계도 스키마 (정본)
설계도는 영상 한 편을 똑같이 다시 만들 수 있는 모든 정보다. 대본 작성 프롬프트, 장면·키프레임·요소 시트 프롬프트, 모델·음성·자막 설정, 제작 노하우까지 한 JSON 에 담는다. 공개 설계도는 누구나 가져와(리믹스) 주제만 바꿔 제작한다.
- 파일: UTF-8 JSON 객체 1개, 최대 4MB.
- 시간 단위: 초(소수 허용). 내부 실행 계획(compile)에서 30fps 프레임으로 바꾼다.
- 식별자(
id):^[A-Za-z0-9_-]{1,64}$, 같은 종류 안에서 유일. 키프레임 id 는 설계도 전체에서 유일. - 확장: 최상위와 모든 객체에서
x-로 시작하는 키는 검증하지 않고 그대로 보존한다(실행에는 쓰지 않음). 예:x-native-visualization. - 알 수 없는 키(
x-아님)는 오류다. 새 필드는 스키마 개정(vidia-blueprint@2+ 변환기)으로 추가한다.
최상위
| 필드 | 타입 | 필수 | 설명 |
|---|---|---|---|
schemaVersion | "vidia-blueprint@1" | 필수 | |
meta | object | 필수 | 제목·요약·분류·노하우 |
video | object | 필수 | 화면 비율·해상도·전체 스타일 |
models | object | 필수 | 기본 모델(장면에서 덮어쓸 수 있음) |
variables | array | 선택 | 리믹스 입력 칸(주제·대상 등). 기본 [{key:"topic",label:"주제",type:"longtext"}] |
authoring | object | 선택 | 대본 작성 프롬프트·평가 팩 |
elements | array | 선택(기본 []) | 반복 등장 요소와 구도 |
speakers | array | 필수(1개 이상) | 화자와 목소리 |
subtitles | object | 선택 | 자막 설정(기본값 있음) |
audio | object | 선택 | BGM·음량 |
scenes | array | 필수(1~120개) | 장면 |
meta
{ title(1~120자, 필수), summary(≤1000), category(≤40, 예: "shorts-engineering"), tags(string[] ≤20개, 각 ≤30자), language("ko-KR" 기본), format("shorts"|"longform", 필수), knowhow(markdown ≤20000, 제작 노하우), license("vidia-open-1" 기본), parent({blueprintId:int, versionId:int}|null, 서버가 채움), source({format, importedAt}|null, 서버가 채움) }
video
{ aspectRatio("9:16"|"16:9"|"1:1", 필수), fps(30 고정, 선택), resolution("720p"|"1080p", 기본 "720p"), visualStyle(≤2000, 모든 이미지 프롬프트 앞에 붙는 공통 스타일), negativeStyle(≤1000, 선택), targetDurationSec({min,max}, 선택), screenTitle({enabled:boolean, text(≤72)}, 선택) }
models
{ llm(string, 선택 — 예전 형식 호환용이며 실행에는 쓰지 않는다), image({model:"gpt-image-2", size?:"1024x1536"|…}), video({provider:"seedance"|"veo"|"kling", version?, tier?, resolution?("480p"|"720p"|"1080p"), audio?:boolean}), tts({defaultVoiceId, tempo:0.5~2.0 기본 1.0}), judge(string, 선택: 자동 검수용 멀티모달 LLM) }
- 기본 영상 모델:
{provider:"seedance", version:"2.0", tier:"mini", resolution:"720p"}
variables[]
{ key(^[a-z][a-z0-9_]{0,31}$), label(≤40), type("text"|"longtext"|"select"), options?(string[] — select 전용), default?(string ≤4000), help?(≤200), required?(boolean) }
authoring
{ scriptPrompt?({system(≤20000), user(≤20000)} — {{변수}} 치환), evaluationPack?(평가 팩 id — 기본: "shorts-score@1"|"longform-eval@4", 숏츠 도메인: "engineering@1"|"incident@1"|"history@1"|"crime@1"|"case@1", 유튜브 형식: "yt-shorts@1"|"yt-longform@1", 목적·장르(숏폼·롱폼 공용): "explainer@1"|"tutorial@1"|"product-review@1"|"ad-promo@1"|"story@1"|"news-brief@1"|"finance@1"|"health@1"|"kids-edu@1"|"ranking-list@1"|"mystery-horror@1"|"motivation@1"|"travel-place@1"|"dialogue@1"|"lecture@1"|"comedy@1"), rewritePolicy?({maxRounds 0~5 기본 3, minGain 0~10 기본 0.5}), notes?(≤5000) }
elements[]
{ id, name(≤60), kind("person"|"object"|"tool"|"building"|"place"|"cutaway"|"other"), description(≤1000), identityRules(string[] ≤12), views:[{ id, angle("front"|"three_quarter"|"side"|"back"|"top"|"bottom"|"closeup"|"cutaway"|"custom"), detail?(≤200), imagePrompt(≤4000) }](1개 이상) }
speakers[]
{ id, name(≤40), voiceId(비디아 음성 16종 중 하나), tempo?(0.5~2.0), elementId?(elements id|null) }
비디아 음성: v2_ann_m_30s_01 v2_ann_m_30s_02 v2_ann_m_30s_04 v2_ann_m_30s_05 v2_ann_f_30s_01 v2_ann_f_30s_02 v2_ann_f_30s_03 v2_ann_f_30s_04 v2_ann_f_30s_05 v2_m_teen_01 v2_m_young_01 v2_m_mid_01 v2_m_senior_01 v2_f_teen_01 v2_f_young_01 v2_f_senior_01
subtitles
{ enabled(기본 true), style:{ font(기본 "Noto Sans KR"), sizeAt1080(20~140, 기본 60), bold(기본 true), color("#RRGGBB" 기본 "#FFFFFF"), outlineColor(기본 "#000000"), outline(0~12 기본 3), shadow(0~8 기본 0), position("bottom"|"middle"|"top" 기본 "bottom"), marginV(0~600, 1080 기준 기본 160), maxLines(1~3 기본 2), maxCharsPerLine?(8~40), fadeMs(0~500 기본 120), background?("none"|"box") } }
audio
{ bgm?({assetId?:string|null, url?:null, volumeDb:-40~0 기본 -18, duckDb:-30~0 기본 -10}), narrationLufs(-24~-10 기본 -16), sceneGapMs(0~2000 기본 200) }
scenes[]
| 필드 | 타입 | 필수 | 설명 | |||
|---|---|---|---|---|---|---|
id | string | 필수 | ||||
title | string ≤80 | 선택 | ||||
purpose | string ≤500 | 선택 | 이 장면이 하는 일(연출 의도) | |||
durationSec | number 1~60 | 선택 | 없으면 내레이션 길이 + tail | |||
tailSec | number 0~3 | 선택 | 발화 뒤 여유(기본 0.5) | |||
utterances | array | 선택(기본 []) | `[{id, speakerId?, ttsText(≤800, 읽을 글), subtitleText?(≤200, 화면 글 — 없으면 ttsText), pauseAfter?("none" | "micro" | "normal" | "strong")}]` |
media | object | 필수 | 아래 | |||
keyframes | array | 선택 | `[{id, imagePrompt(≤4000), role?("start" | "change" | "end"), atSec?(number), references?([{elementId, viewId}] ≤3), referenceKeyframeIds?(string[] ≤2)}]` | |
videoPrompt | string ≤2000 | 선택 | AI 영상 움직임 프롬프트 | |||
transition | "cut"\ | "fade"\ | "white-flash" | 선택 | 다음 장면으로 넘어갈 때(기본 cut) | |
overlayText | string ≤60 | 선택 | 화면 상단 강조 문구 |
media:
type:"ai-image"(키프레임 이미지 + 켄번즈),"ai-video"(키프레임 → AI 영상),"stock-video","photo"(실사진),"upload"(사용자 업로드 이미지/영상)motion:"kenburns-in"|"kenburns-out"|"pan-left"|"pan-right"|"none"(정지 이미지일 때)video(ai-video 전용 선택):{provider, version, tier, resolution, mode:"image"|"text"|"reference"}— models.video 덮어쓰기stock(stock-video 전용):{provider:"pexels"|"pixabay"|"wikimedia"|"archive"|"nasa"|"upload", id?, url?(https), startSec?, durationSec?, license?, attribution?}photo(photo 전용):{url?(https), assetId?, license?, attribution?, rightsConfirmed?:boolean}assetId(upload 전용): 사용자 업로드 자산 id
검증 규칙(교차):
ai-image·ai-video장면은 keyframes 1개 이상.- utterances 의 speakerId 는 speakers id 여야 하고, 없으면 첫 화자.
- keyframes.references 의 elementId/viewId 는 elements 에 있어야 한다.
- referenceKeyframeIds 는 앞선 키프레임(같은 장면의 앞 또는 이전 장면)이어야 한다.
- 장면 수 1~120, 발화 합계 50,000자 이하.
- voiceId 는 16종 중 하나.
가져오기 형식(importers)
vidia-blueprint@1(그대로)- 구버전 숏츠
script@1(작성용: scenes[].views/utterances/events) - 구버전 숏츠 컴파일본
1.6(및 1.5): scenes[].visual.keyframes, audio.utterances, generation - 구 Flow 설계도
1.0~1.4: video/elements/speakers/subtitles/scenes - 구버전 롱폼 v3 형식: meta, narration[], scenes[].visualization/stock_video
가져오기 결과는 항상 vidia-blueprint@1 이고 원본 형식은 meta.source.format 에 남는다. 옮길 수 없는 원본 필드는 x-source 에 보존한다.