Hacker News

Show HN: AI search for every photo and every frame of video on macOS

macOS에서 사진과 동영상 장면을 로컬 AI로 검색하는 SCM

SCM은 사진과 동영상을 Mac 안에서 분석해 자연어, 화면 속 글자, 음성 대사로 검색하는 오픈소스 앱입니다. 동영상은 장면별로 색인해 검색 결과에서 해당 시점으로 이동하며, 미디어를 외부로 보내지 않습니다.

AI 요약

SCM은 macOS용 로컬 우선 미디어 검색 앱입니다. 폴더를 지정하면 사진과 동영상을 가져와 색인하고, 사용자는 기억나는 장면을 자연어로 검색합니다. 모델 추론은 Mac에서 실행하며 계정이나 업로드가 필요하지 않습니다. 모델 가중치는 처음 한 번 내려받고 나면 오프라인으로 동작합니다. 기본 CLIP 모델은 약 435MB입니다.

검색 방식

검색은 파일, 장면, OCR, 대사 모드로 나뉩니다. 파일 모드는 이미지 임베딩의 코사인 유사도로 사진과 동영상을 정렬하고, 파일명과 검색어 구문을 보정 신호로 더합니다. 입력 직후에는 파일명 키워드 검색부터 시작하고, 비전 모델 결과가 뒤이어 반영됩니다. 결과 카드에는 시각적 일치나 파일명 일치 같은 근거를 표시하며, 구성 요소별 점수도 확인할 수 있습니다. 중국어·일본어·한국어 검색에는 겹치는 바이그램을 사용합니다.

장면 모드는 동영상의 각 구간을 따로 색인합니다. 검색 결과에는 장면 포스터와 타임코드가 나오며, 항목을 열면 해당 시점부터 재생합니다. ffmpeg가 장면 전환을 감지하고 설정한 밀도에 맞춰 구간을 구성합니다. Eco는 60초 간격, Balanced는 30초, Detailed는 15초, Ultra는 5초, Ultra Pro는 2.5초 간격입니다. 프리셋마다 구간 수와 저장 공간 비용이 달라집니다. Balanced의 구간 예산은 영상당 8~128개이며, Ultra Pro는 24~2048개입니다. 구간 계획은 파일 경로, 크기, 수정 시각, 설정 지문을 기준으로 캐시하므로 조건이 같으면 재가져오기 때 장면 감지를 건너뜁니다. 전체 동영상은 20%, 50%, 80% 지점의 프레임을 임베딩해 평균을 냅니다.

OCR 모드는 이미지와 프레임에 보이는 문구를 Tesseract로 읽고, 파일명이나 비전 모델 점수 없이 실제 문자열을 대조합니다. 영어는 기본으로 켜져 있고, 중국어 간체·번체, 일본어, 한국어를 포함한 언어 팩을 설정에서 선택합니다. 언어 팩은 한 번 내려받은 뒤 오프라인에서 사용합니다. 단어 위치도 저장해 검색어가 이미지 어디에 있는지 표시합니다. 대사 모드는 Whisper 전사문에서 정확한 문자열을 찾습니다. 한 발화 안의 연속 구절, 한 발화나 8초 이내 구간에 있는 단어, 같은 동영상에 등장하는 단어 순으로 결과를 나눕니다. 검색 결과를 열면 해당 대사가 나온 시점으로 이동합니다.

모델과 라이브러리 관리

비전 모델은 ONNX Runtime으로 실행하며 라이브러리마다 CLIP ViT-L/14@336, SigLIP-2-B/16, SigLIP-2-L/16@256, SigLIP-B/16 가운데 하나를 선택합니다. CPU 기준 표기 속도는 모델에 따라 이미지당 약 50~570ms입니다. 모델을 바꾸면 전체 라이브러리를 다시 임베딩하며, 작업이 끝날 때까지 파일명 검색을 이어갑니다. 검색을 막지 않고 백그라운드에서 처리합니다.

