在2021款MacBook上使用Gemma4-31B(50GB交换空间)本地索引一年的视频

Hacker News Top 工具

摘要

一位开发者描述了在2021款MacBook上本地运行Gemma 4 31B模型,对一年未标记的野生动物视频进行语义索引,从而实现轻松搜索,并可通过DaVinci Resolve的IntelliSearch进行后期编辑。

暂无内容
查看原文
查看缓存全文

缓存时间: 2026/05/21 15:14

# 在五年前的M1 Max上本地索引一年的视频,使用Gemma 4 31B 来源:https://blog.simbastack.com/indexed-a-year-of-video-locally/ ## 当我睡觉时,我那台五年前的MacBook在本地运行Gemma,索引了一年的视频 2026年5月21日 我每年大约有一半时间在肯尼亚马赛马拉,每次待三个月。小屋前有动物、摩托车、马赛村落的朋友们、还有那些觉得无人机是见过最搞笑东西的孩子们。这是半年的生活。另一半则是每天对着终端机工作十六小时,硅谷黑客大脑按照非洲时间运转。两者都是真实的,都在消耗注意力。 前半段生活里,iPhone、DJI Pocket、无人机、尼康Z8,以及最近的Ray-Ban Metas源源不断地产生素材。总有什么东西在录制。我认识的每个摄影师或摄像师都面临同样的问题:档案库的增长速度远超他们能剪辑的速度。后半段生活就是为什么我的素材从未被碰过。 *两盘安检托盘,装满了尼康单反、运动相机、耳机、运动手表、SSD、电池和一团乱麻的数据线——摄于内罗毕到西班牙的某个机场。两盘东西:相机、耳机、无人机零件、电池、SSD,还有没人需要那么多根的数据线。其中大部分设备都记录东西。但记录下来的东西几乎都不会很快再被碰触。* 三个月前,这间度假小屋的社交媒体频道一片沉寂。不是因为没有内容;小屋在多块SSD上存了多年的原始素材。瓶颈在于*剪辑时间*,而我的时间消失了。二月份的时候,搭载Opus 4.5(然后是4.6)的Claude Code达到了可以丢着agent运行数小时然后回来合并PR的程度。KaribuKit也在同一时间段上线了第一个付费物业。我开始睡不好觉,同时在后台运行三四个agent,本来该剪视频的几个月变成了我交付软件的时间。 于是某个周末我坐下来想解决这个问题。我尝试的第一条路走错了。 ## 错误的层级 最初的方案(经过大约一小时研究后对自己说的)是一个SaaS堆栈:Eddie AI用于迭代剪辑,Higgsfield MCP用于生成B-roll,Submagic用于字幕,Buffer用于跨平台发布。每月大约140美元,纸面上看很漂亮。 但在运行任何一个之前,两个问题就暴露了。 首先,生成式人工智能视频在真正的旅行品牌中没有立足之地。客人每晚支付300美元以上是为了看*真实的地方*,被误标为AI生成的镜头等于在TripAdvisor上被钉上十字架。Higgsfield出局。 其次,每周3-5篇帖子对我来说太激进了,实际最低限度更像是2-3篇。这个方案过于乐观,两周内就会让我失败。 然后我记起我已经拥有DaVinci Resolve Studio,而Resolve 21内置了IntelliSearch(语义素材搜索)、Smart Bins(自动整理文件夹)和Voice to Subtitle(时间线上准确率90-95%)。这大约占了Eddie所卖功能的70%,所以Eddie也出局了。 剩下的方案是:Claude Code通过开源的DaVinci Resolve MCP驱动Resolve,ElevenLabs在信息类片段中负责配音(它在该场景下名副其实),而成本从每月140美元降到了22美元。 但更深层次的问题只有在我真正尝试使用这些工具时才显现。市面上每个AI视频编辑器都假定你的素材已经被标记过。我的素材是`IMG_*.mov`和`DJI_*.mp4`,放在诸如`Mara june 2024 backup final FINAL`之类命名的文件夹里。Eddie可以根据转录文本搜索,但这些工具没有一个能针对未标记的档案库找到“金色时刻山坡上的大象”。 AI编辑器正在解决错误的问题。更准确地说,它解决的是*第二个*问题;第一个问题在于索引。 ## 问题 我大声问出来:*agent怎么知道每个片段里有什么?* 对于未标记的档案库,没有答案。可以给它转录文本、GPS坐标、文件名、父文件夹名,但没有一样能告诉你“日出时广角镜头里有长颈鹿”,除非有东西真的看了像素。 杠杆在上游。先建索引,让档案库能用英语查询,那么上层的编辑器就变成了一个薄层,做它本该做的事。 所以我建了索引,本地完成。 ## 构建过程 这是我在SimbaStack为客户做的那种AI原生构建,只不过这次我是客户也是工程师,这让决策树短了很多。 四个约束确定了形态: - **本地优先。**Mara Hilltop的档案库在物理SSD上,大部分个人资料在我的笔记本上。上传云端不现实,既因为成本(数千个文件,每个片段好几GB),也因为不想把整个人生的视觉记录交给第三方。 - **侧边文件,而非中央数据库。**每个片段旁边放一个`.description.md`,纯文本,可用grep搜索。如果我的索引器明天坏掉,这些文件仍然存在;当文件在不同驱动器间移动时,它们也会随数据一起移动。 - **一次视觉调用捕获所有信息。**昂贵的操作是对提取帧的视觉扫描,因此任何将来可能想了解某个片段的信息,都必须从这一次调用中获得。模式从第一天起就是穷尽的:评分、技术质量、光照、时间段、色彩调色板、音频质量、人物数量、关键词、人脸、位置、转录文本、散文描述。全部在一次调用中完成。 - **三个视觉后端:**通过我的Max订阅CLI使用Claude(默认,零边际成本)、需要速度时用Anthropic API、以及一个指向LM Studio的本地后端用于批量处理。本地那个才是关键。 每个片段的流水线: 1. `ffprobe`获取元数据。 2. `exiftool`获取GPS经纬度和海拔。支持iPhone、DJI Pocket、无人机素材,全部适用。 3. 通过Nominatim反向地理编码。免费、有速率限制、无需API密钥。 4. `ffmpeg`提取五张均匀间隔的帧,1920px。 5. WhisperX进行转录,带有词级对齐和pyannote说话人分割。支持印地语、英语、斯瓦希里语等97种语言。 6. `insightface`检测人脸并将512维ArcFace嵌入存储到中央SQLite人脸数据库中,以便日后跨档案库查询人物。 7. 视觉模型读取帧、转录片段和文件夹上下文,返回YAML前置元数据加一段散文描述。 8. 侧边文件写入磁盘。 下面是一个来自Mara Hilltop档案的真实片段的示例。 IMG_1103.MOV的一帧:Ellie在Mara Hilltop豪华帐篷的甲板上,正午时分,身后是稀树草原* *来自`IMG_1103.MOV`的一帧。Ellie在度假小屋的一间豪华帐篷的甲板上,正午。这些上下文信息文件名中完全没有。* Gemma为IMG_1103.MOV编写的侧边文件,显示YAML模式和Description块* *Gemma为同一片段编写的侧边文件。顶部是YAML(光照枚举、时间段枚举、色彩调色板、人脸嵌入、GPS),下面是散文`## Description`。它捕捉到了游猎帐篷环境、相机从室内到稀树草原的摇移、镜头类型,并建议了两个用途(营销短片和旅行vlog的B-roll)。文件名是`IMG_1103.MOV`;侧边文件则包含了我以后找到它所需的其他所有信息。* 整个东西是一个Claude Code技能,位于`~/.claude/skills/video-index/`,约1400行Python。几乎全部由Claude Code编写。我的工作是架构、提示词、模式设计,以及出问题时进行故障排查。 ## 荒谬之处 这才是真正让我惊讶的部分。 我2021年买了一台16英寸MacBook Pro M1 Max,64GB内存,原因与LLM毫无关系。我之前那台机器的32GB限制困扰我有一阵子了。混乱的黑客大脑同时跑着数百个Chrome标签页外加DaVinci Resolve、Slack、Discord和Drive,这超出了预统一内存硬件的处理能力,导致不断分页。我在新M1 Max上把内存加满,是因为旧机器一直拖慢我的工作流程,而且我有钱解决这个问题。 五年后,同一台笔记本电脑在LM Studio上运行着Gemma 4 31B Q4,索引一整年视频素材。 *LM Studio开发者视图,已加载gemma-4-31b,占用28.40 GB,REST API位于127.0.0.1:1234,服务器日志显示图像编码* *LM Studio已加载Gemma 4 31B Q4。28.40 GB模型在内存中,REST API在`127.0.0.1:1234`。底部面板是实际批量运行时的服务器日志,正在逐片段编码帧。* 批量运行将笔记本电脑推到了64GB内存单独无法承受的程度。活动监视器报告峰值使用了50.89 GB的交换空间。 *macOS活动监视器显示64GB物理内存,索引运行期间使用了50.89GB交换空间,内存压力处于黄色区域* *64 GB物理内存,使用了50.89 GB的交换空间。内存压力处于黄色区域,这种状态绝对不应该在普通周二运行。Apple的交换是为这种情况设计的,风扇声音很大。* 我谷歌了一下这是否会损坏SSD,据说明天两天没事。不要让它成为常态运行状态,但一个周末的强力使用完全在容忍范围内。我的笔记本电脑变得很热,风扇转了起来,而我在做其他事情的同时它仍在持续生成侧边文件。 M1 Max 16英寸,说实话,是传奇级别的。Mac社区的人这么说是有充分理由的:五年后,它仍能以可用速度运行31B参数模型,并且拥有在这种老旧硬件上不应存在的余量。我预计这个设备还能再用三到五年,因为本地LLM只会越来越高效,而硬件是地板,不是天花板。 我买它是因为Chrome。现在它运行着一个我购买时还不存在的模型。 ## 四个Bug,四个教训 构建过程大部分是Claude Code执笔。有趣的工作是它差点搞砸的四次。 **WhisperX 3.8在我不用的这段时间里破坏了它的分割API。**出现了两个破坏性变化:`whisperx.DiarizationPipeline`移到了`whisperx.diarize`子模块,构造函数的关键字参数`use_auth_token`改名为`token`(继承自pyannote 3.x)。修复方法是签名自省:脚本先尝试`token=`,如果构造函数抛出TypeError则回退到`use_auth_token=`,这样下次API变动时也能自动兼容。教训:当调用快速迭代的AI库时,防御性构造函数调用是廉价的保险。 **Claude CLI将权限错误以成功响应的形式返回。**在CLI后端的首次测试中,所有四个侧边文件都返回了相同文本,内容为*“我需要读取图像帧的权限...”*,而脚本的成功检查通过了,因为退出码为0且输出不为空。原因是,在非交互模式下,如果没有`--permission-mode bypassPermissions`,CLI会返回权限拒绝文本作为响应正文,而不是提示用户,这意味着失败模式看起来完全像成功,除非你进行字符串匹配。修复方法是添加该标志,并加上一个防御性检查,将任何包含“我需要权限”的短响应标记为错误而非描述。教训:编写脚本调用AI工具时,非交互权限流程是静默失败隐藏的地方。 **Gemma返回了`people_count: "many"`而不是整数。**我的视觉提示词明确写了`整数,如果>10则为字符串"many"`。Gemma正确遵循了指令;bug出在模式设计上。修复方法是更严格的提示词(整数0-99,明确要求估算),并在解析器中加入对旧的"many"响应的强制转换。不要在模式字段中使用联合类型。要么永远整数,要么永远字符串,绝不要“整数或这个特定字符串”,因为每个下游消费者都要为这个选择付出代价。 **那个不应该被删除的摩托车片段。**我最初的删除提示词是摄影师作品集风格的:严重运动模糊、软对焦、抖动稳定性都评级为`cull`。技术上没错。然后我在一个西班牙之旅的手持夜间摩托车片段上测试,结果它被删除了。我发现了:那是个有趣的记忆,模糊*就是*那种感觉。我将删除标准重新定义为“不是真正的录制”(镜头盖、口袋素材、两秒测试片段、完全过曝),而不是“不完美的捕捉”。教训:照片档案库可以激进删除,视频回忆应宽容删除。同一模式,不同标准;明确你处于哪种模式。 ## 实际收获 三件事,比一周前我更加确信。 **枚举约束比指令更能防止幻觉。**我在一张夜晚拍的共享办公空间照片上测试了Gemma 4 E4B,它描述场景为“明亮照明、充足自然光、落地窗”——但窗外一片漆黑,因为是夜晚。然后我用结构化模式提示词测试了31B,强制模型从`golden_hour | bright_daylight | overcast | dim_interior | nighttime | mixed | unclear`中选择,关闭思考和开启思考都能正确识别出夜间。模型可能会在开放式散文中胡说,但它只能选错枚举值,而无法发明新值。使用模式,而非指令。 **本地31B加上结构化提示词能缩小大部分与云端的差距。**在我的大部分测试片段上,关闭思考的Gemma 4 31B Q4配合结构化模式产生的输出,很难与Sonnet 4.6区分。云端溢价只在最难的那10-20%上才体现价值。大规模批量索引(一夜数千个片段)应该本地运行;云端是对本地标记为`review`的片段进行二次评审的环节。这种两层设置才是可扩展的。 **AI视频编辑器的定位高了一层。**有价值的层是索引。一旦你的档案库可以用纯英语查询(“给我看Mara的手持室内片段、金色时刻、有人物、长度超过8秒”),上层的编辑器就很简单了。大多数AI编辑器领域都在竞争一个不存在的索引之上的表面层,而索引正是它们集体跳过的前提条件。 ## 下一步 回看过去,这件事之所以这么久没解决,实际上并非时间问题。我把所有现存的AI超能力都指向了工作侧的生活:Claude Code隔夜重构代码库、Codex编写我大部分PR、我刚刚花了三个月用来交付KaribuKit的agent堆栈。而在剪辑侧,我一样都没用。这种“没去做”已经变成了一种持续的、低度的挫败感,一整年都盘踞在脑海深处,是那种每次打开SSD的文件夹又关掉、什么也没做时你就会注意到的东西。某个周六灵光一闪的不是我需要找时间。而是剪辑问题是一个工具问题,而工具恰恰是那种我现在碰巧有能力解决的问题。 这个周末我在构建编辑器:Claude Code作为编排器,DaVinci Resolve MCP负责剪辑,ElevenLabs负责信息类片段的配音。工具有一个硬性规则:语音克隆只用于实用内容。方向指引、房间描述、多语言版本、事实性内容(那些我本人也会当面说的内容)。绝不用于推荐或创始人留言。2026年的披露法律是真实的,而酒店品牌的信任太容易失去。 索引让这一切变得可控。没有它,我可能还在翻看47GB的DJI Pocket素材,寻找那个日出广角镜头。 现在:一年份的Mara Hilltop素材在一台五年前的笔记本电脑上,可以用英语查询。成本是一个周末的时间和50GB交换空间。剩余其他SSD上的历年素材是下一个目标。 对所有这一切的一个公平检验:Mara Hilltop的社交媒体频道至今仍是死的。索引器

相似文章

2台配备 512GB 内存的 M3 Ultra Mac Studio

Reddit r/LocalLLaMA

硬件投入约 2.5 万美元。告诉我你们希望我在这两台设备上部署什么模型,我会协助测试。目前我已通过 Exo 后端跑通了 DeepSeek v3.2 Q8 版本;当前每台设备均在运行 GLM 5.1 Q4(正在排查为何 Exo 无法加载 Q8 版本)。静候社区完成 Kimi 2.6 针对 MLX/mmap 的优化适配。