Egyptian promo video (فيديو ترويجي مصري)
로컬 머신에서 약 60~70초 길이의 세로형 프로모션 비디오를 완전히 제작합니다:
script.json ──► 음성 해설 (Gemini TTS, 무료) ──► 대사별 클립 ──► 타임라인
screenshots ──► promo.html (seek(t) 애니메이션) ──► puppeteer 프레임 ──► ffmpeg
synth.cjs (오리지널 비트 + SFX) ──► sidechain 압축 믹스 ──► loudnorm −14 LUFS ──► MP4 + WhatsApp 사본
모든 장면은 해당 대사의 길이에 정확히 맞춰지므로, 단어나 음성을 변경하면 전체 영상이 자동으로 재타이밍됩니다.
검증된 예제 (레스토랑 주문 시스템: 바쁜 전화 후크 → WhatsApp 불편 → 리빌 → 메뉴 → 장바구니 → QR 테이블 → 주문 추적 → 대시보드 → 통계 → 브랜드 + CTA)가 기본 템플릿입니다. 엔진을 바꾸지 않고 장면만 변경하여 다른 제품의 구조에 재사용하세요.
필요한 것
- Node 18+, PATH에 ffmpeg/ffprobe, Google Chrome (또는
CHROME_PATH설정). - 빌드 폴더에서:
npm i puppeteer-core qrcode msedge-tts@2(C: 드라이브가 꽉 찼다면npm_config_cache와TEMP를 다른 드라이브로 지정). - 음성을 위한 무료 Google AI Studio 키 (aistudio.google.com/apikey). 사용자가 직접
VIDEO/.env파일에GEMINI_API_KEY=…를 붙여넣습니다 — 키가 비어있는 상태로 파일을 만들고, 절대 채팅에 붙여넣거나 출력하도록 요청하지 마세요. 첫 호출 시 Generative Language API가 해당 프로젝트에 대해 비활성화되어 있다는 오류가 발생할 수 있습니다: 오류의 콘솔 링크를 사용자에게 제공하여 Enable을 클릭하게 한 후 1분 후에 재시도하세요.
폴더 구조
사용자 프로젝트 내에 VIDEO/ 폴더를 생성하세요 (예: marketing/video-<brand>/):
VIDEO/.env GEMINI_API_KEY= (사용자가 직접 입력)
VIDEO/script.json assets/script.example.json의 사본, 편집 필요
VIDEO/build/ 스크립트 + 이 스킬의 assets/template/*
VIDEO/build/img/ promo.html이 사용하는 스크린샷과 로고
VIDEO/vo/ s01.wav … s10.wav (음성 클립)
VIDEO/out/ 렌더링 결과물, sheet.jpg, timeline.json
워크플로우
1. 브리핑 (찾을 수 없는 것만 질문)
제품과 기능, 대상 고객(누가 구매하는지), 브랜드명 및 발음, 컬러 팔레트 + 로고 (사용자 코드에서 확인: tailwind config, icon.svg, Logo 컴포넌트), CTA, 연락처 정보 (있는 경우). 기본 형식: 9:16, 60~70초, 이집트 방언, 남성 에너지 넘치는 목소리.
2. 스크립트 → script.json
장면당 한 줄씩, 총 열 줄. 효과가 입증된 구조:
- Hook (0~4초): 시청자가 공감할 수 있는 고통스러운 질문 ("كام أوردر ضاع منك النهارده… عشان التليفون كان مشغول؟").
- Pain: 현재의 불편한 방식, 손실로 끝맺음.
- Reveal: "طب تخيّل…" + 제품 소개 (여기서 비트 드롭). 4~9. 장면당 하나의 기능, 각각 실제 스크린샷 포함.
- 브랜드 + CTA: 제공하는 회사, 구독/연락 초대.
voice는 TTS가 읽는 내용입니다: 이집트인이 말하는 방식으로 작성 (عامية, 숨 쉬는 "…", 의문문 "؟", 숫자는 단어로 "أربعة وعشرين", "QR"은 "كيو آر"). subtitles는 시청자가 읽는 내용입니다 (숫자 "٢٤", "QR", 브랜드는 라틴 문자로). headlines는 장면 19의 25단어 키네틱 타이틀입니다; 강조할 단어는 *…*로 감싸세요.
통계, 백분율, 가격, 수상 또는 사용 후기를 지어내지 마세요 — 시청자와 클라이언트가 확인할 수 없으며 법적 위험이 있습니다. 단순하게 진술된 이점만으로도 충분히 판매됩니다.
V/P/G가 포함된 브랜드명: 아랍어에는 V가 없으므로 "نوفيكس"는 "NOFIX"로 읽힙니다. voice에 ڤ ("نوڤيكس") 또는 라틴 문자 ("NOVIX")로 작성한 후, step 4에서 check-v.cjs로 확인하세요.
3. 스크린샷 (실제 제품, 폰 사이즈)
Puppeteer를 390×844, deviceScaleFactor 3 (→ 1170×2532)으로 사용하여 build/img/에 저장합니다. 템플릿이 기대하는 파일명: phone-home.png, phone-sweets.png, phone-restaurant.png, phone-options.png, phone-cart.png, tracking.png, dashboard-cancel.jpg, dashboard-stats.jpg, dashboard-products.jpg — 제품에 맞게 이름 변경/교체하세요 (references/template.md 참조).
- 리브랜딩 / 일반 데모:
evaluateOnNewDocument+MutationObserver로 스크립트를 주입하여 이전 브랜드명을 재작성하고, 로고src를 교체하고, 전화번호를 숨기고 브랜드 사진을 교체한 후,innerText에서 잔여물이 없는지 확인하세요. - 로그인된 페이지 (대시보드): 사용자가 이미 로그인되어 있는 인앱 브라우저 창을 사용하고 (절대 비밀번호를 입력하지 마세요), 375×812 뷰포트를 에뮬레이트하고,
javascript_tool로 동일한 DOM 교체를 적용한 후 스크린샷을 찍으세요 (파일을 저장하며 복사 가능). 창 크기가 작업 중에 재설정될 수 있으므로 각 촬영 전에 모바일 뷰포트를 다시 적용하세요. - 실제 고객 데이터: 캡처 전에 화면의 이름/전화번호를 마스킹하세요. 현실적인 상태(새 주문, 취소 요청)가 필요하면 명확히 레이블이 지정된 데모 레코드를 생성하고, 캡처한 후 해당 레코드만 삭제하고 삭제되었는지 확인하세요.
4. 음성 해설
무료이며 자연스러운 이집트 음성은 Gemini TTS (scripts/vo-gemini.cjs)에서 제공합니다:
gemini-3.8-flash-tts에는 92개의 네이티브 이집트 음성이 있습니다 (ar-eg-*, 예:ar-eg-concierge-1젊고 밝은,ar-eg-commercial-11광고 음성,ar-eg-storyteller-3캐주얼). 무료 티어: 이 모델의 경우 하루 10회 요청으로 제한됩니다.gemini-3.1-flash-tts-preview는 별도의 무료 할당량이 있지만 일반 음성만 제공합니다 (Puck쾌활한 남성 — 사용자 선택,Orus단호한 남성, …) 스타일 텍스트로 이집트 방향으로 조정됩니다.- 명령어 (
VIDEO/build에서 실행):node vo-gemini.cjs voices→ar-EG음성 목록.node vo-gemini.cjs sample <voice> [voice…]→ 각 음성의 후크 라인을vo/samples/에 저장 (음성당 1회 요청). mp3로 변환하여 사용자에게 보내 귀로 선택하게 합니다 — 직접 들을 수 없습니다.node vo-gemini.cjs all <voice>→ 한 번의 요청으로 전체 스크립트를 처리하고, 일시 정지 지점에서 10개의 클립으로 분할합니다 (할당량을 절약하고 단일 연속 테이크처럼 들림). 이전 클립은 백업됩니다.node vo-gemini.cjs line <voice> <n>→ 단일 라인 재녹음.GEMINI_TTS_MODEL=gemini-3.1-flash-tts-preview를 사용하여 모델 전환.
- 샘플을 현명하게 사용하세요 (5개 음성 = 5회 요청). 3.8 할당량이 소진되면 다음 옵션을 제안하세요: 리셋될 때까지 기다리기 (~태평양 자정), 또는 3.1로 오늘 녹음하기. 추가 Google 계정을 통해 할당량을 더 확보하도록 제안하지 마세요 — Google의 API 약관은 제한을 우회하는 것을 금지하며, 두 계정 모두 정지될 수 있습니다.
- 대안:
vo-edge.cjs(Microsoftar-EG-ShakirNeural, 무제한, 키 불필요 — 사용자들은 로봇 같고 이집트어 같지 않다고 평가), 또는 사용자가 휴대폰으로 직접 라인을 녹음한 후vo/sNN.wav로 트리밍/정규화. ElevenLabs는 훌륭하지만 유료입니다.
모든 테이크를 확인하세요 — 직접 들을 수 없습니다:
node transcribe.cjs [s05 s06…]는 각 클립을 Gemini 텍스트 모델로 전사합니다. 각 전사본은 해당 스크립트 줄과 일치해야 합니다. 다음 줄의 단어가 클립 끝에 있다면 컷이 늦은 것입니다:ffmpeg -af silencedetect=noise=-38dB:d=0.1로 일시 정지를 찾고 꼬리를 다음 클립으로 이동하세요 (gotchas의-ss트랩 참조).vo/take/원본에서 수정하세요.node check-v.cjs s10은 브랜드 자음이 /v/인지 /f/인지 묻습니다 (클립당 두 번). 알려진 잘못된 테이크를 대조군으로 포함시켜 확인이 제대로 작동하는지 확인하세요.
5. 템플릿 테마 적용
템플릿에는 또한 img/qr.png (node -e "require('qrcode').toFile('img/qr.png','<사이트 url 또는 브랜드>',{errorCorrectionLevel:'H',margin:1,width:680})"로 생성 — 시청자가 스캔할 수 있으므로 실제 URL이나 일반 텍스트를 가리키도록 하세요), img/rest-logo.svg (데모 비즈니스 로고) 및 브랜드 아이콘 (img/novix-icon.svg 예시)이 필요합니다.
assets/template/promo.html은 NOVIX 스타일입니다 (네이비 #0B1020, 블루→바이올렛 그라데이션). :root 변수, 무대 배경 및 글로우 색상, .hl 그라데이션, 칩/링/자막 알약, QR 카드, 마지막 장면 (로고, 워드마크, 태그라인, CTA, 기능 라인)을 편집하여 리테마하세요. references/template.md에는 각 요소의 위치와 장면 연결 방식이 나열되어 있습니다.
6. 확인, 미리보기, 렌더링
VIDEO/build에서:
node build.cjs --check— 스크린샷 없이 약 2000프레임을 실행합니다; 5분 렌더링 대신 몇 초 안에 JS 오류를 잡습니다.node build.cjs --preview 3→out/sheet.jpg. 보세요 (이미지를 읽으세요): 헤드라인 줄바꿈, 캔버스 밖 요소, 대비 (예: 오렌지 카드 위의 오렌지 텍스트), 남은 이전 브랜딩.node build.cjs(백그라운드에서 실행, 66초 기준 약 5분). 비디오 길이와 오디오 길이가 일치하는지 보고하고(일치해야 함), 음량(약 −14 LUFS)을 보고합니다.- WhatsApp 사본을 SendUserFile로 보내고 (전체 파일은 보통 30MB를 초과하여 데스크톱에서만 표시됨), 사용자에게 두 파일의 위치를 알려주고, 전사/프레임으로 확인했지만 직접 듣지는 못했다고 명확히 말하세요.
7. 음악
synth.cjs는 오리지널 98 BPM 미들 이스턴 트랩 비트 (다르부카, 808, D Hijaz 모드의 플럭 현악 리드)를 리빌 장면에서 드롭과 함께 구성하며, 통화 중 신호음/슈슈/딩/삐/팝 SFX를 포함합니다. 라이선스 라이브러리 (예: Epidemic Sound 커넥터)는 미리보기만 허용하고 다운로드는 허용하지 않을 수 있습니다 — 미리보기는 광고에 라이선스가 부여되지 않으므로 사용하지 마세요.
전달
- 최종 파일:
out/<name>-9x16.mp4(1080×1920, 30 fps, H.264, AAC, −14 LUFS) 및out/<name>-9x16-whatsapp.mp4. - 플레이스홀더 (엔드 카드의 누락된 전화번호 등)를 언급하고 명백한 다음 단계 (연락처 추가, 가로 버전, 사이트에 삽입)를 제안하세요.
- 스크린샷을 공개적으로 호스팅해야 했다면 (클라우드 비디오 도구에만 필요), 사용자에게 위치를 알리고 제거 옵션을 제공하세요.
무엇이든 실행하기 전에 references/gotchas.md를 읽으세요 — 이 스킬을 빌드하는 동안 발생한 모든 실패와 해결 방법이 나열되어 있습니다.