본문으로 건너뛰기
VIDIA고수의 노하우로 만드는 영상

생활 드라마 숏츠 대본

대본작성

비디아 · v1 · 0회 사용 · 패키지 3개

사연 하나로 1인칭 썰 재연 숏츠의 대본·인물 시트·장면 설계도를 씁니다.

설명서

하는 일 이웃·가족·직장·가게에서 벌어진 갈등을 주인공이 1인칭으로 들려주는 각색 재연 숏츠 설계도를 씁니다. 한눈에 보이는 갈등 구도, 세 번 쌓이는 빌런의 무례, 제3자 앞에서 물증으로 터지는 반전, 그 자리에서 숫자로 끝나는 사이다, 댓글이 갈릴 지점을 설계합니다.

화면 input.media_mix 로 AI 이미지만(장면당 키프레임 1~3장 + 켄번즈) / AI 영상 + AI 이미지(input.video_ratio, 재생 시간 기준) / AI 영상만을 고릅니다. 실사·웹툰·실사+웹툰 전환(매치컷) 화풍을 지원합니다.

인물 대사가 있는 인물마다 정본 시트(요소)와 성별·연령대에 맞는 목소리를 따로 둡니다. 내레이터와 인물 대사를 발화 단위로 나눕니다.

출력 blueprint(검증 통과 설계도, 평가 팩 life-drama@1), script(기획 메모). 이전 파일·평가는 지웁니다.

비용 에이전트 LLM 토큰만 듭니다(검증 도구 무료).

지시서(스킬 txt)

txt 내려받기
[이 모듈이 하는 일]
생활 드라마 숏츠(이웃·가족·직장·가게·집주인에게서 벌어진 갈등을 당사자가 1인칭으로 들려주는 각색 재연 썰) 한 편의 설계도(vidia-blueprint@1)를 쓴다.
대본(내레이터 서술 + 인물 대사), 인물·장소·물건 정본 시트, 장면별 키프레임 이미지 프롬프트, (AI 영상 장면이면) 영상 프롬프트, 인물별 목소리, 자막 설정을 모두 채운다.
장면 화면은 input.media_mix 가 정한다: AI 이미지만 / AI 영상 + AI 이미지 / AI 영상만.
이 장르에서 조회수를 가른 것은 한눈에 보이는 갈등 구도, 물증으로 터지는 반전, 그 자리에서 남들 앞에서 숫자로 끝나는 사이다, 현실적인 입말, 댓글에서 편이 갈릴 지점이다. 이 다섯 가지를 설계의 뼈대로 삼는다.

[입력]
이전 단계 JSON(보통 vidia.doc@1). 없는 값은 기본값을 쓴다.
- input.topic: 사연·소재(필수). 비어 있으면 설계도를 만들지 말고 "error" 에 "사연을 입력해 주세요." 를 적는다.
- input.media_mix: 화면 구성. "AI 이미지만" / "AI 영상 + AI 이미지" / "AI 영상만". 없으면 input.video_ratio 가 있으면 "AI 영상 + AI 이미지", 없으면 "AI 이미지만".
- input.video_ratio: AI 영상 비율(예: "40%", 재생 시간 기준). media_mix 가 "AI 영상 + AI 이미지" 일 때만 쓴다. 없으면 40.
- input.target_seconds: 목표 길이(초). 없으면 90. 60~150 으로 자른다.
- input.art_style: 화풍. "실사+웹툰 전환"(기본) / "실사 재연" / "웹툰".
- input.narrator_voice: 주인공(내레이터) 목소리. "자동"(기본) / "여성" / "남성".
- input.sound: AI 영상 현장음. "켜기" / "끄기"(기본). media_mix 에 AI 영상이 없으면 무시한다.
- input.notes: 제작 메모(방향·금지사항). 가장 먼저 따른다.
- blueprint·evaluation: 이미 있어도 이 모듈은 새로 쓰는 단계이므로 무시하고 처음부터 쓴다.

[할 일]
작업은 여섯 단계로 머릿속에서 진행하고, 결과는 설계도 하나로만 낸다. 1~2단계 메모는 출력하지 않는다(요약만 x-drama 에 남긴다).

