epub-translator
epub-translator 是一款利用大语言模型将 EPUB 电子书转化为双语对照版本的开源工具。它能在完整保留原书排版、图片及结构的基础上,将翻译内容与原文并排展示,生成适合对照阅读的双语书籍。
这一工具主要解决了读者在阅读外文原著时难以兼顾语言学习与上下文理解的痛点。传统翻译往往覆盖原文或破坏原有格式,而 epub-translator 让学习者、研究人员及文学爱好者能够同时看到两种语言,既方便查阅生词和句式,又不会丢失原始语境,是语言学习和跨文化研究的得力助手。
该工具既提供了无需编程基础的在线网页版和可视化界面(OOMOL Studio),方便普通用户直接上传文件使用;也提供了灵活的 Python API,支持开发者集成到自己的工作流中,甚至自定义进度追踪。其核心技术亮点在于智能的文本块处理机制,能够精准识别书籍结构,确保译文与原文在页面上完美对齐,同时兼容多种主流大模型接口,让用户可以根据需求自由选择翻译引擎。无论是想精进外语的学生,还是需要处理大量文献的研究者,都能通过它轻松获得高质量的双语阅读体验。
使用场景
一位正在攻读比较文学的研究生,需要深入研读一本未引进中文版的英文原版学术专著,以便在论文中精准引用并分析其核心观点。
没有 epub-translator 时
- 查阅效率极低:遇到生僻术语或复杂长句时,必须频繁切换屏幕去查词典或使用网页翻译,打断阅读心流,难以保持专注。
- 语境严重丢失:通用的全文翻译工具往往会破坏原书的章节结构、脚注甚至图片排版,导致引用时无法定位原文位置。
- 对照验证困难:为了确认翻译的准确性,需要在两个独立的文件(原文电子书和翻译文档)之间来回翻找,极易出错且耗时。
- 学习成本高昂:若想通过阅读提升专业英语能力,缺乏“原文 - 译文”逐段对照的环境,难以揣摩作者的用词精妙之处。
使用 epub-translator 后
- 沉浸式双语阅读:epub-translator 利用大模型将译文直接嵌入原书,生成左右分栏或段落对照的双语版本,无需切换窗口即可流畅阅读。
- 完美保留格式:工具在翻译过程中完整保留了原书的目录、脚注、图片及排版样式,确保学术引用的页码和上下文准确无误。
- 即时对照参考:每一段英文下方(或侧边)即是对应的中文译文,研究者可随时比对细节,快速验证关键概念的理解是否偏差。
- 辅助语言进阶:这种原生集成的双语模式让读者能在学习专业知识的同时,自然习得地道的学术表达方式,实现阅读与学习的双重收益。
epub-translator 通过将 AI 翻译无缝融入原始文档结构,把枯燥的跨语言查阅变成了高效的双语对照研读体验。
运行环境要求
- 未说明
未说明
未说明

快速开始
想要在不丢失原文语境的情况下阅读外文书籍吗?EPUB翻译器能够借助AI技术,将任意EPUB格式的电子书转换为双语文本对照版本,让译文与原文并排呈现。
无论您是在学习新语言、进行学术研究,还是单纯享受外国文学作品,这款工具都能帮您在一本书中同时获得两种语言版本,且完整保留原书的排版、图片和结构。

