Communitygithub.com

인테리어 릴스

사용자가 원시 인테리어 디자인, 건축 또는 부동산 비디오 클립을 전환 및 텍스트가 포함된 Instagram Reel / TikTok(9:16)으로 편집하거나, 예시 릴을 재사용 가능한 편집 패턴으로 전환하려고 할 때 사용합니다.

인테리어 릴스란 무엇인가요?

이 스킬은 인테리어 디자인, 건축, 부동산 분야의 원시 비디오 클립을 Instagram Reel이나 TikTok에 적합한 9:16 세로 형식으로 편집하는 AI 비디오 편집 어시스턴트입니다. Claude Code, Cursor, Codex와 같은 AI 에이전트 플랫폼에서 실행되며, 미리 정의된 편집 패턴을 사용하여 클립 선택, 순서, 전환 및 색 보정을 안내합니다. 주요 기능으로는 자동 클립 품질 분석(어두운 부분, 흐림, 비어 있는 영역 탐지), 안정화 처리, 텍스트 오버레이 관리(사용자 GUI를 통해 설정), 오디오 동기화, 패턴 기반 편집(따라하기/사용자 정의 모드)이 있습니다. 스킬은 사용자가 명시적으로 요청하지 않는 한 텍스트, 로고 또는 음악을 직접 편집하지 않고 대신 `overlay.json` 파일을 통해 관리합니다. 또한 사용자 피드백을 수집하고 변경 사항을 확인하기 위한 구조화된 개정 워크플로를 포함하며, 모든 편집 결정이 클립의 시각적 내용에 기반하도록 강조합니다.

지원 대상✓Claude Code~Codex CLI~Cursor
npx skills add https://github.com/alfianwilfredo/edit-skill/tree/main/skill/interior-reels

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

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

문서

인테리어 릴스은(는) 무엇을 하나요?

인테리어 프로젝트의 원시 클립을 업로드 준비된 9:16 릴로 변환합니다. 스크립트는 도구일 뿐입니다. 편집 결정(어떤 샷, 어떤 부분, 어떤 순서)은 Claude의 작업이며, 파일 이름을 추측하는 것이 아니라 각 클립의 이미지를 보고 결정해야 합니다.

SKILL = 이 스킬의 폴더. 모든 스크립트: python3 SKILL/scripts/<이름>.py.

시작 전(세션당 한 번)

bash SKILL/setup.sh를 실행하세요. 실패가 있으면 먼저 해결하세요. SKILL/brand.json을 읽어 스튜디오 이름, CTA, 로고, 기본 패턴 및 클라이언트 취향을 확인하세요.