1단계. 이야기 계약(출력하지 않는 메모)
1. 이 편은 각색 재연이다. 회원이 준 사연을 바탕으로 인물·장소·금액·시각을 재구성한다. 실존 인물·회사·가게 이름, 차량 번호, 주소, 실제 날짜를 쓰지 않는다.
2. 갈등 구도 하나를 고른다: 무시당하던 쪽의 반격 / 거짓말이 물증으로 뒤집힘 / 뻔뻔한 요구가 제 발등을 찍음 / 선의가 이용당했다가 되돌려받음. 시청자가 첫 5초에 "어떤 싸움인지" 알아보게 한다. "숨은 재벌·건물주·회장이었다", "하대하던 청소부의 정체" 같은 너무 흔한 구도를 쓰면 인물 관계·발각 방식·응징 수단 가운데 하나를 반드시 비튼다.
3. 세 줄을 확정한다.
   - hook: 결과를 먼저 던지는 한 문장. 분위기·감정 형용사가 아니라 빌런의 얄미운 대사 한 줄이나 말이 안 되는 물증 하나(예: "누가 제 차 보닛 위에 참치캔을 올려두고 갔습니다.").
   - payoff: 마지막에 회수할 한 문장. 훈계가 아니라 대비나 물음으로 끝낸다.
   - title: 상황을 압축한 한 줄(40자 이내). 범인·수법·정체를 말하지 않는다. "전기료가 뛰었다"는 되고 "충전은 옆집이 했다"는 안 된다.
4. 인물: 주인공(=내레이터, 1인칭), 빌런 1명, 물증을 읽거나 목격하는 제3자 1명(중개사·손님·가족·기사·관리소장 등), 필요하면 주변 인물 1~2명. 인물마다 성별·연령대(10대~60대)·말버릇 하나를 정한다. 제3자가 그 자리에 있는 이유를 앞에서 한 줄 깔아 둔다(우연한 등장 금지).
5. 빌런의 얄미움 세 단계: 사소한 무례 → 반복 → 선 넘는 한마디. 선 넘는 한마디는 결말에서 그대로 되돌려준다. 빌런에게도 한 줌의 사정을 준다("그래도 너무했다"가 나오게).
6. 물증: 문자·영수증·사진·계량기·녹음·블랙박스·택배 송장처럼 눈에 보이는 물건 하나. 반전은 고백이 아니라 이 물증이 제3자 앞에서 드러나며 터진다.
7. 숫자 세 개 이상: 금액·시각·횟수·기간(예: "석 달", "밤 열한 시", "삼천 원 아끼려다 육만 원"). 숫자는 리얼함과 사이다를 만든다.
8. 조마조마 구간 하나(10~20초 분량): 전화가 연결되는 동안, 문이 열리기 직전, 물증을 꺼내기 직전. 위협·공포를 길게 끌지 않는다.
9. 웃음 포인트 하나: 구경꾼의 한마디, 허세가 무너지는 아이러니, 짧게 끊어 치는 대사.
10. 댓글이 갈릴 지점 하나: 주인공 대응이 과했나, 가족인데 이렇게까지 해야 했나, 나라면 돈을 받았을까. 성별·세대·지역·직업 집단을 혐오로 갈라치지 않는다 — 다투게 할 것은 "이 상황에서 누가 선을 넘었나"이다.
11. 결말은 법적 확정으로 만들지 않는다. 없는 판결·형사처벌·수사 결과·배상 확정을 붙이지 않는다. 과태료·위약금·환불·퇴거·망신·관계 정리는 된다.

2단계. 비트(장면) 설계(출력하지 않는 메모)
- 목표 길이 T = input.target_seconds(기본 90). 장면 수는 T ÷ 8 을 반올림해 8~14개(60초 8개, 90초 10~11개, 120초 12~13개, 150초 14개). 한 장면 5~15초, 평균 7~9초.
- 한 장면 낭독 글(그 장면 모든 발화 ttsText 합)은 공백 포함 105자 이하(AI 영상 한 번의 최대 길이 15초에 맞추기 위해서다).
- 비트 뼈대(칸 채우기가 아니라 흐름이다):
  1: 결과를 먼저 보여 준다. 핵심 단서 하나를 화면에 박는다(hook).
  2~3: 시간을 되돌려 평소 상태를 세운다. 인물 관계·숫자·배치(몇 층, 주차칸 몇 개, 몇 달째)를 여기서 고정한다. 제3자가 나중에 그 자리에 있을 이유를 깐다.
  4~5: 이상한 것을 발견한다. 빌런의 무례가 반복된다.
  6~8: 원인을 확인한다. 물증이 제3자 앞에서 드러나며 반전이 터진다. 조마조마 구간은 이 직전에 둔다.
  9~10: 대면한다. 빌런은 한 번 버티다가 물증 앞에서 무너진다. 사이다는 그 자리에서, 남들 앞에서, 숫자로. 빌런의 선 넘는 한마디를 그대로 되돌려준다.
  마지막: 첫 장면과 같은 대상·같은 구도로 돌아와 payoff 한 문장으로 닫는다.
- 장면마다 새로 드러나는 정보가 하나 있다(앞 장면과 같은 정보를 반복하지 않는다). 장면 purpose 에 "이 장면에서 새로 드러나는 것"을 한 줄로 적는다.
- 반전의 답은 전체의 40% 이전에 말하지 않는다.
- 곁가지 사건을 동시에 벌이지 않는다. 평범한 일상으로 조용히 시작해 반전 하나를 깔끔하게 터뜨리고 짧게 끝낸다.
- 장면 id 는 s01, s02 … 순서로.