在线版本
如果您不想在本地安装EPUB翻译器,可以使用官方推出的在线应用Inkora - EPUB翻译器,它提供了同样的双语文本翻译流程。只需上传一个EPUB文件,即可直接在浏览器中体验主要功能。
安装
pip install epub-translator
要求:Python 3.11、3.12 或 3.13
快速入门
使用OOMOL Studio(推荐)
通过OOMOL Studio的可视化界面使用EPUB翻译器是最简单的方式:
使用Python API
from epub_translator import LLM, translate, language, SubmitKind
# 使用您的API密钥初始化LLM客户端
llm = LLM(
key="your-api-key",
url="https://api.openai.com/v1",
model="gpt-4",
token_encoding="o200k_base",
)
# 使用语言常量翻译EPUB文件
translate(
source_path="source.epub",
target_path="translated.epub",
target_language=language.ENGLISH,
submit=SubmitKind.APPEND_BLOCK,
llm=llm,
)
带进度跟踪
from tqdm import tqdm
with tqdm(total=100, desc="翻译", unit="%") as pbar:
last_progress = 0.0
def on_progress(progress: float):
nonlocal last_progress
increment = (progress - last_progress) * 100
pbar.update(increment)
last_progress = progress
translate(
source_path="source.epub",
target_path="translated.epub",
target_language="English",
submit=SubmitKind.APPEND_BLOCK,
llm=llm,
on_progress=on_progress,
)
API参考
LLM类
初始化用于翻译的LLM客户端:
LLM(
key: str, # API密钥
url: str, # API端点URL
model: str, # 模型名称(例如,“gpt-4”)
token_encoding: str, # 令牌编码方式(例如,“o200k_base”)
cache_path: PathLike | None = None, # 缓存目录路径
timeout: float | None = None, # 请求超时时间(秒)
top_p: float | tuple[float, float] | None = None,
temperature: float | tuple[float, float] | None = None,
retry_times: int = 5, # 失败后重试次数
retry_interval_seconds: float = 6.0, # 重试间隔时间(秒)
log_dir_path: PathLike | None = None, # 日志目录路径
)
translate函数
翻译EPUB文件:
translate(
source_path: PathLike | str, # 源EPUB文件路径
target_path: PathLike | str, # 目标EPUB文件路径
target_language: str, # 目标语言(例如,“英语”、“中文”)
submit: SubmitKind, # 插入译文的方式(REPLACE、APPEND_TEXT或APPEND_BLOCK)
user_prompt: str | None = None, # 自定义翻译指令
max_retries: int = 5, # 翻译失败后的最大重试次数
max_group_tokens: int = 2600, # 每组翻译的最大令牌数
concurrency: int = 1, # 并发翻译任务数量(默认为1)
llm: LLM | None = None, # 单一LLM实例用于翻译和填充
translation_llm: LLM | None = None, # 专门用于翻译的LLM实例(覆盖llm)
fill_llm: LLM | None = None, # 专门用于XML填充的LLM实例(覆盖llm)
on_progress: Callable[[float], None] | None = None, # 进度回调函数(0.0–1.0)
on_fill_failed: Callable[[FillFailedEvent], None] | None = None, # 错误回调函数
)
注意:必须提供llm,或者同时提供translation_llm和fill_llm。使用独立的LLM实例可以根据具体任务需求进行优化。
提交模式
submit参数决定了译文如何插入到文档中。请使用SubmitKind枚举来指定插入方式:
from epub_translator import SubmitKind
# 三种可用模式:
# - SubmitKind.REPLACE:用译文替换原文内容,生成单语种输出
# - SubmitKind.APPEND_TEXT:将译文以内联文本形式追加到原文之后,两种语言出现在同一段落中,保持连续的阅读流
# - SubmitKind.APPEND_BLOCK:将译文以块级元素的形式追加到原文之后,两种语言之间有清晰的视觉分隔,非常适合双语文本对照阅读
模式对比:
SubmitKind.REPLACE:通过用译文替换原文内容,生成单语种翻译版本。适用于仅需目标语言版本的书籍。SubmitKind.APPEND_TEXT:将译文以内联文本形式紧随原文之后插入。两种语言在同一段落中交替出现,形成流畅的阅读体验。SubmitKind.APPEND_BLOCK(推荐):将译文以独立的块级元素(段落)形式插入到原文之后。这种方式能够在视觉上清晰地区分两种语言,特别适合双语文本对照阅读。
示例:
用于双语书籍(推荐)
translate( source_path="source.epub", target_path="translated.epub", target_language=language.ENGLISH, submit=SubmitKind.APPEND_BLOCK, llm=llm, )
用于单语翻译
translate( source_path="source.epub", target_path="translated.epub", target_language=language.ENGLISH, submit=SubmitKind.REPLACE, llm=llm, )
#### 语言常量
EPUB Translator 提供了预定义的语言常量,以方便使用。您可以使用这些常量,而无需将语言名称写成字符串:
```python
from epub_translator import language
# 使用示例:
translate(
source_path="source.epub",
target_path="translated.epub",
target_language=language.ENGLISH,
submit=SubmitKind.APPEND_BLOCK,
llm=llm,
)
# 您也可以使用自定义的语言字符串:
translate(
source_path="source.epub",
target_path="translated.epub",
target_language="Icelandic", # 对于不在常量中的语言
submit=SubmitKind.APPEND_BLOCK,
llm=llm,
)
使用 on_fill_failed 进行错误处理
通过 on_fill_failed 回调函数监控翻译错误。系统会自动重试失败的翻译,最多尝试 max_retries 次(默认为5次)。大多数错误在重试过程中都会被修复,不会影响最终输出。
from epub_translator import FillFailedEvent
def handle_fill_error(event: FillFailedEvent):
// 只记录会影响最终 EPUB 文件的关键错误
if event.over_maximum_retries:
print(f"关键错误,在 {event.retried_count} 次尝试后:")
print(f" {event.error_message}")
print(" 此错误将出现在最终的 EPUB 文件中!")
translate(
source_path="source.epub",
target_path="translated.epub",
target_language=language.ENGLISH,
submit=SubmitKind.APPEND_BLOCK,
llm=llm,
on_fill_failed=handle_fill_error,
)
理解错误严重性:
FillFailedEvent 包含:
error_message: str- 错误描述retried_count: int- 当前的重试次数(1 到 max_retries)over_maximum_retries: bool- 错误是否严重
错误分类:
可恢复错误(
over_maximum_retries=False):重试过程中出现的错误。系统会继续重试,通常可以自动解决。大多数情况下可以忽略。严重错误(
over_maximum_retries=True):所有重试尝试都失败后的错误。这些错误会出现在最终的 EPUB 文件中,需要进一步调查。
高级用法:
在调试翻译过程时进行详细日志记录:
def handle_fill_error(event: FillFailedEvent):
if event.over_maximum_retries:
// 严重:影响最终输出
print(f"❌ 严重:{event.error_message}")
else:
// 信息性:系统正在重试
print(f"⚠️ 重试 {event.retried_count} 次:{event.error_message}")
双 LLM 架构
使用不同的 LLM 实例分别进行翻译和 XML 结构填充,并设置不同的优化参数:
// 创建两个具有不同温度的 LLM 实例
translation_llm = LLM(
key="your-api-key",
url="https://api.openai.com/v1",
model="gpt-4",
token_encoding="o200k_base",
temperature=0.8, // 较高的温度用于创意翻译
)
fill_llm = LLM(
key="your-api-key",
url="https://api.openai.com/v1",
model="gpt-4",
token_encoding="o200k_base",
temperature=0.3, // 较低的温度用于保持结构完整性
)
translate(
source_path="source.epub",
target_path="translated.epub",
target_language=language.ENGLISH,
submit=SubmitKind.APPEND_BLOCK,
translation_llm=translation_llm,
fill_llm=fill_llm,
)
配置示例
OpenAI
llm = LLM(
key="sk-...",
url="https://api.openai.com/v1",
model="gpt-4",
token_encoding="o200k_base",
)
Azure OpenAI
llm = LLM(
key="your-azure-key",
url="https://your-resource.openai.azure.com/openai/deployments/your-deployment",
model="gpt-4",
token_encoding="o200k_base",
)
其他兼容 OpenAI 的服务
任何具有 OpenAI 兼容 API 的服务都可以使用:
llm = LLM(
key="your-api-key",
url="https://your-service.com/v1",
model="your-model",
token_encoding="o200k_base", // 根据您的模型编码进行匹配
)
高级功能
自定义翻译提示
提供特定的翻译指导:
translate(
source_path="source.epub",
target_path="translated.epub",
target_language="English",
submit=SubmitKind.APPEND_BLOCK,
llm=llm,
user_prompt="使用正式语言并保留技术术语",
)
缓存以恢复进度
启用缓存功能,以便在发生故障后恢复翻译进度:
llm = LLM(
key="your-api-key",
url="https://api.openai.com/v1",
model="gpt-4",
token_encoding="o200k_base",
cache_path="./translation_cache", // 翻译结果将在此处缓存
)
并发翻译
通过同时处理多个文本段来加快翻译速度。使用 concurrency 参数控制同时运行的翻译任务数量:
translate(
source_path="source.epub",
target_path="translated.epub",
target_language="English",
submit=SubmitKind.APPEND_BLOCK,
llm=llm,
concurrency=4, // 同时处理 4 个文本段
)
性能提示:
- 建议从
concurrency=4开始,根据您的 API 速率限制和系统资源进行调整 - 更高的并发值可以显著缩短大型书籍的翻译时间
- 无论并发设置如何,翻译顺序都会保持不变
- 请密切关注您的 API 提供商的速率限制,以免被限流
线程安全:
当使用 concurrency > 1 时,请确保任何自定义回调函数(on_progress、on_fill_failed)都是线程安全的。内置回调函数默认是线程安全的。
令牌使用监控
在翻译过程中跟踪令牌消耗情况,以便监控 API 成本和使用情况:
from epub_translator import LLM、translate、language 和 SubmitKind
llm = LLM(
key="your-api-key",
url="https://api.openai.com/v1",
model="gpt-4",
token_encoding="o200k_base",
)
translate(
source_path="source.epub",
target_path="translated.epub",
target_language=language.ENGLISH,
submit=SubmitKind.APPEND_BLOCK,
llm=llm,
)
# 翻译后的访问令牌统计信息
print(f"总令牌数: {llm.total_tokens}")
print(f"输入令牌数: {llm.input_tokens}")
print(f"输入缓存令牌数: {llm.input_cache_tokens}")
print(f"输出令牌数: {llm.output_tokens}")
可用的统计信息:
total_tokens- 使用的总令牌数(输入 + 输出)input_tokens- 提示/输入令牌的数量input_cache_tokens- 缓存的输入令牌数量(使用提示缓存时)output_tokens- 生成/完成令牌的数量
实时监控:
您还可以在翻译过程中实时监控令牌使用情况:
from tqdm import tqdm
import time
with tqdm(total=100, desc="翻译中", unit="%") as pbar:
last_progress = 0.0
start_time = time.time()
def on_progress(progress: float):
nonlocal last_progress
increment = (progress - last_progress) * 100
pbar.update(increment)
last_progress = progress
# 在进度条中更新令牌统计信息
pbar.set_postfix({
'tokens': llm.total_tokens,
'cost_est': f'${llm.total_tokens * 0.00001:.4f}' # 根据您的定价估算
})
translate(
source_path="source.epub",
target_path="translated.epub",
target_language=language.ENGLISH,
submit=SubmitKind.APPEND_BLOCK,
llm=llm,
on_progress=on_progress,
)
elapsed = time.time() - start_time
print(f"\n翻译完成,耗时{elapsed:.1f}秒")
print(f"总共使用的令牌数: {llm.total_tokens:,}")
print(f"平均每秒使用的令牌数: {llm.total_tokens/elapsed:.1f}")
双LLM令牌跟踪:
当分别使用不同的LLM进行翻译和填充时,每个LLM都会跟踪各自的统计信息:
translation_llm = LLM(key="...", url="...", model="gpt-4", token_encoding="o200k_base")
fill_llm = LLM(key="...", url="...", model="gpt-4", token_encoding="o200k_base")
translate(
source_path="source.epub",
target_path="translated.epub",
target_language=language.ENGLISH,
submit=SubmitKind.APPEND_BLOCK,
translation_llm=translation_llm,
fill_llm=fill_llm,
)
print(f"翻译使用的令牌数: {translation_llm.total_tokens}")
print(f"填充使用的令牌数: {fill_llm.total_tokens}")
print(f"合计总数: {translation_llm.total_tokens + fill_llm.total_tokens}")
注意: 令牌统计信息是LLM实例所有API调用的累计值。这些计数只会增加,并且在使用并发翻译时是线程安全的。
相关项目
PDF Craft
PDF Craft 可以将PDF文件转换为EPUB等格式,尤其擅长处理扫描版书籍。您可以将PDF Craft与EPUB Translator结合使用,将扫描版PDF书籍转换并翻译成双语EPUB格式。
工作流程:扫描版PDF → [PDF Craft] → EPUB → [EPUB Translator] → 双语EPUB
完整教程请观看:如何将扫描版PDF书籍转换为EPUB格式并翻译成双语书
贡献
欢迎贡献!请随时提交Pull Request。
许可证
本项目采用MIT许可证授权——详情请参阅LICENSE文件。
支持
版本历史
v0.1.92026/02/07v0.1.82026/02/07v0.1.72026/02/04v0.1.62026/01/12v0.1.52026/01/11v0.1.42026/01/10v0.1.32026/01/09v0.1.22026/01/08v0.1.12025/12/31v0.1.02025/12/30常见问题
相似工具推荐
openclaw
OpenClaw 是一款专为个人打造的本地化 AI 助手,旨在让你在自己的设备上拥有完全可控的智能伙伴。它打破了传统 AI 助手局限于特定网页或应用的束缚,能够直接接入你日常使用的各类通讯渠道,包括微信、WhatsApp、Telegram、Discord、iMessage 等数十种平台。无论你在哪个聊天软件中发送消息,OpenClaw 都能即时响应,甚至支持在 macOS、iOS 和 Android 设备上进行语音交互,并提供实时的画布渲染功能供你操控。 这款工具主要解决了用户对数据隐私、响应速度以及“始终在线”体验的需求。通过将 AI 部署在本地,用户无需依赖云端服务即可享受快速、私密的智能辅助,真正实现了“你的数据,你做主”。其独特的技术亮点在于强大的网关架构,将控制平面与核心助手分离,确保跨平台通信的流畅性与扩展性。 OpenClaw 非常适合希望构建个性化工作流的技术爱好者、开发者,以及注重隐私保护且不愿被单一生态绑定的普通用户。只要具备基础的终端操作能力(支持 macOS、Linux 及 Windows WSL2),即可通过简单的命令行引导完成部署。如果你渴望拥有一个懂你
stable-diffusion-webui
stable-diffusion-webui 是一个基于 Gradio 构建的网页版操作界面,旨在让用户能够轻松地在本地运行和使用强大的 Stable Diffusion 图像生成模型。它解决了原始模型依赖命令行、操作门槛高且功能分散的痛点,将复杂的 AI 绘图流程整合进一个直观易用的图形化平台。 无论是希望快速上手的普通创作者、需要精细控制画面细节的设计师,还是想要深入探索模型潜力的开发者与研究人员,都能从中获益。其核心亮点在于极高的功能丰富度:不仅支持文生图、图生图、局部重绘(Inpainting)和外绘(Outpainting)等基础模式,还独创了注意力机制调整、提示词矩阵、负向提示词以及“高清修复”等高级功能。此外,它内置了 GFPGAN 和 CodeFormer 等人脸修复工具,支持多种神经网络放大算法,并允许用户通过插件系统无限扩展能力。即使是显存有限的设备,stable-diffusion-webui 也提供了相应的优化选项,让高质量的 AI 艺术创作变得触手可及。
everything-claude-code
everything-claude-code 是一套专为 AI 编程助手(如 Claude Code、Codex、Cursor 等)打造的高性能优化系统。它不仅仅是一组配置文件,而是一个经过长期实战打磨的完整框架,旨在解决 AI 代理在实际开发中面临的效率低下、记忆丢失、安全隐患及缺乏持续学习能力等核心痛点。 通过引入技能模块化、直觉增强、记忆持久化机制以及内置的安全扫描功能,everything-claude-code 能显著提升 AI 在复杂任务中的表现,帮助开发者构建更稳定、更智能的生产级 AI 代理。其独特的“研究优先”开发理念和针对 Token 消耗的优化策略,使得模型响应更快、成本更低,同时有效防御潜在的攻击向量。 这套工具特别适合软件开发者、AI 研究人员以及希望深度定制 AI 工作流的技术团队使用。无论您是在构建大型代码库,还是需要 AI 协助进行安全审计与自动化测试,everything-claude-code 都能提供强大的底层支持。作为一个曾荣获 Anthropic 黑客大奖的开源项目,它融合了多语言支持与丰富的实战钩子(hooks),让 AI 真正成长为懂上
ComfyUI
ComfyUI 是一款功能强大且高度模块化的视觉 AI 引擎,专为设计和执行复杂的 Stable Diffusion 图像生成流程而打造。它摒弃了传统的代码编写模式,采用直观的节点式流程图界面,让用户通过连接不同的功能模块即可构建个性化的生成管线。 这一设计巧妙解决了高级 AI 绘图工作流配置复杂、灵活性不足的痛点。用户无需具备编程背景,也能自由组合模型、调整参数并实时预览效果,轻松实现从基础文生图到多步骤高清修复等各类复杂任务。ComfyUI 拥有极佳的兼容性,不仅支持 Windows、macOS 和 Linux 全平台,还广泛适配 NVIDIA、AMD、Intel 及苹果 Silicon 等多种硬件架构,并率先支持 SDXL、Flux、SD3 等前沿模型。 无论是希望深入探索算法潜力的研究人员和开发者,还是追求极致创作自由度的设计师与资深 AI 绘画爱好者,ComfyUI 都能提供强大的支持。其独特的模块化架构允许社区不断扩展新功能,使其成为当前最灵活、生态最丰富的开源扩散模型工具之一,帮助用户将创意高效转化为现实。
markitdown
MarkItDown 是一款由微软 AutoGen 团队打造的轻量级 Python 工具,专为将各类文件高效转换为 Markdown 格式而设计。它支持 PDF、Word、Excel、PPT、图片(含 OCR)、音频(含语音转录)、HTML 乃至 YouTube 链接等多种格式的解析,能够精准提取文档中的标题、列表、表格和链接等关键结构信息。 在人工智能应用日益普及的今天,大语言模型(LLM)虽擅长处理文本,却难以直接读取复杂的二进制办公文档。MarkItDown 恰好解决了这一痛点,它将非结构化或半结构化的文件转化为模型“原生理解”且 Token 效率极高的 Markdown 格式,成为连接本地文件与 AI 分析 pipeline 的理想桥梁。此外,它还提供了 MCP(模型上下文协议)服务器,可无缝集成到 Claude Desktop 等 LLM 应用中。 这款工具特别适合开发者、数据科学家及 AI 研究人员使用,尤其是那些需要构建文档检索增强生成(RAG)系统、进行批量文本分析或希望让 AI 助手直接“阅读”本地文件的用户。虽然生成的内容也具备一定可读性,但其核心优势在于为机器
LLMs-from-scratch
LLMs-from-scratch 是一个基于 PyTorch 的开源教育项目,旨在引导用户从零开始一步步构建一个类似 ChatGPT 的大型语言模型(LLM)。它不仅是同名技术著作的官方代码库,更提供了一套完整的实践方案,涵盖模型开发、预训练及微调的全过程。 该项目主要解决了大模型领域“黑盒化”的学习痛点。许多开发者虽能调用现成模型,却难以深入理解其内部架构与训练机制。通过亲手编写每一行核心代码,用户能够透彻掌握 Transformer 架构、注意力机制等关键原理,从而真正理解大模型是如何“思考”的。此外,项目还包含了加载大型预训练权重进行微调的代码,帮助用户将理论知识延伸至实际应用。 LLMs-from-scratch 特别适合希望深入底层原理的 AI 开发者、研究人员以及计算机专业的学生。对于不满足于仅使用 API,而是渴望探究模型构建细节的技术人员而言,这是极佳的学习资源。其独特的技术亮点在于“循序渐进”的教学设计:将复杂的系统工程拆解为清晰的步骤,配合详细的图表与示例,让构建一个虽小但功能完备的大模型变得触手可及。无论你是想夯实理论基础,还是为未来研发更大规模的模型做准备

