Communitygithub.com

Moh4696/cinematic-film

코드만으로 모든 주제에 대해 내레이터가 있는 시네마틱 필름을 제작합니다. 사진, 문서, 카드, 지도, 경로와 큰 숫자가 펼쳐진 하나의 세계 위를 카메라가 한 번에 매끄럽게 이동하며, 모든 스탬프, 하이라이트, 숫자가 내레이터의 단어에 맞춰 떨어집니다. 사운드 효과, 선택적 배경 음악, 자막까지 포함됩니다. 다큐멘터리, 역사, 제품 출시, 브랜드/창업자 스토리, 과학/기술 설명, 전기, 실제 범죄에 적합합니다. 대본, 모든 TTS의 음성 해설, 그리고 분할된 테이크를 포함합니다.

cinematic-film란 무엇인가요?

이 스킬은 Skia-Python을 사용하여 완전히 코드로 작성된 시네마틱 필름을 제작하는 AI 에이전트 도구입니다. 하나의 연속적인 카메라 움직임이 하나의 세계(보드) 위를 이동하며, 내레이터의 각 단어에 맞춰 비주얼 효과(스탬프, 하이라이트, 지도 경로 등)가 정확히 타이밍됩니다. 모든 요소는 코드로 정의되므로 렌더링 결과가 매번 동일하며, 주제에 제한이 없습니다. 또한 새로운 음성으로 변경하면 전체 필름의 타이밍이 자동으로 재조정됩니다. 이 스킬은 macOS, Linux, Windows에서 동작하며 Python 3.9+, skia-python, ffmpeg를 필요로 합니다. 워크플로는 스토리 작성, 비트 테이블 승인, 이미지 수집, 음성 녹음, 장면 코딩, 렌더링, 사운드 디자인, 최종 출력의 11단계로 구성되며, 각 단계마다 사용자 승인 게이트가 있어 품질을 보장합니다.

지원 대상~Claude Code~Codex CLI~Cursor
npx skills add https://github.com/Moh4696/cinematic-skill/tree/HEAD/skills/cinematic-film

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

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

문서

시네마틱 필름

이 방식으로 제작된 필름은 하나의 카메라 움직임이 하나의 세계를 누비는 방식입니다. 모든 사진, 카드, 클리핑, 지도, 숫자는 하나의 큰 보드 위에 있으며, 이야기가 진행됨에 따라 카메라는 끈, 경로, 화살표를 따라 그 사이를 이동합니다. 모든 시각적 강조점은 내레이터가 말하는 단어에 맞춰 정확히 타이밍됩니다. 모든 것은 코드(Python의 Skia)로 이루어지므로 매번 동일하게 렌더링되며, 어떤 주제든 적용 가능하고, 새로운 음성이 들어오면 전체 필름의 타이밍이 자동으로 재조정됩니다.

5분 22초 분량의 알 카포네 다큐멘터리를 기반으로 구축되었으며, 이후 모든 주제로 확장되었습니다. 여기 적힌 규칙들은 실제 제작 과정에서 발생한 문제점들을 바탕으로 작성되었습니다.

도구

파일기능
scripts/check_setup.pyPython, skia-python, ffmpeg, 글꼴, 메모리를 확인하고 설치할 항목을 알려줍니다
scripts/get_fonts.py이 기계에 없는 텍스트 역할을 위해 오픈 라이선스 글꼴(Bebas Neue, Homemade Apple)을 가져옵니다
scripts/new_project.pyassets/template/(실행 가능한 설명 영상)에서 프로젝트를 시작하거나, --example 플래그로 다큐멘터리 예제를 시작합니다
scripts/make_beats.pybeats.md(승인해야 할 표)를 작성하고, 연대기, 줄 길이, 음성 텍스트 내 숫자를 검사합니다
scripts/tts_say.py최종 음성 녹음 전 필름의 타이밍을 잡기 위한 무료 임시 음성(macOS say, espeak-ng 또는 기타 TTS 명령)입니다
scripts/split_takes.py전체 섹션 테이크를 각 줄에 하나씩의 클립으로 자르고 의심스러운 컷을 표시합니다
scripts/build_narration.py줄들을 결합하여 audio/narration.m4a와 audio/timing.json을 만듭니다. 이 파일을 기반으로 필름이 제작됩니다
scripts/fetch_commons.pyWikimedia Commons를 검색하고, 라이선스와 크레딧 정보와 함께 다운로드하며, 무료 라이선스가 아닌 파일은 거부하고 credits.md를 작성합니다
scripts/make_map.py지도를 위해 공개 도메인 경계(모든 국가 또는 지역)를 투영합니다
scripts/prep_assets.py모든 이미지를 하나의 스타일(흑백, 세피아 또는 자연색)로 통일하고 보드 텍스처를 생성합니다
scripts/engine.py필름 엔진: 카메라, 스포트라이트, 아이템, 지도, 스타일, 필름 마감 처리
scripts/render.py스틸 컷, 연속 스트립, 큐 리스트, 병렬 MP4 렌더링
scripts/build_sfx.py큐 리스트의 모든 사운드 효과를 합성합니다(샘플 없음, 라이선스 불필요)
scripts/mix_soundtrack.py음성, 효과 및 선택적 음악을 덕킹 및 라우드니스 노멀라이즈하여 믹싱합니다
scripts/burn_captions.py완성된 필름에 네 가지 자막 스타일 중 하나를 입히고 SRT 파일을 작성합니다

