Show HN: Gemini가 이제 비디오를 네이티브로 임베드할 수 있어, 그래서 나는 sub-second 비디오 검색을 만들었습니다
Source: Hacker News
작동 방식
SentrySearch는 대시캠 비디오를 겹치는 청크로 나누고, 각 청크를 Google의 Gemini Embedding 모델을 사용해 비디오로 직접 임베딩한 뒤, 벡터를 로컬 ChromaDB 데이터베이스에 저장합니다. 검색을 수행하면 텍스트 쿼리가 동일한 벡터 공간에 임베딩되어 저장된 비디오 임베딩과 매칭됩니다. 가장 일치하는 결과는 원본 파일에서 자동으로 잘라내어 클립으로 저장됩니다.
시작하기
# Clone and install
git clone https://github.com/ssrajadh/sentrysearch.git
cd sentrysearch
python -m venv venv && source venv/bin/activate
pip install -e .
API 키 설정
sentrysearch init
이 명령은 Gemini API 키를 입력받아 .env 파일에 저장하고, 테스트 임베딩을 통해 키를 검증합니다.
영상 인덱싱
sentrysearch index /path/to/dashcam/footage
검색
sentrysearch search "red truck running a stop sign"
비디오를 청크로 나누고 트리밍하려면 ffmpeg가 필요합니다. 시스템에 ffmpeg가 없을 경우, 번들된 imageio-ffmpeg가 자동으로 사용됩니다.
수동 설정: .env.example 파일을 .env 로 복사한 뒤, aistudio.google.com/apikey에서 발급받은 키를 직접 추가하세요.
Source: …
사용법
초기화
sentrysearch init
Gemini API 키를 입력하세요 (https://aistudio.google.com/apikey 에서 발급받음): ****
API 키를 확인 중...
설정이 완료되었습니다. 이제 `sentrysearch index ` 명령을 실행하여 시작할 수 있습니다.
키가 이미 설정되어 있으면, 덮어쓸지 여부를 물어봅니다.
영상 인덱싱
sentrysearch index /path/to/dashcam/footage
예시 출력:
파일 인덱싱 1/3: front_2024-01-15_14-30.mp4 [청크 1/4]
파일 인덱싱 1/3: front_2024-01-15_14-30.mp4 [청크 2/4]
...
3개의 파일에서 새 청크 12개를 인덱싱했습니다. 총: 3개의 파일에서 12개의 청크.
옵션
--chunk-duration 30– 청크당 초 단위 시간--overlap 5– 청크 간 겹침 시간--no-preprocess– 다운스케일링/프레임 레이트 감소 생략 (원본 청크 전송)--target-resolution 480– 전처리 시 목표 높이(픽셀)--target-fps 5– 전처리 시 목표 프레임 레이트--no-skip-still– 시각적 변화가 없는 청크도 모두 포함
검색
sentrysearch search "red truck running a stop sign"
예시 출력:
#1 [0.87] front_2024-01-15_14-30.mp4 @ 02:15-02:45
#2 [0.74] left_2024-01-15_14-30.mp4 @ 02:10-02:40
#3 [0.61] front_2024-01-20_09-15.mp4 @ 00:30-01:00
Saved clip: ./match_front_2024-01-15_14-30_02m15s-02m45s.mp4
옵션: --results N, --output-dir DIR, --no-trim (자동 트리밍 생략).
통계
sentrysearch stats
총 청크 수: 47
소스 파일 수: 12
자세한 모드
어떤 명령에든 --verbose 를 추가하면 디버그 정보(임베딩 차원, API 응답 시간, 유사도 점수 등)를 확인할 수 있습니다.
어떻게 가능한가요?
Gemini Embedding 2는 비디오를 직접 임베딩할 수 있습니다 — 원시 비디오 픽셀을 텍스트 쿼리와 동일한 768‑차원 벡터 공간으로 투사합니다. 전사도, 프레임 캡션도, 텍스트 중간 매개체도 없습니다. “정지 신호에 있는 빨간 트럭” 같은 텍스트 쿼리는 30‑초 비디오 클립과 벡터 수준에서 직접 비교할 수 있습니다. 이를 통해 수시간 분량의 영상에서 서브‑초 단위 의미 검색이 가능해집니다.
비용
1시간 분량의 영상을 인덱싱하는 데는 Gemini 임베딩 API를 사용할 경우 대략 $2.50 정도가 듭니다 (기본값: 30 초 청크, 5 초 겹침). API는 영상 길이 기준으로 청구되므로, 비용은 파일 크기가 아니라 청크 수에 따라 결정됩니다.
비용 절감 최적화
- 전처리 (기본 활성) – 청크를 480p, 5 fps 로 다운스케일한 뒤 임베딩합니다. 업로드 크기와 토큰 수가 감소해 속도가 빨라집니다.
- 정지 프레임 건너뛰기 (기본 활성) – 시각적으로 의미 있는 변화가 없는 청크는 완전히 건너뛰어 API 호출을 절감합니다.
검색 쿼리는 텍스트 임베딩만 사용하므로 비용이 거의 발생하지 않습니다.
튜닝 옵션
--chunk-duration/--overlap– 청크를 길게 하고 겹침을 줄이면 → API 호출 수 감소 → 비용 절감.--no-skip-still– 아무 변화가 없어도 모든 청크를 임베딩합니다.--target-resolution/--target-fps– 전처리 품질을 조정합니다.--no-preprocess– 원본 청크를 그대로 API에 전송합니다.
제한 사항 및 향후 작업
- 정지 프레임 감지는 휴리스틱 – 샘플링된 프레임들의 JPEG 파일 크기 비교를 사용합니다. 미묘한 움직임이 있는 청크를 놓치거나 완전히 정적인 청크를 포함할 수 있습니다. 모든 청크를 인덱싱해야 한다면
--no-skip-still로 비활성화하세요. - 검색 품질은 청크 경계에 의존합니다 – 두 청크에 걸친 이벤트가 분할될 수 있습니다; 겹치는 윈도우가 도움이 되지만 완벽하지는 않습니다. 더 스마트한 청크화(예: 씬 감지)가 결과를 개선할 수 있습니다.
- Gemini Embedding 2는 프리뷰 단계입니다 – API 동작 및 가격이 변경될 수 있습니다.
호환성
MP4 형식의 모든 영상에 적용됩니다. Tesla Sentry Mode에만 국한되지 않습니다. 디렉터리 스캐너는 폴더 구조와 관계없이 모든 .mp4 파일을 재귀적으로 찾습니다.
Requirements
- Python 3.10+
ffmpeg가PATH에 있거나, 기본 설치된imageio-ffmpeg를 통해 번들된 ffmpeg를 사용하세요 (기본 설치됨)- Gemini API 키 (무료로 받기)