3단계. 대본(발화) 쓰기
- 내레이터(id "narrator")는 주인공 본인이다. 가까운 사람에게 털어놓듯 1인칭 존댓말 구어체로 서술한다("~했거든요", "~더라고요", "~했어요", "~죠"). 합쇼체("~습니다")는 hook·결정적 문장에만 섞고 전체의 40%를 넘기지 않는다. 글말 종결("~했다")은 쓰지 않는다.
- 인물의 실제 대사·속마음은 서술과 한 발화에 섞지 않는다. 따로 나눠 그 인물의 speakerId 로 지정한다. 대사 앞뒤에 인물 이름·감정 지시("라고 화를 냈어요" 처럼 대사를 읽는 서술)를 붙이지 않는다. 누가 말하는지는 앞 서술과 목소리로 알게 한다.
  예: {"speakerId":"narrator","ttsText":"그때 옆집 아주머니가 문을 열고 나오셨어요."} → {"speakerId":"neighbor","ttsText":"아니 그게… 일단 올린 거고."}
- 대사는 짧게 끊어 치는 입말이다. 말끝이 흐려지는 말("아니 그게…"), 말버릇, 금액·물건 이름이 들어간 대사가 리얼함을 만든다. 매끈한 요약체·보고문은 쓰지 않는다.
- 대사 비율은 전체 발화의 20~45%. 빌런 대사 최소 3줄(얄미움 세 단계), 제3자 대사 최소 1줄(물증을 읽거나 한마디 하는 순간).
- 한 발화 = 한 문장(종결부호 하나), 60자 안팎 이하. 따옴표를 쓰지 않는다(대사는 speakerId 로 구분한다).
- 첫 발화는 hook 이다. 인사·자기소개·"제 이야기 좀 들어 보세요" 로 시작하지 않는다.
- 절차·해명 문장을 쓰지 않는다: "안전하게 정리하도록 요청했습니다", "서로 동의해 연락처를 주고받았습니다", "단순히 우기지 않으려고 보관했습니다"처럼 주인공의 신중함을 변호하는 문장. 설명이 두 문장을 넘으면 장면이나 숫자 한 줄로 바꾼다.
- 마지막 20초에 "환불했습니다·정리됐습니다·조사가 진행됐습니다" 같은 보고문으로 끝내지 않는다. 빌런이 무너지는 순간과 치른 대가를 장면으로 쓴다(스피커폰으로 온 가족이 듣는다, 목격자가 한마디 한다, 금액이 대비된다).
- 마지막 문장은 교훈·훈계·구독 요청이 아니다. 첫 장면의 물건·대사로 돌아온 대비, 또는 판단을 시청자에게 넘기는 물음 한 문장.
- 금지: 구독·좋아요·알림·링크 언급, "여러분", 채널명, "이 이야기는 실화입니다" 같은 실화 단정, 생성한 화면을 "실제 블랙박스 원본·실제 증거 사진"이라고 부르는 말(이야기 속 인물이 "블랙박스를 봤다"고 말하는 것은 된다).

[낭독 글(ttsText)과 자막 글(subtitleText)]
- ttsText 는 음성이 그대로 읽는 글이다. 아라비아 숫자·로마자·기호(% ~ / : + - × · 괄호)를 하나도 남기지 않고 실제 발음대로 한글로 쓴다.
- subtitleText 는 화면 글이다. 숫자를 써도 되고 한 줄 16자 안팎·두 줄 이내. 두 글은 사실·수치·어순·문장 수가 같아야 한다. 두 글이 글자까지 같으면 subtitleText 를 생략한다. 자막에 화자 이름을 붙이지 않는다.
- 숫자 읽기: 개·명·대·마리·살·번(횟수)·시(시각)·시간·달 앞의 1~99는 고유어("주차칸 8개"→"주차칸 여덟 개", "3달"→"석 달", "4마리"→"네 마리", "21살"→"스물한 살"), 층·원·년·월·일·분·퍼센트와 큰 수는 한자어("1층"→"일 층", "16세대"→"십육 세대", "60,000원"→"육만 원", "6월"→"유월", "10월"→"시월").
- "보닛·블랙박스·택배·관리비" 같은 일반 단어는 그대로 쓴다. 영어 약어는 발음대로("CCTV"→"씨씨티비").
- pauseAfter: 반전 직전·사이다 직전 발화에만 "strong", 대사가 빠르게 오가는 곳은 "micro", 나머지는 생략.

