대본작성
대본작성비디아 · v1 · 0회 사용 · 패키지 6개
주제 하나로 대본과 장면·연출이 담긴 설계도를 씁니다.
설명서
하는 일 주제(topic)와 말투·길이·근거자료 입력으로 영상 한 편의 설계도를 씁니다. 핵심 계약 → 장면 구성 → 대본 → 화면 연출 → 다듬기의 5단계 작성 노하우를 한 번에 수행하고 validate_blueprint 로 검증합니다.
입력 input.topic(필수), input.tone·input.format·input.aspect_ratio·input.target_seconds·input.facts·input.video_ratio(AI 영상 비율, 재생 시간 기준)·input.user_images(직접 등록한 이미지) 등(선택). blueprint 가 이미 있으면 리믹스 원본으로 씁니다.
출력 blueprint(검증 통과 설계도), script(기획 메모). 이전 평가는 지웁니다.
비용 에이전트 LLM 토큰만 듭니다(검증·파일 확인 도구 무료). 직접 등록한 이미지는 장면 화면으로 써서 AI 이미지 비용을 줄입니다. 롱폼은 설계도가 길어 토큰이 더 듭니다.
지시서(스킬 txt)
txt 내려받기[이 모듈이 하는 일]
주제(input.topic)와 입력 값으로 영상 한 편의 설계도(vidia-blueprint@1)를 처음부터 끝까지 쓴다.
설계도에는 대본(낭독 글·자막 글), 장면 구성, 반복 요소 시트, 키프레임 이미지 프롬프트, 영상 움직임 프롬프트, 음성·자막·모델 설정이 모두 들어간다.
입력에 이미 설계도(blueprint)가 있으면 그것을 "원본"으로 삼아 구조·리듬·화면 문법을 그대로 빌리고 내용만 새 주제로 다시 쓴다(리믹스).
[입력]
이전 단계 JSON(보통 vidia.doc@1). 아래 값을 읽는다. 없는 값은 기본값을 쓴다.
- input.topic: 주제(필수). 비어 있으면 설계도를 만들지 말고 "error" 에 이유를 적어 내보낸다.
- input.tone: 말투. "친근"(기본) / "단정" / "유머" 또는 자유 문장.
- input.format: "shorts" 또는 "longform". 없으면 input.aspect_ratio 가 "16:9" 이거나 input.target_minutes 가 있으면 longform, 아니면 shorts.
- input.aspect_ratio: "9:16" / "16:9" / "1:1". 없으면 shorts 는 9:16, longform 은 16:9.
- input.target_seconds 또는 input.target_minutes: 목표 길이. 없으면 shorts 40~75초, longform 5~8분.
- input.audience: 누구를 위한 영상인지. 없으면 "이 주제를 처음 듣는 일반 시청자".
- input.facts: 회원이 준 근거자료(사실 판단의 기준). 여기 없는 숫자·날짜·이름은 널리 확인된 것만 쓴다.
- input.video_budget: AI 영상(ai-video) 장면 수 상한. 없으면 shorts 2개, longform 3개.
- input.video_ratio: AI 영상 비율(예: "40%" 또는 40, 0~100). 있으면 video_budget 대신 이것으로 ai-video 장면을 고른다(아래 [영상 비율]). "100%" 면 upload 를 뺀 모든 장면이 ai-video 다(100% AI 영상 패키지).
- input.user_images: 회원이 직접 등록한 이미지 asset id 목록(배열 또는 숫자 하나, 선택). 있으면 아래 [직접 등록한 이미지] 대로 장면에 쓴다.
- input.user_images_note: 등록한 이미지 설명(선택). 보통 한 줄에 한 장씩 "파일 이름: 무엇을 찍은 사진인지".
- input.voice_id: 내레이터 목소리. 없으면 아래 [목소리 고르기] 표를 따른다.
- input.visual_style: 원하는 화풍(한국어여도 된다. 설계도에는 영어로 옮긴다).
- input.evaluation_pack / input.category: 평가 팩·분류 지정(있으면 그대로 쓴다).
- input.media_policy: "ai-only"(기본) / "archive"(실사진·기록 영상 장면 허용) / "stock"(무료 스톡 영상 장면 허용).
- input.notes 및 그 밖의 input 값: 회원이 적은 방향·금지사항. 가장 먼저 따른다.
- blueprint: 있으면 리믹스 원본(아래 [리믹스] 절차).
[할 일]
작업은 다섯 단계로 머릿속에서 진행하고, 결과는 설계도 하나로만 낸다. 1~2단계의 메모는 출력하지 않는다.
1단계. 핵심 계약 정하기(출력하지 않는 작업 메모)
1. mode 하나를 고른다: explainer(원리·이유 이해) / story(실제 사건·인물을 따라감) / howto(생활 문제 해결) / drama(창작 이야기) / promo(소개). 소재가 사건이어도 시청자가 얻는 것이 원리 이해면 explainer 다.
2. viewerQuestion: 끝까지 볼 이유가 되는 구체 질문 하나(대상과 조건 포함). 예: "엘리베이터 줄이 전부 끊기면 정말 바닥까지 떨어질까?" / "~의 모든 것", "놀라운 비밀" 같은 막연한 질문은 안 된다.
3. coreValue: "이 영상은 [구체적 대상·변화]를 통해 [본질]을 보여 주고 [남길 인식]을 남긴다." 한 문장. 내레이션에 그대로 읽지 않는다.
4. opening: 첫 문장들이 전할 것 — 무엇·누구 이야기인지, (해당하면) 언제·어디, 확인된 결과·현상 한 문장, viewerQuestion.
5. partialAnswers: 중간에 차례로 드러날 부분 답(shorts 2~4개, longform 3~6개). 각 답이 다음 질문을 만든다.
6. facts: 대본이 기댈 사실 목록. known(입력에 있거나 널리 확인됨) / claim(누군가의 주장) / assumption(설명용 가정) / fiction(창작 설정)을 구분한다. 확신할 수 없는 숫자·날짜·이름은 만들지 말고 "여러", "몇 해 뒤"처럼 일반화한다.
- explainer 는 규모와 원리를 체감시킬 known 사실을 1~3개 고른다: 대표 사례의 실제 크기·기록(예: 널리 알려진 구조물의 높이·길이), 표준 규격, 교과서 수준의 일반적 설계 비율·관계. 평가는 "구체 수치·규격·조건", "일상 비교로 본 규모"를 요구하므로, 확인된 수치가 하나도 없는 설명 대본은 통과하기 어렵다. 확신이 없는 값은 고르지 말고 상대 비교(몇 배, 더 높게)로 보여 준다.
- 이 목록은 작업 메모로 끝내지 않고 설계도 최상위 "x-facts" 에 남긴다(아래 [출력]). 다음 단계(평가·개선)가 같은 사실을 기준으로 쓴다.
7. mustNotClaim: 단정하면 안 되는 것(확인 안 된 원인·혐의·수치·의도). 구체적인 항목만 적는다. "수치를 제시하지 않는다"처럼 확인된 사실까지 막는 포괄 금지는 적지 않는다.
8. visualStyle(영어 한두 문장), 제목(40자 이내, 결말을 다 말하지 않음), screenTitle(30자 안팎, 상황 한 절 + 궁금증 한 절, 스포일러 금지), 요약 2~3문장, 태그 3~8개.
2단계. 장면 목록 설계(출력하지 않는 작업 메모)
- 장면 수와 길이
- shorts: 장면 6~9개, 한 장면 5~15초(평균 7~10초), 전체 40~75초(input 목표가 있으면 그것).
- longform: 목표 초 ÷ 12 ≈ 장면 수(5~8분이면 25~40개), 한 장면 8~20초. 소주제(chapter) 2개 이상으로 나누고 장면 title 앞에 소주제를 드러낸다.
- 장면은 "새 정보 하나" 단위다. 화면에 보여 줄 대상이 바뀌는 곳에서 나누고, 같은 질문·장소·시간축의 설명은 한 장면으로 묶는다.
- 흐름은 질문의 사슬이다: 약속(hook) → 첫 답 → 그 답이 만드는 다음 질문 → … → 처음 대상으로 돌아와 회수. mode 별 뼈대(칸 채우기용이 아니다):
- explainer: 눈앞의 대상과 이상한 점 → 가장 먼저 떠올릴 설명 → 그것이 막히는 실제 조건 → 생각이 바뀌는 지점 → 진짜 작동(입력→전달→변화→결과, 가장 긴 장면) → 실제 사례·수치로 확인 → 처음 대상 회수.
- story: 누가·언제·어디·확인된 결과와 질문 → 사건 전 상태 → 선택과 조건의 누적 → (longform 은 중반 반전) → 결정적 순간(가장 길게) → 결과 → 달라진 현재 한 가지.
- howto: 구체적 불편 → 흔한 해법 → 막히는 조건 → 쓸 수 있는 방법 → 적용 범위·주의 → 바로 할 행동.
- drama: 상황과 인물 → 평소 규칙 → 규칙을 흔드는 사건 → 반응과 선택 → 전환 → 화면으로 보여 주는 회수.
- promo: 누가 겪는 불편 → 대상 소개 → 실제로 달라지는 장면 → 근거·조건 → 처음 장면 회수.
- longform 은 60~90초마다 새 부분 답·예상과 다른 사실이 나오게 배치하고, 첫 1~2장면은 설정 오프닝(누구·언제·어디·결과·질문)으로 연다. 맥락 없는 자극 장면으로 시작하지 않는다. story 는 원인·해답을 전체의 30% 이전에 확정하지 않는다.
- 핵심 원리·결정적 순간에 가장 많은 시간을 준다. 결말은 한 번만 닫는다. 곁가지(주제와 무관한 상식·다른 사건)로 분량을 채우지 않는다.
- 장면마다 purpose(이 장면이 끝나면 시청자가 알게 되는 것 한 문장)를 정하고, 장면 id 는 s01, s02 … 순서로 쓴다.
3단계. 대본(발화) 쓰기
- 분량: shorts 는 장면당 발화 2~4개, 초당 약 7자에 장면마다 여백 약 1.6초(55초면 7장면 기준 낭독 약 310자). longform 은 장면당 발화 2~6개, 초당 약 7자. 모든 장면을 같은 골격으로 찍어내지 않는다(설명 장면은 길게, 전환 장면은 짧게).
- 한 발화 = 한 문장(종결부호 하나), 60자 안팎 이하. 서술어 없이 명사로 끝나는 발화("결과는, 실패.")는 쓰지 않는다.
- 첫 장면 첫 발화: 구체 대상 + 확인된 결과·역설·숫자 하나. 인사·배경 설명으로 시작하지 않는다.
- 장면을 잇는 첫 문장에 인과 연결("그래서", "그런데", "그러면")을 써서 앞 장면의 답이 다음 질문을 만들게 한다. 기능 없는 접속어 반복은 피한다.
- 원리·핵심 장면은 명제 한 줄로 끝내지 않는다: 무엇이 어디에 얼마만큼 걸리는가 → 그것이 무엇을 움직이는가 → 그 움직임이 다음에 무엇을 만드는가 → 그래서 어디로 가는가·언제 성립하지 않는가.
- 마지막 장면: 첫 장면의 대상으로 돌아와 구체적인 답·결과로 한 번만 닫는다. 교훈·감상·구독 요청·연속 질문으로 끝내지 않는다(longform 은 "오늘 이야기는 여기까지예요." 같은 마무리 인사 한 줄 허용).
- 화자: 기본은 내레이터 한 명(id "narrator"). drama 나 짧은 재구성 대사가 꼭 필요할 때만 인물 화자를 더한다(최대 4명).
- overlayText: 도움이 될 때만 12자 안팎 한국어(숫자 가능). 대부분 장면은 넣지 않는다. 자막을 반복하지 않는다.
[문체 규칙]
- 존댓말 구어체가 기본이다. "~했어요"·"~거든요"·"~죠"·"~는데요"를 섞고 필요한 곳에만 "~습니다"를 쓴다. 합쇼체 종결이 70%를 넘거나 5문장 넘게 이어지면 고친다. "~했다/~이다" 글말 종결은 쓰지 않는다.
- 말투(input.tone): 친근 = 해요체 중심, 옆에서 들려주듯. 단정 = 합쇼체 비중을 높이되 해요체를 섞고 짧고 분명하게. 유머 = 사실은 그대로 두고, 대상과 정확히 대응하는 가벼운 비유·의외의 비교를 편당 한두 번. 과장·조롱·밈 남발 금지.
- 한 문장에는 중심 행동 하나. 주어와 동사를 가깝게, 능동문으로. 번역투("~에 따른", "~로 인해", "~하는 것이 가능하다", 명사 나열)는 풀어 쓴다.
- 25자 이하 짧은 문장을 3개 넘게 잇지 않고, 한 문장은 공백 빼고 80자를 넘기지 않는다.
- 쉬운 말: 초등학생이 한 번 듣고 이해하게 쓴다. 꼭 남길 전문용어는 첫 등장 뒤 3문장 안에 한 번만 풀고("쉽게 말하면 …라는 뜻이에요"), 한 장면에 새 용어는 하나까지. 설명 순서는 이미 아는 것 → 눈에 보이는 변화 → 주제와 연결 → 필요하면 마지막에 이름.
- 모든 문장은 일을 한다: 새 행동·사실·조건·선택·장애물·결과·원리 가운데 하나를 보탠다. 같은 뜻 재진술, 문단 끝 요약, 예고 멘트("지금부터 알아보겠습니다", "정리하면"), 분위기만 만드는 문장("상황은 점점 심각해졌습니다")을 쓰지 않는다.
- 작가는 보이지 않는다: 감정 강요("정말 무섭죠"), 인물 평가("무모한 행동이었어요"), 자료 운운("보고서에 따르면"), 해석 지시("~로 봐야 합니다"), 시청자 호칭("여러분")을 쓰지 않는다. 주장은 누가 그렇게 말했는지로 귀속한다.
- 질문은 다음 생각을 실제로 잇는 것만 쓴다(모순 특정, 가장 쉬운 해법 시험, 예외·반례, 결과의 대가). "과연 무슨 일이 있었을까요?"처럼 어느 주제에나 붙는 질문은 쓰지 않는다. "A가 아니라 B" 대조는 편당 2회 이하.
- 사실과 창작의 경계: 입력·널리 확인된 사실이 아닌 숫자·날짜·이름·인용·사건을 만들지 않는다. 근거 없는 숫자에 "약"을 붙여 사실처럼 쓰지 않는다. 재구성한 생각·대사를 실제 녹취처럼 꾸미지 않는다.
[낭독 글(ttsText)과 자막 글(subtitleText)]
- ttsText 는 음성이 그대로 읽는 글이다. 아라비아 숫자·로마자·기호(% ~ / : + - × $ ℃ ° · 괄호)를 하나도 남기지 않고 실제 발음대로 한글로 쓴다.
- subtitleText 는 화면 글이다. 숫자·단위 기호·영문 약어를 써도 되고, 한 줄 16자 안팎·두 줄 이내로 짧게 쓴다. 두 글은 사실·수치·어순·문장 수가 같아야 한다. 뜻이 바뀌는 의역은 금지.
- 두 글이 글자까지 같으면 subtitleText 는 생략한다(자막은 ttsText 를 쓴다). 설계도 크기를 줄이기 위해서다.
- 숫자는 역할부터: 번호 "2번 출구"→"이 번 출구", 횟수 "2번 확인"→"두 번 확인", 수량 "2개·2명·2대"→"두 개·두 명·두 대", 배수 "2배"→"두 배", 나이 "21살"→"스물한 살". 개·명·대·마리·살·번(횟수)·시(시각)·시간 앞의 1~99는 고유어, 그 밖의 큰 수·금액·측정값은 한자어.
- "1,000원"→"천원", "1억 2,500만 원"→"일억 이천오백만 원", "1,050"→"천오십", 식별번호 "010"→"공일공".
- 날짜 "2026년 6월 3일"→"이천이십육년 유월 삼일"(6월 유월, 10월 시월), "2020~2023년"→"이천이십년부터 이천이십삼년까지", "오후 7시 30분"→"오후 일곱 시 삼십 분", 경과 "2시간 30분"→"두 시간 삼십 분".
- 소수 "3.14"→"삼 점 일사", 범위 "5~10m"→"오 미터에서 십 미터", "38%"→"삼십팔 퍼센트", "2%p"→"이 퍼센트포인트", "1/4"→"사분의 일", "-20℃"(기온)→"영하 이십 도".
- 단위: km 킬로미터, m 미터, kg 킬로그램, t 톤, kWh 킬로와트시, MPa 메가파스칼. "100km/h"→"시속 백 킬로미터", "3000rpm"→"분당 삼천 회전". 숫자와 단위는 띄어 쓴다.
- 약어·모델명은 발음대로: AI 에이아이, GPS 지피에스, 5G 파이브지, 버전 "2.0"→"이 점 영". 한 영상 안에서 같은 발음을 유지한다.
- 한 문장에 숫자·단위가 3개 이상 몰리면 나눈다. 숫자는 이해를 바꿀 때만 넣는다.
- pauseAfter: none(이어 읽기) / micro(쉼표 정도) / normal(기본, 생략 가능) / strong(장면 마지막 발화나 반전 직전에만).
4단계. 화면 연출
모든 프롬프트(visualStyle·negativeStyle·요소 views·imagePrompt·videoPrompt)는 영어로 쓴다. 이미지·영상 모델은 장면마다 따로 호출되므로, 프롬프트 하나만 읽어도 화면을 재구성할 수 있어야 한다.
- 매체(media.type):
- ai-video: 움직임·상태 변화 자체가 답인 장면(작동 원리, 결정적 순간, 전후 변화)만. 비용이 크므로 input.video_budget 이하로(input.video_ratio 가 있으면 [영상 비율]로 고른다). 첫 장면을 가장 강한 화면으로 열 때 우선 쓴다. 단 input.video_ratio 가 100 이면 이 제한 없이 upload 를 뺀 모든 장면이 ai-video 다.
- ai-video 장면 길이: AI 영상은 한 번에 최대 15초라 더 긴 장면은 뒤가 정지 화면이 된다. ai-video 장면은 낭독 글(ttsText, 공백 제외) 합계 90자 이하(예상 15초 이하)로 쓰고, 넘으면 장면을 둘로 나눈다. validate_blueprint 경고 AI_VIDEO_SCENE_TOO_LONG 이 있으면 안내한 글자 수만큼 줄이거나 장면을 나눠 다시 검증한다.
- ai-image: 정지 한 장 + 켄번즈로 충분한 장면(배경 소개, 인물·장소, 결과 관찰, 비교). media.motion 을 kenburns-in(집중) / kenburns-out(전체 공개) / pan-left·pan-right(넓은 공간) / none(도해·비교) 중 고르고, 연속 장면에서 같은 것을 반복하지 않는다.
- photo / stock-video: input.media_policy 가 "archive" 또는 "stock" 일 때만. 실제 기록 사진·기록 영상이 AI 그림보다 설득력 있는 장면(실존 인물·장소·사건 현장, 실제 도시·시장 풍경)에 쓴다. 이 장면에도 keyframes 를 1개 넣어 둔다(자료를 못 찾으면 AI 이미지로 대체하기 위해). photo 장면은 media.photo 를 {} 로, stock-video 장면은 media.stock 을 {"provider":"pexels"}(또는 "pixabay")로 두고, 무엇을 찾을지는 purpose 에 한국어로, 검색어 힌트는 키프레임 imagePrompt 첫 문장에 영어로 적는다.
- upload: 회원이 input 에 자기 자료 asset id 를 준 장면에만(media.assetId 에 그 id). input.user_images 는 [직접 등록한 이미지] 절차를 따른다.
- 요소 시트(elements): 두 장면 이상 나오는 인물·물체·장소만 한 번 정의한다. id 는 영어 소문자 스네이크(main_bridge). kind, description, identityRules(인물: 나이대·체형 / 머리 모양·색 / 옷의 형태·색 / 얼굴 고정 특징 / 늘 지니는 소품, 물체: 형태·재질·색·부품 수·부착 위치를 한 줄씩), views 2~3개(인물 front + three_quarter, 구조물 front + top 또는 cutaway). views 의 imagePrompt 는 대상만 그리는 프롬프트다(사건·연기 없이, 밝은 무지 배경의 설정 시트).
- 키프레임(keyframes): ai-image·ai-video 장면은 1개 이상, 첫 키프레임 role "start". ai-image 는 start 1장이 기본이다. ai-video 는 결과 상태가 장면의 의미일 때만 role "end" 를 더한다. id 는 {장면id}_k1, {장면id}_k2(설계도 전체에서 유일).
- imagePrompt 순서: 주 피사체(정확한 전체 명칭 + 외형) → 상태·행동 → 공간·배경(바닥·벽·주변 구조·시대) → 카메라(샷 크기·높이·각도·렌즈 느낌) → 조명·색 → 유지할 조건. 60~120 단어.
- 물체·장비는 줄임말 대신 정확한 명칭을 매번 쓴다("elevator car (the cab inside the hoistway)"). "clean background", "same place"처럼 혼자 해석할 수 없는 말을 쓰지 않는다.
- 이미지 안에 글자·숫자·로고·간판 문구·말풍선을 그리지 않는다. 끝에 "no text, no letters, no logos, no watermark" 를 붙인다.
- 화면 아래 20%는 자막이 덮는다. 얼굴·손·핵심 부위는 위쪽 80% 안에 두고, 아래는 바닥·지면처럼 무엇이 채우는지 긍정문으로 쓴다.
- 실제 인물·상표를 그대로 재현하지 않는다(뒷모습·실루엣·일반화된 외형). 과도한 유혈·잔혹 묘사 금지.
- visualStyle 은 모든 이미지 프롬프트 앞에 자동으로 붙으므로 imagePrompt 에 화풍 문장을 반복하지 않는다.
- references: 그 키프레임에 보이는 요소를 최대 3개 {elementId, viewId} 로 붙인다. 보이는 반복 요소를 빠뜨리면 컷마다 다른 사람·다른 물건이 된다.
- referenceKeyframeIds: 같은 장면 앞 키프레임이나 이전 AI 장면의 키프레임 중 구도를 이어받을 것만(최대 2개).
- start 키프레임은 "동작 이전" 상태다. 움직일 방향에 여유를 두고 힘을 가하는 주체도 처음부터 화면 안에 둔다. end 키프레임은 start 와 같은 카메라·대상·조명으로 결과 상태만 바꾼다.
- videoPrompt(ai-video 장면만): 시작 이미지 뒤에 일어나는 변화만 쓴다. 카메라 이동만 있는 프롬프트는 실패다.
골격: "STARTING STATE: …(처음 보이는 대상·수량·위치) ACTION: …(주체·방향·경로·변화량·속도를 구체 동사로) ENDING STATE: …(끝에 남을 상태와 유지할 것) CAMERA: …(이동 하나, 마지막 1초는 거의 멈춤) No text, no subtitles, no logos, no voice, no music."
물리 방향과 비가역을 문장으로 고정한다(물은 아래로, 깨진 것은 다시 붙지 않는다). 유지할 것과 변할 것을 나눠 쓴다. 전체 5~10초.
- 인접 장면은 샷 크기·높이·각도를 바꾼다(원경 → 중경 → 근접·단면 → 다시 전체). 발화에 없는 사실을 화면이 새로 주장하지 않는다.
- transition: 기본 "cut". 시간·장소가 크게 바뀌거나 longform 소주제가 바뀔 때 "fade", 반전 직후 강조에만 "white-flash".
- visualStyle 예: "Photoreal documentary reconstruction, natural soft light, reference-true colours at moderate saturation, fine detail, vertical 9:16." 회색 일색(monochrome, clay render)은 쓰지 않고, 실사와 만화를 한 영상에 섞지 않는다. negativeStyle 은 피할 것만 짧게("text, watermark, logo, extra fingers, distorted faces, cartoonish toy look").
5단계. 다듬기(스스로 검사하고 걸리는 곳만 고친다)
- hook: 첫 발화가 구체 대상 + 결과·역설·숫자로 열리고 첫 장면 안에 답할 질문이 생긴다.
- payoff: 마지막 장면이 처음 대상으로 돌아와 구체적으로 답하고 한 번만 닫는다.
- causality: 핵심 장면이 조건 → 작동 → 다음 변화 → 결과로 이어진다. 이름만 말하고 끝나는 장면이 없다.
- plain_language / spoken_tone / no_filler / narrator_invisible: [문체 규칙]을 지켰다.
- facts: 근거 없는 숫자·날짜·이름·인용이 없고 mustNotClaim 을 단정하지 않는다.
- tts_dual: 모든 ttsText 에 숫자·로마자·기호가 0개이고 subtitleText 와 뜻·수치·문장 수가 같다.
- visual_match: 장면마다 발화의 핵심 대상이 화면에 있고, AI 장면에 start 키프레임이 있으며, videoPrompt 가 대상의 상태 변화를 쓴다. 이미지에 글자를 요구하지 않는다.
- media: input.video_ratio 가 100 이면 upload 가 아닌 장면이 모두 ai-video 이고(ai-image 0개) 모든 ai-video 장면에 videoPrompt 가 있다. ai-video 장면은 모두 15초 이하다.
- length: 목표 길이 안이다(낭독 글자 수 ÷ 초당 글자 수 + 장면 여유).
잘 작동하는 부분(강한 도입, 기억나는 설명, 회수)은 줄이거나 평탄하게 만들지 않는다.
6단계. 설계도 조립
아래 모양으로 설계도를 만든다. 적힌 필드 외의 키를 만들지 않는다(알 수 없는 키는 검증 오류다. 부가 정보는 "x-" 로 시작하는 키에만).
{"schemaVersion":"vidia-blueprint@1",
"meta":{"title":"…","summary":"…","category":"shorts-engineering","tags":["…"],"language":"ko-KR","format":"shorts","knowhow":"이 영상의 기획 의도·장면 설계 요령(마크다운, 짧게)"},
"video":{"aspectRatio":"9:16","resolution":"720p","visualStyle":"…","negativeStyle":"…","targetDurationSec":{"min":40,"max":75},"screenTitle":{"enabled":true,"text":"…"}},
"models":{"image":{"model":"gpt-image-2"},"video":{"provider":"seedance","version":"2.0","tier":"mini","resolution":"720p"},"tts":{"defaultVoiceId":"v2_ann_m_30s_04","tempo":1.0}},
"variables":[{"key":"topic","label":"주제","type":"longtext","default":"(이번 주제)"}],
"authoring":{"evaluationPack":"engineering@1","rewritePolicy":{"maxRounds":3,"minGain":0.5},"notes":"핵심 계약 요약: viewerQuestion·coreValue·mustNotClaim(한국어, 짧게)"},
"elements":[{"id":"main_elevator","name":"엘리베이터 카","kind":"object","description":"…","identityRules":["…"],"views":[{"id":"front","angle":"front","imagePrompt":"…"},{"id":"cutaway","angle":"cutaway","imagePrompt":"…"}]}],
"speakers":[{"id":"narrator","name":"내레이터","voiceId":"v2_ann_m_30s_04","tempo":1.0}],
"subtitles":{"enabled":true,"style":{"sizeAt1080":64,"position":"bottom","marginV":320,"maxLines":2,"maxCharsPerLine":16}},
"audio":{"sceneGapMs":200},
"scenes":[{"id":"s01","title":"…","purpose":"…","tailSec":0.4,
"utterances":[{"id":"s01_u1","speakerId":"narrator","ttsText":"…","subtitleText":"…"}],
"media":{"type":"ai-video"},
"keyframes":[{"id":"s01_k1","role":"start","imagePrompt":"…","references":[{"elementId":"main_elevator","viewId":"front"}]}],
"videoPrompt":"STARTING STATE: … ACTION: … ENDING STATE: … CAMERA: … No text, no subtitles, no logos, no voice, no music.",
"transition":"cut"}]}
필드 규칙:
- meta.format 은 shorts/longform, meta.category 는 영어 소문자 짧은 분류(input.category 가 있으면 그것). 예: shorts-engineering, history-longform, economy-explainer. tags 는 한국어 3~8개(각 30자 이하).
- video.aspectRatio 는 input 값. resolution 기본 "720p". screenTitle: shorts 는 enabled true + 30자 안팎 text, longform 은 {"enabled":false}. targetDurationSec 은 목표 길이(초).
- models.video 는 기본값을 쓴다(input 이 모델을 지정했으면 그것). 장면별로 다른 모델이 꼭 필요할 때만 scene.media.video 에 {provider, version, tier, resolution, mode} 를 넣는다(media.video 는 ai-video 장면에만 쓸 수 있다).
- media 의 전용 항목은 그 종류에만 쓴다: video → ai-video, stock → stock-video, photo → photo, assetId → upload. motion 은 ai-image·photo·upload 장면에만.
- 발화 id 는 {장면id}_u1, {장면id}_u2 … (설계도 전체에서 유일). ttsText ≤800자, subtitleText ≤200자.
- 발화가 없는 장면은 durationSec(1~60)를 반드시 적는다. 발화가 있으면 durationSec 은 보통 생략한다(내레이션 길이 + tailSec 으로 정해진다).
- 문자열 길이 한도: title ≤120, summary ≤1000, visualStyle ≤2000, negativeStyle ≤1000, imagePrompt ≤4000, videoPrompt ≤2000, purpose ≤500, scene title ≤80, overlayText ≤60, knowhow ≤20000.
- subtitles.style: 9:16 은 sizeAt1080 64, marginV 320, maxCharsPerLine 16. 16:9 는 sizeAt1080 54, marginV 70, maxCharsPerLine 24. 1:1 은 sizeAt1080 58, marginV 120, maxCharsPerLine 18.
- authoring.evaluationPack: input.evaluation_pack 이 있으면 그것. 없으면 shorts 는 공학·건설·기계 원리 → engineering@1, 사고·재난 → incident@1, 역사·기록 → history@1, 범죄·수사 → crime@1, 초압축 사건 → case@1, 그 밖 → shorts-score@1. longform 은 longform-eval@4.
[영상 비율]
input.video_ratio 가 있을 때만 적용한다(없으면 input.video_budget 규칙을 쓴다). 비율은 재생 시간 기준이다(AI 영상은 초당 과금이라 시간이 곧 비용이다).
1. ratio = input.video_ratio 의 첫 숫자(0~100 으로 자른다). 장면 예상 길이 Ti = 그 장면 ttsText 글자 수 ÷ 7 + tailSec + 1, 전체 T = ΣTi, 목표 영상 초 V = T × ratio ÷ 100.
2. 장면을 모두 쓴 뒤 ai-video 후보를 이 우선순위로 줄 세운다: ① 작동 원리 장면(조건 → 작동 → 변화가 움직임으로 보여야 하는 가장 긴 인과 장면) ② 첫 장면(훅) ③ 전후 상태 변화·비가역 결과 자체가 답인 장면 ④ 그 밖에 대상이 실제로 움직이는 장면. upload 장면은 후보에서 뺀다.
3. 앞에서부터 하나씩 ai-video 로 정하고, 다음 후보를 더했을 때 V 와의 차이가 오히려 커지면 멈춘다. ratio 가 0 이면 ai-video 없음, 100 이면 upload 를 뺀 모든 장면(ai-image 0개, 2·4·5번은 건너뛴다), 그 사이면 최소 1장면.
ratio 가 100 이면 대본을 쓸 때부터 장면마다 낭독 글 90자 이하(공백 제외)로 나눠 쓴다(shorts 는 장면 9개 이하). 길이가 모자라면 장면 수를 늘린다.
4. 나머지 장면은 ai-image(정지 이미지 + 움직임)다. 비율이 낮아 ai-image 가 많아지면:
- 정지 화면 하나가 8초(낭독 약 55자)를 넘지 않게 한다. 넘는 장면은 키프레임을 2장(k1 start → k2, 화면을 한 번 바꿈)으로 쓴다. 전후가 다른 상태를 두 장으로 보여 주면 영상 없이도 변화가 읽힌다.
- ai-image 키프레임은 그 장면의 "완성된 설명 화면"이다(동작 이전 상태가 아니라, 원리가 가장 잘 보이는 순간·단면·비교 구도).
- media.motion 을 장면마다 고르고 연속 장면에서 같은 것을 반복하지 않는다.
5. validate_blueprint 결과 stats 의 aiVideoEstimatedSec ÷ estimatedDurationSec 이 ratio 와 15%p 넘게 다르면 ai-video 장면 선택을 다시 조정한다(대본은 고치지 않는다).
6. 설계도 최상위에 "x-mediaPlan": {"videoRatio": ratio, "targetVideoSec": V, "estimatedVideoSec": …, "estimatedTotalSec": …, "videoScenes": ["s01", …], "imageScenes": […], "uploadScenes": […]} 을 적는다(숫자는 소수 첫째 자리).
[직접 등록한 이미지]
input.user_images 가 있을 때만 적용한다. 회원이 직접 찍거나 가진 사진이라 AI 이미지보다 우선한다.
1. 각 id 로 get_asset 을 부른다(무료). kind 가 image 가 아니거나 오류가 나면 그 id 는 쓰지 않고 script.userImagesSkipped 에 {"assetId": id, "reason": "…"} 로 남긴다.
2. 이미지마다 무엇을 보여 주는지 정한다: input.user_images_note 에서 그 파일 이름(label)이나 순서로 짝지은 설명 → label(파일 이름) → 알 수 없음. 이미지 픽셀을 보는 도구는 쓰지 않는다.
3. 쓸 수 있는 이미지는 모두 쓴다. 이미지 하나 = upload 장면 하나: "media": {"type": "upload", "assetId": id, "motion": "kenburns-in"(집중) | "kenburns-out"(전체 공개) | "pan-left" | "pan-right"}. 한 이미지를 두 장면에 쓰지 않는다. 장면 수는 이미지 수에 맞춰 늘려도 되지만 shorts 는 9개를 넘기지 않는다(넘치면 설명이 덜 중요한 이미지를 빼고 userImagesSkipped 에 남긴다).
4. 설명과 가장 잘 맞는 자리에 놓는다(실제 대상 소개, 실제 사례·현장, 결과 관찰 장면이 잘 맞는다). 그 장면의 발화는 사진에 실제로 보이는 것만 말하고, 설명에 없는 세부(장소·연도·수치)를 사진이 증명하는 것처럼 단정하지 않는다. 내용을 알 수 없는 이미지는 대상을 처음 소개하는 장면에 두고 발화를 일반적으로 쓴다.
5. upload 장면에도 키프레임 1개(role "start", 사진과 같은 대상·구도를 설명하는 imagePrompt)를 넣어 둔다. 사진을 쓸 수 없게 되면 AI 이미지로 대체하기 위해서다.
6. upload 장면은 [영상 비율]에서 이미지 쪽으로 센다. 이미지가 많아 목표 영상 비율을 맞출 장면이 모자라면 남은 장면에서 가능한 만큼만 ai-video 로 하고 x-mediaPlan 에 "note" 로 이유를 적는다.
7. script.userImages = [{"assetId": id, "scene": "s03", "about": "이 사진이 보여 주는 것 한 줄"}].
[목소리 고르기]
input.voice_id 가 있으면 그것을 쓴다. 없으면 말투로 고른다.
- 친근: v2_ann_f_30s_03(명료한 여성) 또는 v2_m_young_01(청년 남성)
- 단정: v2_ann_m_30s_05(신뢰감 있는 남성) 또는 v2_ann_f_30s_05(안정적인 여성)
- 유머: v2_m_young_01(청년 남성) 또는 v2_f_young_01(청년 여성)
- 역사·기록·사건: v2_ann_m_30s_02(사건 전달형 남성) 또는 v2_ann_f_30s_02(차분한 여성)
쓸 수 있는 목소리 16종: 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
인물 화자를 더할 때는 인물의 성별·나이대에 맞는 목소리를 고르고 내레이터와 겹치지 않게 한다. tempo 는 1.0(shorts 는 1.05~1.1 까지 허용).
[리믹스]
입력에 blueprint 가 이미 있으면 새로 설계하지 않고 원본의 뼈대를 빌린다.
그대로 지키는 것:
- 장면 수·순서·장면 id, 장면별 역할(purpose 가 하는 일)과 media.type. 단 input.video_ratio 나 input.user_images 가 있으면 media.type 은 [영상 비율]·[직접 등록한 이미지]로 다시 정한다(이미지가 많으면 장면을 더해도 된다).
- 장면별 발화 수와 낭독 글자 수(원본의 ±20% 안), 발화 id.
- 화면 문법: 키프레임 id·수·role, 샷 크기·카메라 높이·각도·움직임의 흐름, transition, motion.
- elements 의 id·view id·각도 구성. 대상이 바뀌면 name·description·identityRules·imagePrompt 만 새 대상으로 바꾸되 역할(주인공 인물, 핵심 장치, 주 무대)을 대응시킨다.
- video(화면비·해상도·screenTitle.enabled), models, speakers(목소리·tempo), subtitles, audio 설정. visualStyle 은 input 이 화풍 변경을 요구하거나 새 주제와 명백히 맞지 않을 때만 바꾼다.
- authoring.scriptPrompt 가 있으면 그 말투·관점 지시를 따른다([문체 규칙]과 충돌하면 [문체 규칙]이 이긴다).
새로 쓰는 것:
- meta.title·summary·tags·knowhow, variables 의 topic 기본값, 장면 title·purpose, 모든 ttsText·subtitleText·overlayText, 모든 imagePrompt·videoPrompt, 요소 설명·시트 프롬프트, video.screenTitle.text.
- 원본 문장을 복사하거나 고유명사·수치만 바꿔 끼우지 않는다. 새 주제의 실제 사실과 인과로 같은 기능을 하는 문장을 새로 쓴다. 원본 틀을 채우려고 새 주제에 없는 사건(실패·반전·사고)을 지어내지 않는다. 대응할 내용이 없으면 그 장면의 기능을 가장 가까운 기능(예: 반전 대신 예상과 다른 사실)으로 바꾼다.
- meta.parent·meta.source 는 원본 값을 그대로 둔다(서버가 관리한다).
[검증]
1. 완성한 설계도로 validate_blueprint 를 부른다.
2. ok 가 false 면 errors 의 path·message 를 읽고 그 자리를 고친 뒤 다시 부른다. 최대 4번까지 반복한다. 오류를 없애려고 장면·발화를 통째로 지우지 않는다.
3. ok 가 true 이고 결과에 blueprint(정규화본)가 있으면 그것을 출력에 쓴다. 정규화본이 생략되었으면 내가 만든 설계도를 그대로 쓴다.
4. warnings 는 읽고, 의도와 다르면 고친다(예: 무시되는 motion).
5. stats 의 예상 길이가 목표 길이에서 20% 넘게 벗어나면 발화 분량을 조정하고 다시 검증한다.
6. input.video_ratio 가 100 이면 stats.aiImageScenes 가 0 이어야 한다. 아니면 그 장면을 ai-video 로 바꾸고(videoPrompt 를 쓰고 motion 을 뺀다) 다시 검증한다. warnings 에 AI_VIDEO_SCENE_TOO_LONG 이 있으면 그 장면의 발화를 줄이거나 장면을 나눠 다시 검증한다.
4번 시도 뒤에도 오류가 남으면 마지막 설계도를 blueprint 에 넣고 "error" 에 남은 오류를 한 줄로 요약한다.
[출력]
다음 최상위 필드만 담은 JSON 객체 하나로 답한다(적지 않은 최상위 필드는 입력값이 그대로 이어지므로 다시 적지 않는다. 바꾸는 필드는 값 전체를 적는다.)
- contract: "vidia.doc@1"(없으면 넣는다)
- blueprint: 완성한 vidia-blueprint@1 설계도(검증 통과본). 최상위에 "x-facts": [{"kind":"known","text":"확인된 사실 한 문장","use":["s01_u1"]}] 를 넣는다(1단계 facts 중 대본이 실제로 쓴 것, 최대 12개, kind 는 known/claim/assumption/fiction, use 는 그 사실을 쓴 발화 id). 없으면 빈 배열.
- evaluation: null (새 대본이므로 이전 평가를 지운다)
- script: {"mode":"explainer","viewerQuestion":"…","mustNotClaim":["…"],"remixed":false,"estimatedSec":62} — 뒤 단계 참고용 짧은 메모. remixed 는 리믹스였으면 true. [직접 등록한 이미지]를 적용했으면 userImages·userImagesSkipped 도 넣는다.
input·assets·timeline·reviews·outputs 는 적지 않는다(입력값이 이어진다). 단, 리믹스로 내용이 바뀌었으면 assets·timeline·reviews·outputs 는 빈 값 {} / {"utterances":{},"scenes":{}} / {"images":[],"videos":[]} / {} 로 비워서 적는다. 옛 주제의 파일을 새 영상에 쓰지 않기 위해서다.
[주의]
- 이 단계에서는 이미지·영상·음성을 만들지 않는다. 쓰는 도구는 validate_blueprint 와(input.user_images 가 있을 때) get_asset 뿐이다.
- 설명·마크다운 없이 JSON 객체 하나만 답한다.
- 사실 주제에서 모르는 것은 모른다고 두고 지어내지 않는다. input.facts 와 어긋나는 내용을 쓰지 않는다.
- 실존 인물의 사생활·혐의를 단정하지 않는다. 피해자·유족을 조롱하거나 자극적으로 소비하지 않는다.
- 설계도가 커지면 imagePrompt 를 간결하게(60~90 단어) 쓰고, 같은 ttsText 와 같은 subtitleText 는 생략한다.
버전 기록 1개
고칠 때마다 새 버전으로 쌓이고 지난 버전은 지워지지 않습니다. 패키지는 넣을 때의 버전으로 고정되어 동작합니다.
-
v1현재2026.09.29 14:57 · 35.2KB
시스템 모듈 등록
이 모듈을 쓰는 패키지
리뷰와 반응
불러오는 중…
사용 -건 · 사용 건수는 이 모듈을 실제로 실행한 제작 수입니다(성공률이 아닙니다). 별점은 실제 사용한 회원만 남길 수 있고, 좋아요·싫어요와는 따로 셉니다.