🔍给 Bob 写了个本地 OCR 插件

问题

升级 macOS 27 之后,Bob 的离线 OCR 经常要等几十秒才出结果,有时候直接报错:
有时候又是秒出,很不稳定。

原因

Bob 的离线 OCR 用的是系统的 Vision,Vision 第一次用某个模型的时候要在 ANE 上编译,一个模型 20~50 秒,编译好缓存在 ~/Library/Caches/<程序名>/com.apple.e5rt.e5bundlecache/。
问题是这个缓存会被系统删掉。磁盘可用空间低于 15G 左右的时候,系统的 deleted 进程会自动清缓存,这个目录也会被清空,日志里能看到:
缓存被删了之后,已经加载过模型的进程会一直报上面那个 13 的错,新进程则要重新编译,所以就出现了有时候报错、有时候等很久。
我一开始以为是沙盒的问题(Bob 是 App Store 版),后来自己写的服务也报了同样的错,才查到是磁盘空间不够,当时只剩 11G。
Bob 1.21.1 加了一个子进程来识别,但是空闲 10 分钟就会退出,下次又要重新编译。在 Bob 里还翻到一个隐藏开关 AppleOCRChannelTidyDisabled,试了没用。
最简单的解决办法:磁盘留 20G 以上的空间。

插件

写了一个本地服务加 Bob 插件:
  • 服务用 Swift 写的,常驻后台,模型加载一次一直用
  • 每分钟检查一次缓存,被系统清掉了就自动重启,重新编译
  • 插件带了文字坐标,Bob 的图片翻译也能用
速度一般在 0.1~0.3 秒,4000x4000 的满屏文字 1 秒左右,服务占 90M 左右内存。图片只在本机传,不联网。

安装

  1. 装命令行工具,装过 Xcode 的可以跳过:xcode-select --install
  1. 装本地服务:
    1. 到 Releases 下载 .bobplugin,双击安装
    1. Bob 偏好设置 → 服务 → 文本识别,添加「本地 OCR」拖到第一位,点「验证」
    第一次安装要编译模型,大概 1~2 分钟,可以看日志,出现 预热完成 就可以用了:
    notion image

    效果

    notion image

    出现的问题

    第一次截图还是很慢

    Vision 的模型是按文字分的,中英日韩俄泰不用额外编译,阿拉伯文、印地文要各自单独编译一个,我这台机器上一共 5 个。一开始预热只跑了一张中文图,结果在 Bob 里截的第一张图又等了 28 秒。现在启动的时候会把这几种文字都跑一遍。

    升级系统之后

    缓存目录是按系统版本分的(比如 26A434),升级 macOS 之后服务会自己重新编译一遍,1~2 分钟,这段时间截图会慢。
    项目地址:https://github.com/kikohz/bob-plugin-local-ocr,有问题可以提 issue。
    Loading...