소린셔 설명 패키징
출연 구술 클립(A-roll)과 대사를 소린셔 스타일의 설명 영상으로 패키징합니다. 출연 장면은 다른 도구로 생성하거나 촬영합니다. 이 스킬은 패키징에 필요한 자료 조회와 설명 화면, 자막, 전환, 사운드를 담당합니다.
환경에 design-aesthetic-standard가 있으면 시각 및 사운드 창작 판단이 이를 함께 따릅니다. video-generation이 있으면 출연 클립 생성과 편집은 해당 스킬을 참조합니다.
참조 문서 (필요 시 읽기)
references/style-bible.md: 그녀의 그래픽 언어, 6가지 하드 룰, 색상 팔레트, 폰트, PIP, 전환 통계, 사운드 레벨. 씬을 계획하기 전에 반드시 읽어야 합니다.references/research.md: 각 레이아웃에 필요한 자료, 출처 등급, 확인 위치, 이미지 권리. 씬을 계획할 때 읽습니다.references/layouts.md: 각 레이아웃 컴포넌트의 파라미터, 호출 예제, 주의사항. 스토리보드를 작성할 때 읽습니다.references/storyboard-api.md:timeline.json과project.json형식, 스토리보드 API, 키워드 타이밍, 리뷰 및 렌더링 명령. 처음 프로젝트를 설정할 때 읽습니다.
환경
- Node.js ≥ 18, ffmpeg, python3 (numpy 및 Pillow 포함).
npm install및 첫 번째 렌더링 시 인터넷 연결 필요 (Remotion이 Chrome을 다운로드). - macOS (Apple Silicon)에서만 테스트되었습니다. 다른 시스템에서는 기본적으로 소프트웨어 렌더링
swangle을 사용하며, 환경 변수REMOTION_GL로 변경 가능합니다. - 폰트: 템플릿에 6개의 SIL OFL 폰트가 포함되어 있으며, 라이선스는
templates/engine/public/fonts/LICENSES.txt에 있습니다. YouShe 타이틀 흑체 (YouShe.ttf)는 패키지에 없을 수 있습니다.new_project.sh는$YOUSHE_TTF및 일반 폰트 디렉토리에서 찾습니다. 찾지 못하면 사용자에게 https://www.uisdc.com/uisdc-first-free-font 에서 다운로드하여public/fonts/YouShe.ttf로 저장하라는 메시지를 표시합니다. 이 폰트가 없으면 제목과 자막이 Noto Sans CJK 가장 굵은 웨이트(900)로 폴백되며, 사선 처리가 없어 스타일이 크게 약해집니다. - Remotion 라이선스: 개인, 3인 이하 회사 및 비영리 단체는 상업적 사용을 포함하여 무료로 사용 가능합니다. 4인 이상 회사는 회사 라이선스를 구매해야 합니다 (https://www.remotion.pro/license).
워크플로우
1. 입력 준비
- 출연 클립: 각 문장에 대해 1920×1080 mp4 파일을
public/clips/<id>.mp4에 저장. - 대사: 각 문장에는 낭독 텍스트
say(한자 표기)와 자막 텍스트sub가 필요합니다. - 사실 파일:
templates/facts_template.md에서 복사. 이미 있는 사실과 출처를 먼저 작성하고, 누락된 것은 4단계에서 조회. - 선택 사항: 실사 또는 AI 이미지 (
public/broll/), 사진 (public/photos/), 음악 (public/music/), 새 아이콘 (public/icons/).
2. 프로젝트 생성
<skill>/scripts/new_project.sh <프로젝트 디렉토리> # --demo 옵션을 추가하면 4개의 가짜 출연 클립과 예제 스토리보드가 생성되어 스모크 테스트에 사용됩니다.
그런 다음 timeline.json을 작성합니다. 각 출연 비디오 클립을 트랜스크립트하고 tin/tout을 결정하며, 시작과 끝의 무음을 자릅니다. 중간에 말실수는 cuts에 기록합니다. project.json의 brand와 music을 수정합니다.
3. 씬 계획 (먼저 테이블을 작성한 후 코드 작성)
style-bible.md와 research.md를 읽은 후 다음 테이블을 작성합니다: 씬 이름 | 포함 문장 | 레이아웃 | 어두운 배경 또는 흰 배경 | PIP 방식 | 필요한 자료. 다음 5가지를 확인합니다:
- 하나의 씬은 2~8개 문장을 포함하며, 한 문장에 한 페이지가 되어서는 안 됩니다.
- 각 씬에서 '주체가 잘림' 또는 '주체가 화면의 60% 이상을 차지'(R1)를 충족해야 합니다.
- 어두운 배경 씬 2~3개마다 흰 배경 씬 1개가 있어야 합니다(R2).
- 원문을 인용할 때는
docpage를 사용하며, 원문은 실제로 한 글자씩 인용되어야 합니다. - 오프닝 훅, 의견 문장, 전환 문장 및 결말은 전체 화면 출연에 남겨두고, 설명 화면으로 완전히 덮지 않아야 합니다.
4. 자료 조회
씬 테이블의 '필요한 자료' 열을 따라 항목별로 조회하며, 방법은 research.md를 참조합니다. 각 결과를 사실 파일에 번호, 원문, 출처 링크, 날짜와 함께 기록합니다. 사진은 scripts/commons_photo.py로 검색 및 다운로드합니다.
조회 후 씬 테이블을 수정합니다: 한 글자씩 인용할 원문을 찾을 수 없으면 docpage를 사용하지 않음; 동일한 기준의 데이터를 모을 수 없으면 paper를 사용하지 않음. 대사의 숫자가 사실 파일과 일치하지 않으면 대사를 먼저 수정한 후 출연 클립을 생성하거나 다시 편집합니다.
5. 스토리보드 작성
templates/scenes_example.py에서 작성 방법을 복사합니다. 각 씬은 다음을 충족해야 합니다:
- 요소의 입장 애니메이션 키워드 정렬:
S.k('키워드', -0.15). - 현재 항목은 밝게, 나머지는 어둡게 (
focus/hl/lit). 카메라는 현재 항목을 따라감 (sc.cam/look). KF.append((태그, 시간))을 사용하여 최소 1개의 리뷰 프레임을 등록.
python3 story_core.py timeline.json scenes.py를 실행하여 gaps/overlaps []를 확인합니다.
6. 키프레임 리뷰 (최소 2회)
python3 -c "import json;print(' '.join(str(f) for _,f in json.load(open('keyframes.json'))))" | xargs node render.mjs stills stills/k1
python3 <skill>/scripts/sheet.py stills/k1 keyframes.json 6
하나씩 그리드 이미지를 검토하고, 아래 리뷰 체크리스트에 따라 수정한 후 수정된 프레임을 다시 렌더링합니다. 원본 영상이 있는 경우 동일한 유형의 레이아웃 원본 프레임을 캡처하여 나란히 비교합니다.
7. 전체 렌더링, 믹싱, 합성, 품질 검사
<skill>/scripts/render_chunks.sh video.mp4
python3 <skill>/scripts/mix_audio.py timeline.json mix_raw.wav
<skill>/scripts/finalize.sh video.mp4 mix_raw.wav final.mp4
python3 <skill>/scripts/audit.py video.mp4 72 # 비디오 프레임과 정적 프레임을 프레임별로 비교하며, flagged는 반드시 0이어야 함.
모바일 버전: ffmpeg -i final.mp4 -c:v libx264 -crf 23 -preset medium -pix_fmt yuv420p -c:a aac -b:a 128k -movflags +faststart final_phone.mp4.
리뷰 체크리스트
각 키프레임에서 확인:
- 주체가 충분히 크거나 가장자리에서 잘림. 주변에 넓은 빈 공간이 없어야 함.
- 현재 말하고 있는 항목이 가장 밝고, 카메라가 그 근처에 있어야 함.
- 프레임당 최대 2개의 레이블.
- 자막 (화면 y 905–960), PIP, 채널 로고, AI 라벨에 의해 가려지는 요소가 없어야 함.
- 박스형 문자 (누락된 글리프), 세로로 줄바꿈된 단어, 카드를 벗어난 글자가 없어야 함.
- 숫자, 단위, 원문이 사실 파일과 일치하고, 출처 행이 존재하며, CC BY 사진에는 저작자 표시가 있어야 함.
- 흰 배경 씬과 어두운 배경 씬이 번갈아 나타나야 함.
알려진 함정
- 키워드가 문장의 시작에 있을 때
S.k(단어, -0.3)이 클립 시작점보다 앞설 수 있음.max(S.t0, ...)으로 잘라냅니다. formula6의 토큰 열 너비는iw와 같습니다.iw는 문자 수 ×fs보다 크거나 같아야 합니다.- 화면 x = (세계 x − 카메라 x) × s + 960.
piprect는 화면 x 110–560을 차지하며, 주체는 ≥ 600 위치에 배치. 카메라 위치를 변경하면 화면에서 주체의 위치도 함께 변경됩니다. ui결과의 기본 단위는 '위안/월'이며,u=로 변경 가능.paper카드 하단의 화면 y는 ≤ 900이어야 합니다.ent6의 국기 코드는cl,cn,de,fr,jp,us만 지원.- 이미지 경로가 존재하지 않으면 해당 프레임 렌더링이 실패합니다 (
FAIL ... Error loading image). 먼저ls public/<경로>로 확인. - 정적 프레임이 정상이라고 해서 전체 비디오가 정상임을 보장하지 않습니다. 전체 렌더링 후 반드시
audit.py를 실행. - 그라데이션 3D 텍스트가 600px를 초과하면 Chrome이 멈출 수 있습니다.
GText의 레이어 수와 블러 제한을 제거하지 마세요.
사용 경계
- 이것은 스타일 복제 도구입니다. 완성 영상에
brand.label의 'AI 생성 · 비본인' 라벨을 유지하고, 제거하지 마세요. brand.logo는 기본적으로 비어 있습니다. 사용자 자신의 채널 로고를 입력하세요. '소린셔' 또는 다른 실제 크리에이터의 로고를 채운 후 공개 배포하지 마세요.- 실제 크리에이터의 초상이나 목소리를 사용하여 출연 장면을 생성한 후 공개 배포하지 마세요.
- 완성 영상을 본인의 작품으로 게시하거나 시청자를 오도하는 데 사용하지 마세요.
- 영상에 포함된 데이터, 원문, 정책 조항은 모두 출처까지 추적 가능해야 합니다.