- वीडियो आर्काइव में असली bottleneck एडिटिंग टूल नहीं बल्कि खोज न कर पाना था, और फोकस बिना लेबल वाले क्लिप्स को ऐसे इंडेक्स में बदलने पर था जिन्हें English में query किया जा सके
- local-first डिज़ाइन के तहत हर क्लिप के बगल में
.description.md sidecar file बनाई गई, और rating, lighting, location, transcript, keywords, prose description को एक ही vision call में निकाला गया
- pipeline ने
ffprobe, exiftool, Nominatim, ffmpeg, WhisperX, insightface, vision model को जोड़कर metadata, GPS, frames, transcript, face embeddings तैयार किए
- 2021 का 16-inch MacBook Pro M1 Max 64GB, LM Studio में Gemma 4 31B Q4 चला रहा था, और bulk processing के दौरान swap अधिकतम 50.89GB तक गया
- structured schema और enum constraints ने hallucination घटाई, और bulk indexing को local 31B पर चलाकर केवल मुश्किल 10~20% क्लिप्स को cloud model से दोबारा evaluate करने वाला सेटअप संभव था
समस्या की शुरुआत: एडिटिंग नहीं, सर्च
- Maasai Mara में लगभग आधा साल रहने के दौरान iPhone, DJI Pocket, drone, Nikon Z8, Ray-Ban Meta से शूट किए गए वीडियो लगातार जमा होते गए, लेकिन ज़्यादातर दोबारा खोले बिना पड़े रहे
- Mara Hilltop के social channels 3 महीने तक बंद जैसे रहे, वजह content की कमी नहीं बल्कि editing time की कमी थी
- Claude Code और Opus 4.5/4.6 की वजह से development work में लंबे agent runs और parallel work संभव हुए, और KaribuKit की पहली paid lodging launch के साथ मिलकर वीडियो एडिटिंग का समय और कम हो गया
- शुरुआत में सोचा गया समाधान Eddie AI, Higgsfield MCP, Submagic, Buffer को मिलाकर बनाया गया प्रति माह $140 SaaS stack था, लेकिन यह असली bottleneck से मेल नहीं खाता था
- generative AI वीडियो किसी वास्तविक travel brand के लिए उपयुक्त नहीं थे, और जब मेहमान वास्तविक जगह की उम्मीद करते हों, तब गलत AI scenes भरोसा बिगाड़ सकते थे
- यथार्थवादी posting frequency हफ्ते में 3~5 नहीं बल्कि 2~3 पोस्ट के करीब थी, इसलिए शुरुआती योजना दूसरे हफ्ते से ही विफल होने की संभावना रखती थी
- पहले से मौजूद DaVinci Resolve Studio और Resolve 21 की IntelliSearch, Smart Bins, Voice to Subtitle जैसी सुविधाएँ Eddie के लगभग 70% फ़ीचर्स कवर कर रही थीं
- बचा हुआ सेटअप यह था कि Claude Code, open source DaVinci Resolve MCP के जरिए Resolve को नियंत्रित करे, और केवल informational clips के लिए ElevenLabs voiceover संभाले, जिससे लागत घटकर प्रति माह $22 रह गई
असली bottleneck: AI editor से पहले चाहिए index
- बाज़ार के AI video editors यह मानकर चलते हैं कि वीडियो पहले से labeled हैं, लेकिन वास्तविक archive
IMG_*.mov, DJI_*.mp4, Mara june 2024 backup final FINAL जैसे नामों में बिखरा हुआ था
- Eddie transcript search तो कर सकता था, लेकिन बिना label वाले archive में “golden-hour hillside elephant” जैसे scenes नहीं ढूंढ सकता था
- filename, parent folder, GPS coordinates, transcript text से “frame के अंदर giraffe वाला sunrise wide shot” जैसी visual content नहीं जानी जा सकती
- असली leverage editor के ऊपर नहीं बल्कि उससे पहले वाले layer में था, और पहले archive को English में query किए जा सकने वाले index में बदलना ज़रूरी था
local-first indexer का डिज़ाइन
- समग्र संरचना SimbaStack में client work के लिए बनाए जा रहे AI-native builds जैसी थी, लेकिन यहाँ वही व्यक्ति client भी था और engineer भी, इसलिए निर्णय तेज़ी से हो सके
-
चार constraints
- local-first होना ज़रूरी था
- Mara Hilltop archive physical SSDs पर था और personal footage laptop पर, इसलिए हज़ारों multi-GB clips को cloud पर upload करना लागत और privacy दोनों के लिहाज़ से सही नहीं था
- central DB की जगह sidecar files चाहिए थीं
- हर clip के बगल में
.description.md रखी गई ताकि plain text में grep किया जा सके
- भले बाद में indexer टूट जाए, files बनी रहें, और drives के बीच move करने पर data साथ जाए
- एक vision call में ज़रूरी सारी जानकारी निकलनी चाहिए थी
- extracted frames पर vision pass महँगा काम है, इसलिए बाद में काम आने वाली जानकारी भी पहली call में मिल जाए, इसी हिसाब से schema शुरू से ही चौड़ा रखा गया
- इसमें rating, technical quality, lighting, time of day, color palette, audio quality, people count, keywords, faces, location, transcript, prose description जैसी चीज़ें शामिल थीं
- तीन vision backends में से चुनने की सुविधा होनी चाहिए थी
- default था Claude Max subscription का CLI, जिसमें marginal cost नहीं थी
- speed चाहिए हो तो Anthropic API का इस्तेमाल किया जाता था
- bulk processing के लिए LM Studio की ओर जाने वाला local backend इस्तेमाल हुआ, और यही local backend मुख्य था
हर clip के लिए processing pipeline
ffprobe से metadata पढ़ा गया
exiftool से GPS latitude, longitude, altitude पढ़े गए, और यह iPhone, DJI Pocket, drone footage पर एक समान काम करता था
- Nominatim से reverse geocoding किया गया; यह free था, rate-limited था, और API key की ज़रूरत नहीं थी
ffmpeg से 1920px size के 5 frames समान अंतराल पर निकाले गए
- WhisperX से word-level alignment और pyannote speaker diarization सहित transcript बनाया गया, और यह Hindi, English, Swahili सहित 97 भाषाओं को support करता था
insightface से faces detect किए गए, और बाद में पूरे archive में व्यक्ति-आधारित search के लिए 512-dimensional ArcFace embeddings को central SQLite face DB में रखा गया
- vision model ने frames, transcript के हिस्से, folder context को पढ़कर YAML frontmatter और prose description लौटाई
- अंतिम परिणाम clip के बगल में
.description.md sidecar के रूप में लिखा गया
- Mara Hilltop का वास्तविक clip
IMG_1103.MOV केवल filename से संदर्भ नहीं बताता था, लेकिन Gemma द्वारा बनाए गए sidecar में safari tent setup, indoor से savanna तक कैमरा pan, shot type, और marketing reel या travel vlog B-roll जैसे उपयोग शामिल थे
- folder स्तर पर हर clip के sidecar के अलावा ऊपर
_INDEX.json और _INDEX.md भी बनाए गए, जिन्हें तेज़ grep और LLM context देने के लिए उपयोग किया गया
- पूरा implementation लगभग 1,400 lines Python की Claude Code skill था; ज़्यादातर code Claude Code ने लिखा, और इंसानी भूमिका architecture, prompts, schema design, bug triage तक सीमित रही
पुराने MacBook पर चलाया गया local 31B model
- 2021 में खरीदा गया 16-inch MacBook Pro M1 Max 64GB RAM मूल रूप से LLM के लिए नहीं, बल्कि Chrome tabs, DaVinci Resolve, Slack, Discord, Drive को साथ चलाने के लिए चुना गया था
- 5 साल बाद वही laptop LM Studio में Gemma 4 31B Q4 चलाकर 1 साल के video archive को process कर रहा था
- LM Studio में 28.40GB model memory में loaded था, और REST API
127.0.0.1:1234 पर चल रही थी
- bulk processing के दौरान केवल 64GB RAM पर्याप्त नहीं रही, और Activity Monitor के अनुसार swap usage अधिकतम 50.89GB तक पहुँच गई
- यह स्थिति रोज़मर्रा के कामकाजी दिन के लिए टिकाऊ नहीं थी, लेकिन weekend भर ज़ोर से चलाने के स्तर पर स्वीकार्य मानी गई
- laptop गरम हो गया, fans तेज़ चले, लेकिन दूसरे काम चलते रहने के बीच यह sidecar files बनाता रहा
- M1 Max 16-inch ने दिखाया कि 5 साल पुराने hardware पर भी 31B parameter model उपयोगी speed पर चल सकता है, और अगर local LLM और efficient हो जाएँ तो इसे आगे 3~5 साल और इस्तेमाल किया जा सकता है
चार bugs और उनसे मिले सबक
-
WhisperX 3.8 का speaker diarization API बदलाव
- WhisperX 3.8 में
whisperx.DiarizationPipeline, whisperx.diarize submodule में चला गया
- constructor argument
use_auth_token, pyannote 3.x के अनुसार token में बदल गया
- इसका समाधान signature introspection था
- script पहले
token= आज़माती थी, और अगर constructor TypeError दे तो use_auth_token= पर fallback करती थी
- तेज़ी से बदलती AI libraries को call करते समय defensive constructor handling सस्ता insurance साबित होता है
-
Claude CLI permission error को success response की तरह लौटाता है
- CLI backend के पहले test में 4 sidecars सभी एक ही text के साथ लौटे: “I need permission to read the image frames...”
- exit code 0 था और output खाली नहीं था, इसलिए script का success check pass हो गया
- non-interactive mode में
--permission-mode bypassPermissions न होने पर Claude CLI prompt के बजाय permission-denied text को response body के रूप में लौटाता है
- समाधान था वह flag जोड़ना, और “I need permission” वाली छोटी responses को description नहीं बल्कि error मानने वाली defensive check लगाना
- AI tools को scripts में इस्तेमाल करते समय non-interactive permission flow में silent failures छिपे हो सकते हैं
-
Gemma ने people_count: "many" लौटाया
- vision prompt में
integer or the string "many" if >10 कहा गया था, इसलिए Gemma ने असल में निर्देश सही माना
- bug model में नहीं बल्कि schema design में था
- बदलाव के बाद 0~99 integer का अनुमान लगाने को कहा गया, और पुराने
"many" responses को parser में जबरन convert किया गया
- schema fields को
int या कोई खास string जैसे union में नहीं बनाना चाहिए; हमेशा integer या हमेशा string में तय रखने से downstream consumers सरल रहते हैं
-
shaky motorcycle clip गलती से discard हो गया
- शुरुआती cull prompt photo portfolio मानकों के ज़्यादा करीब था, इसलिए heavy motion blur, soft focus, shake को
cull मानता था
- Spain trip के दौरान शूट किया गया handheld night motorcycle clip भी discard हो गया, जबकि वही blur उस याद की feeling थी
- cull criteria को “perfect shot नहीं” से बदलकर “वास्तविक record नहीं” किया गया
- discard होने वाले clips को lens cap shots, pocket footage, 2-second test clips, पूरी तरह blown-out exposure जैसे मामलों तक सीमित किया गया
- photo archive को aggressively cull करना चाहिए, लेकिन video memories को उदारता से; एक ही schema में भी mode स्पष्ट होना चाहिए
structured schema और local model से निकले निष्कर्ष
-
enum constraints hallucination घटाते हैं
- Gemma 4 E4B ने रात में ली गई coworking-space photo को “brightly lit, abundant natural light, floor-to-ceiling windows” बताया, जबकि खिड़की के बाहर पूरी तरह अंधेरी रात थी
- 31B को structured schema देकर
golden_hour | bright_daylight | overcast | dim_interior | nighttime | mixed | unclear में से एक चुनने को कहा गया, तो thinking-off और thinking-on दोनों ने nighttime वापस चुना
- model खुली prose में झूठा विवरण बना सकता है, लेकिन enum में नया मान invent नहीं कर सकता; बस गलत विकल्प चुन सकता है
- निर्देशों की तुलना में schema ज़्यादा सुरक्षित साबित हुआ
-
local 31B और structured prompts cloud के gap को कम करते हैं
- Gemma 4 31B Q4 thinking-off ने structured schema के साथ कई test clips पर Sonnet 4.6 से अलग पहचानना मुश्किल output दिया
- cloud models का premium मुश्किल 10~20% clips पर मूल्यवान था
- हज़ारों clips को रातभर index करने जैसे bulk काम local पर चलाए जा सकते थे, और केवल local द्वारा
review चिह्नित clips को cloud में दोबारा evaluate करने वाली दो-स्तरीय संरचना scalable लगी
-
AI video editors बहुत ऊपर वाले layer में प्रतिस्पर्धा कर रहे हैं
- असली value editor में नहीं बल्कि searchable index में थी
- अगर “Mara के handheld indoor clips, golden hour, people present, and longer than 8 seconds” जैसी natural-language queries संभव हों, तो उसके ऊपर का editor layer सरल हो जाता है
- AI editor market एक ऐसे surface layer पर प्रतिस्पर्धा कर रहा है जिसके नीचे ज़रूरी index मौजूद ही नहीं है, यानी वह prerequisite layer को छोड़ रहा है
आगे के कदम और सीमाएँ
- अगला काम Claude Code को orchestrator की तरह इस्तेमाल कर, DaVinci Resolve MCP से cuts बनाना, और informational clips पर ElevenLabs voiceover जोड़ने वाला editor बनाना है
- voice cloning पर स्पष्ट सीमाएँ हैं
- इसका उपयोग केवल utility content के लिए होगा, जैसे directions, room descriptions, multilingual versions, और ऐसी factual जानकारी जो व्यक्ति खुद बोल सकता हो
- reviews या founder messages में इसका उपयोग नहीं होगा
- 2026 तक disclosure obligations से जुड़ी क़ानूनी ज़िम्मेदारियाँ वास्तविकता बन सकती हैं, और hospitality brand का भरोसा आसानी से खोया जा सकता है
- index होने पर 47GB DJI Pocket footage में sunrise wide shot खोजने के लिए manually scrub नहीं करना पड़ता
- अभी 5 साल पुराने laptop पर Mara Hilltop के 1 साल के वीडियो English में query किए जा सकते हैं, और इसकी कीमत थी एक weekend का समय और 50GB swap
- पुराने SSDs पर बचे बाकी साल अब अगला processing target हैं
- Mara Hilltop के social channels अभी भी वापस जीवित नहीं हुए हैं
- indexer केवल सही clips ढूंढने की समस्या हल करता है
- उन्हें finished reels में बदलने वाला editor बाकी आधा हिस्सा है; सफलता मिली तो follow-up लिखा जाएगा, और विफलता हुई तो उसके कारणों पर लिखा जाएगा
- सही समाधान किसी इंसान को hire करना भी हो सकता है
- Mara Hilltop के लिए उपयुक्त warm और observant sensibility वाला editor ढूँढना, एक और skill लिखने से भी कठिन हो सकता है
- अत्यधिक कटे-फटे MTV-style reels इच्छित दिशा नहीं हैं
- code github.com/Simbastack-hq/framedex पर public है, और PRs तथा issues आमंत्रित हैं
1 टिप्पणियां
Hacker News टिप्पणियाँ
लगता है Claude ने पोस्ट लिखते समय शेयर करने के लिए गलत URL चुन लिया। अगर होम फ़ोल्डर बाहर एक्सपोज़ नहीं है, तो
~/.claude/skills/video-index/तक पहुँचा नहीं जा सकता, इसलिए जानना चाहूँगा कि क्या आप Skill फ़ाइलें शेयर कर सकते हैंअपडेट: मैंने जल्दी में यह रिपॉज़िटरी बना दी - https://github.com/Simbastack-hq/framedex
लाइसेंस MIT है, और इसे जनरलाइज़ करने के बाद मैं अभी तक ठीक से टेस्ट नहीं कर पाया हूँ। जल्द ही इसे ढंग से देखूँगा और और अपडेट जोड़ूँगा
TODO की दो बड़ी चीज़ें हैं: 1) इस इंडेक्सिंग और Claude की मदद से DaVinci Resolve में वीडियो एडिटिंग को तेज़ करना, 2) अभी यह सिर्फ वीडियो प्रोसेस करता है, लेकिन इसे कैमरे में मौजूद हज़ारों स्टिल इमेज को भी समझने लायक बढ़ाना
समझ नहीं आता कि इतनी ज़्यादा swapping की ज़रूरत क्यों है। जितनी memory bandwidth चाहिए, उसे देखते हुए इससे SSD की लाइफ़ काफ़ी जल्दी कम हो सकती है
Gemma 4 31B का 4-bit quantized मॉडल 28.4GiB नहीं, लगभग 19GiB होना चाहिए [1]। मैं इमेज बार-बार नहीं डालता, इसलिए context में डालते समय कितनी अतिरिक्त memory चाहिए होगी, यह नहीं जानता, लेकिन 10GiB से ज़्यादा नहीं लगती
Activity Monitor देखने पर लगता है कि मॉडल लोड किए हुए Handy और Claude Code के virtual machine के ऊपर कई Electron ऐप भी चल रहे हैं, तो असली कारण शायद वही हों। जब लैपटॉप डिस्क को बुरी तरह रगड़ना शुरू करेगा, तो ऐसे ऐप फ्रीज़ हो जाएँगे, इसलिए वे ज़्यादा काम के नहीं होंगे
[1] https://huggingface.co/mlx-community/gemma-4-31b-it-4bit
फिर भी थोड़ा अटक रहा था, लेकिन यह प्रभावशाली था कि Brave ब्राउज़र में बहुत सारे टैब खुले होने पर भी मैं दूसरे काम करता रह सका
क्या आपको पता था कि यह पहले से मौजूद है, काफ़ी अच्छा है, और 50GB swap भी नहीं खाता?
https://github.com/iliashad/edit-mind
बढ़िया। काश मेरे पास इतना RAM होता कि लोकल मॉडल चला पाता। मैंने पिछले कुछ हफ़्तों में बहुत मिलता-जुलता कुछ बनाया है; मैंने इसे Whisper और ffmpeg इस्तेमाल करने वाले लोकल Electron ऐप के रूप में बनाया, और वीडियो से बातचीत करने के लिए semantic search और embeddings जोड़े
विज़ुअल analysis, tagging और वीडियो चैट के लिए Claude से बात करता हूँ। जानना चाहूँगा कि यह प्रोजेक्ट एक ही इमेज भेजता है या नहीं। मैं कस्टम scene detection algorithm से हर वीडियो में कई अलग-अलग इमेज ढूँढता हूँ और उन्हें subtitles के साथ एक ही request में Claude को भेजता हूँ। यह निश्चित रूप से सबसे महँगा हिस्सा है। analysis के लिए Sonnet 4.6 और tagging के लिए Haiku इस्तेमाल करूँ तो 1 घंटे के वीडियो पर लगभग 1 डॉलर लगता है, और लोकल पर यह शायद धीमा होगा
लेकिन frames चुनने का तरीका इसकी कमज़ोरी है। scene detection निश्चित रूप से मदद करेगा, और यह रोडमैप में पहली प्राथमिकता है। जानना चाहूँगा कि आप scene detection में frames कैसे चुनते हैं, क्या वह साझा कर सकते हैं
मैंने vector search नहीं जोड़ा, और इसे ज़्यादा portable सामान्य Markdown फ़ाइलों के साथ simple रखा। SSD को कहीं और ले जाएँ तो knowledge फ़ाइलों के साथ चली जाती है, sync करने के लिए कोई इंडेक्स नहीं होता, और यह plain text है जो tools से ज़्यादा टिकाऊ है। फिर भी, आपकी बताई दूसरी दिशा भी देखने लायक है
कुछ और अच्छे विकल्प भी हैं। Gemini 3.1 Flash Lite ऐसे काम के लिए बहुत अच्छा है। लेकिन Gemini 3.5 Flash नहीं। उसकी pricing अच्छी नहीं है
https://openrouter.ai/google/gemma-4-31b-it
मेरे दो सवाल हैं
description.mdके उदाहरण मेंfaces -> cluster_idजैसी एंट्रियाँ हैं। जानना चाहूँगा कि क्या यह DaVinci Resolve के face index से आया है। फ़ोटो कलेक्शन में face+name, location जैसी जानकारी बहुत महत्वपूर्ण होती है, लेकिन सामान्य LLM ऐसी चीज़ों को अच्छी तरह नहीं संभालते.description.mdsidecar फ़ाइल है, जो हर क्लिप के बगल में रखी जाती हैबाद में आप Claude के साथ “मैं लॉज के लक्ज़री कमरों का वीडियो बनाना चाहता हूँ” जैसी brainstorming कर सकते हैं, और Claude फ़ाइलों को देखकर समझ सकता है कि कौन-से वीडियो काम आएँगे
आसानी से खोजने के लिए टेक्स्ट विवरणों को इकट्ठा करने वाली फ़ोल्डर रूट-लेवल की एक फ़ाइल भी है। मैंने ब्लॉग में उदाहरण इमेज जोड़ी है - https://blog.simbastack.com/_media/gvcycx2n.png
चेहरे insightface से आते हैं। ओपन सोर्स
buffalo_lपैक के RetinaFace से detect करता है, और CPU पर लोकल चलता है। हर क्लिप के sample frames से चेहरे detect और embed करके~/.framedex/faces.dbमें rows लिखता हैसच कहूँ तो यह हिस्सा लोकल DB में जमा हो रहा है, इतना तो पता है, लेकिन यह कितना अच्छा काम करता है, इसे अभी ठीक से टेस्ट नहीं किया है। जल्द ही ठीक से जाँचने वाला हूँ
और व्यापक रूप से देखें तो framedex जानबूझकर चेहरे या location की handling LLM पर नहीं छोड़ता। चेहरे insightface / ArcFace embeddings से हैं, इसलिए क्लिप्स के बीच तुलना निर्णायक रूप से की जा सकती है। विज़ुअल मॉडल सिर्फ लोगों की अनुमानित संख्या देता है, यह पहचानने की कोशिश नहीं करता कि वे कौन हैं
location को exiftool के ज़रिए EXIF GPS और Nominatim/OpenStreetMap reverse geocoding से संभाला जाता है। यह अनुमान नहीं, बल्कि ठोस metadata है
LLM सिर्फ वही करता है जिसमें वह अच्छा है: scene description, mood, shot type, keywords, और archive/review/discard ratings जैसी चीज़ें। आख़िरी rating वाला हिस्सा थोड़ा विवादास्पद हो सकता है
मैंने 2015 के ThinkPad पर इसी तरह का काम करने के लिए Gemma चलाया था। अच्छी बात यह रही कि memory upgrade कर सका, नहीं तो काफ़ी तकलीफ़ होती
झूठ नहीं बोलूँगा, llama.cpp चलाते समय fan पूरी speed पर था। फिर भी यह चला और काम पूरा हो गया
कभी-कभी इसे “resources 100% उपयोग हो रहे हैं” के रूपक की तरह इस्तेमाल किया जाता है, और शायद यहाँ भी वही मतलब है, लेकिन दूसरे संदर्भों में लोग इसे सचमुच शिकायत के तौर पर भी कहते हैं
“जनरेटिव AI वीडियो का असली travel brands में कोई स्थान नहीं है” — मुझे नहीं लगता कि ज़्यादातर Airbnb hosts इससे सहमत होंगे
“TripAdvisor पर सूली पर चढ़ा दिया जाएगा” वाली बात पर भी, मैं सच में नहीं समझता कि नकली लिस्टिंग डालने वाले Airbnb hosts कैसे बचे रहते हैं
दूसरी तरफ़, असली वीडियो समय लेते हैं और पूरी प्रक्रिया को धीमा कर देते हैं
मुझे लगता है कि B2C AI applications की संरचनात्मक सीमा यह है कि वे personalized context बनाना कठिन पाते हैं
अगर सक्षम लोकल मॉडल बड़े पैमाने पर शुरू से context gathering, research, tagging वगैरह कर सकें, तो यह बड़ा breakthrough हो सकता है
आप कई screenshots डालते हैं और यह उनके अंदर की सामग्री के आधार पर समझदारी से नाम देने की कोशिश करता है। वीडियो, PDF वगैरह पर भी यही लागू होता है
लेकिन जैसा आपने कहा, मुझे लगा Apple इसे बस एक फीचर के रूप में जोड़ देगा, इसलिए मैंने इससे पैसे लेने की कोशिश भी नहीं की
https://finalfinalreallyfinaluntitleddocumentv3.com/
लेकिन मुझे लगता है कि बस समय की बात है, जब agents इतने smart हो जाएँगे कि गैर-तकनीकी दोस्त भी सिर्फ इतना कहेंगे, “इस फ़ोल्डर के वीडियो इस तरह व्यवस्थित कर दो कि मैं इन्हें समझ सकूँ,” और काम हो जाएगा