내 실생활에 AI 더하기 (1) — 사진, 영상 하이라이트 만들기
폰 사진 앱을 켜다가 여행 영상 폴더 앞에서 매번 멈춘다.
문제는 "안 본다"가 아니라 "안 보게 된다"였다. 분명히 좋아서 찍었는데, 시간이 지나니 불필요한 컷이 너무 많아서 다시 들어가기가 부담스러운 폴더가 된다. 핵심 장면만 추린 2~3분짜리 메모리 필름이 있다면 한 번에 그 시간을 다시 만날 수 있을 것 같았다.
업무에서는 AI를 매일 많이 쓴다. 코드 리뷰, 설계 토론, 디버깅, 문서 정리. 거의 모든 작업이 AI와 함께 굴러간다. 그런데 실생활은 그렇지 않다. 사진 검색이나 메모 정리에 가끔 도움을 받는 정도, 일회성으로 묻고 답을 받는 수준에서 멈춰 있다.
이 간극이 이상했다. 같은 사람이 같은 도구를 쓰는데, 업무에서는 체계적으로 굴리고 실생활에서는 그때그때 한 번씩만 부른다. 도구의 문제도 아니고 능력의 문제도 아니다. 어디에 어떻게 적용할지를 한 번도 진지하게 생각해본 적이 없는 게 문제였다.
이 글은 그 선을 처음 넘은 기록이다. 여행 영상 폴더부터 본격적으로 AI에게 맡기기 시작하면서, 어떤 데이터부터 시작할지 정하고, 어떻게 AI와 일할지 다듬은 과정. 그리고 그 과정에서 작은 피드백 한 줄이 재사용 가능한 규칙으로 굳어진 이야기다.
0번 후보 — 안 보면 잃는 데이터부터
후보는 여러 개였다. 가계부 자동화, 이메일 정리, 일정 관리, 사진 백업, 손글씨 메모 정리. 우선순위를 정해 보니 답이 빨리 나왔다.
가계부와 이메일은 이미 안 본 채로도 시스템이 돌아간다. 안 보면 약간 불편하지만 잃는 게 없다. 사진은 이미 클라우드에 백업돼 있다. 그런데 여행 영상은 안 보면 기억이 사라진다. 한 번의 여행은 다시 못 오고, 그 기록이 풀리지 않은 채 폴더에 쌓이면 결국 잊힌다.
AI를 실생활에 도입하자는 막연한 동기를 구체화할 때 가장 단단한 기준은 그것이 없으면 잃는 게 무엇인가였다. 여행 영상이 0번 후보로 떠올랐다.
들고 들어간 설계 윤곽
백지에서 시작하지는 않았다. 영상의 후보 컷을 시각 신호(구도·노출·중복 제거·활동 분포)와 음성 신호(STT 의미)로 점수 매겨 고르고, GPS 메타데이터로 위치 라벨을 묶는다 — 이 정도 설계 윤곽은 이미 머릿속에 있었다. 특히 STT를 자막용만이 아니라 어느 컷이 의미 있는지를 판단하는 선별 신호로도 쓴다는 것까지.
그 위에서 AI에게 맡긴 것은 디테일이다. 어느 컷이 진짜 좋은가. BGM은 어디서 어떤 톤으로 가져올까. 자막은 어떤 호흡으로 띄울까. 위치 라벨은 어디까지 광범위해야 맵 앱처럼 보이지 않을까. 이런 디테일은 문서 한 줄로 정의되지 않는다. 결과를 보고 "이건 이상해" 라는 한 줄을 던지면서 깎아내야 한다.
이 글의 본문은 그 깎아내기의 기록이다. 설계는 들고 들어갔고, 다듬기는 AI와 함께 했다.
도구 선택 — 평소에 쓰는 환경 안에서
도구는 짧게 결정됐다. 평소에 쓰는 Codex CLI 안에 스킬 형태로 만든다. 매일 켜는 도구가 아니면 결국 안 쓰게 된다. 새 UI를 따로 만들 이유가 없었다.
스킬 형태가 주는 이점은 명확했다. 의존성 관리(Homebrew, ffmpeg-full, whisper-cpp)를 스킬 안에 박아두니 다른 컴퓨터에서도 그대로 돈다. 매 단계 결과를 프롬프트로 검증할 수 있다. "이 장면은 왜 골랐어?" 하면 Codex가 답한다. 그리고 한 번 만든 규칙이 재사용 가능한 자산으로 남는다. 다음 폴더, 그 다음 폴더에서도 같은 규칙이 자동으로 작동한다.
이게 일회성 작업과 스킬 만들기의 결정적 차이다. 일회성으로 한 폴더 처리하는 건 누구나 한다. 같은 작업을 다음 폴더에도 자동으로 시키려면 규칙을 어딘가에 박아둬야 한다. 스킬은 그 어딘가의 가장 깔끔한 형태였다.
작업 방식 — Diagnose → Execute → Verify
여러 폴더에 반복 적용하면서 같은 루프가 매번 돌았다. 각 폴더마다 한 사이클씩.
1. Diagnose — 결과를 보고, 무엇이 잘못됐는지 한 줄로 말한다
2. Execute — Codex에게 그 한 줄을 던진다. 구현은 맡긴다
3. Verify — 다시 렌더링해서 같은 문제가 해결됐는지, 다른 게 망가지지 않았는지 본다
한 루프가 평균 30분 안에 돌았다. 이 사이클이 잘 돌아가게 만드는 건 사실 한 줄로 문제를 말할 수 있는 능력이다. 길게 설명할수록 AI는 길게 헤맨다. 짧고 정확한 진단이 가장 빠른 코드를 만든다.
이 루프를 돌면서 세 가지가 분명해졌다.
1. 구현을 맡길수록 결과가 더 좋아졌다
*"BGM을 어떻게 깔지"*는 결정하지 않았다. *"BGM이 너무 이상해"*만 말했다. ffmpeg 옵션을 어떻게 짤지, 어떤 트랙을 어디서 받을지는 Codex가 골랐다. 다만 결과 영상이 어떻게 들리는가는 내가 판단했다.
이게 의외로 중요했다. 구현까지 내가 지시하면 AI는 그 지시 안에서만 움직였다. *"BGM 볼륨을 0.1로 설정해줘"*라고 하면 0.1로 설정해 줬는데, 그게 좋은 결과인지는 따로 확인해야 했다. 반대로 *"BGM이 너무 시끄러워"*라고 하면 AI가 톤·맥락·믹스까지 같이 봤다. 그 쪽에서 더 좋은 결과가 자주 나왔다.
결정은 외주했지만, 결과를 평가하는 책임은 내가 가지고 있었다. 결과를 평가할 능력만 있으면 됐고, 구현 디테일까지 다 알 필요는 없었다.
2. 내가 알려주지 않으면 AI도 모르는 영역이 있었다
생성형 AI에게 완전히 모르는 영역을 맡기면 결과가 흔들렸다. BGM 선택이 그랬다. Codex가 무료 BGM을 검색해서 깔면 매번 어색했다. 그래서 직접 후보 7곡을 던졌다.
Ikson - Sunny, Scandinavianz - Vacation, Scandinavianz - Sunny Island, MBB - Feel Good, LiQWYD - Feel, LiQWYD - Free, Joakim Karud - Dreams.
모두 YouTube Audio Library에서 라이선스 확인 가능한 트랙이었다. 이 7곡을 스킬의 기본 풀로 박았다. 이후로는 Codex가 영상 톤을 보고 풀에서 한 곡 골라서 다운받고 렌더에 넣었다. 추가 승인 없이.
AI가 못 하는 게 아니라, 내가 알고 있는 것을 안 알려주면 AI도 모르는 거였다. 도메인 지식을 처음에 한 번 명시적으로 주입하는 게 작업의 질을 결정했다. 그리고 그걸 스킬에 박아두면 다음 작업부터는 다시 안 알려줘도 됐다.
3. 숫자로 받은 자기보고가 가장 단단했다
가장 위험한 패턴이 *"네, 다 처리했습니다"*였다. 정확히 무엇을 어떻게 처리했는지 알 수 없었다.
그래서 스킬 안에 숫자로 보고하라는 규칙을 박았다. 사진 800장을 처리했으면 "812장 중 readable 810장, 컨택트 시트 13장 생성, 47장 선택, 8장 강한 후보로 표시" 같이. 영상 QA를 했으면 "ffprobe 결과 12분 34초, blackdetect에서 1.5초 fade 외 검은 프레임 없음, silencedetect 0건" 같이.
숫자로 말하면 거짓말이 어려웠다. 내가 의심할 지점도 명확해졌다. "검토했어요" 다음에는 더 물어볼 게 없었는데, "812장 중 47장 선택" 다음에는 "왜 47장만?" 같은 다음 질문이 자연스럽게 따라왔다. 검증 가능한 진술만 받는 것 — 이게 AI에게 일을 맡길 때 가장 단단한 안전망이었다.
짧은 피드백이 영구 규칙으로 — 다섯 가지 변곡점
위 작업 방식이 만든 가장 중요한 결과는, 한 줄짜리 피드백이 SKILL.md의 한 단락으로 영구히 박힌다는 점이었다. 한 폴더에서 본 문제가 다음 폴더에서 안 보이는 규칙이 된다. 통영, 정리, 북한산, 페낭, 랑카위, 심천, 여수, 세부까지 10개 가까운 폴더를 거치며 다섯 개의 큰 변곡점이 그렇게 박혔다.
변곡점 1 — 구도 거부 규칙
첫 진짜 피드백은 화면 전환 자체였다.
"1분에서 2분 정도까지는 구도가 이상한데도 하이라이트에 들어갔고, 화면 전환이 너무 자주 깜빡이면서 되니깐 보기가 힘드네."
이 한 줄에서 두 규칙이 나왔다. 가린 렌즈, 다리만 찍힌 컷, 어두운 주머니 샷 같은 카메라 핸들링 흔적은 기술적으로 선명해도 거부한다. 짧은 클립이 연속해서 깜빡이는 걸 막기 위해 xfade와 acrossfade로 전환을 부드럽게 잡는다.
두 규칙이 그날 SKILL.md에 박혔다. 다음 폴더(정리)부터는 같은 문제가 안 나왔다. 한 폴더에서 던진 한 줄이, 다음 폴더에서 자동으로 작동했다.
변곡점 2 — STT 자막을 단어 단위로
영상을 보는데 자막 타이밍이 어긋났다.
"자막이 보이스 나오는 속도보다 빠르게 나오는 거 같은데." "STT 단어 단위로 뽑고 하는 게 가능해?"
문장 단위 STT는 타이밍이 어색했다. 단어 단위 타이밍을 받아서 문장 자막의 시작·끝을 재조정하는 방식으로 바꿨다.
STT 모델도 그날 굳었다. whisper-cpp의 ggml-medium.bin 멀티링구얼. 한국어 품질이 tiny나 base로는 부족했다. 스킬에는 *"silently downgrade 금지"*까지 명시했다. Codex가 임의로 가벼운 모델로 바꿔서 한국어 자막 품질을 떨어뜨리는 일을 막기 위해서다.
자막에 대한 또 하나의 원칙도 같이 박혔다. 자막은 메모리 큐이지 전사가 아니다. 음성을 다 자막으로 박지 않는다. 지명, 반응, 결정, 감정적 코멘트만 짧게 남긴다. 나머지는 그냥 원본 오디오로 듣는다.
변곡점 3 — BGM은 만들지 않는다, 골라서 쓴다
세 번째 피드백은 BGM이었다.
"BGM 너무 이상해." "아예 생성 BGM은 쓰지 마."
LLM이 BGM 분위기를 생성해주려는 시도는 전부 어색했다. 그래서 도메인 지식 원칙대로 직접 후보 7곡을 던졌고, 그 풀이 스킬의 기본 자산으로 박혔다. 이후로는 Codex가 영상 톤을 보고 풀에서 한 곡 골라서 다운받고 렌더에 넣는다.
볼륨 정책도 박혔다. 원본 오디오/스피치가 중요한 영상은 bgm_volume 0.08~0.14, 음악 중심 몽타주는 0.14~0.22. 숫자로 박으니 Codex가 매번 헤매지 않는다.
여기서 더 큰 원칙이 굳었다. 원본 오디오를 보존한다. 파도 소리, 발걸음, 도시 소음, 웃음, 반응. 이게 추억의 진짜 앵커다. BGM은 그 위에 얇게 깔리는 보조 레이어지 주역이 아니다.
변곡점 4 — 광범위 위치 자막
"장소가 있는 건 장소를 자막으로 보여주면 좋을 것 같거든. 상세한 장소까지는 아니고 지역 이름 정도만."
GPS 메타데이터가 있는 영상은 위치를 자막으로 띄울 수 있었다. 다만 정확한 식당 이름이나 호텔 이름까지 박으면 메모리 필름이 맵 앱처럼 느껴진다. 광범위 라벨, 즉 Da Lat, Nha Trang, Seoul, Osaka 수준만 쓴다.
근거 우선순위도 정했다. 영상 GPS → 인접 사진 EXIF(타임스탬프 매칭) → STT 지명 언급 → 파일명 → 화면 속 표지판. (0,0) 좌표는 무효. GPS 없는 영상은 인접 시각의 사진 GPS로 추론한다.
변곡점 5 — 작은 실패가 만든 메타데이터 규칙
통영 영상에서 한 컷에 *"통영 2일차"*라는 자막이 박혔다. 보고 던진 말은 짧았다.
"1일차 영상은 없는 거야?"
LLM이 임의로 *"2일차"*라는 내러티브를 만들어 박은 거였다. 1일차 폴더는 처음부터 없었으니 2일차도 있을 수 없다. 소스 메타데이터에 없는 표현은 제목·자막에 넣지 않는다. 이 규칙이 그날 박혔다.
이런 작은 실패가 가장 중요했다. 큰 구조는 며칠 만에 잡혔지만, 디테일 한 줄은 매번 실패해야 보였다. 한 줄이 박힐 때마다 스킬은 다음 폴더에서 더 조용히 일했다.
2단계 QA — "파일 만들어졌어요"가 곧 완료는 아니다
마지막에 박힌 게 QA 단계였다.
처음에는 렌더링이 끝나면 그게 완료였다. 그러면 안 됐다. 중간에 무음 구간이 끼었고, 마지막 1초가 잘렸고, 자막이 영상 끄트머리를 잘랐다. 매번 영상을 끝까지 봐야 잡혔다. 그러면 재사용 가능한 스킬의 의미가 없다.
QA를 두 층으로 박았다.
Technical QA. ffprobe로 코덱·해상도·fps·오디오 채널 확인. blackdetect로 의도치 않은 검은 프레임. silencedetect로 긴 무음 구간. volumedetect로 클리핑이나 너무 작은 오디오. 그리고 타임라인 컨택트 시트, 12초마다 한 프레임씩 뽑아 4×6 격자로 한 장에 모은다.
Memory-highlight QA. 소스 시간 순서와 결과 클립 순서가 일치하는가. 모든 중요한 시점·장소가 표현됐는가. 위치 라벨이 GPS·인접 증거에 근거하는가. 자막이 메모리 큐인가 전사인가. 반복되는 컷이 빠졌는가.
두 단계 모두 명시적으로 보고하게 했다. *"QA 했어요"*가 아니라 "ffprobe 결과는 X, blackdetect에서 1.5초 fade 외에는 검은 프레임 없음, 12개 클립 모두 시간순 일치" 같이. 앞서 정리한 "자기보고는 숫자로" 원칙이 QA에서도 그대로 작동했다.
이 QA가 박힌 뒤로는 한 폴더당 내가 봐야 하는 시간이 5분에서 30초로 줄었다. AI에게 일을 맡길 때 결국 가장 중요한 게 검증 자동화다. 자동화된 검증이 없으면 매번 사람이 결과를 끝까지 봐야 하고, 그러면 도구가 아니라 수동 작업의 다른 이름에 가까워진다.
사진까지 — media-highlight로 분기
video-highlight가 안정되자 다음 한계가 보였다. 여행은 영상만이 아니다. 사진이 훨씬 많다. 베트남 폴더에는 영상 30개에 사진 800장. 영상만으로 만든 하이라이트는 분명히 작동했지만, 내가 가장 잘 찍은 한 장의 풍경은 한 번도 메모리 필름에 들어가지 못했다.
"여행이라는 게 동영상뿐만 아니라 사진도 엄청 많이 찍자나… 둘 다 합쳐서 하나의 하이라이트… 일단 기존 스킬은 냅두고 새롭게 만들어보자."
이 한 줄에서 media-highlight 스킬이 분기됐다. 기존 스킬을 망가뜨리지 않기 위해 새 스킬로 갔다. 검증된 워크플로우를 건드리지 않는 게 가장 안전한 확장이었다.
새 스킬은 폴더를 보고 세 모드 중 하나를 고른다. photo-only, video-only, 또는 mixed. mixed 모드에서는 한 타임라인에 사진과 영상 아이템이 시간 순으로 섞인다. 베트남 첫째 날 풍경 사진 3장 → 시장 영상 8초 → 음식 사진 2장. 이 흐름이 자연스럽게 짜인다.
사진 정책의 핵심은 exhaustive accounting이다. 모든 사진을 적어도 기술 메타데이터·품질 점수·중복 그룹·컨택트 시트로 한 번씩 본다. "800장 모두 의미적으로 이해했다" 같은 모호한 자기보고는 금지. 대신 "812장 중 47장 선택" 같은 숫자 보고만 허용. 앞서 정리한 "자기보고는 숫자로" 원칙이 여기서도 그대로 적용됐다.
오디오 정책도 갱신됐다. 영상 구간에는 원본 오디오 위에 BGM을 얇게 깔고, 사진 구간에서는 BGM이 살짝 올라온다. 전환은 acrossfade로 0.5~0.8초 겹쳐서 오디오 컷을 없앤다. "현장음이 있을 땐 현장음, 사진이 나올 땐 BGM, 자연스럽게." 이 한 줄이 정책이 됐다.
부수 효과도 있었다. 영상은 GPS가 박힌 경우가 드문데, 사진은 거의 모든 폰 사진에 EXIF GPS가 있다. 영상 GPS가 없으면 인접 시각의 사진 GPS로 위치를 추론하는 흐름이 자연스럽게 강해졌다. 사진을 같이 보면 영상의 위치 추론도 더 정확해진다.
반복 사이클이 만든 것
video-highlight SKILL.md는 251줄, media-highlight는 208줄이다. 그중 다수가 위 변곡점들로부터 한 줄씩 박혀 만들어졌다. 한 폴더에서 본 한 가지 문제가, 다른 폴더에 가서도 안 보이게 만드는 규칙이 된다.
지금은 이렇다. 폴더 하나 던지면 2~3분짜리 메모리 필름이 나온다. 베트남, 몰디브, 인도네시아, 페낭, 여수, 세부, 다 만들어졌다. 그리고 그것들을 실제로 다시 본다. 가족에게도 보여준다. 폴더에 잠들어 있던 800장 사진과 30개 영상이, 3분짜리 한 편이 되어 기억으로 돌아왔다.
업무에서 쓰던 AI 활용 패턴(Diagnose → Execute → Verify, 짧은 피드백, 숫자 기반 검증)이 실생활에서도 그대로 작동했다. 다만 측정 지표가 달라졌다. 업무에서는 정답률이나 recall이지만, 여기서는 내가 다시 보는가다. 더 단순하고 더 정직한 지표였다.
이게 LLM 시대의 스킬 만들기에서 가장 흥미로운 점이었다. 처음부터 완벽한 SKILL.md를 짤 수는 없다. 한 줄짜리 피드백 30개가 폴더를 거치며 쌓여 만드는 것에 가깝다. 그러려면 한 가지가 필요하다. 한 줄로 문제를 말할 수 있는 사람. 그게 거의 전부다.
끝나고 보니 — 다섯 가지가 남았다
이 작업을 거치면서 내가 알게 된 게 다섯 가지였다. 권유라기보다는, 같은 자리에서 시작해 보려는 사람과 나누고 싶은 회고에 가깝다.
1. 안 보면 잃는 게 가장 큰 데이터가 0번 후보였다. *"AI를 어디에 쓸까"*보다 *"안 보면 무엇을 잃는가"*가 더 단단한 기준이었다. 기능이 많은 데이터가 아니라 잃을 게 큰 데이터가 먼저였다.
2. 평소에 쓰는 도구 안에 들어가지 않으면 결국 안 쓰게 됐다. 별도 앱은 그것까지 따로 켜야 하는 도구가 된다. 매일 켜는 환경 안에 자연스럽게 들어왔을 때 비로소 굴러갔다.
3. 한 줄로 진단할 수 있을 때 사이클이 가장 빠르게 돌았다. *"BGM을 0.1로 설정해줘"*보다 *"BGM이 너무 시끄러워"*가 더 좋은 결과를 냈다. 구현은 맡기고, 결과를 평가할 능력만 내가 가지고 있으면 됐다.
4. 숫자가 박힌 자기보고가 가장 단단한 안전망이었다. *"검토했어요"*는 검증할 수 없었지만, *"812장 중 47장 선택"*은 검증할 수 있었고 다음 질문도 따라왔다.
5. 한 번의 작업을 스킬로 굳히는 순간, AI가 진짜 내 도구가 됐다. 한 폴더에서 효과를 본 규칙이 다음 폴더에서도 자동으로 작동했을 때, 비로소 AI 도입이라는 말이 실체를 가졌다. 그 전까지는 매번 새로 시작하는 일회성에 가까웠다.
스킬은 한 번에 완성되지 않는다. 짧은 피드백 한 줄이 규칙으로 굳어지면서 만들어진다. 그러려면 한 줄로 문제를 말할 수 있어야 한다.
앞으로의 방향
여행 영상은 0번 후보였을 뿐이다. 살아가면서 또 어디에 AI가 필요한지, 무엇을 어떻게 맡기게 될지는 그때그때 마주치게 될 것 같다. 이 시리즈는 그 기록이다.
참고 — 실제 스킬 코드:

