제품 홍보 영상 (promo-video)
당신은 샷 고르기와 텍스트 채우기만 하면 됩니다. 코드를 작성하지 않고, template/, scripts/, industries/ 디렉토리 내의 어떤 파일도 수정하지 않으며, 좌표, 프레임 번호, 색상 값을 전혀 입력하지 않습니다.
아래에서 <SKILL>은 이 파일이 있는 디렉토리를 의미합니다. 모든 명령은 Node 22 / Python 3.10으로 실행합니다. 영어 사용자나 영어 동영상이 필요한 경우에는 <SKILL>/SKILL.en.md를 대신 읽으십시오.
프로세스
- 업종 및 언어를 결정합니다.
meta.industry:software(기본값) /food(외식) /ecommerce(전자상거래 실물) /education(교육) /beauty(미용) /travel(여행/숙박). 업종을 잘못 선택하면 사용 가능한 샷과 규정 준수 규칙이 모두 틀리게 됩니다.meta.lang:zh(기본값) /en. 동영상에 영어 자막이 필요하거나 사용자가 영어권 사용자이면en으로 설정합니다(사용법은 5단계 참조).- 업종이
software가 아닌 경우 -> 먼저<SKILL>/industries/<industry>/recipe.md를 읽으십시오 (영어 프로젝트는recipe.en.md): 여기에는 해당 업종에 권장되는 샷 조합,brief-template.md(해당 업종의 브리핑에서 물어봐야 할 항목들), 그리고test-brief.md/expected.md(규정 위반 예시)가 포함되어 있습니다. 이 단계를 건너뛰면 쉽게 차단될 수 있는 콘텐츠를 작성하게 됩니다.
- 브리핑을 읽습니다. 해당
brief-template.md의 항목을 이해합니다. '제품명 / 한 줄 핵심 가치 / 불편 상황 / 핵심 동작 / 2-4개의 핵심 기능' 등이 누락되면 먼저 질문하고, 데이터나 기능을 임의로 지어내지 마십시오.meta.product는 브리핑의 제품명을 그대로 사용하며, 전체 영상(hook 캡슐, 엔드카드의 brand)에서 이 이름만 사용합니다. 엔드카드의brand는 반드시 이 이름과 정확히 일치해야 합니다.meta.action: 필수 입력 사항, 한 문장으로 '사용자가 무엇을 하면 -> 제품이 무엇을 제공하는지'를 설명합니다(예: '영수증 사진 찍기 -> 금액과 분류 자동 입력'). 화면에 표시되지 않습니다. 데모용 샷(chat/phone/mockApp/photoShot)의 화면 텍스트는 이 동작을 반영해야 하며, 검증 시 확인됩니다.- 브리핑의 '획득 방법'에 내용이 있으면 -> 그대로
meta.cta에 작성하고, 엔드카드의cta도 이를 그대로 복사합니다. 브리핑에 '없음'으로 명시되면 -> 두 곳 모두 작성하지 않습니다. '앱스토어에서 XX 검색'과 같은 문구를 직접 만들어 쓰지 마십시오. - 브리핑에 없는 기능은 핵심 기능이나 엔드카드에 절대 포함시키지 마십시오.
- 브리핑에 '숫자와 출처' 항목이 있으면 -> 각 항목을
meta.facts에 복사합니다. 형식은[{"id":"f1","text":"원문..."}]입니다(순수 문자열 배열이 아닙니다). 화면에 표시되는 모든 단위를 포함한 숫자(시간, 백분율, 배수, 인원, 금액)는 여기서 동일한 숫자를 찾을 수 있어야 하며, 출처가 없는 것은 모두 오류로 처리됩니다(단순 경고가 아님). 데이터가 제공되지 않은 경우에는 정성적인 표현을 사용하고, 숫자를 지어내지 마십시오. 샷의params.refs: ["f1"]은 특정 표현(예: '즉석 제조')을 특정 fact와 연결하여 업종 규칙 확인에 사용합니다. - 전체 영상에서 동일한 작업의 소요 시간은 하나의 숫자만 사용합니다: 카운터에 '3분'이라고 쓰면, 다른 곳에 '즉시 완료', '3초'라고 쓸 수 없습니다. 후크에 '반나절'이라고 쓰면, 카운터의 이전 값도 '반나절'이어야 합니다. 검증 시 오류가 발생합니다.
compare샷에서도 같은 열의stat과items가 모순되어서는 안 됩니다(예: 왼쪽 열에 '5분'과 '3일'이 같이 있음). - 기본 15-45초의 총 길이 범위를 벗어나야 하는 경우(예: 업종 권장 구조가 27초 이상 필요),
meta.durationRange: [15, 60]와 같은 두 요소 배열을 작성합니다. - 하단에 상시 표시해야 하는 작은 글씨 안내(예: '한정 이벤트, 상품 상세페이지 기준')가 있으면
meta.notices에 문자열 배열로 작성합니다. 최대 3개까지 가능하며, 한 줄로 합쳐져 하단에 표시됩니다.
- 디렉토리 생성:
promo/<영문 제품명>/디렉토리를 만들고, 스토리보드는promo/<영문 제품명>/storyboard.json에 작성합니다. 사용자가 제공한 스크린샷, 동영상, 로고는 동일한 디렉토리에 복사합니다. - 테마 선택(
meta.theme):- 감성, 소셜, 생활 ->
warm-emotion - 개발자, AI, 하드코어 도구 ->
tech-dark - 건강, 학습, 가계부, 가벼운 도구 ->
fresh-light - 업무, B2B, 생산성 ->
business-blue - 명절, 프로모션, 신상품 ->
festival-red - 고급, 미니멀, 디자인 ->
mono-premium브랜드 컬러가 있으면meta.brandColor(#RRGGBB)를 작성합니다. 이 값은 강조 색상만 변경합니다.
- 감성, 소셜, 생활 ->
- 5-9개의 샷을 선택합니다. (샷 설명은
<SKILL>/shots.md참조. 상단에 18개 샷 요약표가 있습니다.)hook은 반드시 첫 번째 샷(2-3초)이어야 하고,endCard는 반드시 마지막 샷(4초)이어야 합니다. 핵심 동작을 보여주는 샷이 하나 이상 포함되어야 합니다 (2단계에서 작성한meta.action). 검증 시 확인됩니다.chat은 messages + panel(질문 -> 답변)을 작성하거나,mockApp에 input(사용자 입력/질문) + 결과(dashboard의 stat, editor의 items, done)를 작성합니다. 스크린샷이 있으면phone을 사용합니다.meta.industry에 따라 어떤 샷을 사용할 수 있는지 결정됩니다(industries/<industry>/rules.json의enabledShots참조, 또는 recipe.md에서 직접 확인). 허용되지 않은 샷을 선택하면 검증 시 오류가 발생합니다. 7개의 업종별 샷(software의 경우 기본적으로 비활성화):photoShot실제 사진/동영상(요리, 상품, 작품, 방, 공용 공간, 주방)priceCard가격표;storeCard매장/지도/예약;reviewCard실제 고객 리뷰(원문 그대로, 과장된 표현으로 수정 금지)factSheet사양표/개봉 목록/강의 계획서/시험 정보/색상표;credCard자격/명예 카드beforeAfter전후 비교 슬라이더(미용 업종만 사용 가능,consent:true+retouched:false필요) 중간에는 제품 유형에 따라 샷을 선택하고, 고정된 템플릿을 그대로 사용하지 마십시오.features핵심 기능 카드는 필수가 아닙니다. 두 가지 하드 요구 사항(검증 시 알림):- 중간 부분에 최소 하나의 샷은 {compare, steps, phone, meter} 중에서 선택;
- quickList와 counter는 동시에 사용할 수 없음 (둘 다 사용하면 영상이 hook -> quickList -> mockApp -> counter -> endCard로 모든 사람이 똑같은 템플릿이 됩니다).
software 업종에서 선택 가능한 조합 (하나를 선택한 후 제품에 맞게 수정; 다른 업종은
industries/<industry>/recipe.md의 권장 구조를 직접 따름): - B2C 감성/소셜 (채팅, 감성, 동반): hook(bubble) -> chat 데모(2-3문장 자막으로 작성) -> meter 또는 compare로 '이 말의 무게' 전달 -> quickList 빠른 전환 -> endCard
- 도구/효율성 (글쓰기, 가계부, 게시, 편집): hook(stat) -> compare로 '예전 vs 지금' 전달 -> mockApp editor/form 데모 '입력 -> 결과' -> steps로 사용 방법 설명 -> endCard; 또는 hook -> quickList로 불편함 전달 -> mockApp -> steps -> endCard
- B2B 데이터/업무 (보고서, 회의, CRM): hook(icon) -> phone 스크린샷 강조 또는 mockApp dashboard에 input 포함 '질문 한 번 -> 데이터 출력' -> compare 또는 meter로 효과 전달 -> steps -> endCard; 브리핑에 소요 시간 숫자가 있는 경우에만 counter 사용(이 경우 quickList는 사용 불가)
총 길이는 20-30초가 가장 좋습니다(15-45초 또는
meta.durationRange의 사용자 정의 범위 허용). 동일한 유형의 샷을 연속해서 사용하지 마십시오. 인접한 두 샷의mood차이는 0.5를 넘지 않도록 합니다(중간에 전환용 샷을 하나 삽입). 그렇지 않으면 배경이 급격하게 전환됩니다.
- 자막 작성(각 샷의
caption): 샷 당 한 문장, TikTok 스타일의 큰 글씨로, 시청자에게 말하는 것처럼 작성하고, 화면이 어떻게 움직이는지 설명하지 마십시오. (❌ '카드가 하나씩 나오며, 그것이 무엇을 할 수 있는지 설명합니다'는 샷 설명이지 자막이 아닙니다).- 중국어: 최대 2줄,
\n으로 줄바꿈; 각 줄은 12자(한자 기준) 이하 (알파벳/숫자는 반자로 계산).meta.lang: "en"일 때 영어 자막은 라틴 문자 수를 기준으로 계산(약 중국어 제한의 1.8배), 구체적인 숫자는docs/shots/<type>.en.md참조 {}로 가장 중요한 2-5자를 감싸서 강조 색상으로 변경; 샷 당 최대 1개- hook의 caption = 커버 타이틀, 사용자의 불편함 또는 반전 질문 작성
- endCard에는 caption을 작성하지 않고, 슬로건은
params.slogan에 작성 - 동일한 자막은 최대 5초까지만 표시 가능. 5초가 넘는 샷(예: 8-10초의 chat)의 경우, caption을 2-3개 문장의 배열로 작성하여 해당 샷의 시간을 균등하게 나눕니다:
"caption": ["일단 보내지 마세요.\n상대방이 원하는 건 {당신의 관심}", "하나 골라서 입력창에 넣고\n보낼지는 {당신이 결정하세요}"] - 자막은 사용자의 상황이나 제품이 가져온 변화에 대해 이야기해야 하며, 앞뒤 샷과 연결되어야 합니다. 화면의 움직임은 컴포넌트의 역할이므로 작성하지 마십시오. 자막에서 「」로 묶인 단어는 해당 샷 또는 이전 샷의 화면에 반드시 등장해야 합니다 (검증 시 확인)
- 자막에 수량( '이 4문장', '세 개의 답변')을 언급한 경우, 해당 샷의 항목 수와 일치해야 합니다 (검증 시 확인)
- 만능 문장('세 가지, {그것이...}', '이 세 단계', '이런 순간들, 당신도...')을 사용하지 마십시오. 또한 examples, shots.md, spec의 자막과 매개변수를 그대로 복사하지 마십시오. 검증 시 알림을 주고 직접 채울 수 있는 문장 패턴을 제안합니다. 예시는 형식 참고용으로만 사용하십시오.
- 단어 중복( '일정 일정'), 글자 수 맞추기 위한 무리한 축약( '목이 조이다'를 '목 조임'), 오타( '로그인'을 '로그인' 오기, 단, '상륙함/달 착륙'은 제외)를 하지 마십시오. 글자 수가 초과되면 문장 전체를 바꾸어 표현하십시오.
- 절대적 표현('완전 해결', '깔끔하게 해결', '안전 걱정 없음', '100%')을 사용하지 마십시오: 제품이 구현하기 어려운 경우가 많습니다. 검증 시 알림을 주며, 적절한 표현으로 바꾸어야 합니다.
- 줄바꿈은 하나의 백슬래시
\n만 사용; 자막에 인용 부호가 필요하면 「」를 사용하고, 영어 큰따옴표"는 사용하지 마십시오.
- 중국어: 최대 2줄,
mood작성(0-1): 불편함/긴장 0.8-1, 전환점 0.5, 제품 및 기능 0-0.3, 엔드카드 0. 배경 색상과 배경 음악이 이에 따라 변경됩니다.storyboard.json작성, 형식은 문서 끝의 전체 예시를 참조하십시오. 시간은dur(초)로 작성하며, 0.5의 배수로 작성합니다. 파일은 반드시 UTF-8 인코딩이어야 합니다. 중국어 Windows의 기본값은 GBK: 편집기/파일 쓰기 도구를 사용하여 직접 UTF-8로 작성; PowerShell을 사용하는 경우[IO.File]::WriteAllText($p, $json, [Text.UTF8Encoding]::new($false))를 사용; Python을 사용하는 경우open(p, "w", encoding="utf-8")을 사용.echo >,Out-File(5.1 버전)로 중국어를 작성하지 마십시오.chat샷의panel.replies는 제품이 **'저'**가 상대방에게 보내는 제안입니다. '저'의 입장에서 작성합니다 (나는 야근해야 한다고 말하는데, 제안 답변이 '더 이상 야근하지 말고, 나랑 있어줘'가 되어서는 안 됩니다 – 그것은 상대방의 어조입니다); panel이 있으면typing을 작성하지 마십시오.- 검증, 오류 메시지에 따라 하나씩 수정하여 통과할 때까지 반복:
오류 형식은 'N번째 샷(유형) 필드: 문제 -> 해결 방법'이며, '해결 방법'을 따릅니다. 결과는 세 가지 등급으로 나뉩니다:node <SKILL>/scripts/validate.mjs promo/<제품명>/storyboard.json- 오류(errors): 반드시 수정해야 하며, 수정하지 않으면 영상이 생성되지 않습니다.
- 경고(warnings): 가능하면 수정(문구 품질, 구조가 템플릿과 너무 비슷하지 않은지), 수정하지 않아도 영상은 생성되지만, 전달 시 사용자에게 왜 수정하지 않았는지 설명할 수 있어야 합니다.
- 인적 검토 필요(human): 검증이 판단할 수 없는 사항(예: '이 리뷰가 정말 한 글자도 바꾸지 않았는지', '이 자격 사항이 실제로 브리핑에서 나온 것인지'), storyboard를 수정할 필요 없음, 원래대로 사용자에게 나열하여 사용자가 직접 확인하도록 합니다.
- 영상 생성(약 2분 소요, 자동으로 배경 음악 생성됨):
node <SKILL>/scripts/make.mjs promo/<제품명>/storyboard.json --out promo/<제품명>--out은 필수 입력 사항입니다(테스트 시에는--round <회차>로 대체, 결과물은tests/<회차>/<제품명>/에 통합 저장. 동일 회차의 여러 영상은 같은 회차 이름을 사용하며, 초 단위 타임스탬프 디렉토리를 직접 생성하지 마십시오). 결과물:video.mp4,sheet.png(초당 한 프레임의 콜라주),check/(0번째 프레임 + 각 샷 종료 직전의 전체 크기 프레임),report.txt(텍스트 레이아웃 보고서 포함: 단어 분리, 너비 초과 여부),layout.json. 몇 프레임만 빠르게 확인하려면:--stills 0,3.5,8(초)을 추가하면 단일 프레임만 출력되고 전체 영상은 생성되지 않습니다. - 먼저
report.txt의 마지막 부분 '기계 자체 점검', '텍스트 레이아웃 보고서', '레이아웃 자체 점검'을 확인합니다 (make.mjs가 자동 수행: 백슬래시, 제품명, 획득 방법, 자막 머무는 시간, 엔드카드 아이콘과 면책 조항 작은 글씨가 겹치는지, 단어 분리/너비 초과 행이 있는지 확인; 렌더링 시 각 텍스트 블록의 위치를 측정하여 텍스트가 카드에 의해 잘리거나, 두 텍스트 블록이 서로 겹치거나, 텍스트가 x150-930 범위를 벗어나는지 확인). ✗ 표시가 있으면 먼저 수정(레이아웃 ✗는 일반적으로 특정 필드에 너무 많은 내용을 작성한 경우: 항목을 삭제하거나 텍스트를 줄임). 그런 다음sheet.png와check/를 아래 체크리스트에 따라 자체 점검하고, 문제가 있으면 storyboard.json을 수정하여 9단계로 돌아갑니다. - 전달:
video.mp4경로와sheet.png경로를 사용자에게 전달하고, '게시 전 자체 점검 체크리스트'(아래 참조)를 첨부합니다. 9단계의 '인적 검토 필요' 항목을 그대로 나열하여 사용자가 하나씩 확인하도록 하고, 사용자를 대신하여 판단을 내리지 마십시오.
자체 점검 체크리스트 (스프레드시트 이미지를 보고 각 항목을 화면과 대조하여 결론을 작성하고, 단순히 체크 표시만 하지 마십시오)
- 0번째 프레임에 큰 제목 + 메인 비주얼이 있고, 빈 화면이나 반쪽짜리가 아닙니다. 커버에
\n, 백슬래시 같은 이상한 문자가 없습니다. - 각 샷에는 움직이는 주체(포인터, 숫자, 카드, 채팅 버블)가 하나씩 있고, 정적인 이미지만 있는 것은 아닙니다. '이미지가 줌인/줌아웃되는' 것으로 때우지 않았습니다.
- 자막이 주제를 가리지 않고, 잘리지 않았으며, 단어가 분리되지 않았습니다(한 단어가 두 줄로 나뉨). 자막과 화면이 동일한 내용을 말하고 있으며, 앞뒤 샷의 이야기가 연결됩니다.
- 자막은 시청자에게 하는 말이고, 샷 설명이 아닙니다('카드가 하나씩 나오는'과 같은 화면 동작 설명 문장이 없습니다).
- 핵심 동작이 실제로 시연되었습니다('입력/질문 -> 결과'를 볼 수 있음). 기성 패널 이미지만 있는 것이 아닙니다.
- 배경 색상이 감정에 따라 변합니다: 불편함 포인트는 붉은색 계열, 기능과 엔드카드는 차가운 계열.
- 엔드카드의 제품명이
meta.product와 일치합니다. 획득 방법은 브리핑 원문이거나 표시하지 않습니다. URL, QR 코드가 없습니다. - 숫자 모순이 없습니다: 비교의 앞뒤 숫자를 직접 계산해 봅니다(30분 대 5초라면 결론을 '25분 절약'이라고 쓰면 안 됨). 화면의 숫자가
meta.facts에서 출처를 찾을 수 있습니다. - 오타, 글자 수를 맞추기 위해 글자를 지워서 만든 단어('자동 업로드'를 '자동 올'으로 쓰지 않음), 절대적 표현이 없습니다.
- 업종 샷이 올바른 위치에 사용되었습니다:
beforeAfter는 미용 업종에서만 사용;reviewCard의 인용은 원문 그대로이며, 과장되게 수정되지 않았습니다.
게시 전 자체 점검 체크리스트 (전달 시 사용자에게 첨부, 자신이 확인하는 것으로 끝내지 마십시오)
- '인적 검토 필요' 항목 모두 나열: 9단계 검증 결과의
human목록을 사용자에게 그대로 복사합니다. 사용자를 대신하여 '괜찮을 것 같다'고 판단하지 마십시오. 일반적인 예:reviewCard/credCard의 인용이 브리핑 원문과 한 글자도 다르지 않은지, 플랫폼 규칙이 업데이트되었는지, 업종 자격 요건이 충족되는지. meta.industry가 올바르게 선택되었습니까? (잘못 선택하면 허용되는 샷과 규정 준수 규칙이 모두 틀리게 됩니다).- 실제 사람 출연, 고객 리뷰, 전후 비교 사진과 관련된 경우, 당사자의 서면 동의를 받았습니까? (
consent/retouched같은 필드는 검증 요구 사항일 뿐이며, 실제 동의 획득은 사용자의 책임입니다. 검증이 대신 확인해 줄 수 없습니다). - 동영상을 게시할 플랫폼(틱톡/웨이신 채널/샤오홍슈/해외)이
meta.platform과 일치하며, 해당 플랫폼의 고유 규칙(예: 쇼핑 카트에 가격 자막을 표시할 수 없음)을 확인했습니까? - 다국어 프로젝트: 영어 자막을 원어민이 검토했습니까? 기계는 글자 수와 금지어만 확인했을 뿐, 어색한 표현은 찾아낼 수 없습니다.
하드 규칙 (검증 시 차단됨)
- 첫 번째 샷은 반드시
hook이어야 합니다.endCard는 마지막에 배치합니다. - 총 길이는 15-45초(또는
meta.durationRange의 사용자 정의 범위). 각 샷 유형에는 자체 길이 범위가 있습니다(shots.md 참조). - 각 필드에는 글자 수 제한이 있으며, 초과하면 문장 전체를 더 짧은 표현으로 바꾸어야 합니다. 단어의 글자를 지워서 글자 수를 맞추지 말고, 영어로 대체하지도 마십시오 (
meta.lang: "en"일 때 영어는 자체 문자 수 제한이 있으며, 해당 필드 설명 참조). - shots.md에 나열된 필드, 허용 값 및 아이콘 이름만 사용할 수 있습니다. 철자가 틀리거나 필드가 추가되면 오류가 발생합니다.
- 최소 하나의 샷은
meta.action을 시연해야 합니다(5단계 참조). 동일한 자막은 최대 5초까지만 표시할 수 있습니다. - 엔드카드
brand=meta.product; 엔드카드cta=meta.cta(브리핑에 없으면 모두 작성하지 않음). - 화면 텍스트에 백슬래시가 포함될 수 없습니다 (JSON에서
\\n으로 작성하면 그대로 화면에 표시됨). - 화면에 URL, QR 코드, '스캔', @계정, 'XX번호: 이름', '팔로우/검색 XX' 등이 나타날 수 없습니다. 제품 자체의 카테고리 용어(예: '공식 계정' 레이아웃 도구)는 트래픽 유도로 간주되지 않습니다: 해당 단어를
meta.allowWords에 추가하고, 검증을 통과하기 위해 제품명을 변경하지 마십시오. - 「광고법」 극한 금칙어 사용 금지: 가장, 최고, 유일무이, 최초, 첫 번째 선택, 독점, 최상급, 절대적, 100%, 전 네트워크, 압도적으로 앞서는... ('최근/마지막/첫 번째 단계' 등은 해당되지 않음). 확실한 근거가 있는 경우에만
meta.allowWords에 기록합니다. - 단위를 포함한 숫자(시간/백분율/배수/인원/금액)는 반드시
meta.facts에서 동일한 숫자를 찾을 수 있어야 합니다. 없으면 지어낸 것으로 간주하여 무조건 오류 처리합니다. - 업종 규칙은 세 가지 등급: block은 무조건 차단(예: 의료 미용 효능 주장, 할인 가격에 근거 없음, 실제 리뷰에 월 표시 없음); warn은 경고만 하고 차단하지 않음; human은 검증이 판단할 수 없으므로 전달 시 사용자에게 나열(위의 '게시 전 자체 점검 체크리스트' 1번 항목 참조)
- 리소스 경로는 storyboard.json이 있는 디렉토리를 기준으로 하며, 파일이 반드시 존재해야 합니다. 스크린샷은 png/jpg/webp를 지원하고, 동영상은 mp4를 지원합니다.
금지 사항
template/,scripts/,industries/디렉토리 내의 어떤 파일도 수정하지 않습니다. 좌표, 픽셀, 프레임 번호, 색상 값, CSS를 작성하지 않습니다.- 사용자가 제공하지 않은 데이터나 출처를 지어내지 않습니다. 화면의 숫자는
meta.facts에서 찾을 수 있어야 하며, 출처가 없으면 '예시 데이터이며, 실제와 다를 수 있습니다'라고 작성합니다. - 타사 앱의 이름, 로고 또는 브랜드 색상(예: 특정 채팅 앱의 녹색 말풍선)이 나타날 수 없습니다. '상대방', '동료', '고객'과 같은 표현을 사용합니다.
- 실제 사람 이름, 전화번호, 계정을 작성하지 않습니다.
bgm필드를 사용하지 않습니다(make.mjs가 자동으로 채움).- 업종 규정의 회색 지대 문제(예: '이 문장이 의료 용어로 간주되는가')를 스스로 판단하지 않습니다: 검증이 차단하면 수정하고, 검증이 통과했지만 확실하지 않으면 '인적 검토 필요'에 포함시켜 사용자에게 넘기고, 스스로 '괜찮을 것이다'라고 결론 내리지 마십시오.
일반적인 오류 및 해결 방법
| 오류 | 해결 방법 |
|---|---|
| N행... 자, 각 행 최대 12자 | 줄이거나, 의미상 구분되는 부분에서 \n을 사용하여 두 행으로 나눕니다. |
| 2개의 {} 강조 표시 사용 | 가장 중요한 한 곳만 남깁니다. |
| {} 쌍이 맞지 않음 | 각 {에는 }가 있어야 하며, 여러 행에 걸쳐 있을 수 없습니다. |
| 「광고법」 극한 금칙어 '가장' 포함 | 증명 가능한 표현으로 변경: '가장 빠른' -> '3초 만에 결과 출력' |
| 첫 번째 샷은 반드시 hook이어야 함 | 맨 앞에 hook을 추가합니다. |
| endCard 이 샷에는 자막을 쓸 수 없음 | caption을 삭제하고, 큰 글자는 params.slogan에 작성합니다. |
| 알 수 없는 필드가 있음 | 오류의 '사용 가능한 필드'를 확인하고 철자를 수정합니다(예: mockApp은 variant가 아니라 kind 사용). |
| 'xx'라는 이름의 아이콘이 없음 | shots.md 상단의 아이콘 목록에서 선택합니다. |
| 총 길이 ...가 15-45초 사이여야 함 | 샷을 추가/삭제하거나 dur을 수정합니다. |
| 리소스 파일을 찾을 수 없음 | 경로를 확인합니다. storyboard.json이 있는 디렉토리를 기준으로 합니다. |
| JSON 구문 분석 실패: N행 | 해당 행을 확인합니다: 쉼표 누락, 끝 쉼표 초과, 자막에 영어 큰따옴표 사용(「」로 변경). |
| 이 문장이 화면에 N초 동안 표시됨 | caption을 2-3개 문장의 배열로 작성하거나, 이 샷을 두 개로 나눕니다. |
| 전체 영상에 핵심 동작을 시연하는 샷이 없음 | chat(질문 -> panel 답변) 또는 mockApp(input + 결과)을 추가합니다. |
| 엔드카드 제품명이 meta.product와 일치하지 않음 | brand를 meta.product와 정확히 일치하도록 변경합니다. |
| cta를 작성했지만 meta.cta가 비어 있음 | 브리핑에 획득 방법이 있으면 meta.cta에 작성한 후 복사합니다. 없으면 cta를 삭제합니다. |
| 리터럴 \n이 있음 | JSON에서 줄바꿈은 하나의 백슬래시만 사용합니다. |
| 플랫폼명 '공식 계정' 포함 (경고) | 제품 자체의 카테고리 용어: meta.allowWords에 추가; 트래픽 유도: 삭제. |
| 필수 필드 meta.action 누락 | '사용자가 무엇을 하면 -> 제품이 무엇을 제공하는지' 한 문장을 작성합니다. |
| 숫자가 meta.facts에서 출처를 찾을 수 없음 | 브리핑에 해당 숫자가 있으면 원문 그대로 meta.facts에 복사합니다({"id":"f1","text":"…"} 형식). 없으면 구체적인 숫자를 정성적 표현으로 대체합니다. |
| 자막에 샷 설명어 포함(예: '카드가 하나씩 나옴') | 이것은 시청자에게 보여주는 자막이지 편집자에 대한 설명이 아닙니다. 사용자 관점의 한 문장으로 변경합니다. |
| '상륙'은 오타, 올바른 표현은 '로그인' | '로그인'으로 변경합니다('상륙함/달 착륙' 등은 해당되지 않음). |
| '깔끔하게 해결'은 절대적 약속 | 적절한 표현으로 변경합니다(예: '핵심 정보를 확인할 수 있음'). |
| 'XX' 업종이 샷 'YY'를 허용하지 않음 | 해당 업종에서 허용하는 다른 샷으로 변경하거나, meta.industry가 잘못 선택되었는지 확인합니다. |
| [B-xxx] 업종 규정 위반 | 오류 메시지의 '해결 방법'을 따릅니다. 확실한 근거가 있는 극한 금칙어인 경우에만 meta.allowWords를 고려합니다(warn 수준에만 유효, block 수준은 반드시 삭제). |
실제 스크린샷이 없을 때
우선 mockApp 샷(움직임이 있음)을 사용합니다. 만약 반드시 '휴대폰에서 여기를 클릭하는' 장면을 연출해야 한다면, 먼저 mockApp을 렌더링하여 스크린샷으로 만든 후 phone 샷에 사용합니다:
cd <SKILL>/template
npx remotion still src/index.ts Screen <스토리보드 디렉토리 절대 경로>/screen.png --frame=145 --props=<스토리보드 디렉토리 절대 경로>/screen-props.json
screen-props.json은 {"type":"mockApp","theme":"<테마>","dur":5,"params":{...mockApp의 params...}} 형식으로 작성하며, <SKILL>/examples/_src/screen-props.json을 참조합니다. 그런 다음 phone 샷에 "src": "screen.png"를 작성하고, meta.disclaimer에 '데모 화면이며, 내용은 시뮬레이션입니다'라고 작성합니다.
추가 예시 (구조가 각각 다르므로 '제품 유형'에 따라 선택하고, 자막을 그대로 복사하지 마십시오)
<SKILL>/examples/jev.json: B2C 감성, software 업종 (채팅 데모 2문장 자막 -> 계기판 -> 빠른 전환 -> 엔드카드; 획득 방법 '공식 홈페이지에서 안드로이드 버전 다운로드')<SKILL>/examples/ledger.json: 도구 효율성, software 업종 (불편함 빠른 전환 -> 비교 -> mockApp 영수증 촬영 결과 -> 숫자 -> 엔드카드; 브리핑에 획득 방법이 없어 엔드카드에 cta 없음)<SKILL>/examples/meeting.json: B2B 업무, software 업종 (스크린샷 강조 표시 -> 시뮬레이션 인터페이스 -> 숫자 -> 단계 -> 엔드카드; 획득 방법 '공식 홈페이지에서 무료 체험 신청')<SKILL>/examples/en-focus.json:meta.lang: "en"의 영어 예시 (가상 앱, 영어 자막 작성 방법 보여줌)- 기타 업종(food/ecommerce/education/beauty/travel)의 규정 준수 예시는
industries/<industry>/test-brief.md+expected.md에 있습니다: test-brief는 샘플 브리핑이고, expected는 이 브리핑을 바탕으로 작성된 스토리보드의 어떤 부분이 차단되고 그 이유를 명확히 설명합니다. 새로운 업종의 첫 번째 영상을 만들 때는 이 두 문서를 먼저 보는 것이 좋습니다.
전체 예시 (examples/ledger.json, 검증 통과 가능)
{
"meta": {
"title": "편리한 가계부 홍보 영상 (불편함 -> 제품 -> 3가지 핵심 기능 -> 엔드카드)",
"product": "편리한 가계부",
"theme": "fresh-light",
"disclaimer": "데모 화면이며, 데이터는 예시입니다",
"action": "영수증 촬영 -> 금액과 분류 자동 입력",
"facts": [
{"id": "f1", "text": "체험 사용자는 이번 달에 지난달보다 약 1,260원을 더 저축했습니다 (예시 데이터)"},
{"id": "f2", "text": "데모 가계부 예시 항목: 배달음식 ₩8,600, 밀크티/커피 ₩3,260, 해지하지 않은 자동 결제 ₩980, 심야 택시 ₩4,100 (예시 데이터)"},
{"id": "f3", "text": "수동 기록 한 건 평균 약 5분 소요; 이 제품으로 사진 촬영 기록 한 건 약 10초 소요 (예시 데이터)"},
{"id": "f4", "text": "데모 인식 결과: 점심 ₩38,500, 이번 달 식비 예산 62% 사용 (예시 데이터)"}
]
},
"shots": [
{
"type": "hook",
"dur": 2.5,
"caption": "월급은 받았는데,\n월말이면 {바닥나요}",
"mood": 0.85,
"params": {"visual": "stat", "text": "₩ 0", "sub": "이번 달 돈 어디 갔지", "badge": "영수증 한 장이면 기록 완료", "tone": "bad"}
},
{
"type": "quickList",
"dur": 3.5,
"caption": "돈이 어디로 갔는지\n{하나도 기억 안 나요}",
"mood": 0.8,
"params": {
"title": "이번 달 사용처 불명",
"items": [
{"text": "배달음식", "tag": "₩8,600", "tone": "bad", "icon": "bell"},
{"text": "밀크티/커피", "tag": "₩3,260", "tone": "warn", "icon": "heart"},
{"text": "해지 안 한 자동 결제", "tag": "₩980", "tone": "bad", "icon": "calendar"},
{"text": "심야 택시", "tag": "₩4,100", "tone": "warn", "icon": "clock"}
]
}
},
{
"type": "compare",
"dur": 4.5,
"caption": "가계부 쓰기,\n{더 이상 의지에 맡기지 마세요}",
"mood": 0.45,
"params": {
"mode": "lr",
"left": {"title": "수동 가계부", "items": ["매 건 수동 입력", "분류는 감에 의존", "결국 포기"], "tone": "bad", "icon": "doc", "stat": "5분", "level": 8},
"right": {"title": "편리한 가계부", "items": ["영수증 사진 자동 인식", "자동 분류", "월말 한 번에 정리"], "tone": "good", "icon": "bolt", "stat": "10초", "level": 2},
"meterLabel": "번거로움 정도",
"verdict": "한 건 기록에 단 10초"
}
},
{
"type": "mockApp",
"dur": 4.5,
"caption": "영수증만 찍으면,\n{금액과 분류가 다 입력돼요}",
"mood": 0.25,
"params": {
"kind": "editor",
"title": "기록하기",
"source": "예시 데이터, 실제 사용자 청구서 아님",
"input": "촬영: 점심 영수증",
"button": "인식",
"items": [
{"text": "점심 ₩38,500"},
{"text": "상점: 1층 국수집"},
{"text": "분류: 식비 (자동)"},
{"text": "이번 달 식비 62% 사용"}
],
"highlight": 3,
"done": "기록 완료"
},
"note": "핵심 동작 시연: 사용자가 영수증을 찍으면 -> 제품이 금액, 상점, 분류를 제공"
},
{
"type": "counter",
"dur": 3,
"caption": "월말에 확인해 보니,\n{저축이 늘었네요}",
"mood": 0.1,
"params": {"to": 1260, "prefix": "₩", "label": "지난달보다 이번 달에 더 저축한 금액", "sub": "예시 데이터이며, 개인차가 있을 수 있습니다", "icon": "money", "tone": "good"}
},
{
"type": "endCard",
"dur": 4,
"mood": 0,
"params": {
"brand": "편리한 가계부",
"slogan": "나가는 모든 돈,\n{하나하나 파악해요}",
"points": ["영수증 찍으면 자동 기록", "가계부는 내 휴대폰에만 저장"],
"icon": "money"
}
}
]
}