폴더 감시 기능은 새 파일을 자동으로 가져옵니다. 가져올 때 SHA-256 해시로 중복을 걸러내므로 파일 이름을 바꿔도 중복 항목을 만들지 않습니다. MIME 판별로 확장자가 잘못된 파일도 정규화합니다. 색인과 임베딩, 장면 데이터, 전사문, 썸네일은 기본적으로 ~/Library/Application Support/scm에 저장합니다. 전체 검색 상태를 저장하는 임베딩 버전은 최대 10개까지 관리하며, 복원 전에 자동 백업을 만듭니다.

부가 기능과 구현

선택 기능인 LLM 채팅은 이미 추출한 대사, OCR 텍스트, 파일명 검색 결과를 근거로 답합니다. llama.cpp를 로컬 루프백 주소에 띄우며, 답변에는 근거 항목을 가리키는 번호가 붙습니다. 기본 Qwen3 1.7B는 약 1.1GB로 8GB 메모리 Mac을 대상으로 하고, Llama 3.2 3B는 약 2GB입니다. 사용자가 설정에서 켜기 전에는 모델을 내려받거나 실행하지 않습니다.

앱은 Electron과 React로 구성하고, 색인 작업은 Node 워커에서 처리합니다. CLIP·SigLIP에는 Transformers.js와 ONNX, OCR에는 Tesseract.js WASM, 음성 인식에는 Whisper를 사용합니다. 작성자는 macOS에 한정하면 Apple Vision이 더 빠르고 정확할 수 있지만, v1에서는 이식성을 위해 Tesseract를 택했다고 설명합니다. Swift와 MLX를 사용하는 네이티브 v2도 별도로 살펴보고 있다고 밝혔습니다. 앱은 샌드박스 렌더러, CSP, 프로세스 분리 구조를 쓰며 분석 미디어를 외부에 보내지 않습니다. Homebrew 설치는 Apple Silicon과 macOS 12 이상을 대상으로 합니다.

