Communitygithub.com

egyptian-promo-video (فيديو ترويجي مصري)

전문가 수준의 세로형 (9:16) 프로모션 / 광고 비디오를 웹사이트, 앱, 시스템 또는 제품용으로 제작합니다. 이집트-아랍어 음성 해설, 움직이는 아랍어 타이포그래피, 실제 제품 스크린샷을 폰 목업에 담은 화면, 동기화된 자막, 오리지널 음악 및 음향 효과를 포함하며, 유료 도구 없이 로컬에서 MP4 (및 WhatsApp용 사본)로 렌더링합니다.

egyptian-promo-video (فيديو ترويجي مصري)란 무엇인가요?

이 스킬은 사용자가 '프로모션 비디오', '광고', '릴스', 'TikTok/Instagram/Facebook 영상', '설명 동영상', '제품 데모', '모션/애니메이션 영상' 또는 'فيديو ترويجي / إعلان / ريلز / فيديو انيميشن / فويس أوفر مصري'를 요청할 때마다 사용하도록 설계되었습니다. (예: '내 사이트/앱/회사 영상 만들어 줘', '기존 프로모션을 다른 회사용으로 리브랜딩', '음성을 더 이집트스럽고 자연스럽게' 등) 핵심 특징: - **완전 로컬 제작**: Node.js, ffmpeg, Puppeteer, Google Chrome 만으로 모든 작업 수행, 유료 API나 온라인 서비스 불필요. - **이집트 아랍어 음성**: Google AI Studio의 무료 Gemini TTS를 사용해 90개 이상의 네이티브 이집트 음성 제공 (여성, 남성, 광고, 스토리텔링 등). 한도는 모델당 하루 10회 요청. - **자동 타이밍**: 각 장면의 길이가 음성 대사 길이에 자동으로 맞춰져, 대사나 음성만 바꾸면 전체 영상 길이가 자동 조정됩니다. - **오리지널 음악**: 미들 이스턴 트랩 비트 (다르부카, 808, D Hijaz 모드의 현악기 리드)를 신디사이저로 생성하며, 장면 전환, 효과음도 포함. - **입증된 템플릿**: 레스토랑 주문 시스템용 예제(후크 → 페인 → 리빌 → 기능별 장면 → 브랜드 + CTA)를 기본 템플릿으로 제공하며, 엔진을 바꾸지 않고 장면만 수정하여 다른 제품에 재사용 가능. - **스크립트 기반**: 각 장면의 음성 대사(voice), 자막(subtitles), 헤드라인(headlines)을 JSON으로 작성하며, 대사는 이집트 구어체(عامية)로 작성합니다. - **실시간 체크 및 미리보기**: transcription 검증, V/P 발음 확인, 스크린샷 없는 빠른 체크 모드(2000프레임) 및 sheet.jpg 미리보기로 오류 조기 발견. - **렌더링**: 최종 MP4 (1080×1920, 30fps, H.264, AAC, −14 LUFS) 및 WhatsApp용 사본을 생성합니다.

지원 대상~Claude Code~Codex CLI~Cursor✓Gemini CLI
npx skills add https://github.com/ussefehab/afhamha-sah-video-skill/tree/HEAD/egyptian-promo-video

즐겨 사용하는 AI에게 물어보기

이 에이전트 스킬이 미리 로드된 새 채팅을 엽니다.

문서

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

장면당 한 줄씩, 총 열 줄. 효과가 입증된 구조:

  1. Hook (0~4초): 시청자가 공감할 수 있는 고통스러운 질문 ("كام أوردر ضاع منك النهارده… عشان التليفون كان مشغول؟").
  2. Pain: 현재의 불편한 방식, 손실로 끝맺음.
  3. Reveal: "طب تخيّل…" + 제품 소개 (여기서 비트 드롭). 4~9. 장면당 하나의 기능, 각각 실제 스크린샷 포함.
  4. 브랜드 + 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 (Microsoft ar-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에서:

  1. node build.cjs --check — 스크린샷 없이 약 2000프레임을 실행합니다; 5분 렌더링 대신 몇 초 안에 JS 오류를 잡습니다.
  2. node build.cjs --preview 3 → out/sheet.jpg. 보세요 (이미지를 읽으세요): 헤드라인 줄바꿈, 캔버스 밖 요소, 대비 (예: 오렌지 카드 위의 오렌지 텍스트), 남은 이전 브랜딩.
  3. node build.cjs (백그라운드에서 실행, 66초 기준 약 5분). 비디오 길이와 오디오 길이가 일치하는지 보고하고(일치해야 함), 음량(약 −14 LUFS)을 보고합니다.
  4. 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를 읽으세요 — 이 스킬을 빌드하는 동안 발생한 모든 실패와 해결 방법이 나열되어 있습니다.

관련 스킬