요약

망남한뼘해변 스킴캠프(2026-09-05~06) 참가 학생 12명과 강사 2명에게 각자 주인공인 인스타 릴스 영상을 한 편씩 만들어 줬다. 사진 339장·영상 321편에서 그 사람이 나온 컷만 골라 “처음엔 서툴렀다 → 연습했다 → 파도를 탔다” 이야기로 엮고, 격려 말풍선을 얹은 30초(학생)·60초(강사) 세로 영상이다. 도구는 HTML로 영상을 만드는 오픈소스 HyperFrames. 영상 제작 자체보다 “이 사진의 아이가 누구인가”를 틀리지 않는 것이 일의 8할이었고, 그 실패와 복구 과정이 이 글의 본론이다.

왜 이 기술인가

마을 캠프가 끝나면 사진은 수백 장 쌓이는데 정작 부모에게 건네줄 “우리 아이 영상”은 없다. 편집자를 고용하면 1인당 며칠, 12명이면 몇 주다. 프리미어 같은 편집기 대신 템플릿 하나 + 참가자별 JSON 하나로 렌더하면, 사진 고르기만 끝나면 14편이 반나절에 나온다. 반복이 많고 형식이 같은 마을 홍보물에 딱 맞는 구조다.

단계별 따라하기

1. 환경 (30분)

  • npm i -g hyperframes, FFmpeg(winget), hyperframes browser ensure. hyperframes doctor로 점검.
  • 작업 폴더는 영문 경로로. FFmpeg·Chromium이 한글 경로에서 간헐적으로 실패한다.
  • 한글 폰트(검은고딕·주아)와 GSAP을 프로젝트 안에 파일로 넣는다. 인터넷 CDN에 의존하면 렌더가 불안정하다.

2. 템플릿 한 번만 만든다

참가자 JSON(이름, 첫 사진, 컷 목록, 말풍선 5개) → 세로 1080×1920 HTML을 생성하는 스크립트 하나. 타이틀 카드(잘 나온 사진 + 이름) → 몽타주 8~11컷(켄번즈 줌) → 엔딩 카드(수료증 사진). 30초·60초는 duration 값만 바꾼다. 첫 학생으로 렌더까지 한 번 통과시켜 두면 나머지는 데이터만 바뀐다.

3. 신원 근거를 먼저 확보한다 — 여기서 실패했다

처음엔 AI 에이전트 9개에 사진·영상을 나눠 “누가 나오는지” 카탈로그를 만들게 했다. 에이전트마다 “BOY-NIKE”, “BOY-TALL” 같은 별명을 붙였는데, 같은 아이에게 배치마다 다른 별명이 붙고, 다른 아이에게 같은 별명이 붙었다. 이 카탈로그를 믿고 만든 영상 하나는 주인공이 통째로 다른 학생이었다.

원인은 명단이었다. 수료식 사진에서 실명을 판독해 11명을 확정했는데, 수료식에 없던 12번째 학생이 있었다. 갈 곳 없는 그 아이의 사진들이 “키 큰 남학생”이라는 이유로 다른 학생에게 흡수됐다. 게다가 내가 세운 판별 규칙(“정호준은 키가 가장 크다”)이 틀린 전제였고, 그 위에 검증이 쌓였다.

복구한 방법:

  1. 참가자별 전용 폴더를 주최자가 만들어 줬다(그 아이 사진만 모은 것). 이후 이 폴더 밖 소재는 한 장도 쓰지 않았다.
  2. 폴더 파일과 모든 영상의 사용 파일을 md5 해시로 대조했다. 이름이 아니라 내용을 비교하니 누락이 없다. 한 학생 영상이 통째로 다른 아이라는 것, 다른 학생 영상 2컷이 또 다른 아이라는 것이 이 대조에서 바로 드러났다.
  3. 겹친 컷은 직접 열어봤다. 한 사진에 두 아이가 있으면 겹침이 곧 오류는 아니다 — 크롭 중심이 누구인지가 기준이다.

교훈으로 굳어진 순서: ① 그 사람만 모은 폴더 ② 실명이 찍힌 사진(수료증·명찰) ③ 그 다음에야 AI가 붙인 라벨. 참가자 수를 먼저 확정하고, 명단에 없는 얼굴이 반복되면 사람에게 물어라.

4. 사진 고르기는 에이전트 1인 1명

학생당 에이전트 하나가 폴더 파일을 전부 직접 보고(동영상은 프레임을 뽑아서) 컷을 고른다. 규칙:

  • 확신 없으면 뺀다. 억지로 채우지 않는다. 소재가 부족하면 그 사실을 보고한다.
  • 가로 사진은 세로로 자르면 폭 42%만 남는다. 어느 쪽을 남길지(focus) 정한 뒤 실제로 잘린 그림을 만들어 눈으로 본다. 이걸 건너뛴 컷은 인물이 잘려 나갔다.
  • 첫 화면은 얼굴이 위쪽 절반에 오는 컷. 아래 1/3은 이름이 덮는다.
  • 실전 라이딩 동영상은 좋은 순간의 시각(mediaStart)을 프레임 단위로 잡는다.
  • 채택·탈락 근거를 학생별 문서에 남긴다. 나중에 “왜 이 컷이 빠졌나”에 답할 수 있다.

5. 검수는 그림으로

학생별 6~7프레임 시트와 첫 화면 12명 모음을 만들어 주최자에게 보냈다. 오분류는 이 한 장에서 주최자가 즉시 잡아냈다(“3번째 컷은 김보영이야”). AI가 아무리 대조해도 아이들 얼굴을 아는 사람의 10초가 더 정확하다. 검수 시트는 선택이 아니라 필수 단계다.

6. 무인 진행

AI 사용량 제한에 세 번 걸렸다. 두 가지로 넘겼다.

  • 렌더는 AI가 필요 없다. 파일 완성을 감시해 자동 렌더하는 셸 스크립트를 별도 프로세스로 띄워 두면 제한과 무관하게 밤새 돈다.
  • AI 자신은 1~2시간 뒤 자동 기상해 죽은 에이전트만 다시 띄운다.

교훈

  • 영상은 쉽고 인물은 어렵다. 14편 렌더는 25분, 인물 판별 정정은 이틀이었다.
  • 명단부터 확정하라. 명단에 없는 사람은 반드시 누군가에게 흡수된다.
  • AI가 붙인 별명은 근거가 아니다. 에이전트마다 다른 눈으로 본다. 실명·전용 폴더·해시가 근거다.
  • 틀린 전제는 검증을 오염시킨다. “가장 키 큰 학생”이라는 잘못된 규칙 위에서 에이전트는 성실하게 틀렸다. 규칙은 사진에서 나와야 하고, 사람이 확인해야 한다.
  • 검수 시트 한 장이 대조 100번보다 낫다. 아는 사람이 보면 끝난다.
  • 소재 한계는 정직하게 남긴다. 어떤 학생은 실전 라이딩 컷이 없다. 다른 아이 컷으로 채우는 순간 영상의 의미가 사라진다.

참고

  • 도구: HyperFrames (Apache 2.0), FFmpeg
  • 스킬 패키지: sakyowon-ai/skills/hyperframes-student-shorts (템플릿 엔진·렌더 스크립트·선별 브리핑 3종 포함)
  • 핸드오버: sakyowon-ai/handover-20260916-skimcamp-student-shorts.md
  • 산출물: 학생 12편(30초)·강사 2편(60초), 무음(인스타 업로드 시 음원 삽입)

문서 정리 = 데카(deka2026)