4단계. 화면 연출(모든 프롬프트는 영어)
A. 장면 매체(media) — input.media_mix 에 따라 정한다.
- "AI 이미지만": 모든 장면이 {"type":"ai-image","motion":"…"}. AI 영상을 만들지 않으므로 videoPrompt 를 쓰지 않는다.
  - 장면 안 화면이 바뀌어야 이야기가 읽힌다. 장면 길이(낭독 글자 수 ÷ 7 + 1초)가 7초를 넘으면 키프레임 2장, 11초를 넘으면 3장(k1 role "start", k2 role "change", k3 role "end")으로 나눠 행동의 전후·반응 컷을 시간순으로 보여 준다. 키프레임에 atSec 을 적지 않으면 장면 길이를 똑같이 나눈다.
  - motion 은 kenburns-in(단서·표정 집중) / kenburns-out(상황 전체 공개) / pan-left·pan-right(복도·주차장처럼 넓은 공간) / none 가운데 고르고, 연속 장면에서 같은 것을 반복하지 않는다.
- "AI 영상 + AI 이미지": 영상 비율 ratio = input.video_ratio 의 첫 숫자(기본 40, 0~100 으로 자른다). 장면 예상 길이 Ti = 그 장면 ttsText 글자 수 ÷ 7 + tailSec + 1, 전체 T = ΣTi, 목표 영상 초 V = T × ratio ÷ 100.
  - ai-video 후보 우선순위: ① 첫 장면(hook: 결과·단서가 움직임으로 보이는 장면) ② 반전 장면(물증이 제3자 앞에서 드러나는 순간) ③ 사이다 장면(빌런이 무너지는 순간) ④ 인물이 실제로 움직이는 행동 장면(물건을 놓는다, 문을 연다, 휴대전화를 내민다). 앞에서부터 하나씩 ai-video 로 정하고, 다음 후보를 더했을 때 V 와의 차이가 오히려 커지면 멈춘다. ratio 가 0 초과면 최소 1장면.
  - 나머지 장면은 위 "AI 이미지만" 규칙의 ai-image 다(키프레임 1~3장, motion).
- "AI 영상만": 모든 장면이 {"type":"ai-video"}. ai-image 장면을 만들지 않는다.
- 영상 장면 공통: 한 장면에 행동 하나, 카메라 변화 최대 하나. "캔을 놓는다"와 "고양이가 올라온다"는 다른 장면이다. 한 장면 낭독 글 105자 이하(15초 이하)를 지킨다.
- 블랙박스·CCTV 형식 장면은 카메라를 절대 움직이지 않는다(고정 화각 SHOT 하나, 카메라 동사 없음). 그 화각에서 보이지 않는 접촉은 블랙박스인 척 이어 붙이지 않고 별도 재연 장면으로 나눈다.

B. 화풍(video.visualStyle 과 장면별 스타일 문장)
- input.art_style 이 "실사 재연": video.visualStyle = "Photorealistic fictional reenactment of an ordinary Korean everyday situation: real low-rise housing, apartments, parking areas, shops and offices, real daylight or practical indoor light, natural lens perspective, restrained acting, no cinematic colour grading, reference-true colours at moderate saturation. Vertical 9:16 frame. Ordinary people in ordinary clothing; no exaggerated expressions, no violence, no caricature."
- "웹툰": video.visualStyle = "2D Korean webtoon-inspired cel animation of an ordinary Korean everyday location: clean line work, flat colour fills with one shadow step, grounded detailed backgrounds, restrained but readable facial acting, consistent character designs. Vertical 9:16 frame."
- "실사+웹툰 전환"(기본): 발견·블랙박스·피해 흔적·현장 재연 장면은 실사, 사람끼리 대치·모임·대면·결말 장면은 웹툰으로 한 편 안에서 바꾼다.
  - video.visualStyle 에는 공통 조건만 둔다: "Vertical 9:16 frame of an ordinary Korean everyday situation, reference-true colours at moderate saturation, consistent character identities, clothing, object counts and spatial layout across every frame."
  - 각 키프레임 imagePrompt 첫 문장을 그 장면의 화풍 문장으로 시작한다: 실사 장면 "Photorealistic fictional reenactment, real daylight, natural lens perspective, restrained acting." / 웹툰 장면 "2D Korean webtoon cel animation, clean line work, flat colour fills with one shadow step, grounded background." 영상 프롬프트의 Style 줄에도 같은 문장을 쓴다(앞 장면의 화풍은 이어지지 않는다).
  - 화풍이 바뀌는 곳은 매치컷으로 잇는다: 직전 화면의 물체를 다음 화면에 그대로 이어 준다(실사 피해 사진 → 웹툰 인물이 들고 있는 휴대전화 화면). 전환 장면 transition 은 "cut". 내레이션에 "이제 만화로" 같은 제작 지시를 읽지 않는다.
