BabelDOC PDF 翻译接入统一 API
最后更新: 2026-07-16
BabelDOC 的翻译器天生就是 OpenAI 兼容协议:--openai 开启 LLM 翻译,--openai-base-url 定端点,--openai-api-key 鉴权,--openai-model 选模型。把 base URL 填成 https://api.kkaiapi.com/v1,翻译 PDF 时 Claude、DeepSeek、GLM、Gemini 一个 Key 随时切换,版式、公式、图表原样保留。
先说结论:四个参数管住每一次翻译调用
BabelDOC 的命令行直接暴露端点:--openai 启用 LLM 翻译器,--openai-base-url 决定请求发到哪里,--openai-api-key 负责鉴权,--openai-model 选模型 ID。README 自带的示例展示的就是这套参数组合,它的翻译服务说明写得很直白:只支持 OpenAI 兼容的 LLM,这让一个多厂商 OpenAI 兼容网关成为顺理成章的选择,而不是权宜之计。 因为模型 ID 是按纯字符串转发的,端点提供的任何模型都能用:上游文档自己就推荐 GLM 和 DeepSeek 家族作为对 OpenAI 兼容协议友好的模型,经 kkaiapi,它们和 Claude、Gemini 的 ID 就并排待在同一个 base URL 后面。
babeldoc --files paper.pdf \
--lang-in en --lang-out zh \
--openai \
--openai-model "deepseek-v4-flash" \
--openai-base-url "https://api.kkaiapi.com/v1" \
--openai-api-key "$KKAIAPI_KEY"BabelDOC 怎么把一份 PDF 变成模型调用
BabelDOC(GitHub 上的 funstory-ai,约 9K 星标,出自沉浸式翻译团队)是一个保版式的 PDF 文档翻译工具:解析文档结构,保护公式和图表,识别段落,用 LLM 逐段翻译,再重建成一份译文单语版和一份双语对照版。它以 CLI 和 Python API 两种形态提供,是托管版 BabelDOC 服务的自建对应物。 端点真正起作用的是翻译这一步。一份文档会变成许多段落大小的 chat-completions 请求,由 --qps 参数(默认每秒 4 次)节流,由一个 worker 池处理(pool-max-workers 默认跟随 QPS 值)。这个形状带来两个结果。第一,翻译是走量的负载:一份长 PDF 是成百上千次小调用,单价会被迅速放大。第二,和主要靠"读"的检索类负载不同,翻译"写"的量和"读"的量差不多,比较不同 ID 时输出 token 单价和输入单价同样重要。 BabelDOC 还会缓存翻译结果,重跑同一份文档会复用之前的结果,除非传了 --ignore-cache。术语表 CSV(--glossary-files)能在整个流程里锁定专有名词,--max-pages-per-part 能把超大文档拆成几部分,分别翻译再自动合并。
完整配置:命令行参数或 TOML 配置文件
重复使用的场景里,同样的设置可以写进一个 TOML 文件,用 --config 传入。[babeldoc] 表接受完全相同的键,写成短横线格式:openai、openai-model、openai-base-url、openai-api-key,再加上吞吐量和输出选项。这样 Key 不用留在命令行历史里,一份翻译配置也能在不同文档间复用。 下面的配置是一份实用的走量配置:大多数文档用快速 ID,QPS 调高匹配一个有并发能力的网关,单语和双语两种输出都保留。翻译要求更讲究的文档,把 openai-model 换成更强的 ID 就行。
[babeldoc]
lang-in = "en-US"
lang-out = "zh-CN"
qps = 10
pool-max-workers = 10
# 翻译服务
openai = true
openai-model = "deepseek-v4-flash"
openai-base-url = "https://api.kkaiapi.com/v1"
openai-api-key = "sk-你的kkaiapi密钥"
# 输出控制
no-dual = false
no-mono = false
watermark-output-mode = "no_watermark"怎么选翻译模型
对比流程很具体:用两个 ID 翻译同样十页(按次运行分别缓存不会互相干扰),对照读两份双语版,再看按 Key 的用量日志算每一遍花了多少。多数团队最后落地一个快速默认档加一个高端档,都存成 TOML 文件。
- 走量文档(说明书、只读一次的论文)适合 deepseek-v4-flash:技术性文字的翻译质量能撑住,单页成本几乎可以忽略
- 中文目标语言的翻译是 glm-5.2 和 DeepSeek 家族的主场,上游文档自己也把 GLM 和 DeepSeek 列为表现良好的 OpenAI 兼容选择
- 在意细节的文档(合同、要发表的译文)值得用 claude-sonnet-4-6 或 claude-haiku-4-5-20251001,它们在长文档里对术语和语域的把握更忠实
- 这里输出 token 很要紧。翻译写的量和读的量差不多,比较不同 ID 时也要看输出价格那一列,不只是输入
- 快速 ID 配术语表效果更好。一份术语表 CSV 能锁住快速模型偶尔会漂移的专有名词,补齐技术文本上的质量差距
主力模型价格
价格按 kkaiapi 中文区实时价格计算,单位 ¥/1M tokens(输入/输出)。
| 模型 | 模型 ID | kkaiapi 价格(输入/输出) | 适合场景 |
|---|---|---|---|
| DeepSeek V4 Flash | deepseek-v4-flash | ¥0.9 / ¥1.8 | 走量文档默认选择 |
| GLM-5.2 | glm-5.2 | ¥7.2 / ¥25.2 | 中文目标语言 |
| Gemini 3.5 Flash | gemini-3.5-flash | ¥7 / ¥40 | 多语种混排文档 |
| Claude Haiku 4.5 | claude-haiku-4-5-20251001 | ¥1 / ¥5 | 英文文档快速翻译 |
| Claude Sonnet 4.6 | claude-sonnet-4-6 | ¥3 / ¥15 | 合同、要发表的译文 |
翻车点与吞吐量调优
QPS 是和网关互相牵动的参数。默认每秒 4 次很保守,大多数有并发能力的上游能撑住更多,调高 --qps(pool-max-workers 会跟着走)是让一份三百页的文档从一下午缩短到几分钟的关键。边看 429 响应边往上加,不要一上来就跳到一个很大的数字,因为被限流的段落会重试,拖慢整个流程。 这些参数只有在设置了 --openai 时才生效。传了 base URL 但没加 --openai,翻译器就是关闭状态,表现为解析了 PDF 但从未翻译。模型 ID 是精确字符串,以端点 /v1/models 的返回列表为准,拼错字会在第一段翻译时报模型不存在。401 意味着 Key 和 base URL 不属于同一个账户。 版式问题不是端点问题。文字重叠、公式丢失、表格错乱,根源在 PDF 解析这一侧(试试 --enhance-compatibility、扫描件用 --ocr-workaround,或者富文本开关),换模型解决不了。反过来也一样:术语翻译错了是模型或术语表的问题,不是解析器的问题。 缓存可能掩盖变化。换模型之后,如果想让新 ID 重新翻译旧 ID 已经处理过的内容,传 --ignore-cache,否则缓存过的段落维持原样。
哪些人会把 BabelDOC 接到一个网关上
- 批量翻译论文的研究者,一份文档几百次小调用,走量价格和按 Key 的用量可见性是关键
- 标准化双语文档的团队,同一个端点上跑一份快速默认档和一份高端档,只是模型字符串不同
- 所在语言对最强翻译模型分属不同厂商的用户,GLM、DeepSeek、Claude、Gemini 的 ID 都在一个 Key 后面
- 用自建替代托管服务翻译机密文档的用户,解析留在本地,只把段落文字发给一个可审计的端点
- 手头没有某家厂商官方支付渠道的开发者,充值即用不需要海外卡
验证接入与排查首份文档
开始长任务之前先列出你的 Key 能调用的模型;--openai-model 必须和提供的某个 ID 精确匹配。 然后端到端翻译一份很小的文档(一页 PDF,或者在大文档上用 --pages 1)。第一段就 401 说明 Key 和 base URL 不匹配。模型不存在是 ID 拼错了。解析了但从未调用端点的任务是漏了 --openai。频繁卡顿并出现重试提示,说明 QPS 设得比端点能承受的要高,先调低再慢慢往上加。 文档开始流动之后,kkaiapi 控制台会显示每次请求的模型、token 数和花费。翻译成本随文档长度双向增长(输入和输出都算),按 Key 的用量日志是弄清楚每个模型每页真实成本的地方,不用靠估算。
curl -s https://api.kkaiapi.com/v1/models \
-H "Authorization: Bearer $KKAIAPI_KEY" | head -50
# 再跑一次单页冒烟测试
babeldoc --config babeldoc.toml --files sample.pdf --pages 1常见问题
BabelDOC 支持自定义 OpenAI 兼容端点吗?
原生支持。命令行暴露 --openai-base-url 和 --openai-api-key,配合 --openai-model,TOML 配置文件接受完全相同的键。上游 README 明确写着支持的翻译器类型是 OpenAI 兼容 LLM。
BabelDOC 能用 Claude、GLM 或 DeepSeek 模型翻译吗?
能。模型 ID 按纯字符串转发给 --openai-base-url 背后的端点,所以目录里任意 ID 都能用。上游文档本身就推荐 GLM 和 DeepSeek 家族作为表现良好的选择。
一份 PDF 大概要花多少次 API 调用?
BabelDOC 按段落大小翻译,一份文档会变成成百上千次 chat-completions 小调用,由 --qps 节流。输入和输出 token 都随文档长度增长,按 Key 的用量日志会给出精确的单份文档成本。
对着一个网关应该设多高的 QPS?
从默认值 4 附近起步,边观察 429 响应边往上加;有并发能力的端点通常能撑住更多,pool-max-workers 没有单独设置时会跟随 QPS 值。一个稳定更高的 QPS 是长文档几分钟和几小时的差别。
换了模型但翻译结果没变,为什么?
是翻译缓存的原因。BabelDOC 按文档复用缓存结果;换了 --openai-model 之后传 --ignore-cache,新 ID 才会重新翻译之前处理过的内容。
端点选择会影响版式、公式或表格吗?
不会。解析、版式分析和 PDF 重建都在本地运行,和端点无关。版式问题有专门的参数(--enhance-compatibility、--ocr-workaround),base URL 只决定哪个模型翻译文字。