Baru-baru ini, developer independen berhasil indexing setahun penuh video lokal hanya dengan MacBook 2021 dan model Gemma 4-31B. Artikel ini adalah breakdown praktis cara kerjanya dan bagaimana kamu bisa replikasi setup serupa untuk project pribadi atau internal tim.
Sumber inspirasi: Indexing a year of video locally on a 2021 MacBook oleh Simba Stack.
Kamu tidak butuh server mahal. Minimum viable setup:
Install dependency utama:
pip install opencv-python-headless chromadb sentence-transformers ollamaProses indexing dimulai dengan mengubah video menjadi frame representatif. Gunakan OpenCV untuk ekstraksi setiap 5 detik:
import cv2, os
def extract_frames(video_path, out_dir, interval=5):
cap = cv2.VideoCapture(video_path)
fps = cap.get(cv2.CAP_PROP_FPS)
count = 0
while cap.isOpened():
ret, frame = cap.read()
if not ret: break
if int(count) % (int(fps) * interval) == 0:
cv2.imwrite(f"{out_dir}/frame_{count}.jpg", frame)
count += 1
cap.release()Untuk 1 tahun video, biasanya menghasilkan 10.000 - 50.000 frame tergantung durasi total.
Gemma 4-31B support vision dan text. Kita gunakan untuk generate embedding visual dari setiap frame:
import ollama
def embed_image(path):
res = ollama.embed(
model="gemma4:31b",
input=[{"type": "image", "source": path}]
)
return res.embeddings[0]Embedding ini akan disimpan ke vector database untuk semantic search nanti.
ChromaDB adalah pilihan terbaik untuk local vector search karena pure Python dan zero-config:
import chromadb
client = chromadb.PersistentClient(path="./video_index")
collection = client.get_or_create_collection("video_frames")
def index_frame(frame_path, embedding, metadata):
collection.add(
ids=[metadata["id"]],
embeddings=[embedding],
metadatas=[metadata]
)Metadata wajib menyertakan nama file video dan timestamp frame untuk traceability.
Setelah index terbangun, search menjadi trivial. User bisa query dalam bahasa natural:
def search_videos(query, n_results=5):
q_embed = ollama.embed(model="gemma4:31b", input=query).embeddings[0]
return collection.query(
query_embeddings=[q_embed],
n_results=n_results
)Hasil query akan mengembalikan frame paling relevan beserta metadata video dan timestamp-nya.
Jika kamu indexing lebih dari 100.000 frame, pertimbangkan:
Dengan optimasi ini, MacBook 2021 pun mampu handle indexing 1 tahun video dalam waktu semalam.
Sumber referensi: Simba Stack - Indexed a Year of Video Locally.
Dapatkan feedback, users, dan eksposur dari komunitas kreator, developer, dan entrepreneur digital Indonesia.
Submit Produk → Pelajari Dulu