- video.negativeStyle: "text, letters, captions, speech bubbles, watermark, logo, licence plate, readable signage, distorted faces, extra fingers, extra people, caricature, gore".

C. 정본 시트(elements) — 인물·물건이 컷마다 달라지지 않게 하는 핵심
- 두 장면 이상 나오는 인물·장소·물건·차량·피해 흔적을 한 번 정의한다. 대사가 있는 인물(내레이터 포함)은 모두 kind "person" 요소가 있어야 한다. 3~6개가 보통이다.
- id 는 영어 소문자 스네이크(neighbor_woman, parcel_box). name 은 한국어 2자 이상(장면 문장에서 이 이름으로 찾는다). description 은 한국어 한 줄.
- identityRules(한 줄씩, 3~6개):
  - 인물: 나이대·체형 / 머리 모양·색 / 상의·하의 색과 형태 / 얼굴 고정 특징(안경·점) / 늘 지니는 물건.
  - 물건·차량: 형태·색·재질·개수·표식 없는 외형(번호판·상표 글자 없음).
  - 피해 흔적: 위치·방향·길이(긁힘은 운전석 쪽 앞문 아래에서 뒤로 한 줄 등). 사진·재연·웹툰 화면에서 모두 같아야 한다.
  - 장소: 벽·화단·주차칸·현관문의 상대 위치와 개수.
- views 2~3개. 가장 알아보기 쉬운 각도를 첫 번째로 둔다(뒤 구도는 첫 구도를 참조해 같은 대상이 된다). 인물 front + three_quarter, 장소 front + top(배치), 흔적 closeup. 같은 angle 을 두 번 쓰지 않는다.
- view imagePrompt 는 그 대상만 그린다(사건·연기 없이, 전체가 보이게, 밝은 무지 배경의 설정 시트. 장소는 사람 없이). "실사+웹툰 전환" 이면 인물 시트는 실사로 그린다("photorealistic character reference").
- 블랙박스·CCTV 장면이 두 번 이상이면 그 화각 자체를 kind "other" 요소로 정본화한다(같은 구도 유지).
- speakers[].elementId 에 그 인물 요소 id 를 적는다.

D. 키프레임(keyframes)
- 모든 장면에 1개 이상. 첫 키프레임 role "start", id {장면id}_k1, _k2, _k3(설계도 전체에서 유일).
- imagePrompt 순서(60~100 단어): (전환 모드면 화풍 문장) → 주 피사체와 정확한 외형 → 지금 상태·행동 한 가지 → 공간·배경(바닥·벽·주변 구조) → 인물·물건의 상대 위치와 개수 → 카메라(샷 크기·높이·각도) → 조명.
- ai-video 장면의 start 는 "행동 이전" 상태다. 움직일 방향에 여유를 두고, 행동하는 인물·물건도 처음부터 화면 안에 둔다. ai-image 장면의 키프레임은 그 순간이 가장 잘 읽히는 완성된 화면(단서가 보이는 순간, 표정·반응, 물증을 내미는 손)이다.
- 대화 장면은 말하는 사람과 듣는 사람을 한 화면에 정면으로 나란히 두지 않는다: 어깨 너머 샷, 반응 컷, 휴대전화를 든 손, 뒷모습. 입 모양이 크게 보이는 정면 클로즈업을 피한다(목소리는 음성으로 따로 들어간다).
- 이미지 안에 글자·숫자·간판 문구·말풍선·번호판을 그리지 않는다. 문자·영수증·서류·휴대전화 화면은 "text-free blurred message bubbles"처럼 글자 없는 흐린 질감으로 그린다. 끝에 "no text, no letters, no speech bubbles, no logos, no watermark" 를 붙인다.
- 화면 아래 25%는 자막이 덮는다. 단서(캔·긁힘·휴대전화 화면)와 얼굴은 위쪽 75% 중앙에 두고, 아래는 바닥·도로·책상처럼 무엇이 자연스럽게 이어지는지 긍정문으로 쓴다("비워 둔다"라고 쓰지 않는다).
- 수량·배치(주차칸 수, 캔 수, 층)는 내레이션의 숫자와 같게 그린다.
- references: 그 키프레임에 보이는 요소를 최대 3개 {elementId, viewId}로 붙인다(인물을 먼저). imagePrompt·장면 purpose·발화에 요소 name 이 나오면 반드시 붙인다. 한 화면에 요소가 4개 이상이면 둘째 키프레임으로 나눠 붙인다.
- referenceKeyframeIds: 같은 장소·같은 시각을 이어받을 앞 키프레임(최대 2개). 시간이 건너뛰거나 화풍이 바뀌면 쓰지 않는다.
- 미성년자를 인물로 그리지 않는다(아이가 나오는 사연이면 뒷모습·손·소지품으로만). 폭력·유혈·조롱 연출 금지.

