Smart Proxy Tagger: 비디오 촬영 자료를 위한 오프라인 태거
요약
Smart Proxy Tagger는 비디오 편집 자료를 위한 로컬 오프라인 태거 도구입니다. 사용자가 미디어를 기기에 인덱싱하면 타임스탬프 검색이 가능하며, 고객의 민감한 영상은 외부로 전송되지 않습니다. 이 도구는 오픈 가중치 모델(open-weight model)을 사용하여 프레임을 읽고 캡션을 생성합니다.
핵심 포인트
- 민감한 미디어 자료를 로컬에서 안전하게 인덱싱 가능
- 오픈 가중치 모델과 pgvector를 활용하여 클라우드 의존성 최소화
- 타임스탬프 기반 검색을 통해 원하는 특정 순간을 효율적으로 찾음
프리랜서 편집자들은 수많은 인터뷰 영상과 B-roll(보조 영상)을 받지만, 그중 원하는 특정 순간을 찾지 못하는 경우가 많습니다. Smart Proxy Tagger는 이러한 상황을 위한 로컬호스트 도구입니다. 경로를 붙여넣고 같은 기기에서 영상을 인덱싱한 후, 타임스탬프를 검색할 수 있습니다. 고객의 미디어는 노트북에 그대로 보관됩니다. 유일하게 외부로 전송되는 미디어 호출은 인덱싱이 완료되었을 때 말하는 한 문장뿐이며, 이 문장에는 프레임이나 파일 경로가 포함되지 않습니다.
이 제품은 용량이 커질 수 있는 로컬 라이브러리를 위한 것입니다. 데모는 약 5초 간격으로 샘플링된 짧은 클립이며, 파일당 최대 24개의 순간을 담고 있습니다. 이 간격은 backend/frames.py의 FRAME_SAMPLE_INTERVAL_SECONDS 옆에 명시되어 있습니다. 본 게시물에서는 데모 클립을 수 테라바이트 규모의 작업으로 다루지 않습니다.
레포: github.com/devinuwa/smart-proxy-tagger
데모:
오픈 소스가 중요한 이유
수 시간 분량의 4K 영상을 폐쇄형 비전 API에 업로드하는 것은 느릴 뿐만 아니라, 촬영 시간에 따라 비용이 증가합니다. 프리랜서 편집자는 또한 고객의 미공개 영상을 노트북 외부로 보내서는 안 됩니다.
인덱서는 로컬 오픈 가중치 모델(open-weight model)을 사용하여 각 샘플링된 프레임을 읽도록 구축되었습니다. 이번 제출에서 caption_frame은 명시적인 대체재입니다. 이 함수는 파일 이름과 타임스탬프를 기록하며, 문자열에 이것이 대체재임을 명시합니다. PaliGemma는 해당 기능을 대체하는 Gemma 계열 모델입니다. 워크플로우, 임베딩 단계(embedding step), 그리고 pgvector는 이미 갖추어져 있으므로, 이 교체 작업은 클라우드 비전 호출을 추가하지 않습니다. 이 빌드에는 분당 호스팅되는 캡션 API가 없습니다. 검색 임베딩은 로컬 384차원 벡터이며, 127.0.0.1의 TimescaleDB에 pgvector를 사용하여 저장됩니다.
DEV의 다른 사람들도 같은 흐름을 만들고 있습니다. Kabilarasan B는 SAM 2.1을 사용하여 비디오 주석 작업을 로컬로 유지했습니다. swmcc는 로컬 비전 모델을 사용해 사진 아카이브를 인덱싱했습니다. FacePika는 '클라우드 업로드 없음'을 나중에 추가할 기능이 아니라 제약 조건으로 다루었습니다. Mukundakatta는 긴 작업은 인덱스를 체크포인트하고 거기서 재개해야 하는 이유를 보여주었습니다. 마지막 아이디어가 바로 캡션 단계가 프레임당 하나의 활동이 아니라, 심장 박동을 가진 단일 시간적(Temporal) 활동인 이유입니다.
기술 스택 및 후원 트랙
- Gemma. 캡션 활동은
caption_frame을 호출합니다. 실행 중인 빌드는 그 텍스트를phase2-stand-in으로 레이블링합니다. PaliGemma는 이 함수가 다음으로, 이 장치에서, 프레임이 노트북을 벗어나지 않도록 작성된 로컬 모델입니다. - Temporal. 프레임 발견, 추출, 캡셔닝, 음성 알림은 하나의 워크플로우입니다. 캡션 단계는 단일하고 긴 활동입니다. 이는 다음 프레임 인덱스에 심장 박동을 보내고, 작업자가 재시도할 때(노트북이 잠든 후에도 포함) 거기서 재개됩니다. API는 워크플로우 ID를 반환하며 영상이 끝날 때까지 기다리지 않습니다.
- Tiger Data. 검색 행은 pgvector가 있는 TimescaleDB에 거주하며, localhost에서 게시됩니다. 키워드 전체 텍스트와 벡터 유사성이 융합되며, 각 히트(hit)는 어떤 신호가 일치했는지 알려줍니다. 코사인 거리 0.85 이상인 벡터 이웃은 제외되므로, 중첩되는 부분이 없는 쿼리는 저장된 모든 순간을 나열하지 않습니다. 이것은 호스팅된 데이터베이스가 아닙니다.
- ElevenLabs. 인덱싱이 완료되면 하나의 활동이 말합니다:
워크플로우는 데이터베이스나 HTTP 임포트를 거치지 않으며, Temporal이 샌드박스(sandbox)에서 재현하기 때문에 그러합니다. 음성 처리는 별도의 활동이기 때문에 음성 처리 실패가 영상에 대한 자막을 다시 생성하지 않습니다.
self._progress["status"] = "captioning"
stored = await workflow.execute_activity(
"caption_and_store",
...
해당 활동 내부에서, 하트비트(heartbeat) 상세 정보는 다음 프레임 인덱스입니다. 완료된 행은 이미 데이터베이스에 있으므로 재시도한다고 해서 다시 처리되지 않습니다.
start_index = 0
details = activity.info().heartbeat_details
if details:
...
사용해보기 (Try it)
github.com/devinuwa/smart-proxy-tagger의 README에 로컬 실행 단계가 나와 있습니다: TimescaleDB와 Temporal을 위한 Docker, Python 워커, FastAPI, 그리고 http://127.0.0.1:5173에서 Vite 앱입니다. 전체 경로를 붙여넣고 Index footage를 클릭한 후, 상태가 완료될 때까지 기다린 다음, 자막에서 단어를 검색합니다. 브라우저를 닫는다고 해서 워커가 멈추지는 않습니다.
에이전트 세션 (Agent session)
Smart Proxy Tagger 구축하기
당신:
비디오그래퍼들이 원본 영상을 인덱싱하고 검색할 수 있는 로컬호스트 도구인 Smart Proxy Tagger를 Hacktoberfest Week 2 Side Hustle 챌린지를 위해 만드세요. 영상은 기기에 보관하세요. Temporal, pgvector가 적용된 로컬 TimescaleDB, 그리고 완료 문장 생성에만 ElevenLabs를 사용하세요.
에이전트:
설계는 로컬 루프입니다: React 앱이 FastAPI에게 Temporal 워크플로우 시작을 요청하고, 하나의 자막 활동(caption activity)이 프레임 커서를 하트비트하며, 검색은 TimescaleDB와 pgvector를 읽습니다. ElevenLabs는 한 문장만 받고 프레임이나 클라이언트 경로는 받지 않습니다.
▸ write_architecture docs/ARCHITECTURE.md
입력
docs/ARCHITECTURE.md
출력
Wrote the local UI, Temporal, pgvector, and voice flow.
에이전트:
자막 단계는 프레임당 하나의 활동(activity)이 아니라 하나의 활동입니다. 이는 다음 프레임 인덱스를 하트비트하며 재시도 후 그 지점에서 재개됩니다. ElevenLabs 키가 누락되면 음성 활동만 실패하므로, 영상은 계속 검색 가능합니다.
▸ implement_workflow backend/workflow.py and backend/activities.py
입력
backend/workflow.py와 backend/activities.py
Output
IndexFootageWorkflow는 discover, extract, caption_and_store, 그리고 notify_complete를 포함합니다.
Agent
검색은 키워드 및 벡터 히트를 보여줘야 합니다. 공유하는 단어가 없는 가장 가까운 이웃(nearest-neighbor) 쿼리도 여전히 모든 행을 반환했기 때문에, 코사인 거리(cosine distance)가 0.85 이상인 벡터 히트는 병합 전에 제외됩니다.
You
ElevenLabs API 키를 추가하고 Creator 플랜으로 업그레이드했습니다. 기존 키도 계속 작동할까요?
Agent
플랜을 업그레이드해도 동일한 키가 계속 작동합니다. 이전에 HTTP 402를 반환하던 라이브러리 음성이 이제 오디오를 반환합니다. 키는 .env에 유지되며 브라우저로 절대 전송되지 않습니다.
You
흩어져 있는 Python 파일들을 backend이라는 폴더에 그룹화한 다음, devinuwa 계정 아래 GitHub에 푸시해주세요.
Agent
이제 모듈들은 backend/에 위치합니다. 워커와 API는 각각 python -m backend.worker 및 uvicorn backend.server:app으로 리포지토리 루트에서 시작하므로, .env와 var가 프론트엔드 옆에 있게 됩니다. github.com/devinuwa/smart-proxy-tagger에 푸시했습니다. 이 빌드의 캡션은 여전히 로컬 대체품입니다: 파일 이름과 타임스탬프입니다. PaliGemma는 나중에 caption_frame을 대체할 모델입니다. 데모 샘플은 약 5초 간격으로 최대 24 프레임을 처리하며, 테라바이트급 실행이 아닙니다.
8개의 메시지 중 8개
AI 자동 생성 콘텐츠
본 콘텐츠는 Dev.to AI tag의 원문을 AI가 자동으로 요약·번역·분석한 것입니다. 원 저작권은 원저작자에게 있으며, 정확한 내용은 반드시 원문을 확인해 주세요.
원문 바로가기