macOS에서 사진과 영상 모든 프레임을 로컬 AI로 검색하는 SCM 공개

Hacker News6일 전조회 4

macOS에서 동작하는 로컬 AI 미디어 검색 도구 SCM이 공개됐다. 폴더에 쌓인 사진과 영상의 모든 프레임을 자연어 문장으로 검색하게 해주는 데스크톱 앱이다. 계정도, 클라우드도, 업로드도 없다. 추론은 전부 사용자의 맥에서 돌아가고, 모델 가중치를 한 번 내려받은 뒤에는 오프라인으로 동작한다.

검색은 두 단계로 진행된다. 타이핑을 시작하면 파일명 키워드로 빠른 선검색이 돌고, 곧이어 비전 모델이 이미지 임베딩과의 코사인 유사도로 결과를 점수화한다. 여기에 파일명·구문 부스트가 조건부로 붙고, 모델별로 보정된 하한선과 근접 중복 다양성 필터가 적용된다. 결과 타일마다 무엇 때문에 매칭됐는지 알려주는 배지가 달리고, 마우스를 올리면 항목별 점수 분해가 툴팁으로 뜬다. 중국어·일본어·한국어 질의는 겹치는 바이그램 단위로 검색된다.

영상은 파일 단위가 아니라 장면 단위로 다룬다. ffmpeg가 샷 경계를 스캔해 세그먼트 계획을 만들고, 설정에서 고른 밀도에 맞춰 각 구간의 중간 프레임을 임베딩한다. 검색 결과 타일에는 장면 포스터와 타임코드 배지가 붙고, 영상을 열면 해당 시점으로 바로 이동한다. 잡음 게이트가 걸려 있어 장면 매칭이 없으면 엉뚱한 결과로 화면을 채우는 대신 장면 없음으로 응답한다. 샷 계획은 경로·크기·수정 시각·설정 지문 조합으로 파일별 캐시된다.

텍스트와 음성은 별도 모드로 분리돼 있다. 이미지와 프레임에 보이는 글자는 Tesseract가 읽는데, 비전 모델과 분리된 자체 워커에서 돌기 때문에 AI 엔진이 준비 중이거나 꺼져 있어도 동작한다. 영어는 항상 켜져 있고 35개 언어를 추가로 토글할 수 있으며, 기본값은 중국어 간체·번체, 일본어, 한국어다. 언어팩은 개당 2.4~5MB, 기본 세트가 약 17MB다. 영상 속 대사는 Whisper로 전사해 정확 문자열 검색을 한다. 임베딩이나 임계값 없이 세 단계로 나뉜다. 한 발화 안의 연속 구문, 한 발화 또는 8초 이내 구간의 모든 단어, 같은 영상 안의 모든 단어다. 전사 모델은 tiny.en(약 150MB, 기본)과 base.en(약 300MB) 중에 고르며, 바꾸면 모든 영상이 다시 전사된다.

선택 기능으로 로컬 LLM 채팅이 있다. 설정에서 켜기 전에는 아무것도 내려받거나 실행하지 않는다. loopback에 바인딩된 llama.cpp 사이드카가 앱이 이미 추출해 둔 대사·OCR 텍스트·파일명 키워드 히트를 근거로 답하고, 클릭 가능한 번호 인용을 붙인다. 답변은 토큰 단위로 스트리밍되며 초당 토큰 수가 표시된다. 질의 앞에 /screenshots, /videos, /email을 붙이면 검색 대상 코퍼스를 좁힐 수 있다.

임베딩 모델은 ONNX Runtime 위에서 네 가지를 전환해 쓸 수 있다. 실제 영상 장면 검색에 강한 모델, 작은 물체나 간판, 화면 속 글자에 강한 1024차원 고해상도 모델 등이 포함된다. 모델을 바꾸면 라이브러리 전체를 다시 임베딩해야 하는데, 전환은 즉시 반영되고 나머지는 백그라운드에서 채워진다. 그 사이 검색은 파일명 키워드로 폴백한다. 모델별 텍스트 평균 중심화로 텍스트 임베딩 편향을 보정해 모델 간 점수를 일관되게 유지한다.

라이브러리 관리는 자동화에 초점이 맞춰져 있다. 감시 폴더를 지정하면 새 파일이 자동으로 들어오고, 콘텐츠 해시로 이름이 바뀐 중복을 걸러낸다. 검색 질의는 탭으로 저장할 수 있고 최대 20개까지 이름을 붙여 관리한다. 스크린샷 분류는 이름 변경에 영향을 받지 않도록 네 가지 신호를 우선순위대로 쓴다. 수동 지정, 20개 이상 언어의 OS 스크린샷 파일명 어휘 30여 종, PNG 텍스트 청크나 EXIF UserComment를 읽는 메타데이터 검사, 소스 폴더 힌트다. OCR 텍스트에서 이메일 주소를 찾아내는 뷰도 있는데, 단어 상자 사이로 쪼개진 주소나 gmail,com 같은 오타, [at]·[dot] 형태의 난독화, 받아쓰기 형태까지 복원한다.

설치와 빌드는 개발자 친화적으로 준비돼 있다. Apple Silicon과 macOS 12 이상에서 Homebrew cask로 설치하며, cask가 설치·업그레이드 때마다 격리 플래그를 자동으로 해제해 Gatekeeper 단계를 거치지 않는다. 앱은 Electron으로 패키징됐고 패키지 매니저는 Bun을 쓴다. bun run dev, bun start, bun run build, bun run dist 같은 스크립트가 있고, 빌드 산출물은 dist-app/ 아래에 SCM-0.2.4.dmg와 SCM-0.2.4.zip으로 떨어진다. 기본 CLIP 모델 가중치는 약 435MB를 최초 한 번 내려받는다.

배경에는 클라우드 기반 사진·영상 검색 서비스의 프라이버시 부담이 있다. 개인 미디어를 외부로 올리지 않으면서도 의미 기반 검색을 쓰고 싶다는 요구는 꾸준했고, 애플 실리콘이 충분한 로컬 추론 성능을 제공하면서 이런 도구가 현실적인 선택지가 됐다.

개발자 입장에서 이 프로젝트는 로컬 우선 멀티모달 검색 파이프라인의 실제 구현 사례다. 비전 임베딩, OCR, 음성 전사, 로컬 LLM을 각각 다른 런타임으로 조합하면서 모델 전환·재임베딩·캐시 무효화 같은 운영 문제를 어떻게 다루는지 참고할 만하다. 다만 macOS와 Apple Silicon 전제가 분명하고, 모델을 바꿀 때마다 라이브러리 전체 재임베딩이 필요하며, LLM 채팅은 별도로 켜야 하고 가중치 다운로드가 선행돼야 한다는 점은 감안해야 한다.