MacVision:在 macOS 上用 Apple Vision 为 DSH 做离线 OCR

前言

DeepSeek Harness(DSH)里的模型本质是纯文本:扫描件、截图、PDF 若直接丢进对话,要么走云端视觉 API(要 key、内容出本机),要么靠多模态能力(往往没有逐行坐标,长文档易漏行),要么再装一套本地 OCR(Python、brew 或大包体权重)。在 macOS 上,系统自带的 Vision 框架已经提供 VNRecognizeTextRequest,支持多语言、较快单页识别,并能给出行级像素坐标。下面介绍社区插件 MacVision(@zaclinley/dsh-macvision)如何把这条路径接进 DSH 工具层,让模型在本地拿到可读文本和可选坐标,而无需 API key 与联网。

这是什么

MacVision 由维护者 Zac-Linley 发布,npm 包名 @zaclinley/dsh-macvision,当前版本 0.1.1(MIT 许可证)。定位是:Apple Vision OCR for DeepSeek Harness——在本机读取扫描件、截图、拍照文档和 PDF,把文字(以及可选的逐行坐标)交给模型。

插件只在 macOS 上生效:package.json 中 os 为 darwin;在 Linux 或 Windows 上 apply 会说明原因后直接返回,不会注册半成品工具。Node 引擎要求为 ^22.19.0 || >=24.0.0。

核心功能

模型侧通过工具 ocr_macos(path) 调用 OCR。整体分层如下:

模型调用 ocr_macos(path)
        │
        ├─ lib/tool.js    参数校验 → 文件指纹缓存 → 结果整形 → 渲染成可引用文本
        ├─ lib/engine.js  找二进制(env → 缓存 → 包内)→ 没有就用 swiftc 现编 → spawn
        └─ swift/macocr.swift
              ├─ 图片:ImageIO 解码 → 短边放大到 1600 → Vision
              └─ PDF:有文字层用 PDFKit 直抽;无文字层则渲染并处理 /Rotate → Vision
                        └─ 可选四向 fast 探测后再 accurate 精读(横放扫描件)

设计上强调三点(均来自项目 README):

  1. 零运行时依赖:不依赖 @deepseek-ai/dsh-tools 的 peer 包,用普通对象注册工具,避免宿主升级时因安装方式导致插件不可用。
  2. 只取字,不做语义:Vision 输出「行 + 坐标 + 置信度」,理解交给模型。
  3. 结果直接进上下文:render 产出带统计头的文本,模型无需再解析 JSON 即可引用。

与同领域 npm 插件 dsh-mac-vision 相比,MacVision 侧重 PDF 逐页渲染、/Rotate 与可选页码、横放扫描件的四向探测;不提供屏幕/窗口捕获(该能力在 dsh-mac-vision)。需要抓屏时请选用后者。

安装与启用

推荐从 npm 全局安装并注册到 DSH:

npm i -g @zaclinley/dsh-macvision
dsh plugin add @zaclinley/dsh-macvision

不用 CLI 时,可编辑 ~/.dsh/profiles/<profile>/package.json,在 dependencies 中声明 @zaclinley/dsh-macvision,并在 dsh.profile.bundles 中加入该包名,于 profile 目录执行 pnpm install 后重启 DSH。挂载由包内 cordis.patch.yml 完成。

安装前应自行查看 GitHub 仓库 源码与 MIT 许可证;插件以当前 DSH 进程权限读取本地路径,只应对可信文件调用。

工具参数与典型用法

参数 类型 默认 说明
path string 必填 本地图片或 PDF;URL 会被拒绝
languages string en-US 逗号分隔;中文单据常用 zh-Hans,中英混排 zh-Hans,en-US
mode accurate / fast accurate fast 约快 3 倍,小字号易丢字
pages string 全部 PDF 页码,如 1-3,7
dpi number 200 PDF 渲染分辨率,小字可到 300
minConfidence number 0 丢弃低置信行
autoRotate boolean true 四向 fast 探测再精读
boxes boolean false 返回每行 [x,y,w,h]
maxChars number 20000 text 上限
maxLines number 1000 带坐标时的行数上限

返回字段包括 text、pages[].lines[]、stats(行数、均置信度、旋转纠正、耗时等)、以及可能的 truncated。

README 中的冒烟测试可在插件目录执行:

node test/smoke.mjs [图片] [PDF]

包内还提供 CLI 二进制 macvision-ocr(对应 bin/macocr)。重新编译 Swift 引擎需要 Xcode Command Line Tools:

npm run build:engine

适用场景与注意

适合:在 Mac 上处理票据、发票、扫描 PDF,希望文本与坐标留在本机、且不想维护 Python OCR 栈的 DSH 用户;有文字层的 PDF 可走 PDFKit 直抽(README 示例:约 44ms、12MB 文件)。

务必知晓的限制(摘自 README):

  • languages 多语言同时给时 Vision 可能用第一种语言硬读其他语系行;建议只给主语言或分次调用。
  • 波斯语部分字母会与阿拉伯字体映射差异导致归一化问题;手写、印章、水印置信度低,不宜当权威值。
  • 超大 PNG 解码内存峰值高;带 boxes 时长文档需调 maxLines 或配合 pages 分段。

社区目录页:SkillHub — Zac-Linley/macvision。DSH 生态强调「一切皆插件」,该目录为独立社区站点,与 DeepSeek / 幻方无官方从属关系。

结尾

MacVision 把 macOS Vision 接到 DSH:离线、零 API、可选行坐标,PDF 与横放扫描有专门处理。安装以 npm i -g @zaclinley/dsh-macvision 与 dsh plugin add @zaclinley/dsh-macvision 为准;细节与限制以 GitHub README 为准。

羽毛球分组比赛记分
小程序二维码

欢迎使用《羽毛球分组比赛记分》微信小程序

Xiaoye