E. 영상 프롬프트(ai-video 장면만, 영어, 1,200자 안팎 이하) — 시작 이미지 뒤의 변화만 쓴다.
"image 1 is <시작 화면의 주 피사체 한 줄>. Keep it identical.
Style: <그 장면의 화풍 문장>.
Character lock: <등장 인물마다 나이대·머리·옷 색 한 줄. 인물이 없으면 등장 물건의 외형·개수>.
STARTING STATE: <처음 보이는 인물·물건·수량·위치>.
ACTION: <주체가 어느 가장자리에서 들어와 어디까지 무엇을 하는지, 무엇과 접촉하는지 구체 동사로. 행동 하나>.
ENDING STATE: <끝에 남는 상태와 유지할 것>.
CAMERA: <카메라 변화 하나, 대면 장면은 over-shoulder·reaction cut 까지. 블랙박스·CCTV 형식은 'fixed camera, no movement'. 마지막 1초는 거의 멈춤>.
<소리 줄 — 아래 F>
No text, no speech bubbles, no on-screen writing, no logos, no licence plates, no extra characters."
- 카메라만 움직이는 프롬프트는 실패다. 줌·팬만으로 장면을 채우지 않는다.
- 인물이 말하는 입 모양을 크게 만들지 않는다(대사는 음성으로 따로 들어간다). "mouth closed or turned away from camera while the line is heard" 처럼 쓴다.
- 흔적·흙·물건이 새로 생기면 원인 물체의 출처·이동 경로·접촉 지점·남는 결과를 쓴다. 이미 있는 흔적은 위치·윤곽이 변하지 않는다고 고정한다.
- 장면마다 사건을 "x-event" 로 남긴다: {"target": "대상(영어)", "before": "전 상태", "after": "후 상태"}.

F. 소리(models.video.audio)
- media_mix 에 AI 영상이 있고 input.sound 가 "켜기" 면 models.video.audio 를 true 로 두고, 영상 프롬프트에 "SOUND: ambient only — <환경·재질 소리 한 줄, 예: car door closing in a parking garage, distant traffic>. No voices, no dialogue, no singing, no music." 줄을 넣는다(목소리는 음성 단계가 따로 넣는다).
- 그 밖에는 models.video.audio 를 false 로 두고 소리 줄을 넣지 않는다.

G. 그 밖
- transition 기본 "cut". 시간이 크게 건너뛸 때만 "fade", 반전이 터진 직후 한 번만 "white-flash".
- video.screenTitle: enabled true, text 는 30자 안팎의 상황 한 절 + 궁금증 한 절(스포일러 금지). 핵심 낱말 하나를 **노랑**으로, 분노·반전 낱말이 있으면 하나만 !!빨강!!으로 감싼다. 예: "석 달째 **택배**가 사라진 !!진짜 이유!!".

[목소리 고르기]
- 쓸 수 있는 목소리: 여성 v2_f_teen_01(10대) v2_f_young_01(20대) v2_ann_f_30s_01~05(30대, 40·50대 여성에도 쓴다) v2_f_senior_01(60대) / 남성 v2_m_teen_01(10대) v2_m_young_01(20대) v2_ann_m_30s_01 v2_ann_m_30s_02 v2_ann_m_30s_04 v2_ann_m_30s_05(30대) v2_m_mid_01(40·50대) v2_m_senior_01(60대).
- 내레이터: input.narrator_voice 가 "여성"이면 주인공 연령대의 여성 목소리(30대면 v2_ann_f_30s_03), "남성"이면 남성 목소리(30대면 v2_ann_m_30s_04), "자동"이면 사연의 화자 성별로 정한다(알 수 없으면 v2_ann_f_30s_03).
- 인물마다 성별·연령대에 맞는 목소리를 고르고, 내레이터와 다른 목소리를 쓴다. 같은 성별·연령대 인물이 둘이면 서로 다른 목소리를 쓴다. 한 인물의 목소리는 끝까지 바꾸지 않는다.
- speakers[].name 은 "주인공(내레이터)", "옆집 아주머니(50대 여성)"처럼 역할과 성별·연령대를 적는다. tempo 는 내레이터 1.05, 인물 1.0~1.1.
- 화자는 내레이터 포함 최대 6명. 화자 수를 늘리려고 간접화법까지 대사로 바꾸지 않는다.

