- Created by Chandler-Lu
- 🗓 Last Updated: 25/07/26 16:48:05
- 🌟 Stars on GitHub: 232
- Please consider supporting the creator by Starring or Sponsoring them on GitHub!
- Get Latest Release
- Get Source Code
From their README
Alfred - OCR and Translation
下载地址
OCR Demo

Translate Demo

版本
5.0.0
- 重构为分层结构:
core(基础设施)+providers(各引擎)+utils(纯工具),入口统一为src/main.py;新增引擎只需新增一个 Provider 子类并在router.py注册; - 段落识别重写:由「行距方差二选一」改为多信号加权判定(行距、行尾留白、首行缩进、字号变化、行尾标点、分栏、列表项),阈值全部相对于实测版面度量,同一段落的上下行不再插入回车;
- 中英文空格与标点重写:按字符上下文而非整行判断,URL、邮箱、
1,000.50、f(x)、v1.2.3不再被破坏;跨行的中英文边界也能正确加空格;英文换行不再被粘连(canhandle→can handle),英文连字符断行自动还原; - 健壮性:所有网络请求增加超时、重试与统一代理;缺少某个密钥不再导致整个脚本崩溃;异常不会以 traceback 形式进入剪贴板;百度 Token 失效可自动刷新;
- 修复腾讯接口在网络异常时的
NameError; - 新增单元测试与
config/*.yaml配置支持。
4.9.6
- 使用 ZXing-C++ 进行二维码识别。
4.9.5
- 同步 macOS Alfred 版本;
- 优化代码;
- 修复百度表格识别。
4.9.2
近期更新
- 百度 OCR 更换接口参数,已修复;
- 支持 Mathpix 公式识别;
- 删除腾讯优图接口,新增腾讯云文字识别接口(正式版);
- 由于可选识别方式过多,CNOCR 的触发方式修改为唯一触发词
ooc (CNOCR)。
能力
- 离线 OCR (CNOCR)
- 通用 OCR (百度 | 腾讯 | Google)
- 二维码识别 (百度 | ZXing)
- 表格文字识别 (百度)
- 数学公式识别 (百度 | Mathpix)
- 多文件识别 (百度)
- 文本翻译 (彩云小译)
使用(必看!!)
- 这不是一个开箱即用的产品!
- 您至少要拥有 macOS Alfred 3 及以上版本并激活 Powerpack。
- 您需要安装 Python 3 及相应的依赖模块,并将 Python 3 路径填写在
PYTHON_PATH处。 - 您需要申请并将对应接口的配置填入环境变量,部分接口附带我自己的 Key,但严禁滥用。
- 具体配置方法请移步 安装方式。
命令行
统一入口为 src/main.py,服务可用数字(与旧版一致)、名称或 Alfred 关键词指定:
python src/main.py 1 /tmp/shot.png # 数字选择器,兼容旧版 Action
python src/main.py baidu /tmp/shot.png # 名称
python src/main.py oob - # 关键词,'-' 表示读取剪贴板图片
python src/main.py baidu https://host/a.png # 远程图片
python src/main.py translate "你好" # 翻译
python src/main.py # 查看全部服务
可选参数:--json(输出 Alfred Script Filter JSON)、--copy(同时写入剪贴板)、--debug(把段落判定过程打到 stderr)。
旧入口
src/ocr.py与src/translate.py仍然可用,它们会转发到main.py,已安装的 Workflow 无需改动。
项目结构
src/
├── main.py # 唯一入口
├── router.py # ServiceRouter:数字/名称/关键词 → Provider
├── core/ # 公共基础设施
│ ├── base_provider.py # BaseProvider 抽象基类 + OcrResult
│ ├── config.py # 配置(默认值 + 配置文件 + 环境变量)
│ ├── auth_manager.py # Token 获取、缓存、自动刷新
│ ├── http_client.py # 超时、重试、代理、异常归一
│ ├── image_loader.py # 文件 / URL / 剪贴板
│ ├── formatter.py # 标点、中英文空格、结果渲染
│ ├── layout.py # 行盒子 → 段落
│ ├── output.py # stdout / Alfred JSON / 剪贴板 / 通知
│ └── exceptions.py # 异常体系
├── providers/ # 各引擎实现(baidu / tencent / google / cnocr / mathpix / zxing / caiyun)
└── utils/ # 标点映射表、剪贴板封装
新增一个引擎:继承 BaseProvider,实现 recognize(),然后在 router.py 的 PROVIDER_CLASSES 中登记。
配置
优先级:环境变量 > config/user.yaml > ~/.config/alfred-ocr/config.yaml > config/default.yaml > 内置默认值。
所有可调项及其说明见 config/default.yaml,每一项都能用同名环境变量覆盖(Alfred Workflow 变量即以此方式生效)。
密钥请放在环境变量或 config/credentials.json(已被 git 忽略),不要写进配置文件:
{
"baidu_api_key": "...",
"baidu_secret_key": "..."
}
常用调节项:
| 配置项 | 默认值 | 说明 |
|---|---|---|
http_proxy |
127.0.0.1:7890 |
全局代理,对所有引擎生效;填 "" 则直连 |
http_timeout |
20.0 |
单次请求超时(秒) |
http_retries |
2 |
网络抖动与 5xx 的重试次数 |
paragraph_enabled |
true |
关闭后每行单独成段 |
paragraph_gap_ratio |
1.45 |
行距超过常规行距的多少倍算新段落 |
paragraph_short_line_chars |
3.0 |
行尾留白多少个字算「这一行结束了」 |
paragraph_indent_chars |
1.2 |
首行缩进多少个字算新段落 |
text_add_cjk_latin_space |
true |
中英文之间加空格 |
text_normalize_punctuation |
true |
标点按上下文转全角/半角 |
debug |
false |
输出段落判定依据到 stderr |
关于代理
http_proxy 是全局设置,由 core/http_client.py 统一注入,所有引擎(含图片 URL 下载)都会走它,不需要每个 provider 各自处理。
关闭代理有一处需要注意:空的环境变量会被当作「未设置」,因为 Alfred 会把 Workflow 里所有变量都导出,没填的那些不应该覆盖默认值。所以要直连,请在配置文件里写空值:
# config/user.yaml
http_proxy: ""
开发
pip install -r requirements.txt
pip install pytest
python -m pytest tests -q
依赖
通用 OCR
pip install requests
CNOCR (离线 OCR)
pip install cnocr[ort-cpu]
pip install cnocr[serve] # 针对 FastAPI 服务模式
ZXing (离线二维码识别)
pip install zxing-cpp
接口
CNOCR
触发
- 截图至剪贴板后使用关键词
ooc触发。
说明
- 一切安装方法请依据该项目 README。
Baidu AI (百度)
触发
- 通用 OCR:快捷键 ctrl+v 触发截图选框,或截图至剪贴板后使用关键词
oob (baidu)触发; - 二维码识别:截图后使用关键词
ooqb (qr baidu)触发; - 表格文字识别:截图后使用关键词
ooe (excel)触发,识别后可直接复制至 Excel; - 多文件识别:finder 中选中需要识别的图片并使用关键词
oof (file)触发。

说明
- 具备中英文识别;标点符号按上下文替换为对应语言下的符号,中英文之间自动补空格,URL、小数、
f(x)等不会被误伤; - 自动合并段落:属于同一段的上下行直接拼接,不插入回车(判定依据与阈值见「配置」一节);
- 二维码识别支持同时识别多个;
- 自带一个测试 Token,不保证可用性,需要稳定可自行申请;
- 最大支持单个 4MB 的图片。
自定义语种
目前仅通用 OCR 支持选择语言
语种选择逻辑:
- ctrl+v 或关键词
oob触发时,将选择环境变量中的baidu_language_type来定义语种。如果该值为空,则定义为默认值CHN_ENG,即中英文混合识别; - 当使用
oob调出选择菜单,并按住 command 触发时,将使用第二语言识别。
第一语言选择位置:

第二语言选择位置:

支持的全部语种及其语种代码如下所示:
- CHN_ENG:中英文混合
- ENG:英文
- JAP:日语
- KOR:韩语
- FRE:法语
- SPA:西班牙语
- POR:葡萄牙语
- GER:德语
- ITA:意大利语
- RUS:俄语
Tencent (腾讯)
触发
- 通用 OCR:截图至剪贴板后使用关键词
oot (tencent)触发。
说明
- 自带一个测试 Token,不保证可用性,需要稳定可自行申请;
- 最大支持 3MB 的图片。
Google OCR
触发
- 通用 OCR:截图至剪贴板后使用关键词
oog (google)触发。
环境变量
| 变量名 | 字段说明 |
|---|---|
| google_access_token | 授权密钥 |
| google_post_referer | HTTP 请求时的 Referer 参数,默认为空 |
| google_http_proxy | HTTP 代理,默认为空,填写方式如 127.0.0.1:1234 |
说明
- Google OCR 为收费业务,需绑定信用卡,故本项目不带测试 Token,需要自行申请。
Mathpix
触发
- 公式识别:截图至剪贴板后使用关键词
oom (mathpix)触发。
说明
- Mathpix 为收费业务,需绑定信用卡,故本项目不带测试 Token,需要自行申请。
ZXing
触发
- 截图至剪贴板后使用关键词
ooq触发。
说明
- 一切安装方法请依据该项目 README;
- 仅支持单个二维码识别。
彩云小译
触发
- 文本翻译:使用关键词
tc (translate caiyun) + 需要翻译的内容来触发;输出结果可通过command + c复制。
说明
- 支持中译英,及 X 译中(X 为彩云小译已经支持的语言类别)。
TODO
- 截图翻译
项目
用户
感谢以下小伙伴帮助测试: