인테리어 릴스은(는) 무엇을 하나요?
인테리어 프로젝트의 원시 클립을 업로드 준비된 9:16 릴로 변환합니다. 스크립트는 도구일 뿐입니다. 편집 결정(어떤 샷, 어떤 부분, 어떤 순서)은 Claude의 작업이며, 파일 이름을 추측하는 것이 아니라 각 클립의 이미지를 보고 결정해야 합니다.
SKILL = 이 스킬의 폴더. 모든 스크립트: python3 SKILL/scripts/<이름>.py.
시작 전(세션당 한 번)
bash SKILL/setup.sh를 실행하세요. 실패가 있으면 먼저 해결하세요. SKILL/brand.json을 읽어 스튜디오 이름, CTA, 로고, 기본 패턴 및 클라이언트 취향을 확인하세요.
절대 규칙(위반 불가)
- 텍스트와 로고는 어시스턴트의 작업이 아닙니다. 텍스트와 로고는 클라이언트가 GUI에서 설정하여
<폴더>/_edit/overlay.json에 저장합니다.render.py는 이 파일을 읽고 계획의 모든teks와logo를 덮어씁니다.plan.json에teks나logo를 작성하지 말고, 클라이언트에게 텍스트 내용을 묻지 말고, 클라이언트가 요청하지 않는 한overlay.json에 직접 텍스트를 추가하지 마세요(brand.json의 CTA 포함). - 패턴은 컷과 외형만 제어합니다. 패턴에서 가져오는 것: 슬롯 순서, 지속 시간, 움직임, 전환, 그레이딩. 패턴의
teks,contoh_isi,logo는 참조 비디오의 메모일 뿐, 렌더링되지 않습니다. - 채팅을 통한 텍스트 또는 로고 변경 =
overlay.json편집. 클라이언트가 텍스트 내용, 폰트, 위치, 등장 시간, 크기, 색상 또는 로고 변경을 요청하면<폴더>/_edit/overlay.json(형식은PLAN.md의overlay.json섹션 참조)을 편집하고 다시 렌더링하세요. GUI는 응답 후 이 파일을 다시 로드합니다. 폰트는SKILL/fonts/에서만 사용 가능합니다. 폰트 목록, 카테고리, 특징 및 용도는fonts/fonts.json에 있습니다. 클라이언트가 요청한 분위기에 따라 거기서 선택하세요. 줄마다 다른 폰트나 크기(예: "두 번째 줄은 Great Vibes로")는teks[].per_baris를 통해 설정합니다. 로고는hitam(brand/logo.png) 또는putih(brand/logo-putih.png)만 가능합니다. 스튜디오 데이터(이름, 웹사이트keziakarin.com, Instagram@keziakarin.studio)는brand.json에서 유지됩니다. - 오디오도
overlay.json(audio)에서 가져옵니다. 음악을 직접 선택하거나 교체하지 말고, 계획에musik을 작성하지 마세요. 클라이언트가 채팅으로 요청하면(노래 변경, 볼륨, 시작점, 최종에 음악 포함/제외, 비트 동기화),overlay.json의audio를 편집하세요(형식은PLAN.md참조). 음악은 패턴 가이드 오디오(patterns/audio/) 또는 스튜디오 라이브러리(brand/musik/)에서만 사용 가능합니다. 클라이언트가 최종 결과물에 사용하려는 경우 참조 오디오가 타인의 소유임을 알리세요. overlay.json이 아직 없으면, 패턴의 텍스트와 로고 없이 렌더링이 진행됩니다. 클라이언트에게 텍스트와 로고를 GUI의 세부 정보 섹션에서 채울 수 있다고 알리세요.- 요청 없이
overlay.json을 삭제하거나 교체하지 마세요. 이 파일은 클라이언트의 선택입니다. - 흔들림은 자동으로 처리됩니다.
render.py는 각 세그먼트의 흔들림을 측정하고 자체적으로 안정화합니다("stabil": "auto", 기본값). 이유가 없는 한stabil을 입력하지 마세요.true는 강제 안정화,false는 비활성화(예: 의도적인 손떨림). 렌더 로그에서 "Stabil" 테이블을 읽으세요.! sisa goyang terlihat= 결과 확인;! GAGAL= 렌더 중단, 해당 세그먼트에 대해 다른 범위 또는 클립 선택. 리뷰 시, 명확히 흔들리거나 초점이 나간 부분은_review/*.json에goyang을 계속 입력하세요. 해당 범위는 렌더가mulai를 이동할 때 사용되지 않습니다. - 적합한 부분을 선택하고, 클립의 모든 초를 사용하지 마세요. 렌더링 시
render.py가 자동으로 클립을 분석하여(_kualitas/) 어둡거나, 비어 있거나(객체 없음), 흐릿한 부분을 표시합니다. 0.3초 이상의 불량 부분을 포함하는 세그먼트는 거부되고mulai제안이 제공됩니다. 필수:mulai를 제안 위치로 이동하거나,durasi를 줄이거나, 클립을 교체하세요. 사용자 허가 없이--abaikan-kualitas를 사용하지 마세요. - 지속 시간은 푸티지를 따르고, 패턴을 따르지 않습니다. 클립의 좋은 범위가 패턴 슬롯보다 짧으면 해당 슬롯을 줄이세요. 총 릴 길이는 패턴의
durasi_total보다 짧을 수 있습니다. 불량 부분으로 슬롯을 채우지 마세요. - 최종본 전에 프레임을 확인하세요. 분석 제안은 해당 범위의 프레임을 보고(그리드 또는 미리보기) 확인해야 합니다. 분석은 주요 객체가 좋은지, 해당 부분이 적절한 오프닝인지 알 수 없습니다.
- 먼저 모든 소재 클립을 리뷰하세요.
scripts/review_bahan.py <폴더-소재>를 실행하고,_review/의 모든 시트를 끝까지 보고, 각 클립의 JSON을 작성하세요(sudah_dilihat,goyang,rentang_layak,keputusan).render.py는 클립이 리뷰되지 않았거나 세그먼트가rentang_layak밖에 있으면 렌더링을 거부합니다(--abaikan-kualitas제외). - 렌더 후 텍스트를 확인하세요. 텍스트 위치는 클라이언트가 선택합니다(3x3 그리드). 렌더 후
*_teks<N>_cek.jpg를 확인하세요(빨간색 상자 = 예상 텍스트 영역). 텍스트가 얼굴이나 주요 객체를 가리면 클라이언트에게 알리고 다른 위치를 제안하세요. 동의 없이 위치를 직접 변경하지 마세요. - 클라이언트가 선택한 클립은
<폴더>/_edit/klip.json에 있습니다. 계획을 세우기 전에 이 파일을 읽으세요(형식은PLAN.md의klip.json섹션 참조).pembuka= 첫 번째 세그먼트의 클립,penutup= 마지막 세그먼트의 클립,jangan= 어떤 세그먼트에도 사용 불가. 클라이언트의 선택이 패턴의jenis_shot보다 우선합니다. 해당 클립의 샷 유형이 패턴 슬롯과 다르면 클라이언트에게 알리세요. 선택한 클립 내 최고의 초는 여전히 어시스턴트가 선택합니다.render.py는 이 파일을 위반하는 계획을 거부합니다(--abaikan-kualitas로 우회 불가).klip.json을 변경하거나 삭제하지 마세요. 이 파일은 GUI가 씁니다.
워크플로: 클립을 릴로 편집
- 정보 수집. 필수: 클립 폴더. 선택 사항: 패턴 및 음성/내레이션 파일(mp3/m4a/wav). 텍스트와 로고는 이미
_edit/overlay.json에 있으므로 묻지 마세요. 정말로 비어 있는 것만 물어보고, 최대 1개의 질문. 오디오 파일이 있으면 계획에suara를 입력하세요(PLAN.md참조). 음성은 스킬이 녹음하지 않습니다. 사용자가 오디오 파일을 제공해야 합니다. 폴더의 클립 수를 패턴의min_klip과 비교하세요. 부족하면 클라이언트에게 알리고min_klip이 더 작은 패턴을 제안하거나 클립을 추가하도록 제안하세요. 클라이언트가 동의하면 계속 진행해도 됩니다. - 스캔.
scan_clips.py <폴더>를 실행하여<폴더>/_scan/을 생성합니다. - view 도구로 모든
_scan/<클립>.jpg그리드를 보세요. 각 클립에 대해 표에 기록: 샷 유형(wide / medium / detail / walk-through / pan), 방, 품질(흔들림, 어두움, 너무 밝음, 사람 또는 어수선한 물건 있음), 최고의 초(manifest.json의detik_frame이 그리드 상자를 초에 매핑), 카메라 움직임 방향. 모든 그리드를 보기 전에는 진행하지 마세요. - 패턴 선택.
SKILL/patterns/*.json에서 요청 또는 기본값에 따라 선택. 자동 선택 시cocok_untuk가 클립 수와 내용에 가장 잘 맞는 것을 선택하세요. 선택한 패턴의catatan_training(있는 경우)을 읽고 슬롯 채울 때 교훈을 적용하세요. - 슬롯 채우기.
alur의 각 슬롯에 대해jenis_shot와 일치하는 클립과mulai초를 선택하고 아래 스토리텔링 규칙을 따르세요.durasi,gerak,transisi_masuk,efek_masuk,efek_keluar,redup, 그레이딩을 패턴에서 복사하세요.bingkai와akhir도 계획으로 복사하고,logo_slot을logo_segmen(해당 슬롯의 세그먼트 인덱스)으로 변경하고,pembuka_segmen을 패턴의 첫 번째 텍스트 슬롯 인덱스(teks[0].slot)로 채워 GUI의 오프닝 텍스트가 해당 슬롯에 나타나도록 하세요. 패턴에teks[0].durasi가 있으면pembuka_durasi_teks(숫자, 초)도 계획에 작성하세요. 이렇게 하면 오프닝 텍스트가 읽힐 수 있을 만큼 충분히 오래 표시됩니다. 패턴에teks[0].sampai_slot이 있으면pembuka_teks도 계획에 작성하세요.mulai,animasi,fade,keluar는teks[0]에서 복사하고,sampai_segmen=sampai_slot슬롯의 세그먼트 인덱스. 텍스트와 로고는 복사하지 마세요.SKILL/PLAN.md에 따라<폴더>/_edit/plan.json을 작성하고 절대 경로를 사용하세요.bingkai레터박스가 있는 패턴: 가로 클립을 우선 사용하세요. 세로 클립은 중앙에서 잘려 16:9 띠가 됩니다. 부득이하게 사용할 경우 클라이언트에게 알리세요.- 클립 재사용은 클립이 슬롯 수보다 적을 때 허용됩니다. 동일한 클립 내
mulai범위는 최소 1초 간격을 유지하고, 연속된 두 세그먼트에 사용하지 마세요. 렌더는 이 규칙이 위반되면 경고를 표시합니다. - 패턴에
belum_didukung이 있으면 렌더 전에 해당 효과를 클라이언트에게 언급하세요. - GUI의 편집 모드(메시지 "Mulai edit"에 언급됨):
ikuti referensi(기본값): 패턴 흐름을 정확히 복사하고, 슬롯을 버리거나, 바꾸거나, 합치지 마세요. 오버레이 텍스트는 패턴 슬롯에 따라 샷 번호(kapan)가 이미 지정되어 있고, 로고는logo_segmen을 사용하므로 세그먼트 순서는alur와 동일해야 합니다. 클립이 부족하면 클립을 재사용하고(위 규칙), 슬롯을 버리지 마세요.custom: 패턴은 스타일(그레이딩, 전환, 효과, 프레임)의 시작점일 뿐입니다. 지속 시간과 세그먼트 수는 클립에 맞게 조정 가능합니다. 계획에"mode": "custom"을 작성하여 참조 오디오가 비트에 동기화되도록 하세요.
- 미리보기.
render.py <계획> --preview를 실행한 다음*_preview_cek.jpg를 확인하세요. 확인: 순서가 합리적인지, 나쁜 샷이 없는지, 오버레이 텍스트를 읽을 수 있고 주요 객체를 가리지 않는지, 이상한 정지 프레임이 없는지. 필요한 경우 계획을 수정하고 반복하세요. - 최종본.
render.py <계획>을 실행하고,*_cek.jpg를 한 번 더 확인한 다음, 비디오 경로와 샷 순서 요약을 1-2문장으로 보고하세요.
인테리어 스토리텔링 규칙
- 처음 3초가 사람들이 스크롤을 멈추게 합니다. 오프닝은 가장 강력한 샷이어야 합니다: 밝고, 곧고, 공간이 완전히 보여야 함.
- 평면도를 따르세요. 공간 순서는 현관에서 공용 공간(거실, 식당, 주방)으로, 그런 다음 개인 공간(침실, 욕실)으로. 방 사이를 왔다 갔다 하지 마세요.
- 규모를 번갈아 가며. 와이드, 그다음 디테일, 그다음 와이드. 서로 다른 방의 와이드 두 개가 연속으로 오면 컷 대신 전환으로 연결하는 것이 좋습니다.
- 움직임 방향을 연결하세요. 왼쪽으로 패닝한 후 왼쪽으로 움직이는 샷이나
slideleft/smoothleft전환으로 연결하세요. 연결 지점에서 반대 방향 움직임을 피하세요. - 안정적인 부분을 선택하세요. 카메라가 시작하거나 멈출 때가 아닌 움직임 중간의 초를 선택하세요. 흔들리거나, 흐릿하거나, 사람이 있는 부분은 건너뛰세요.
- 클로징은 CTA와 로고를 위한 빈 공간이 있는 가장 예쁜 샷을 사용하세요.
- 텍스트:
overlay.json을 통해 클라이언트가 관리합니다. 조언을 요청받으면 텍스트당 최대 6단어를 제안하세요. - 클립이 슬롯보다 적음: 먼저
detail슬롯을 버리세요. 클립이 초과: 최고의 것만 사용하고, 모든 클립을 사용할 필요는 없습니다. - 가로 클립: 구도가 중요한 경우
"isi": "blur"를 사용하세요. 주요 객체가 중앙에 있으면crop으로 충분합니다.
워크플로: 결과 후 수정
클라이언트 메시지가 [mode revisi: ...]로 끝날 때 적용됩니다(GUI가 _edit/plan.json이 이미 있을 때 추가). 목표: 무엇이든 변경하기 전에 수정 의도를 이해하는 것, 다시 렌더링하는 데 오래 걸리기 때문입니다. 클라이언트는 버튼만 클릭하므로 모든 질문은 반드시 pertanyaan 블록을 통해 보내야 하며, 자유 텍스트로 보내지 마세요.
- 새 수정 메시지(답변이 아닌, "Kerjakan"이 아닌):
plan.json을 읽고 마지막 결과의*_cek.jpg를 확인하세요. 어떤 파일도 변경하지 마세요.- 한 라운드 보내기: 최대 4개의 질문. 질문은 의도에 대한 것(어떤 샷, 얼마나 많이, 어떤 스타일)과 결과에서 최대 2개의 발견 사항(예: 어두운 샷, 텍스트가 객체를 가림)이며, 각각 "Perbaiki" / "Biarkan"과 같은 옵션이 있습니다.
- 각 질문에는 2-4개의 짧은 옵션(≤ 6단어)이 있으며, 정확히 하나의 옵션에
"disarankan": true가 있습니다."multi": true는 두 개 이상 선택 가능한 경우에만 사용합니다(예: 어떤 샷을 교체할지). "Lainnya" 옵션을 추가하지 마세요. GUI에서 이미 제공합니다. - 최대 1문장의 소개를 작성하고, 블록을 보낸 후 중단하고 기다리세요.
Jawaban:으로 시작하는 메시지 = 라운드 답변. 아직 명확하지 않은 부분이 있고 이것이 첫 번째 라운드이면 두 번째 라운드를 보내세요(동일한 규칙). 그 후(또는 이미 명확하면)ringkasan블록을 보내세요: 만들 변경 사항 목록, 변경당 1포인트. 중단하고 기다리세요.Langsung kerjakan: ...= 마지막 모든 질문에 대해disarankan옵션을 사용하고 요약 없이 작업하세요.Kerjakan sesuai ringkasan.= 마지막 요약 내용을 정확히 작업하고(plan/overlay 편집, 미리보기, 최종본), 평소처럼 보고하세요.- 카드가 열려 있을 때의 자유 텍스트 메시지 = 자유 응답.
Jawaban:처럼 처리하세요. - 수정당 최대 2라운드 질문. 이미 매우 명확한 요청(예: "폰트를 Great Vibes로 변경")도 여전히 1라운드 간단히(발견 사항으로 충분하거나 확인 질문 1개), 그다음 요약.
- "klip pilihan berubah" 메시지(클라이언트가 오프닝, 클로징 또는 사용 금지 클립을 변경한 후 GUI가 보냄) = 일반 수정: 최신
_edit/klip.json을 읽고 위 1-4단계를 통해 계획에 적용합니다(절대 규칙 13).
블록 형식(유효한 JSON, 응답당 하나의 블록):
```pertanyaan
{"jenis": "tanya", "pertanyaan": [
{"id": "q1", "judul": "어떤 샷을 교체할까요?", "multi": true,
"opsi": [{"label": "샷 2 (주방)", "disarankan": true}, {"label": "샷 4 (방)"}]},
{"id": "q2", "judul": "발견: 샷 3이 약간 어둡습니다", "multi": false,
"opsi": [{"label": "수정", "disarankan": true}, {"label": "그대로"}]}
]}
{"jenis": "ringkasan", "ringkasan": ["샷 2를 주방 클립 4초로 교체", "샷 3 밝게 조정"]}
## 워크플로: 스타일 트레이닝
메시지가 `[mode training: ...]`로 끝날 때 적용됩니다(GUI의 스타일 트레이닝 탭에서 보냄). 목표: 예시 비디오에 대해 기존 패턴을 다시 테스트하고, 일치하지 않는 부분을 보고하고, 클라이언트 승인 하에 패턴을 수정합니다. 모든 질문은 반드시 `pertanyaan` 블록을 통해 보내야 합니다(형식은 "워크플로: 결과 후 수정" 참조).
1. **GUI 메시지의 입력:** 패턴 이름, 모드(`ikuti referensi` / `custom`), 클립 폴더.
2. **자료.** `SKILL/patterns/<패턴>.json`과 `catatan_training`을 읽으세요. 예시 비디오 = `skill/contoh-video/<video_contoh>`(`contoh-video` 폴더는 스킬 폴더 옆). 참조 시트: 이미 있는 `SKILL/_ref/<이름>/` 사용(패턴 이름 또는 확장자를 뺀 `video_contoh` 파일 이름 검색; `filmstrip.jpg`/`shots.jpg` 확인). 없으면 `analyze_ref.py <예시 비디오> --name <패턴> --out <폴더>/_training/<패턴>/ref`를 실행하세요.
3. **작업 폴더 = `<폴더>/_training/<패턴>/`.** 사용자 프로젝트 폴더를 건드리지 마세요.
4. **`SKILL/_ref/<패턴 이름>` 또는 `_training/<패턴>/ref/`의 참조 시트 열기.** 각 참조 샷(`shots.jpg` 하이라이트, 전체 `filmstrip.jpg`)을 보고 패턴의 의도된 선택(`alur`의 `mulai`, `durasi`)과 비교하세요.
5. **다음 중 하나를 직렬로 하나씩 시도하되, 참조가 있는 경우에만:**
- 참조 시트(수동)에서 패턴 슬롯에 일치하는 참조 샷 찾기.
- `detect_shots.py <예시 비디오> --pattern <폴더>/_training/<패턴>/shots.json`(그런 다음 `_training/<패턴>/shots.json`을 검사하여 각 탐지된 샷을 패턴 슬롯과 일치시킵니다. `catatan_training`이 탐지 매개변수를 지정할 수 있으며, 실패하면 `switch_detect` 또는 다른 값으로 전환).
- `analyze_ref.py`를 사용하여 자동 제안.
6. **클라이언트가 `ikuti referensi` 모드를 선택한 경우** 각 패턴 슬롯을 예시 비디오의 해당 부분과 일치시키는 것이 목표입니다. 각 슬롯에 대해 가장 적합한 예시 부분(시작 시간, 지속 시간)을 찾으세요. 슬롯 중 하나라도 정확히 일치하는 예시 부분이 없으면 2라운드 질문:
라운드 1: 패턴의 어떤 슬롯을 변경할지(옵션 포함). 라운드 2: 선택한 슬롯에 대한 제안(새 `jenis_shot`, `durasi`, `gerak`).
7. **클라이언트가 `custom` 모드를 선택한 경우** 패턴을 사용하여 예시 비디오의 원본 편집에 가장 가까운 결과를 얻는 것이 목표입니다. 원본 편집 순서를 추정하기 위해 예시 비디오를 보세요. 발견한 사항을 기반으로 `alur`를 조정하세요. 주요 차이점에 대한 질문 1라운드.
8. **클라이언트가 변경에 동의한 후** 패턴을 업데이트하세요. `SKILL/patterns/<패턴>.json`을 편집하여 `alur`의 슬롯을 수정하고, `catatan_training`에 학습 내용을 추가하세요(파일 끝에). 필요한 경우 `cocok_untuk`를 업데이트하세요(OLC).
9. **예시 비디오 자체를 확인:** 탐지/제안과 무관하게, 원본 비디오 품질을 확인하세요(흐릿한 샷, 트랜스코딩 아티팩트). `_training/<패턴>/kualitas/`에 기록하세요. 품질 문제가 있는 경우 `note_kualitas`에 패턴의 영향을 받는 슬롯을 표시하세요.
## 명령어 요약
- `SKILL/scan_clips.py <폴더>`: 그리드 썸네일 생성.
- `SKILL/scripts/review_bahan.py <폴더>`: 각 클립 리뷰.
- `SKILL/render.py <계획> [--preview] [--abaikan-kualitas]`: 미리보기 또는 최종 렌더링.
- `SKILL/scripts/ichimatsu.py <폴더>`: 클립 교정 시트 생성.
- `SKILL/scripts/audio_sync_test.py <오디오> <비디오>`: 오디오 동기화 테스트.
- `analyze_ref.py <예시 비디오> --name <패턴 이름> --out <출력 폴더>`: 참조 시트 생성.
- `detect_shots.py <예시 비디오> --pattern <출력 JSON>`: 자동 샷 탐지.