Faceless Shorts
주제로 완성된 세로 쇼츠 영상을 제작합니다: 대본, 음성, 단어 동기화 자막, 애니메이션 장면, 사운드 및 배경음악을 포함하여 MP4로 렌더링합니다. 모든 것이 코드입니다: 캔버스 드로잉, 헤드리스 Chrome 캡처, ffmpeg, 로컬 Kokoro 음성, 로컬 Whisper 단어 타이밍, numpy 사운드. AI 이미지나 비디오 없음, API 키 없음, 크레딧 없음.
SKILL = 이 파일이 있는 폴더입니다. 프로젝트는 ~/faceless-shorts/<short-name>/에 저장됩니다.
| 스타일 | 설명 | 길이 · 비율 |
|---|---|---|
Deep Dive 3D deep-dive | 대표 스타일, Zack D. Films 스타일: 조각된 3D 인물, 햇빛이 드는 세트, 빛나는 엑스레이 신체, 혈관을 통한 카메라 여정, 얕은 심도. "만약 ~하면 어떻게 될까?" 신체/과학 | 30-45 s · 9:16 |
Night File 3D night-file | 미해결 미스터리 / 실제 범죄: 하나의 빛만 있는 어두운 3D 공간, 얼굴 없는 사람들(대상은 빨간색으로 빛남), 타자기 날짜, 사건 파일 삽입 | 30-45 s · 9:16 |
Inside Out inside-out | 평면 2D "만약 ~하면 어떻게 될까?" 설명: 단순한 주인공, 엑스레이 컷어웨이, 굵은 1-3단어 자막, 강렬한 컷 | 25-40 s · 9:16 |
Stick Story stick-story | "당신이라면 어떻게 하시겠습니까?" 생존 단계: 연기하는 눈을 가진 막대인간, 평면 실내/야외 공간, 금색 단계 카드 | 30-45 s · 9:16 |
Paper Atlas paper-atlas | 컷 아웃 종이 역사: 양피지 지도, 진홍색 경로, 금색 날짜 리본, 시대 인물 | 30-45 s · 9:16 |
Tall Tale 3D tall-tale | 재미있는 실화: 햇살 가득한 3D 작은 마을에서 움직이는 평면 2D 만화 인물(큰 둥근 머리, 잉크 윤곽선), 항상 움직이는 카메라, 한 단어 자막 | 40-60 s · 9:16 |
스타일 선택: 신체/건강/과학 "만약 ~하면 어떻게 될까" → Deep Dive 3D (또는 더 가볍고 빠른 2D 룩을 원하면 Inside Out) · 으스스함, 미스터리, 실제 범죄, "1971년에 이런 일이 일어났다" → Night File 3D · 생존, 생활 꿀팁, "이렇게 하세요" → Stick Story · 역사적 사건, "X는 어떻게 일어났는가" → Paper Atlas · 재미있거나 영리한 실화, 사기, 허점, "이 남자가 X를 했다" → Tall Tale 3D. 명확하지 않으면 한 번 물어보십시오.
각 스타일 = styles/<style>/style-sheet.png (룩을 하나의 이미지로 표현, 스타일 자체 코드로 그림) + STYLE.md (규칙 + 엔진 매뉴얼) + example/ (있는 그대로 렌더링되는 완전한 프로젝트). 계획을 세우기 전에 스타일의 STYLE.md를 전체 읽으십시오.
0. 첫 사용 (컴퓨터에서)
bash SKILL/scripts/setup.sh를 All set 메시지가 나올 때까지 실행하십시오 (Node 22+, ffmpeg, Chrome 확인; ~/.faceless-shorts/venv 생성; Kokoro 음성 ~340MB 및 Whisper small.en ~0.5GB 다운로드). 누락된 항목은 공식 무료 방법으로 설치하고, 비밀번호가 필요한 항목은 물어보십시오. 그런 다음 bash SKILL/scripts/selftest.sh를 실행하면 SELFTEST PASSED가 출력되어야 합니다: 연락처 시트를 열고 이름과 모양을 확인하십시오.
1. 입력 (한 번에, 기본값 채움)
알려지지 않은 것만 한 번에 물어보십시오: 주제 (또는 "3가지 아이디어 골라줘"), 마음에 드는 쇼츠 링크 (선택 사항), 길이 (기본 ~30초), 음성 (SKILL/scripts/py SKILL/scripts/voice.py --list; 기본 am_michael), 내레이션 모드: AI 음성 (기본) · 자신의 녹음 (대본 보고 녹음; words.py --audio) · 자막만 (아직 음성 없음; estimate.py), 배경음악 (내장 · 없음 · 자신의 로열티 프리 파일), 마지막 줄 / 핸들. "바로 시작" = 기본값.
2. 계획 (한 화면, 대기)
보여줄 내용: 제목 · 전체 나레이션, 컷당 한 줄, 캡션 청크 포함 (WHAT IF *YOU | SWALLOW *GUM?) · 샷 리스트, 각 줄마다 (보여지는 것, 움직이는 것, 어떤 단어에 맞추는지) · 키트에 추가할 새 구성 요소 (있는 경우) · 사실 및 출처. "만들까요?" 라고 물어보고 기다리십시오.
대본 규칙. 실제 사람이 친구에게 말하는 방식으로 작성하십시오: 연결어 ("음,", "여기서", "그런데", "그래서", "즉")를 사용한 완전하고 흐르는 문장. 35초에 약 90-110단어. 줄은 컷입니다, 문장이 아닙니다: 각 문장을 자연스러운 쉼표, "그리고", "여기서"에서 1-3줄로 나누어 그림이 1.5-3.5초마다 바뀌면서 음성은 계속 흘러가게 합니다 (voice.py는 각 전체 문장을 한 번에 말합니다). 형태: 갈고리 질문, 점진적 상승, 신화 또는 놀라움, 반전 ("하지만 만약 당신이..."), 반복되는 강력한 마지막 줄. 숫자는 말하는 대로 씁니다 ("seven"). 머릿속으로 소리 내어 읽어보십시오: 자막처럼 들리면 다시 쓰십시오. 독창적인 작성만: 형식은 가져와도 다른 제작자의 대본이나 샷은 가져오지 마십시오. 모든 사실은 신뢰할 수 있는 출처와 대조하십시오 (script.json "sources"에 나열). 건강 주제: 정확하고, 고어 없음, 무서운 잘못된 정보 없음.
3. 제작
bash SKILL/scripts/new_video.sh <style> <short-name>을 실행하여 예제를~/faceless-shorts/<short-name>/에 복사합니다.script.json작성 (줄 + 캡 + 간격; STYLE.md 참조).- 타이밍:
SKILL/scripts/py SKILL/scripts/voice.py <proj>실행 후SKILL/scripts/py SKILL/scripts/words.py <proj>(자체 녹음:words.py <proj> --audio their.m4a; 자막만:estimate.py <proj>). src/shots.js다시 작성: 긴 줄은 두 샷으로 나누고, 각 샷을cut(i)으로 배치하고Wd('word', line)으로 단어의 주요 순간에 배치합니다. 키트 재사용 (src/core/kit.js); 새 구성 요소는 스타일 룩에 맞게 거기에 추가합니다.- 프로젝트에서:
node tools/capture.mjs check(CHECK OK 출력) →node tools/capture.mjs cues→SKILL/scripts/py tools/mix.py .→ QA (4장) →node tools/capture.mjs video renders/<name>.mp4. 하나의 샷 반복:node tools/capture.mjs frames review/f "4.2,4.6"후 확인.
4. QA: 확인하지 않은 프레임은 절대 보여주지 마십시오
node tools/capture.mjs sheet review/all.jpg 0.5 10 (0.5초마다 프레임, 타임스탬프 포함)을 실행하여 전체 시트를 읽은 다음 주요 프레임을 전체 크기로 확인하십시오. 모든 프레임에 대해 질문:
- 의미가 통하는가? 샷당 하나의 시각적 모드: 신체가 엑스레이면 전체가 엑스레이여야 함 (엑스레이 신체에 셔츠 소매 없음). 소품은 그것을 잡고 있는 것과 함께 움직임 (껌은 손이 입에 닿을 때까지 손에 머물러야 함). 원인이 나타나기 전에 아무것도 나타나지 않음.
- 그 순간의 나레이션과 일치하는가? 그림은 해당 줄 직전에 변경됨; 공개는 해당 단어에 맞춰짐.
- 충돌하는 것이 있는가? 움직이는 요소가 레이블, 알약, 자막 영역(y 1250-1550) 또는 서로를 우연히 교차하지 않음.
- 자막: 1-3단어, 정확히 하나의 노란색 단어, 철자 정확, 말하는 단어에 맞춤, 휴대폰에서 읽을 수 있어야 함.
- 스타일 시트: 팔레트, 평면 모양, 시안색 엑스레이 뷰, 빨간색 위험만 사용.
- 사운드: 배경음악 위로 음성이 선명함; 효과음 부드러움 (날카로운 틱이나 삐 소리 없음). 수정하고, 시트를 다시 렌더링하고, 다시 확인하십시오. 사용자에게 무엇을 잡아내고 고쳤는지 알리십시오.
5. 전달
사용자를 위해 MP4를 엽니다. 또한 제공: 35MB를 초과하면 공유용 복사본 (ffmpeg -i in.mp4 -c:v libx264 -crf 21 -preset slow -c:a aac -b:a 160k -movflags +faststart share.mp4), 가장 좋은 커버 프레임 (capture.mjs frames), 제목, 캡션 및 5-8개의 해시태그. 자체 녹음 모드의 경우 각 줄의 타이밍이 포함된 대본도 제공하여 함께 읽을 수 있도록 합니다. 정확한 변경 한 번을 제안하고 변경된 부분만 다시 렌더링합니다.
5b. Zapier를 통해 YouTube에 게시 (사용자가 업로드를 요청할 때만)
모든 호출은 Code Mode 도구입니다: execute 내에서 tools.zapier.*로 실행하십시오 (일반 도구로 호출하지 마십시오). 실제 업로드에서 한 번 검증됨; 아래 값은 정확합니다.
- 연결.
list_zapier_skills에 업로드용 저장된 스킬이 있으면 사용하십시오. 그렇지 않으면 YouTube 앱이 활성화되어 있는지 확인하십시오:discover_zapier_actions({ app: "YouTube" })→enable_zapier_action({ selected_api: "YouTubeV4CLIAPI", app_display_name: "YouTube", action: "upload_video" }). 아직 연결이 없으면manage_zapier_connections({ selected_api: "YouTubeV4CLIAPI" })가 사용자에게 연결 URL을 반환합니다. - 파일 호스팅. 액션의
video/thumbnail매개변수는 Zapier 서버가 가져올 수 있는 URL이 필요합니다. 로컬 경로는 조용히 실패합니다. MP4를 임시 호스트에 올리십시오. 다음 순서로 (2026-11-03 테스트 완료; Windows에서는curl.exe사용):- a. litterbox (1시간~72시간 만료, 최대 1GB):
curl -F "reqtype=fileupload" -F "time=1h" -F "fileToUpload=@renders/<name>.mp4" https://litterbox.catbox.moe/resources/internals/api.php→ 일반 텍스트로 직접 URL 반환. - b. uguu.se (약 3시간 만료, 35MB 미만 쇼츠에 적합):
curl -F "files[]=@renders/<name>.mp4" https://uguu.se/upload→ JSON 반환;files[0].url사용 (d.uguu.se/...링크). - c. catbox (영구, 만료 없음): (a)와 동일 호출,
-F "time=1h"없음. 영구 공개이므로 사용자의 동의가 있어야만 사용. - 건너뛰기 (2026-11-03 확인 결과 깨짐, 재시도 낭비하지 마십시오): 0x0.st (업로드 비활성화), tmpfiles.org (링크가 뷰어 페이지, 원시 파일 아님), gofile.io (원시 다운로드에 계정 토큰 필요), file.io (curl API가 웹 앱으로 리디렉션), bashupload.com, temp.sh (죽음).
- 항상 URL을 사용하기 전에 확인하십시오:
curl -sSI <url>은 비디오 콘텐츠 유형과 함께 200/206을 반환해야 합니다. 호스트의 JSON을 확인 없이 신뢰하지 마십시오. - 사용자에게 자신의 비디오가 자체적으로 만료되는 공개 임시 호스트에 올라간다는 것을 알리십시오.
- a. litterbox (1시간~72시간 만료, 최대 1GB):
- 먼저 확인. 이것은 사용자의 실제 채널에 작성되므로 실행 전에 확인하십시오: 제목, 공개 범위 (비공개 / 미등록 / 공개) 및 카테고리.
필요한 경우
inspect_zapier_actions({ tool_name: "youtube_upload_video", enum_property: "category_id" })로category_id를 확인하십시오. 코미디 = 23 (Tall Tale 및 Deep Dive의 기본 권장), 교육 = 27, 애완동물 및 동물 = 15. - 업로드.
execute_zapier_write_action({ selected_api: "YouTubeV4CLIAPI", action: "upload_video", tool_name: "youtube_upload_video", params: { video: "<temp URL>", title, description (#shorts로 끝내기), tags: [# 없는 5-8개의 해시태그], category_id: "23", privacy_status, made_for_kids: false, embeddable: true, notify_subscribers: true, default_language: "en", license: "youtube" } }) - 보고. 결과에
id가 포함됩니다. 링크는https://www.youtube.com/watch?v=<id>입니다. 60초 이하의 세로 비디오는 자동으로 Shorts가 됩니다 (추가 필드 불필요). 사용자를 위해 로컬 파일을 엽니다 (tools.browser.preview({ path: "renders/<name>.mp4" })) 및 YouTube URL을 텍스트로 제공합니다. 인앱 브라우저는 종종 youtube.com 로드에 실패하여 ERR_ABORTED를 반환합니다. 이는 업로드 실패가 아닙니다. - 썸네일. 미등록 업로드는 이 액션을 통해 사용자 지정 썸네일을 가져오지 않습니다. 사용자가 나중에 비디오를 공개할 경우 저장된 커버 프레임을 제공하십시오.
새 스타일 추가 (사용자 요청 시)
styles/<new-style>/를 만들고 style-sheet.png, STYLE.md (Inside Out과 동일한 섹션: 룩 규칙, 팔레트, 형식, 엔진/키트 맵, 구성 요소, 샷 해부, 큐 유형, QA 함정) 및 완전한 example/을 포함하십시오. Inside Out의 tools/, index.html, src/main.js, src/core/{lib,timing,captions}.js를 복사한 다음 새 룩의 키트와 샷을 만드십시오. 공유 스크립트(voice, words, estimate, new_video, selftest)는 변경 없이 작동합니다. 위 표에 행을 추가하고 selftest.sh를 실행하여 모든 스타일이 통과할 때까지 반복하십시오.
3D 스타일 (Deep Dive, Night File, Tall Tale)
헤드리스 Chrome에서 three.js로 실제 3D를 렌더링합니다. 그래픽 카드가 있으면 빠르고 완전한 품질입니다. 그래픽 카드가 없는 경우 (GPU 가속이 없는 노트북, 클라우드 샌드박스) node tools/capture.mjs ... 앞에 SOFTWARE_GL=1 QS='&res=0.6&aa=0&shadow=1024' FPS=24를 붙여 렌더링합니다 (프레임당 약 2초; 사용자에게 예상 렌더링 시간을 미리 알리고 백그라운드에서 실행하며 QA는 sheet review/all.jpg 1 10으로 먼저 수행). 해당 STYLE.md 파일에 3D API가 나열되어 있습니다.
절대 하지 말아야 할 것
AI로 이미지나 비디오 생성; 사용자의 비용이나 크레딧 사용; 사용자의 요청과 확인 없이 YouTube 또는 다른 호스트에 업로드; 다른 제작자의 대본, 샷 또는 프레임 복사; 확인 없이 사용자의 프로젝트 덮어쓰기; 확인하지 않은 프레임 전달.