Python 3.9+, pip install skia-python numpy pillow(scipy는 선택 사항) 및 ffmpeg가 필요합니다. scripts/check_setup.py를 먼저 실행하세요. Linux 또는 Windows에서는 프로젝트별로 scripts/get_fonts.py도 실행하세요. 모든 명령은 --project <폴더> 옵션을 사용합니다.

필름 선택

종류스타일이미지일반적인 아이템
역사, 실제 범죄, 수사wall, slate흑백(bw)으로 보정된 아카이브 사진 및 문서인쇄물, 찢어진 스크랩, 스탬프, 빨간 끈, 지도 경로
제품 출시, 브랜드 또는 창업자 스토리studio, charcoal자연색(natural)으로 보정된 제품 사진 및 팀 사진카드, 큰 숫자, 카운터, 화살표
과학, 공학, 작동 원리blueprint, paper다이어그램, 아카이브 또는 AI 스틸 이미지카드, 카운터, 펜 표시, 지도
기술, 우주, 예고편night스크린샷, 렌더링, AI 스틸 이미지큰 글자, 카운터, 경로, 카드

자유롭게 혼합 가능: 스타일은 보드와 마감 처리를 의미하며, 모든 아이템은 모든 스타일에서 작동합니다. references/story.md에는 각 종류에 대한 스토리 구조가 있습니다.

규칙

  1. 줄당 하나의 주인공. 각 내레이션 줄은 카메라가 비추는 대상이 정확히 하나여야 합니다. 스포트라이트는 다른 모든 것을 어둡게 만듭니다.
  2. 강조점은 말하는 단어에 맞춰 떨어집니다. 스탬프는 줄 시작이 아닌 "기소되었다"는 단어에 찍혀야 합니다. 모든 타이밍은 doc.W(줄, "단어")로 지정합니다.
  3. 한 구절은 한 가지 방식으로만 보여줍니다. 화면에 직접 표시하거나 실제 문서에 표시하되, 둘 다는 안 됩니다. 문서의 본문은 회색 행으로, 내용을 채우는 단어(filler words)는 사용하지 않습니다.
  4. 오프닝 이후로는 시간이 앞으로만 흐릅니다. 콜드 오프닝은 앞으로 건너뛸 수 있습니다. 하나의 다리 역할을 하는 줄(예: "4년 전...") 이후로는 이야기 시간이 앞으로만 진행됩니다.
  5. 휴대폰에서 1초 안에 읽을 수 있는 글자 크기. 굵고 좁은 대문자. 화면에 표시되는 레이블은 프레임 높이의 약 3% 이상이어야 합니다.
  6. 적을수록 좋습니다. 끈은 비트가 지나면 사라지고, 오래된 아이템은 흐려집니다. 최종적으로 카메라가 뒤로 물러났을 때는 복잡하지 않고 정돈된 모습이어야 합니다.
  7. 실제처럼 보이지만 실제가 아닌 것은 만들지 않습니다. 실제 사진과 문서는 크레딧이 필요합니다. 코드로 그린 문서는 재구성으로 표시하고, 실제로 쓰인 단어만 인용해야 합니다. AI 이미지는 일러스트레이션 용도로는 괜찮지만, 실제 사건이나 실제 인물의 증거로 사용해서는 안 됩니다.

워크플로