5단계. 다듬기(스스로 검사하고 걸리는 곳만 고친다)
- 제목만 읽고 결말이 짐작되는가(되면 실패).
- 첫 발화가 얄미운 대사나 말이 안 되는 물증인가. 첫 5초에 어떤 싸움인지 보이는가.
- 빌런의 무례가 세 번 쌓이고, 선 넘는 한마디가 결말에서 되돌아오는가.
- 반전이 물증으로, 제3자 앞에서 터지는가. 제3자가 그 자리에 있는 이유가 앞에 있는가. 빌런이 한 번은 버티는가.
- 마지막 20초에 보고문이 없고 빌런이 남들 앞에서 무너지는 장면이 있는가. 없는 판결·처벌을 붙이지 않았는가.
- 금액·시각 같은 숫자가 세 개 이상인가. 조마조마 구간·웃음 포인트·댓글이 갈릴 지점이 하나씩 있는가.
- 모든 대사가 해당 인물 speakerId 로 분리됐고, 한 발화가 한 문장인가.
- 모든 ttsText 에 숫자·로마자·기호가 0개이고 subtitleText 와 뜻·수치·문장 수가 같은가.
- 인물·물건이 나오는 모든 키프레임에 references 가 있고, 수량·흔적 위치가 장면마다 같은가.
- media_mix 규칙대로 매체를 배정했는가(AI 이미지만이면 ai-video 0개, AI 영상만이면 ai-image 0개). 영상 장면에 카메라만 움직이는 프롬프트가 없는가.
- 이미지·영상 프롬프트에 글자·말풍선·번호판·실명·주소를 요구한 곳이 없는가.
- 길이: 전체 낭독 글자 수 ÷ 7 + 장면 수 × 0.8 ≈ 목표 초(±15%). 장면마다 낭독 글 105자 이하.

6단계. 설계도 조립
아래 모양으로 설계도를 만든다. 적힌 필드 외의 키는 만들지 않는다(부가 정보는 "x-" 로 시작하는 키에만).
{"schemaVersion":"vidia-blueprint@1",
 "meta":{"title":"…","summary":"실제 사연을 바탕으로 각색한 재연입니다. …(2~3문장)","category":"shorts-life-drama","tags":["생활 드라마","썰","…"],"language":"ko-KR","format":"shorts","knowhow":"갈등 구도·물증·사이다·댓글 포인트 설계 요약(마크다운, 짧게)"},
 "video":{"aspectRatio":"9:16","resolution":"720p","visualStyle":"…","negativeStyle":"…","targetDurationSec":{"min":…,"max":…},"screenTitle":{"enabled":true,"text":"…"}},
 "models":{"image":{"model":"gpt-image-2","size":"1024x1536"},"video":{"provider":"seedance","version":"2.0","tier":"mini","resolution":"720p","audio":false},"tts":{"defaultVoiceId":"v2_ann_f_30s_03","tempo":1.05}},
 "variables":[{"key":"topic","label":"사연","type":"longtext","default":"(이번 사연)"}],
 "authoring":{"evaluationPack":"life-drama@1","rewritePolicy":{"maxRounds":3,"minGain":0.5},"notes":"hook·payoff·갈등 구도·물증·댓글 포인트 요약(한국어, 짧게)"},
 "elements":[{"id":"neighbor_woman","name":"옆집 아주머니","kind":"person","description":"…","identityRules":["…"],"views":[{"id":"front","angle":"front","imagePrompt":"…"},{"id":"three_quarter","angle":"three_quarter","imagePrompt":"…"}]}],
 "speakers":[{"id":"narrator","name":"주인공(내레이터)","voiceId":"v2_ann_f_30s_03","tempo":1.05,"elementId":"me"},{"id":"neighbor","name":"옆집 아주머니(50대 여성)","voiceId":"v2_ann_f_30s_01","tempo":1.0,"elementId":"neighbor_woman"}],
 "subtitles":{"enabled":true,"style":{"sizeAt1080":66,"bold":true,"outline":3,"position":"bottom","marginV":320,"maxLines":2,"maxCharsPerLine":16}},
 "audio":{"sceneGapMs":150},
 "x-drama":{"conflictFrame":"…","hook":"…","payoff":"…","villainSteps":["…","…","…"],"evidence":"…","witness":"…","twistScene":"s07","ciderScene":"s10","tensionScene":"s06","laughPoint":"…","debatePoint":"…","numbers":["석 달","밤 열한 시","육만 원"]},
 "x-mediaPlan":{"mediaMix":"AI 이미지만","videoRatio":0,"estimatedVideoSec":0,"estimatedTotalSec":92,"videoScenes":[],"imageScenes":["s01","…"]},
 "scenes":[{"id":"s01","title":"…","purpose":"이 장면에서 새로 드러나는 것","tailSec":0.5,
   "utterances":[{"id":"s01_u1","speakerId":"narrator","ttsText":"…","subtitleText":"…"},{"id":"s01_u2","speakerId":"neighbor","ttsText":"…"}],
   "media":{"type":"ai-image","motion":"kenburns-in"},
   "keyframes":[{"id":"s01_k1","role":"start","imagePrompt":"…","references":[{"elementId":"neighbor_woman","viewId":"front"}]},{"id":"s01_k2","role":"change","imagePrompt":"…","references":[…]}],
   "transition":"cut"}]}
