2021 MacBook'ta Gemma4-31B ile 1 yıllık videoyu yerelde indekslemek (50GB swap)
(blog.simbastack.com)- Video arşivindeki darboğaz, kurgu araçlarından çok aranabilir olmamasıydı; odak, etiketsiz klipleri İngilizce sorgulanabilir bir indekse dönüştürmekti
- Yerel öncelikli tasarımda her klibin yanına
.description.mdsidecar dosyası oluşturuluyor; rating, ışıklandırma, konum, transkript, anahtar kelimeler ve düzyazı açıklama tek bir vision çağrısından çıkarılıyor - Pipeline;
ffprobe,exiftool, Nominatim,ffmpeg, WhisperX,insightfaceve vision modelini birleştirerek metadata, GPS, kareler, transkript ve yüz embedding'leri üretiyor - 2021 16 inç MacBook Pro M1 Max 64GB, LM Studio'da Gemma 4 31B Q4 çalıştırdı ve toplu işleme sırasında swap en fazla 50.89GB'a çıktı
- Yapılandırılmış şema ve enum kısıtları halüsinasyonu azalttı; toplu indeksleme yerel 31B ile yapılıp yalnızca zor olan %10–20'lik kısım bulut modeliyle yeniden değerlendirilebildi
Problemin başlangıç noktası: kurgudan önce arama
- Maasai Mara'da yaklaşık yarım yıl kalırken iPhone, DJI Pocket, drone, Nikon Z8 ve Ray-Ban Meta ile çekilen videolar sürekli birikti ama çoğu yeniden açılmadan kaldı
- Mara Hilltop'un sosyal kanalları, içerik eksikliğinden değil kurgu zamanı eksikliğinden dolayı 3 ay boyunca durmuştu
- Claude Code ve Opus 4.5/4.6 ile geliştirme işleri uzun süreli ajan çalıştırma ve paralel çalışmayla kolaylaştı; buna KaribuKit'in ilk ücretli konaklama lansmanı da eklenince video kurguya ayrılan zaman daha da azaldı
- İlk düşünülen çözüm, Eddie AI, Higgsfield MCP, Submagic ve Buffer'ı birleştiren aylık 140$ SaaS yığınıydı, ancak gerçek darboğazla uyuşmuyordu
- Üretken yapay zeka videoları gerçek bir seyahat markasına uymuyordu; misafirler gerçek mekanı beklerken yanlış gösterilen yapay zeka sahneleri güveni zedeleyebilirdi
- Gerçekçi paylaşım sıklığı haftada 3–5 değil, haftada 2–3'e daha yakındı; bu yüzden ilk plan daha ikinci haftadan başarısız olabilirdi
- Halihazırda sahip olunan DaVinci Resolve Studio ile Resolve 21'in IntelliSearch, Smart Bins ve Voice to Subtitle özellikleri, Eddie'nin sunduklarının yaklaşık %70'ini kapsıyordu
- Geriye kalan yapı, Claude Code'un açık kaynak DaVinci Resolve MCP ile Resolve'u kontrol etmesi ve yalnızca bilgilendirici kliplerde ElevenLabs ile seslendirme yapılmasıydı; maliyet de aylık 22$'a düştü
Gerçek darboğaz: AI editörden önce gereken indeks
- Piyasadaki AI video editörleri videonun zaten etiketlenmiş olduğunu varsayıyor, ancak gerçek arşiv
IMG_*.mov,DJI_*.mp4,Mara june 2024 backup final FINALgibi adlarla dağılmış durumdaydı - Eddie transkript üzerinden arama yapabiliyordu ama etiketsiz bir arşivde “altın saat ışığında tepede fil” gibi sahneleri bulamıyordu
- Dosya adı, üst klasör, GPS koordinatları ve transkript metni tek başına “karede zürafa olan gün doğumu geniş plan” gibi görsel içeriği anlatmıyordu
- Asıl kaldıraç editörün üstünde değil öncesindeydi; önce arşivi İngilizce sorgulanabilir hale getiren bir indeks gerekiyordu
Yerel öncelikli indeksleyici tasarımı
- Genel yapı, SimbaStack'te müşteriler için geliştirilen AI-native build'lere benziyordu; ancak burada hem müşteri hem mühendis aynı kişi olduğu için kararlar hızlı alındı
-
Dört kısıt
- Yerel öncelikli olmalıydı
- Mara Hilltop arşivi fiziksel SSD'lerdeydi, kişisel videolar da dizüstündeydi; binlerce çok GB'lık klibi buluta yüklemek hem maliyet hem gizlilik açısından uygun değildi
- Merkezi bir veritabanı yerine sidecar dosyaları isteniyordu
- Her klibin yanına
.description.mdkonup düz metin olarak grep ile aranabilir hale getirildi - İndeksleyici ileride bozulsa bile dosyalar kalıyor, sürücüler arasında taşınırken veri de birlikte taşınıyordu
- Her klibin yanına
- Bir vision çağrısında gereken her şey çıkarılmalıydı
- Çıkarılan kareler üzerinde vision pass pahalı olduğundan, ileride gerekebilecek bilgiler de ilk çağrıda alınsın diye şema baştan geniş tutuldu
- Buna rating, technical quality, lighting, time of day, color palette, audio quality, people count, keywords, faces, location, transcript ve prose description gibi alanlar dahildi
- Üç vision backend'i seçilebilir olmalıydı
- Varsayılan, Claude Max aboneliğinin CLI'ıydı; marjinal maliyet yoktu
- Hız gerektiğinde Anthropic API kullanıldı
- Toplu işlerde ise LM Studio'ya bağlanan yerel backend kullanıldı ve asıl kilit nokta bu yerel backend'di
- Yerel öncelikli olmalıydı
Klip başına işleme pipeline'ı
ffprobeile metadata okunduexiftoolile GPS enlem, boylam ve rakım alındı; iPhone, DJI Pocket ve drone videolarında aynı şekilde çalıştı- Nominatim ile ters geocoding yapıldı; ücretsizdi, hız limiti vardı ve API anahtarı gerektirmiyordu
ffmpegile 1920px boyutunda 5 kare eşit aralıklarla çıkarıldı- WhisperX ile kelime düzeyinde hizalama ve pyannote konuşmacı ayrımı dahil transkript üretildi; Hindi, English, Swahili dahil 97 dili destekliyordu
insightfaceile yüzler tespit edildi ve arşiv genelinde kişi araması yapılabilmesi için 512 boyutlu ArcFace embedding'leri merkezi SQLite yüz veritabanına kaydedildi- Vision modeli, kareleri, transkriptin bir kısmını ve klasör bağlamını okuyup YAML frontmatter ile düzyazı açıklama döndürdü
- Nihai sonuç klibin yanına
.description.mdsidecar olarak yazıldı - Mara Hilltop'taki gerçek klip
IMG_1103.MOV, dosya adından bağlam vermiyordu; ancak Gemma'nın ürettiği sidecar içinde safari çadırı kurulumu, içeriden savanaya uzanan kamera pan'ı, çekim tipi ve pazarlama reels'i ile seyahat vlog'u B-roll gibi kullanım alanları yer aldı - Klasör düzeyinde, her klibin yanındaki sidecar'lara ek olarak üstte
_INDEX.jsonve_INDEX.mdüretildi; bunlar hızlı grep ve LLM'e aktarma için kullanıldı - Tüm uygulama yaklaşık 1.400 satır Python içeren bir Claude Code skill'iydi; kodun büyük kısmını Claude Code yazdı, insanın rolü ise mimari, prompt, şema tasarımı ve bug triage oldu
Eski bir MacBook'ta çalışan yerel 31B model
- 2021'de alınan 16 inç MacBook Pro M1 Max 64GB RAM, aslında LLM için değil; aynı anda Chrome sekmeleri, DaVinci Resolve, Slack, Discord ve Drive çalıştırmak için seçilmişti
- Beş yıl sonra aynı dizüstü, LM Studio'da Gemma 4 31B Q4 açıp 1 yıllık video arşivini işledi
- LM Studio'da 28.40GB'lık model belleğe yüklendi ve REST API
127.0.0.1:1234üzerinde çalıştı - Toplu işlem sırasında 64GB RAM yetmedi ve Activity Monitor'a göre swap kullanımı en fazla 50.89GB'a çıktı
- Bu durum sıradan bir iş gününde sürekli taşınacak bir durum değildi ama hafta sonu boyunca sistemi zorlamak için kabul edilebilir görüldü
- Dizüstü ısındı, fanlar hızlandı ama başka işler yapılırken sidecar üretmeye devam etti
- M1 Max 16 inç, 5 yıllık donanımda bile 31B parametreli modeli kullanılabilir hızda çalıştırabildiğini gösterdi; yerel LLM'ler daha verimli hale geldikçe bunun 3–5 yıl daha yeterli olabileceği düşünüldü
Dört hata ve çıkarılan dersler
-
WhisperX 3.8'de konuşmacı ayrımı API değişikliği
- WhisperX 3.8'de
whisperx.DiarizationPipeline,whisperx.diarizealt modülüne taşındı - Kurucu argümanı
use_auth_token, pyannote 3.x ile uyumlu olacak şekildetokenolarak değişti - Çözüm signature introspection oldu
- Script önce
token=deniyor, kurucuTypeErrorverirseuse_auth_token=ile fallback yapıyordu - Hızla değişen AI kütüphanelerini çağırırken savunmacı constructor çağrıları ucuz bir sigorta işlevi görüyor
- WhisperX 3.8'de
-
Claude CLI izin hatasını başarılı yanıt gibi döndürüyor
- CLI backend'in ilk testinde 4 sidecar da aynı “I need permission to read the image frames...” metniyle döndü
- Exit code 0'dı ve çıktı boş değildi; dolayısıyla script'in başarı kontrolünden geçti
- Non-interactive modda
--permission-mode bypassPermissionsyoksa Claude CLI, prompt yerine izin reddi metnini yanıt gövdesi olarak döndürüyordu - Çözüm, bu flag'i eklemek ve “I need permission” içeren kısa yanıtları açıklama değil hata olarak ele alan savunmacı bir kontrol koymaktı
- AI araçlarını script içinde kullanırken non-interactive izin akışlarında sessiz hatalar saklı olabiliyor
-
Gemma
people_count: "many"döndürüyor- Vision prompt'u
integer or the string "many" if >10dediği için Gemma aslında talimata doğru şekilde uyuyordu - Hata modelde değil şema tasarımındaydı
- Düzeltmeden sonra 0–99 arası bir tamsayı tahmin etmesi açıkça istendi; mevcut
"many"yanıtları da parser içinde zorla dönüştürüldü - Şema alanları
int veya belirli bir stringgibi union olmamalı; her zaman tamsayı ya da her zaman string olmalı ki downstream tüketiciler daha basit kalsın
- Vision prompt'u
-
Titrek motosiklet klibi yanlışlıkla elendi
- İlk cull prompt'u, video anılarından çok fotoğraf portföyü ölçütlerine yakındı; ağır motion blur, soft focus ve titreşim
cullolarak işaretleniyordu - İspanya seyahatinde çekilen elde gece motosiklet klibi de elenecekler arasına girdi ama o bulanıklığın kendisi anının atmosferiydi
- Cull kriteri “kusursuz olmayan çekim”den “gerçek bir kayıt olmayan içerik”e çevrildi
- Elenecekler lens kapağı, cep içi görüntü, 2 saniyelik test klibi, tamamen patlamış pozlama gibi örneklerle sınırlandı
- Fotoğraf arşivi agresif biçimde cull edilmeli, video anılarında ise daha toleranslı olunmalı; aynı şema kullanılsa bile mod açıkça belirtilmeli
- İlk cull prompt'u, video anılarından çok fotoğraf portföyü ölçütlerine yakındı; ağır motion blur, soft focus ve titreşim
Yapılandırılmış şema ve yerel modelden çıkan sonuçlar
-
Enum kısıtları halüsinasyonu azaltıyor
- Gemma 4 E4B, geceleri çekilmiş bir coworking-space fotoğrafını “brightly lit, abundant natural light, floor-to-ceiling windows” diye tarif etti ama pencerenin dışında tamamen karanlık gece vardı
- 31B'ye yapılandırılmış şema verilip
golden_hour | bright_daylight | overcast | dim_interior | nighttime | mixed | unclearseçeneklerinden birini seçmesi istendiğinde, hem thinking-off hem thinking-on modundanighttimesonucuna geri döndü - Model açık uçlu düzyazıda yanlış açıklamalar üretebilir, ancak enum içinde yeni bir değer uyduramaz; sadece yanlış seçim yapabilir
- Talimattan çok şema daha güvenli çıktı
-
Yerel 31B ve yapılandırılmış prompt'lar, bulutla aradaki farkı kapatıyor
- Gemma 4 31B Q4 thinking-off, yapılandırılmış şema kullandığında birçok test klibinde Sonnet 4.6'dan ayırt edilmesi zor çıktılar üretti
- Bulut modelinin primi, zor olan %10–20'lik kliplerde anlamlıydı
- Binlerce klibi gece boyunca indeksleyen toplu işler yerelde çalıştırılıp, yalnızca yerelin
reviewdiye işaretledikleri bulutta yeniden değerlendirilen iki aşamalı yapı ölçeklenebilir görünüyordu
-
AI video editörleri çok üst katmanda rekabet ediyor
- Değerli katman editör değil, aranabilir indeksti
- “Mara'da elde çekilmiş iç mekan klipleri, altın saat, içinde insan olan ve 8 saniyeden uzun olanlar” gibi doğal dille sorgu yapılabildiğinde, bunun üstündeki editör katmanı basitleşiyor
- AI editör pazarı, var olmayan bir indeksin üstündeki yüzey katmanda rekabet ediyor ve önkoşul olan indeksi atlıyor
Sonraki adımlar ve sınırlamalar
- Sıradaki iş, Claude Code'u orkestratör olarak kullanıp DaVinci Resolve MCP ile kesimleri oluşturan ve bilgilendirici kliplere ElevenLabs seslendirmesi ekleyen bir editör yapmak
- Ses klonlamada net sınırlar var
- Yalnızca yönlendirme, oda açıklaması, çok dilli versiyonlar ve doğrudan söylenebilecek olgusal bilgiler gibi faydacı içeriklerde kullanılacak
- Yorumlarda ya da kurucu mesajlarında kullanılmayacak
- 2026'da açıklama zorunluluklarına ilişkin yasaların gerçek bir mesele olacağı ve hospitality markalarında güvenin kolay kaybedileceği düşünülüyor
- İndeks olduğunda, 47GB'lık DJI Pocket görüntüsü içinde gün doğumu geniş planı elle scrub etmek gerekmiyor
- Şu anda 5 yıllık dizüstünde Mara Hilltop'un 1 yıllık videoları İngilizce sorgulanabilir hale geldi; bedeli bir hafta sonu ve 50GB swap oldu
- Eski SSD'lerde kalan diğer yıllar sıradaki işleme adayları
- Mara Hilltop'un sosyal kanalları hâlâ yeniden canlanmış değil
- İndeksleyici yalnızca doğru klibi bulma problemini çözüyor
- Onu bitmiş bir reel'e dönüştürecek editör diğer yarı; başarılı olursa bununla ilgili yeni bir yazı, başarısız olursa da neden başarısız olduğuna dair bir yazı gelecek
- Doğru cevap bir insanı işe almak da olabilir
- Mara Hilltop'a uygun sıcak ve gözlemci tona sahip bir editör bulmak, bir skill daha yazmaktan zor olabilir
- Aşırı kesilmiş MTV tarzı reels istenen yön değil
- Kod github.com/Simbastack-hq/framedex adresinde açık kaynak olarak yayımlandı; PR ve issue kabul ediliyor
1 yorum
Hacker News görüşleri
Görünüşe göre Claude, yazıyı yazarken paylaşılacak URL’yi yanlış seçmiş. Ana klasör dışarıya açık değilse
~/.claude/skills/video-index/erişilebilir olmayacaktır; bu yüzden Skill dosyasını paylaşabilir misin diye merak ediyorumGüncelleme: Bu depoyu aceleyle oluşturdum - https://github.com/Simbastack-hq/framedex
Lisans MIT, ama genelleştirdikten sonra düzgün test edemedim. Yakında baştan sona gözden geçirip daha fazla güncelleme ekleyeceğim
TODO listesindeki iki büyük madde şunlar: 1) Bu indeksleme ve Claude’un yardımını kullanarak DaVinci Resolve’da video düzenlemeyi hızlandırmak, 2) Şu an yalnızca videoyu işliyor ama bunu kameradaki binlerce durağan görseli de anlayabilecek şekilde genişletmek
Neden bu kadar fazla swap gerektiğini tam anlayamadım. Gerekli bellek bant genişliği düşünülünce SSD ömrünü oldukça hızlı azaltabilir
Gemma 4 31B’nin 4 bit kuantize modeli 28.4GiB değil, yaklaşık 19GiB civarında olmalı [1]. Görselleri sık sık girdi olarak vermediğim için bağlama eklerken ne kadar ek bellek gerektiğini bilmiyorum ama 10GiB’ı aşacağını sanmıyorum
Activity Monitor’a bakınca modelin yüklü göründüğü Handy ve Claude Code sanal makinesinin üstüne bir de birden çok Electron uygulaması açık görünüyor; yani asıl sebep muhtemelen onlar. Dizüstü bilgisayar disk erişimine abanmağa başladığında bu tür uygulamalar zaten kilitleneceği için pek faydalı olmayacaklardır
[1] https://huggingface.co/mlx-community/gemma-4-31b-it-4bit
Yine de biraz takılıyordu ama Brave tarayıcısında çok sayıda sekme açıkken bile başka işler yapmaya devam edebilmem etkileyiciydi
Bunun zaten var olduğunu, oldukça iyi olduğunu ve 50GB swap tüketmediğini biliyor muydun diye merak ediyorum
https://github.com/iliashad/edit-mind
Harika. Keşke yerel modeli çalıştıracak kadar RAM’im olsaydı. Son birkaç haftadır çok benzer bir şey yaptım; ben bunu Whisper ve ffmpeg kullanan yerel bir Electron uygulaması olarak geliştirdim ve video ile sohbet etmek için anlamsal arama ile embedding ekledim
Görsel analiz, etiketleme ve video sohbeti için Claude ile haberleşiyor. Bu projenin tek bir görsel mi gönderdiğini merak ediyorum. Ben özel bir sahne algılama algoritmasıyla her videoda farklı birden fazla görsel bulup bunları altyazılarla birlikte Claude’a tek bir istekte gönderiyorum. Maliyetin açık ara en yüksek kısmı kesinlikle bu. Analiz için Sonnet 4.6, etiketleme için Haiku kullanırsan 1 saatlik video yaklaşık 1 dolara geliyor ve yerelde yavaş olur gibi duruyor
Ama kare seçme yöntemim zayıf nokta. Sahne algılama kesinlikle yardımcı olurdu ve yol haritasında ilk sırada. Sahne algılamada kareleri nasıl seçtiğini paylaşabilir misin diye merak ediyorum
Vektör arama eklemek yerine daha taşınabilir, genel Markdown dosyalarıyla basit kalmayı seçtim. SSD’yi taşısan bile bilgi dosyalarla birlikte taşınır, senkronize edilecek bir indeks olmaz ve düz metin araçlardan daha uzun ömürlü olur. Ama senin söylediğin diğer yön de keşfetmeye değer
Başka iyi seçenekler de var. Gemini 3.1 Flash Lite bu tür işler için çok iyi. Ama Gemini 3.5 Flash değil. Onun fiyatı pek iyi değil
https://openrouter.ai/google/gemma-4-31b-it
İki sorum var
description.mdörneğindefaces -> cluster_idgibi alanlar var. Bunun DaVinci Resolve’un yüz indeksinden gelip gelmediğini merak ediyorum. Fotoğraf koleksiyonlarında yüz+isim, konum gibi bilgiler gerçekten önemli ama genel amaçlı LLM’ler bunları iyi işlemiyor.description.mdsidecar dosyası sadeceDaha sonra Claude ile “lodge’un lüks odaları hakkında bir video yapmak istiyorum” gibi fikir üretirken sorgulanabiliyor ve Claude dosyaları tarayıp hangi videoların yararlı olacağını anlayabiliyor
Kolay bulunması için metin açıklamalarını toplayan, klasör kökü seviyesinde bir dosya da var. Blogda örnek görsel ekledim - https://blog.simbastack.com/_media/gvcycx2n.png
Yüzler insightface’ten geliyor. Açık kaynak
buffalo_lpaketindeki RetinaFace ile algılanıyor ve CPU’da yerel olarak çalışıyor. Her klibin örnek karelerinde yüzleri algılayıp embedding çıkarıyor, sonra~/.framedex/faces.dbiçine satır yazıyorDürüst olmak gerekirse bu kısım yerel DB’ye yazılıyor, bunun farkındayım ama ne kadar iyi çalıştığını henüz düzgün test edemedim. Yakında bunu iyice kontrol edeceğim
Daha genel olarak framedex bu yüzden yüz veya konum işlemeyi bilinçli şekilde LLM’ye bırakmıyor. Yüzler insightface / ArcFace embedding ile işleniyor; böylece klipler arasında karşılaştırma deterministik oluyor. Görsel model yalnızca yaklaşık kişi sayısını veriyor, kimin kim olduğunu belirlemeye çalışmıyor
Konum ise exiftool üzerinden EXIF GPS ve Nominatim/OpenStreetMap ters coğrafi kodlama ile işleniyor. Tahmin değil, sağlam metadata
LLM sadece iyi yaptığı işleri yapıyor: sahne açıklaması, atmosfer, çekim türü, anahtar kelimeler, arşivleme/inceleme/atma puanları gibi şeyler. Son puanlama kısmı biraz tartışmalı gerçi
2015 model bir ThinkPad’de benzer bir iş için Gemma çalıştırmayı denedim. Neyse ki belleği yükseltebildim; yoksa oldukça acı verici olurdu
Yalan söylemeyeceğim, llama.cpp çalıştırınca fan son hızda dönüyordu. Yine de çalıştı ve iş tamamlandı
Bazen bunun “kaynakları %100 kullanıyor” için bir benzetme olarak kullanıldığını sanıyorum; burada da muhtemelen öyle, ama başka bağlamlarda gerçekten şikayet olarak söylendiği de kesin
“Üretken yapay zeka videolarının gerçek seyahat markalarında yeri yok” ifadesine Airbnb hostlarının büyük kısmı katılmaz gibi geliyor
“TripAdvisor’da çarmıha gerilmek” ifadesi de öyle; sahte ilan koyan Airbnb hostlarının nasıl hayatta kaldığını gerçekten bilmiyorum
Öte yandan gerçek video zaman alıyor ve tüm süreci yavaşlatıyor
Bence B2C AI uygulamaları, kişiselleştirilmiş bağlam üretmenin zor olması nedeniyle yapısal olarak sınırlı
Yetenekli yerel modellerin büyük ölçekte sıfırdan bağlam toplama, araştırma, etiketleme gibi işleri yapabilmesi burada büyük bir sıçrama yaratabilir
İçine bir grup ekran görüntüsü atıyorsun; içeriğe göre akıllıca adlandırmaya çalışıyor. Video, PDF vb. için de aynı
Ama dediğin gibi Apple’ın bunu bir özellik olarak eklemesi çok olası göründüğü için ücret almaya çalışmadım bile
https://finalfinalreallyfinaluntitleddocumentv3.com/
Ama ajanlar yeterince akıllı hale geldiğinde teknik olmayan arkadaşlarımın bile sadece “Bu klasördeki videoları anlayabileceğim şekilde düzenle” demesinin yeterli olması bence an meselesi