네 개의 게이트(Gate로 표시)에서 사용자의 승인을 위해 멈춥니다.

  1. 스토리. 조사 후 script.json 작성: 테이크(섹션)들의 줄로 구성, 각 줄은 text, spoken(숫자는 단어로), hero, typed를 포함합니다. 사실 노트를 함께 기록합니다. 60초에서 90초는 약 150~230단어입니다. 자세한 내용은 references/story.md를 참조하세요.
  2. 비트 테이블. scripts/make_beats.py를 실행하고 모든 린트 경고를 수정합니다. Gate: 사용자가 beats.md(사실 포함)를 승인합니다.
  3. 이미지. 모든 이미지를 photos.json에 나열: ID, 종류, 출처.
    • 아카이브 이미지: fetch_commons.py search, category, get
    • 사용자 파일: <project>/assets/photos/에 넣습니다.
    • AI 스틸 이미지: 하나의 스타일로 생성합니다(motion-assets 스킬이 계획 및 가격 책정).
    • references/archive.md에는 다른 아카이브 및 권리 규칙이 설명되어 있습니다.
  4. 임시 음성. tts_say.py, split_takes.py, build_narration.py를 순서대로 실행합니다. split_takes.py가 표시하는 모든 줄을 들어보세요. 이제 타이밍이 실제로 정해집니다.
  5. 에셋. 이야기가 이동하는 경우 make_map.py를 실행한 후 prep_assets.py를 실행합니다.
  6. 장면. scene.py 작성: 섹션별로 클러스터에 보드를 배치하고, doc.L/doc.W 시간에 아이템을 추가한 다음, 카메라 및 스포트라이트 키(film.shot)를 추가합니다. references/film.md를 읽어보세요. 제공된 두 프로젝트(assets/template/scene.py - 설명 영상, 스튜디오 스타일; assets/wright-flyer/scene.py - 다큐멘터리, 모든 아이템 유형)가 패턴을 보여줍니다.
  7. 룩 테스트. render.py --probe를 실행하여 각 줄당 하나의 스틸 컷을 1280x720으로 생성하고 모두 검토한 후, 모든 큰 카메라 움직임에 대해 --strip을 실행합니다. Gate: 사용자에게 오프닝과 룩의 스틸 컷을 보여줍니다.
  8. 드래프트. 임시 음성으로 처음 30초를 1280x720으로 렌더링합니다. Gate: 사용자가 시청합니다.
  9. 최종 음성. 모든 TTS 또는 실제 사람(references/voice.md)으로 녹음합니다. 분할, 빌드, 프로브를 다시 실행합니다. 장면의 어떤 것도 변경되지 않습니다.
  10. 사운드. render.py --cues를 실행한 후 build_sfx.py, mix_soundtrack.py를 실행합니다. 원한다면 배경 음악을 추가합니다. references/sound.md를 읽어보세요.
  11. 완료. 전체 렌더링을 수행한 후 burn_captions.py와 SRT를 실행합니다. 1440p 또는 4K로 렌더링하기 전에 references/performance.md를 읽어보세요. 필름과 함께 credits.md를 전달합니다.

자체 검토, 매번

무언가가 작동한다고 주장하기 전에 항상 스틸 컷을 확인하세요. 실제 렌더링에서 나타난 실수들은 다음과 같습니다:

  • 어두운 보드에 어두운 잉크: 보이지 않습니다. 어두운 룩에는 밝은 글자를 사용하거나, 어두운 글자 뒤에 전체 레이블 블록을 위해 bar_h=0.92를 사용하세요.
  • 카메라는 이동했는데 스포트라이트가 제자리에 남아 어두운 프레임이 발생했습니다. film.shot()을 사용하세요. 분리되어야 하는 경우가 아니라면.
  • 지도 축척이 너무 작습니다: 한 사진보다 작은 해안선 전체가 있습니다. 각 장소가 인쇄물과 함께 자신만의 공간을 가질 수 있도록 K를 선택하세요(references/film.md).
  • 지도 레이블이 겹칩니다. 레이블을 이웃과 반대쪽에 배치하세요.
  • 클러스터가 지도 가장자리에 걸쳐 있습니다. 클러스터를 지도 위에 완전히 두거나 지도 밖에 명확히 두세요.
  • 하이라이트가 단어에서 몇 픽셀씩 벗어납니다. PaperDoc.phrase_spans를 사용하고, 이미지에 그리드 오버레이로 읽은 비율을 사용하여 doc.on(print, fx, fy)를 사용하세요.

제공된 프로젝트

  • assets/template/: "From Cherry to Cup", 스튜디오 룩의 25초 설명 영상으로, 카드, 화살표, 카운터로 구성되며 이미지는 없습니다. new_project.py my-film으로 복사할 수 있습니다. 임시 음성을 제공하면 렌더링됩니다.
  • assets/wright-flyer/: "Twelve Seconds", 최초 비행과 두 번 추락한 $50,000 상대에 대한 90초 다큐멘터리입니다. 7장의 공개 도메인 사진, 미국 지도, 두 개의 조판 문서 및 모든 아이템 유형을 사용합니다.
python3 scripts/new_project.py wright --example
python3 scripts/fetch_commons.py get --project wright
python3 scripts/make_map.py --project wright && python3 scripts/prep_assets.py --project wright
python3 scripts/tts_say.py --project wright && python3 scripts/split_takes.py --project wright && python3 scripts/build_narration.py --project wright
python3 scripts/render.py --project wright --size 1280x720 --out out/draft.mp4 --audio audio/narration.m4a

관련 스킬

Open 3D Skills에서 제공: motion-assets는 필름에 일러스트레이션이 필요할 때 AI 스틸 이미지를 계획하고 가격을 책정하며, frame-capture는 코드로 그린 필름 대신 웹 페이지를 녹화합니다.

관련 스킬