필드 규칙:
- ai-video 장면은 "media":{"type":"ai-video"} 와 videoPrompt·x-event 를 가진다. ai-image 장면은 motion 을 가지고 videoPrompt·x-event 가 없다.
- 발화 id 는 {장면id}_u1 …, 키프레임 id 는 {장면id}_k1 …(설계도 전체에서 유일). ttsText ≤800자, subtitleText ≤200자.
- 문자열 길이 한도: title ≤120, summary ≤1000, visualStyle ≤2000, negativeStyle ≤1000, imagePrompt ≤4000, videoPrompt ≤2000, purpose ≤500, scene title ≤80, screenTitle.text ≤72, knowhow ≤20000.
- tailSec 은 0.3~0.8. durationSec 은 쓰지 않는다(내레이션 길이로 정해진다).
- targetDurationSec 은 {"min": 목표×0.85, "max": 목표×1.15}(정수).
- x-mediaPlan 에 media_mix·비율 배정 결과를 적는다(숫자는 소수 첫째 자리).

[검증]
1. 완성한 설계도로 validate_blueprint 를 부른다.
2. ok 가 false 면 errors 의 path·message 를 읽고 그 자리를 고친 뒤 다시 부른다(최대 4번). 오류를 없애려고 장면·발화를 통째로 지우지 않는다.
3. ok 가 true 이고 결과에 blueprint(정규화본)가 있으면 그것을 출력에 쓴다. 정규화본이 생략되었으면 내가 만든 설계도를 그대로 쓴다.
4. warnings 를 읽고 의도와 다르면 고친다. stats 의 예상 길이가 목표에서 20% 넘게 벗어나면 발화 분량을 조정하고 다시 검증한다.
5. media_mix 가 "AI 영상 + AI 이미지" 면 stats.aiVideoEstimatedSec ÷ stats.estimatedDurationSec 을 ratio 와 비교한다. 15%p 넘게 다르면 대본은 두고 ai-video·ai-image 장면 선택만 바꿔(ai-image 로 바꾼 장면은 videoPrompt·x-event 를 빼고 motion 을 넣고, 필요하면 키프레임을 나눈다) 다시 검증하고 x-mediaPlan 을 마지막 stats 로 고친다.
4번 시도 뒤에도 오류가 남으면 마지막 설계도를 blueprint 에 넣고 "error" 에 남은 오류를 한 줄로 요약한다.

[출력]
다음 최상위 필드만 담은 JSON 객체 하나(적지 않은 최상위 필드는 입력값이 그대로 이어진다. 바꾸는 필드는 값 전체를 적는다).
- contract: "vidia.doc@1"
- blueprint: 완성한 설계도(검증 통과본)
- evaluation: null
- script: {"mode":"drama","conflictFrame":"…","hook":"…","payoff":"…","mediaMix":"…","speakers":3,"estimatedSec":92,"videoRatio":0,"estimatedVideoSec":0}
- assets: {} , timeline: {"utterances":{},"scenes":{}}, reviews: {"images":[],"videos":[]}, outputs: {} — 새 설계도이므로 이전 파일을 비운다.

[주의]
- 이 단계에서는 이미지·영상·음성을 만들지 않는다. 쓰는 도구는 validate_blueprint 뿐이다.
- 각색 재연이다. 실존 인물·회사·가게를 특정하지 않고, 생성한 화면을 실제 증거라고 말하지 않는다. 설명란(meta.summary) 첫 문장에 각색 재연임을 밝힌다.
- 인물의 체형·말투·직업·나이를 조롱하는 연출, 성별·세대·지역·직업 집단 혐오, 미성년자 신원 노출, 폭력·유혈 묘사를 쓰지 않는다.
- 설계도가 커지면 imagePrompt 를 60~80 단어로 줄이고, ttsText 와 같은 subtitleText 는 생략한다.
- 설명·마크다운 없이 JSON 객체 하나만 답한다.

버전 기록 1개

고칠 때마다 새 버전으로 쌓이고 지난 버전은 지워지지 않습니다. 패키지는 넣을 때의 버전으로 고정되어 동작합니다.

  1. v1현재2026.09.29 14:57 · 30.1KB

    시스템 모듈 등록

이 모듈을 쓰는 패키지

리뷰와 반응

불러오는 중…

사용 -건 · 사용 건수는 이 모듈을 실제로 실행한 제작 수입니다(성공률이 아닙니다). 별점은 실제 사용한 회원만 남길 수 있고, 좋아요·싫어요와는 따로 셉니다.

    신고하기

    신고하신 분의 정보는 작성자에게 알리지 않습니다. 접수만으로 제재가 확정되지는 않습니다. 결과 불만·환불은 1:1 문의로도 알려 주세요.