Hacker News 반응

  • @stephenitis — 전체 구상은 마음에 듭니다. 대용량 동영상 폴더나 1만 2천 개쯤 되는 사진 라이브러리의 동영상을 처리하려면 컴퓨터를 얼마나 오래 비워둬야 하는지 몰라서 아직 써보지 못했습니다.
  • @hn3ufz62f7 — M1에서 CLIP으로 비슷한 걸 만들었는데, 프레임 샘플링 간격이 성능을 좌우합니다. 동영상 1만 2천 개를 초당 한 프레임씩 처리하면 며칠이 걸리고, 키프레임만 써도 밤새 돌려야 했습니다.
    • @xnx — 장면 감지는 써보셨나요? 카메라 컷은 키프레임보다 덜 자주 나올 것 같습니다.
    • @pezgordo — 최소한의 저해상도 버전도 필요할 수 있습니다. 편집 분야에서 흔히 쓰는 기법이라고 들었습니다. 찾으려는 장면이 샘플 간격보다 짧으면 샘플링 간격을 정하기 어렵습니다.
  • @aavisangle — 이걸 어떻게 구현하셨나요? 아키텍처를 설명해주실 수 있나요?
  • @lucideer — 조금 다른 이야기지만, 사진과 동영상을 대략적인 AI 검색으로 찾는다면 Immich도 있습니다. 다만 모든 프레임 검색이나 검색 품질까지 같다고 말할 수는 없습니다.
    • @mannyv — Immich를 써봤는데 마음에 들지 않는 점이 많았습니다. 수십 년 동안 모은 8TB 라이브러리라 모든 해상도의 썸네일 폴더를 만드는 방식이 특히 거슬렸습니다. 정리와 표시에도 다른 문제가 있었습니다. 결국 주말에 Gemini에게 DAM을 만들어달라고 하면 되겠다는 생각이 들었습니다.
    • @lucideer — 캐시와 라이브러리 디렉터리 구조는 설정할 수 있습니다. 제게는 모바일 연동이 가장 큰 차이점입니다.
    • @ryandrake — 소프트웨어가 사용자의 디렉터리 구조를 자기 방식으로 바꾸거나, 기존 파일 위에 별도 라이브러리를 만들 때마다 싫습니다. 사용자 데이터와 디렉터리 구조를 더 유연하게 다루는 소프트웨어가 많아졌으면 합니다.
  • @qprofyeh — iOS처럼 사람이나 얼굴, 반려동물도 검색할 수 있나요?
  • @measure2xcut1x — 메모리 32GB인 M1 Mac에서 스톡 사진 약 2천 장을 검색하면 어떨까요? 야자수가 있는 집, 부엌, 미국 남서부 사막 풍경을 찾고 싶습니다.
    • @tredre3 — Apple Photos도 기기 내 AI로 자연어 사진 검색을 지원합니다. 검색 결과가 만족스럽지 않나요?
    • @measure2xcut1x — 알려줘서 고맙습니다. 사진이 외장 SMB 네트워크 드라이브에 있어서 아직 써보지 않았습니다.
    • @allenleee — M1, M2, M3에서 잘 동작한다고 확인했습니다. 메모리 16GB와 64GB 기기에서 시험했습니다.
  • @cpursley — 왜 네이티브 앱이나 Rust 대신 비대한 JavaScript 앱을 만들었나요? LLM 코딩 도구가 있으니 Rust로 만드는 일도 예전보다 쉽습니다.
    • @collingreen — Rust로 직접 포크를 다시 배포하신 건가요? LLM으로 만들 수 있다는 말은 양쪽에 똑같이 적용됩니다. 본인에게 시간 쓸 가치가 없다면 다른 사람에게 무례하게 그럴 가치가 있다고 요구하는 것도 이상합니다.
    • @cpursley — 일리는 있습니다. 그래도 제 컴퓨터가 JavaScript와 Electron 앱 때문에 힘들어합니다.
  • @postalcoder — macOS용이라면 OCR에 Apple Vision을 써야 합니다. 속도와 정확도 모두 Tesseract보다 훨씬 낫습니다.
    • @allenleee — 좋은 지적입니다. Apple Silicon에서는 Apple Vision이 보통 더 빠르고 정확하며 용량도 작습니다. 다만 SCM을 쉽게 이식할 수 있도록 Tesseract를 골랐습니다. ARM Mac용으로 시작했지만 추론 계층을 Transformers.js, ONNX, Whisper, Tesseract.js WASM으로 구성해 Node 워커에서 실행합니다. 저는 iOS·macOS 개발자이며 SwiftUI와 AppKit을 좋아합니다. 속도를 높이기 위해 네이티브 Swift와 MLX를 쓰는 v2도 따로 살펴보고 있습니다.
    • @robotmay — Apple Vision은 한 이미지에 올바른 방향의 글자와 거꾸로 된 글자가 함께 있으면, 거꾸로 된 글자를 키릴 문자로 읽곤 합니다. 카메라 렌즈 문구를 읽다가 이상한 결과를 봤습니다. 글자를 나눠 곧게 펼친 뒤 OCR을 돌려 해결했습니다.
  • @yt1998 — 왜 CLIP을 선택했나요? Qwen-VL 같은 소형 VLM을 시험해봤나요? 이런 작업에서는 비디오 인코더가 더 잘할 것 같습니다.
  • @Jeeetendra — 동영상에서 원하는 순간으로 바로 이동하는 기능이 유용합니다. Balanced 샘플링은 1~2초만 나오는 장면을 얼마나 자주 놓치나요?
  • @hemedanmert — 편집자에게 유용할 것 같습니다. 비용이 많이 드나요?
    • @allenleee — 100% 무료 오픈소스입니다.

원문: Hacker News / 번역·요약: Trawling