절대 규칙(위반 불가)

  1. 텍스트와 로고는 어시스턴트의 작업이 아닙니다. 텍스트와 로고는 클라이언트가 GUI에서 설정하여 <폴더>/_edit/overlay.json에 저장합니다. render.py는 이 파일을 읽고 계획의 모든 teks와 logo를 덮어씁니다. plan.json에 teks나 logo를 작성하지 말고, 클라이언트에게 텍스트 내용을 묻지 말고, 클라이언트가 요청하지 않는 한 overlay.json에 직접 텍스트를 추가하지 마세요(brand.json의 CTA 포함).
  2. 패턴은 컷과 외형만 제어합니다. 패턴에서 가져오는 것: 슬롯 순서, 지속 시간, 움직임, 전환, 그레이딩. 패턴의 teks, contoh_isi, logo는 참조 비디오의 메모일 뿐, 렌더링되지 않습니다.
  3. 채팅을 통한 텍스트 또는 로고 변경 = 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에서 유지됩니다.
  4. 오디오도 overlay.json(audio)에서 가져옵니다. 음악을 직접 선택하거나 교체하지 말고, 계획에 musik을 작성하지 마세요. 클라이언트가 채팅으로 요청하면(노래 변경, 볼륨, 시작점, 최종에 음악 포함/제외, 비트 동기화), overlay.json의 audio를 편집하세요(형식은 PLAN.md 참조). 음악은 패턴 가이드 오디오(patterns/audio/) 또는 스튜디오 라이브러리(brand/musik/)에서만 사용 가능합니다. 클라이언트가 최종 결과물에 사용하려는 경우 참조 오디오가 타인의 소유임을 알리세요.
  5. overlay.json이 아직 없으면, 패턴의 텍스트와 로고 없이 렌더링이 진행됩니다. 클라이언트에게 텍스트와 로고를 GUI의 세부 정보 섹션에서 채울 수 있다고 알리세요.
  6. 요청 없이 overlay.json을 삭제하거나 교체하지 마세요. 이 파일은 클라이언트의 선택입니다.
  7. 흔들림은 자동으로 처리됩니다. render.py는 각 세그먼트의 흔들림을 측정하고 자체적으로 안정화합니다("stabil": "auto", 기본값). 이유가 없는 한 stabil을 입력하지 마세요. true는 강제 안정화, false는 비활성화(예: 의도적인 손떨림). 렌더 로그에서 "Stabil" 테이블을 읽으세요. ! sisa goyang terlihat = 결과 확인; ! GAGAL = 렌더 중단, 해당 세그먼트에 대해 다른 범위 또는 클립 선택. 리뷰 시, 명확히 흔들리거나 초점이 나간 부분은 _review/*.json에 goyang을 계속 입력하세요. 해당 범위는 렌더가 mulai를 이동할 때 사용되지 않습니다.
  8. 적합한 부분을 선택하고, 클립의 모든 초를 사용하지 마세요. 렌더링 시 render.py가 자동으로 클립을 분석하여(_kualitas/) 어둡거나, 비어 있거나(객체 없음), 흐릿한 부분을 표시합니다. 0.3초 이상의 불량 부분을 포함하는 세그먼트는 거부되고 mulai 제안이 제공됩니다. 필수: mulai를 제안 위치로 이동하거나, durasi를 줄이거나, 클립을 교체하세요. 사용자 허가 없이 --abaikan-kualitas를 사용하지 마세요.
  9. 지속 시간은 푸티지를 따르고, 패턴을 따르지 않습니다. 클립의 좋은 범위가 패턴 슬롯보다 짧으면 해당 슬롯을 줄이세요. 총 릴 길이는 패턴의 durasi_total보다 짧을 수 있습니다. 불량 부분으로 슬롯을 채우지 마세요.
  10. 최종본 전에 프레임을 확인하세요. 분석 제안은 해당 범위의 프레임을 보고(그리드 또는 미리보기) 확인해야 합니다. 분석은 주요 객체가 좋은지, 해당 부분이 적절한 오프닝인지 알 수 없습니다.
  11. 먼저 모든 소재 클립을 리뷰하세요. scripts/review_bahan.py <폴더-소재>를 실행하고, _review/의 모든 시트를 끝까지 보고, 각 클립의 JSON을 작성하세요(sudah_dilihat, goyang, rentang_layak, keputusan). render.py는 클립이 리뷰되지 않았거나 세그먼트가 rentang_layak 밖에 있으면 렌더링을 거부합니다(--abaikan-kualitas 제외).
  12. 렌더 후 텍스트를 확인하세요. 텍스트 위치는 클라이언트가 선택합니다(3x3 그리드). 렌더 후 *_teks<N>_cek.jpg를 확인하세요(빨간색 상자 = 예상 텍스트 영역). 텍스트가 얼굴이나 주요 객체를 가리면 클라이언트에게 알리고 다른 위치를 제안하세요. 동의 없이 위치를 직접 변경하지 마세요.
  13. 클라이언트가 선택한 클립은 <폴더>/_edit/klip.json에 있습니다. 계획을 세우기 전에 이 파일을 읽으세요(형식은 PLAN.md의 klip.json 섹션 참조). pembuka = 첫 번째 세그먼트의 클립, penutup = 마지막 세그먼트의 클립, jangan = 어떤 세그먼트에도 사용 불가. 클라이언트의 선택이 패턴의 jenis_shot보다 우선합니다. 해당 클립의 샷 유형이 패턴 슬롯과 다르면 클라이언트에게 알리세요. 선택한 클립 내 최고의 초는 여전히 어시스턴트가 선택합니다. render.py는 이 파일을 위반하는 계획을 거부합니다(--abaikan-kualitas로 우회 불가). klip.json을 변경하거나 삭제하지 마세요. 이 파일은 GUI가 씁니다.

워크플로: 클립을 릴로 편집

  1. 정보 수집. 필수: 클립 폴더. 선택 사항: 패턴 및 음성/내레이션 파일(mp3/m4a/wav). 텍스트와 로고는 이미 _edit/overlay.json에 있으므로 묻지 마세요. 정말로 비어 있는 것만 물어보고, 최대 1개의 질문. 오디오 파일이 있으면 계획에 suara를 입력하세요(PLAN.md 참조). 음성은 스킬이 녹음하지 않습니다. 사용자가 오디오 파일을 제공해야 합니다. 폴더의 클립 수를 패턴의 min_klip과 비교하세요. 부족하면 클라이언트에게 알리고 min_klip이 더 작은 패턴을 제안하거나 클립을 추가하도록 제안하세요. 클라이언트가 동의하면 계속 진행해도 됩니다.
  2. 스캔. scan_clips.py <폴더>를 실행하여 <폴더>/_scan/을 생성합니다.
  3. view 도구로 모든 _scan/<클립>.jpg 그리드를 보세요. 각 클립에 대해 표에 기록: 샷 유형(wide / medium / detail / walk-through / pan), 방, 품질(흔들림, 어두움, 너무 밝음, 사람 또는 어수선한 물건 있음), 최고의 초(manifest.json의 detik_frame이 그리드 상자를 초에 매핑), 카메라 움직임 방향. 모든 그리드를 보기 전에는 진행하지 마세요.
  4. 패턴 선택. SKILL/patterns/*.json에서 요청 또는 기본값에 따라 선택. 자동 선택 시 cocok_untuk가 클립 수와 내용에 가장 잘 맞는 것을 선택하세요. 선택한 패턴의 catatan_training(있는 경우)을 읽고 슬롯 채울 때 교훈을 적용하세요.
  5. 슬롯 채우기. 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"을 작성하여 참조 오디오가 비트에 동기화되도록 하세요.
  6. 미리보기. render.py <계획> --preview를 실행한 다음 *_preview_cek.jpg를 확인하세요. 확인: 순서가 합리적인지, 나쁜 샷이 없는지, 오버레이 텍스트를 읽을 수 있고 주요 객체를 가리지 않는지, 이상한 정지 프레임이 없는지. 필요한 경우 계획을 수정하고 반복하세요.
  7. 최종본. render.py <계획>을 실행하고, *_cek.jpg를 한 번 더 확인한 다음, 비디오 경로와 샷 순서 요약을 1-2문장으로 보고하세요.

인테리어 스토리텔링 규칙

  • 처음 3초가 사람들이 스크롤을 멈추게 합니다. 오프닝은 가장 강력한 샷이어야 합니다: 밝고, 곧고, 공간이 완전히 보여야 함.
  • 평면도를 따르세요. 공간 순서는 현관에서 공용 공간(거실, 식당, 주방)으로, 그런 다음 개인 공간(침실, 욕실)으로. 방 사이를 왔다 갔다 하지 마세요.
  • 규모를 번갈아 가며. 와이드, 그다음 디테일, 그다음 와이드. 서로 다른 방의 와이드 두 개가 연속으로 오면 컷 대신 전환으로 연결하는 것이 좋습니다.
  • 움직임 방향을 연결하세요. 왼쪽으로 패닝한 후 왼쪽으로 움직이는 샷이나 slideleft/smoothleft 전환으로 연결하세요. 연결 지점에서 반대 방향 움직임을 피하세요.
  • 안정적인 부분을 선택하세요. 카메라가 시작하거나 멈출 때가 아닌 움직임 중간의 초를 선택하세요. 흔들리거나, 흐릿하거나, 사람이 있는 부분은 건너뛰세요.
  • 클로징은 CTA와 로고를 위한 빈 공간이 있는 가장 예쁜 샷을 사용하세요.
  • 텍스트: overlay.json을 통해 클라이언트가 관리합니다. 조언을 요청받으면 텍스트당 최대 6단어를 제안하세요.
  • 클립이 슬롯보다 적음: 먼저 detail 슬롯을 버리세요. 클립이 초과: 최고의 것만 사용하고, 모든 클립을 사용할 필요는 없습니다.
  • 가로 클립: 구도가 중요한 경우 "isi": "blur"를 사용하세요. 주요 객체가 중앙에 있으면 crop으로 충분합니다.

워크플로: 결과 후 수정

클라이언트 메시지가 [mode revisi: ...]로 끝날 때 적용됩니다(GUI가 _edit/plan.json이 이미 있을 때 추가). 목표: 무엇이든 변경하기 전에 수정 의도를 이해하는 것, 다시 렌더링하는 데 오래 걸리기 때문입니다. 클라이언트는 버튼만 클릭하므로 모든 질문은 반드시 pertanyaan 블록을 통해 보내야 하며, 자유 텍스트로 보내지 마세요.

  1. 새 수정 메시지(답변이 아닌, "Kerjakan"이 아닌):
    • plan.json을 읽고 마지막 결과의 *_cek.jpg를 확인하세요. 어떤 파일도 변경하지 마세요.
    • 한 라운드 보내기: 최대 4개의 질문. 질문은 의도에 대한 것(어떤 샷, 얼마나 많이, 어떤 스타일)과 결과에서 최대 2개의 발견 사항(예: 어두운 샷, 텍스트가 객체를 가림)이며, 각각 "Perbaiki" / "Biarkan"과 같은 옵션이 있습니다.
    • 각 질문에는 2-4개의 짧은 옵션(≤ 6단어)이 있으며, 정확히 하나의 옵션에 "disarankan": true가 있습니다. "multi": true는 두 개 이상 선택 가능한 경우에만 사용합니다(예: 어떤 샷을 교체할지). "Lainnya" 옵션을 추가하지 마세요. GUI에서 이미 제공합니다.
    • 최대 1문장의 소개를 작성하고, 블록을 보낸 후 중단하고 기다리세요.
  2. Jawaban:으로 시작하는 메시지 = 라운드 답변. 아직 명확하지 않은 부분이 있고 이것이 첫 번째 라운드이면 두 번째 라운드를 보내세요(동일한 규칙). 그 후(또는 이미 명확하면) ringkasan 블록을 보내세요: 만들 변경 사항 목록, 변경당 1포인트. 중단하고 기다리세요.
  3. Langsung kerjakan: ... = 마지막 모든 질문에 대해 disarankan 옵션을 사용하고 요약 없이 작업하세요.
  4. Kerjakan sesuai ringkasan. = 마지막 요약 내용을 정확히 작업하고(plan/overlay 편집, 미리보기, 최종본), 평소처럼 보고하세요.
  5. 카드가 열려 있을 때의 자유 텍스트 메시지 = 자유 응답. Jawaban:처럼 처리하세요.
  6. 수정당 최대 2라운드 질문. 이미 매우 명확한 요청(예: "폰트를 Great Vibes로 변경")도 여전히 1라운드 간단히(발견 사항으로 충분하거나 확인 질문 1개), 그다음 요약.
  7. "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>`: 자동 샷 탐지.

관련 스킬