Handmade Stage Film
할로윈 밤, TV 볼 것도 없는데: 검은 단발머리 소녀가 칠해진 판지 소파에 앉아 분홍색 음료를 손에 들고 판지 리모컨을 클릭한다. 판지 TV가 켜지면서 지지직거리고, 작은 유령이 화면에서 춤추다가 화면 밖으로 나와 떠다닌다. 그것은 그녀의 컵 옆에 맴돌고("한 모금 마시고 싶었나 봐."), 체크무늬 테이블 위에 내려앉는데 거기엔 거대한 포크가 칠해진 베리 접시를 찌르고 있다("가데니아. 베리. 요거트."). 한 모금 마신 후 그녀는 거대한 마녀 모자 위에 앉아 있고 주변에 별들이 반짝인다("…완전 마법."). 컵은 "매직 프리티 워터"라고 낙서된 화살표와 함께 클로즈업되고, 마지막 카드에는 워드마크, 컵, 유령, "할로윈 한정" 그리고 판매처 정보가 담긴다. 모든 프레임은 브랜드 자체의 7장 캠페인 사진에서 비롯된다.
네 부분으로 제작됩니다:
scripts/generate.mjs는 스틸 사진을 조각들로 변환합니다: 9:16 키프레임(Nano Banana 2가 추가 세트를 그리고 원본 픽셀은 그 위에 다시 입혀짐), Kling 클립, 오려낸 소품, 재배치된 라벨 및 워드마크.scripts/reel.mjs는 클립들을 필름의 시간대에 맞춰 하나의 릴로 자릅니다.scripts/sfx.mjs는 사운드를 합성합니다: 오리지널 오르골 왈츠와 모든 이벤트에 맞는 효과음.scripts/render.mjs는 모든 것을 무대 쇼로 재생합니다: 초당 12프레임의 계단식 움직임, 핸드헬드 흔들림, 움직이는 필름 그레인, 인형, 찢어진 종이 자막, 화살표 태그, 켜지는 TV 화면, 그리고 마지막 카드. 헤드리스 Chrome과 FFmpeg를 사용하여 로컬에서 렌더링합니다.
설정 (머신당 한 번)
이 Skill 폴더 안에서 실행하세요:
npm install
puppeteer-core와 ffmpeg-static이 설치됩니다. Google Chrome이 설치되어 있어야 하며, 그렇지 않으면 CHROME_PATH를 Chrome/Chromium 실행 파일로 설정하세요 (npx @puppeteer/browsers install chrome-headless-shell@stable 명령어로 경로를 확인할 수 있습니다).
푸티지 작업을 위해서는 Nano Banana 2와 Kling 2.5 Turbo용 API 키가 필요합니다; 스크립트는 모델 API 게이트웨이를 통해 이를 호출하며, 키는 해당 게이트웨이에서 생성됩니다 (https://fal.ai/dashboard/keys). 사용자는 자신의 터미널에 FAL_KEY로 설정합니다 (예: 셸 프로필에 추가). 절대 키를 채팅에 붙여넣도록 요청하지 말고, 절대 출력하지 마세요.
비용
사용자의 API 키로 청구되는 모델 사용료: 각 스틸을 9:16으로 확장할 때(및 각 edit 작업) $0.08, 각 5초 클립에 $0.35, 각 컷아웃에 1센트 미만 (2026년 10월 기준). 5개의 클립이 있는 7장의 스틸 영화는 약 $2.30입니다. 릴, 인형, 자막, 사운드 및 최종 MP4는 사용자 머신에서 무료로 제작됩니다. 생성하기 전에 사용자에게 비용을 알려주세요.
성공 비결
- 중요한 부분은 건드리지 않은 자체 사진. 확장과 모든 클립은 브랜드의 실제 스틸 사진에서 시작합니다;
extend는 원본 픽셀을 AI 버전 위에 다시 입히고,relabel은 클립이 흐릿하게 만든 프레임 위에 선명한 라벨을 다시 입힙니다. - 슬라이드쇼가 아닌 스토리. 샷들 사이에 작은 줄거리를 계획하고, 샷들을 연결하는 하나의 여행자(여기서는 TV에서 탈출한 유령 인형)를 만드세요. 자막은 슬로건이 아닌 짧은 이야기 비트입니다.
- 일부러 투박하게. 모든 것은 1/12초 단계로 움직이며 약간의 흔들림이 있고, 인형은 키프레임에서 비틀거리며, 자막은 세 단계에 걸쳐 튀어나오고 화살표는 세 번의 획으로 그려집니다. 부드럽게 하지 마세요.
- 제품과 브랜드의 절반씩. 대부분의 샷에 제품이 등장하고 태그와 함께 클로즈업 샷이 하나 있습니다; 마지막 카드는 워드마크, 제품, 이름 및 구매처 정보로 구성됩니다.
워크플로우
- 수집 하나의 촬영에서 4~8장의 스틸 사진 (3:4, 4:5 또는 9:16), 제품명, 한 줄 설명 (맛, 재료), 참고 사항 ("할로윈 한정") 및 CTA. 스틸 사진 하단에 인쇄된 워드마크나 배지가 있는지 물어보세요 (마지막 카드를 위해 프레임에서 지워지고 키잉됩니다).
- 대본 (생성 전에 보여주기): 샷의 순서, 줄거리, 각 클립에서 움직일 요소 (한두 가지 작은 동작, 제품은 정지), 인형으로 오려낼 소품과 그 역할, 자막 및 태그, 비용. 15~20초 분량으로 유지하세요.
- 키프레임:
node scripts/generate.mjs extend --in still.jpg --out keys/<shot>.png --cover <rows>(9:16이 아닌 각 스틸에 대해 실행,--cover= 원본 하단에 있는 인쇄된 워드마크 띠의 높이(픽셀)). 각각을 전체 크기로 확인하세요: 모델이 새로 확장한 영역에 거울처럼 반사되거나 중복된 객체를 남겼다면, 같은 사진의 평범한 텍스처로 덮으세요. - 시험: 클립 하나, 줄거리의 핵심이 되는 샷:
node scripts/generate.mjs clip --start keys/<shot>.png --prompt "…" --out clips/<shot>.mp4. 프롬프트는 움직이는 것만 지정합니다 ("그녀가 엄지손가락으로 리모컨 버튼 하나를 누릅니다; 컵은 똑바로 서서 움직이지 않습니다"); 고정된 접미사는 카메라가 고정되고 세트, 얼굴 및 제품이 변경되지 않도록 합니다. 보여준 후 나머지를 진행하세요. - 클립 다른 움직이는 샷들에 대해. 각 프레임을 하나씩 확인하세요: 동작이 끝나는 지점을 기록하고 (사운드와 인형을 거기에 맞춤) 제품의 작은 글자가 흐려지는 부분을 확인하세요.
relabel --clip … --key keys/<shot>.png --box x,y,w,h(키프레임에서 라벨의 박스)로 라벨을 수정하거나, 제품이 움직이기 전의 프레임만 사용하세요. 모든 샷에 클립이 필요한 것은 아닙니다: 느린 푸시 인(still,box,boxTo)이 있는 제품 클로즈업 스틸이 더 나은 경우가 많습니다. - 소품: 각 인형에 대해
cutout --in keys/<shot>.png --box x,y,w,h --out props/<name>.png(캐릭터, 별, 꽃, 베리, 손에 든 제품); 무언가 제거된 접시(유령이 없는 TV 화면)에 대해edit. 워드마크:wordmark --in still.jpg --box x,y,w,h --out props/wordmark.png. 마지막 카드의 배경은 키프레임 중 하나에서 칠해진 벽을 크롭한 것입니다. effect.json작성examples/example.json을 참고하여 (샷 및 마지막 카드 섹션 확인),node scripts/reel.mjs effect.json --out reel.mp4실행 후"reel": "reel.mp4"설정.- 사운드:
node scripts/sfx.mjs effect.json --out stage.m4a, 그 다음"music": "stage.m4a". 타이밍 변경 후 다시 실행하세요.--no-bed --music track.mp3는 왈츠 대신 사용자가 사용 라이선스를 보유한 트랙으로 바꿉니다. - 검증:
node scripts/validate.mjs effect.json— 모든 오류를 수정하고 경고를 사용자에게 읽어주세요. - 초안:
node scripts/render.mjs effect.json --quality draft --width 540 --out draft.mp4, 모든 샷에서 한 프레임씩 확인: 자막, 태그 또는 인형이 얼굴이나 제품을 가리지 않는지, 모든 요소가 플랫폼 버튼이 위치한 오른쪽 14% 영역 밖에 있는지 확인. - 최종:
node scripts/render.mjs effect.json --out film.mp4 --poster poster.png. 샤오홍슈의 경우, 3:4 버전을 크롭:ffmpeg -i film.mp4 -vf crop=720:960:0:160 -c:a copy film-3x4.mp4(기본 720 너비 기준; 상단 또는 하단 160px에 중요한 요소가 없는지 확인).
샷
모든 위치는 1080 × 1920 프레임 픽셀 기준입니다. 각 샷은 다음 중 하나입니다:
- 클립 샷:
clip(reel.mjs가 자르는 파일),from및to(클립 내 초),speed(0.5 = 절반 속도, 12단계 재생으로 짧은 좋은 구간의 모든 프레임 사용),hold(첫 프레임이 움직이기 전에 머무는 시간(초)). - 스틸 샷:
still(이미지),len,box및boxTo([x, y, width]이미지 픽셀 내 9:16 윈도우; 시점이 하나에서 다른 것으로 이동).
모든 샷은 다음을 가질 수 있습니다:
captions:{ "text", "at", "out", "x", "y", "rot", "size" }— 손글씨가 적힌 찢어진 종이 조각;\n은 줄바꿈.tags:{ "text", "at", "x", "y", "to": [x, y], "ink": "dark" | "light", "rot", "size" }—to까지 그려지는 화살표가 있는 손글씨 단어.puppets:{ "image", "path": [[t, x, y, width, rotation], …], "sound", "exit", "flip", "wobble" }— 키프레임 사이를 이동하는 컷아웃 (t는 샷 내 초, x, y는 중심). 너비가 0인 키프레임 다음에 전체 너비의 키프레임이 오면 팝 효과."exit": true가 아니면 마지막 키프레임을 유지합니다.sound는 첫 번째 키프레임에서 재생됩니다.screen:{ "rect": [x, y, w, h], "off", "static", "plate", "plateAt" }—off까지 검은색,static까지 지지직거림,plateAt부터plate(화면이 비워진 동일한 키프레임)를 표시하는 TV 또는 휴대폰 화면. 인형이 그 안에서 나올 수 있습니다.sounds:[[t, "kind"], …]—click,tvon,static,ghost,boing,tap,pop,whoosh,land,stab,sip,sparkle,chime,paper,scribble,cut. 컷, 자막, 태그, 화면 및sound가 있는 인형은 자동으로 사운드를 가져옵니다.
마지막 카드
end: len, bg (9:16 칠해진 벽), wordmark (wordmarkY, wordmarkWidth), name (nameY, nameSize), line (lineY), note는 종이 조각 위 (noteX, noteY), cta는 알약 모양 위 (ctaY), 그리고 샷의 puppets와 동일 (손에 든 제품이 가장자리에서 슬라이드 인, 캐릭터, 별). 각각 …At 시간이 있습니다.
필드
| 필드 | 필수 | 참고 |
|---|---|---|
reel | 예 | 비디오 파일 경로, JSON 파일 기준 상대 경로 — scripts/reel.mjs (reel.mp4)에 의해 모든 클립 샷이 하나의 무음 9:16 릴로 잘린 파일 |
shots | 예 | 2~10개 항목 목록: clip, from, to, speed, hold, still, len — 순서대로 영화: 클립 샷 (스틸 사진 중 하나의 AI 클립) 및 스틸 샷 (느린 움직임이 있는 스틸); SKILL.md의 Shots 섹션 참조 |
end.bg | 아니요 | 이미지 경로, JSON 파일 기준 상대 경로 — 마지막 카드 배경: 사진에서 가져온 칠해진 벽이나 배경, 9:16 |
end.wordmark | 아니요 | 이미지 경로, JSON 파일 기준 상대 경로 — 투명 배경의 워드마크 (scripts/generate.mjs wordmark) |
end.name | 아니요 | 텍스트, 4단어 미만 — 마지막 카드에 손글씨로 쓰여진 제품명 |
end.line | 아니요 | 텍스트, 6단어 미만 — 이름 아래 짧은 설명, 예: 맛 정보 |
end.note | 아니요 | 텍스트, 4단어 미만 — 찢어진 종이 조각 위, 예: "할로윈 한정" |
end.cta | 아니요 | 텍스트, 12단어 미만 |
music | 아니요 | 오디오 파일 경로, JSON 파일 기준 상대 경로 — scripts/sfx.mjs (stage.m4a)의 사운드트랙 |
palette | 아니요 | #RRGGBB 형식 색상; 키: ink (자막 및 어두운 태그), paper (종이 조각 및 밝은 태그), accent (CTA 알약) |
팁
- 클립 프롬프트는 간결하게 작성하세요: 한두 가지 작은 동작, 무표정한 얼굴, "컵은 똑바로 서서 움직이지 않고, 라벨이 카메라를 향합니다". 큰 동작은 얼굴과 라벨을 흐릿하게 만듭니다.
- Kling은 자체적으로 타이밍을 선택합니다: 동작이 끝나는 지점을 관찰하고, 클릭, 컷 및 인형을 정수 시간이 아닌 그 프레임에 맞추세요.
- 스토리에 하나의 여행자를 부여하세요: 한 사진에서 오려낸 인형이 다음 샷에 등장하면 일곱 장의 스틸을 하나의 영화로 묶어줍니다.
- 새로운 아트가 아닌 사진 자체에서 인형을 오려내세요: 같은 페인트, 종이 및 조명이 조화를 이룹니다.
- 자막은 3~4 단어로 유지하세요; 그림이 대부분을 설명합니다.
출력
H.264 MP4, 1080 × 1920, 30fps (그림은 초당 12단계로 움직임), 사운드 포함 15~20초, 포스터 프레임(PNG) 포함.