@Jolyne_AI: 开源图书 ai 翻译利器:bilingual_book_maker。 用大语言模型(ChatGPT、Claude 等)把文件和整本书快速做成多语言译本,支持 epub、txt、srt 等常见格式,流程简单、上手快。 GitHub:http…
摘要
bilingual_book_maker 是一个开源 AI 翻译工具,利用 ChatGPT、Claude 等大语言模型快速将 epub/txt/srt/pdf 书籍翻译成多语言版本,支持多种模型并采用吴恩达的三步翻译法提高质量。
查看缓存全文
缓存时间: 2026/07/05 14:34
开源图书 ai 翻译利器:bilingual_book_maker。 用大语言模型(ChatGPT、Claude 等)把文件和整本书快速做成多语言译本,支持 epub、txt、srt 等常见格式,流程简单、上手快。 GitHub:https://github.com/yihong0618/bilingual_book_maker… 加分点:翻译 prompt 采用吴恩达老师的三步翻译法,质量更稳,成稿更顺。
yihong0618/bilingual_book_maker
Source: https://github.com/yihong0618/bilingual_book_maker
中文 | English
bilingual_book_maker
The bilingual_book_maker is an AI translation tool that uses ChatGPT to assist users in creating multi-language versions of epub/txt/srt/pdf files and books. This tool is exclusively designed for translating epub and other public domain works and is not intended for copyrighted works. Before using this tool, please review the project’s disclaimer.

Supported Models
gpt-5-mini, gpt-4, gpt-3.5-turbo, claude-2, palm, llama-2, azure-openai, command-nightly, gemini, qwen-mt-turbo, qwen-mt-plus
For using Non-OpenAI models, use class liteLLM() - liteLLM supports all models above.
Find more info here for using liteLLM: https://github.com/BerriAI/litellm/blob/main/setup.py
Preparation
- ChatGPT or OpenAI token 1
- epub/txt/pdf books
- Environment with internet access or proxy
- Python 3.8+
Quick Start
A sample book, test_books/animal_farm.epub, is provided for testing purposes.
pip install -r requirements.txt
python3 make_book.py --book_name test_books/animal_farm.epub --openai_key ${openai_key} --test
OR
pip install -U bbook_maker
bbook --book_name test_books/animal_farm.epub --openai_key ${openai_key} --test
Translate Service
- Use
--openai_keyoption to specify OpenAI API key. If you have multiple keys, separate them by commas (xxx,xxx,xxx) to reduce errors caused by API call limits. Or, just set environment variableBBM_OPENAI_API_KEYinstead. - A sample book,
test_books/animal_farm.epub, is provided for testing purposes. - The default underlying model is GPT-3.5-turbo, which is used by ChatGPT currently. Use
--model gpt4to change the underlying model toGPT4. You can also useGPT4omini. - Important to note that
gpt-4is significantly more expensive thangpt-4-turbo, but to avoid bumping into rate limits, we automatically balance queries acrossgpt-4-1106-preview,gpt-4,gpt-4-32k,gpt-4-0613,gpt-4-32k-0613. - If you want to use a specific model alias with OpenAI (eg
gpt-4-1106-previeworgpt-3.5-turbo-0125), you can use--model openai --model_list gpt-4-1106-preview,gpt-3.5-turbo-0125.--model_listtakes a comma-separated list of model aliases. - If using chatgptapi, you can add
--use_contextto add a context paragraph to each passage sent to the model for translation (see below).
-
DeepL Support DeepL model DeepL Translator need pay to get the token
python3 make_book.py --book_name test_books/animal_farm.epub --model deepl --deepl_key ${deepl_key} -
DeepL free
python3 make_book.py --book_name test_books/animal_farm.epub --model deeplfree -
Use Claude model to translate
python3 make_book.py --book_name test_books/animal_farm.epub --model claude --claude_key ${claude_key} -
Google Translate
python3 make_book.py --book_name test_books/animal_farm.epub --model google -
Caiyun Translate
python3 make_book.py --book_name test_books/animal_farm.epub --model caiyun --caiyun_key ${caiyun_key} -
Gemini
Support Google Gemini model, use
--model geminifor Gemini Flash or--model geminiprofor Gemini Pro. If you want to use a specific model alias with Gemini (eggemini-2.5-flashorgemini-2.0-flash), you can use--model gemini --model_list gemini-2.5-flash,gemini-2.0-flash.--model_listtakes a comma-separated list of model aliases.python3 make_book.py --book_name test_books/animal_farm.epub --model gemini --gemini_key ${gemini_key} -
Qwen
Support Alibaba Cloud Qwen-MT specialized translation model. Supports 92 languages with features like terminology intervention and translation memory. Use
--model qwen-mt-turbofor faster/cheaper translation, or--model qwen-mt-plusfor higher quality.Use
source_langto specify the source language explicitly, or leave it empty for auto-detection.python3 make_book.py --book_name test_books/animal_farm.epub --qwen_key ${qwen_key} --model qwen-mt-turbo --language "Simplified Chinese" python3 make_book.py --book_name test_books/animal_farm.epub --qwen_key ${qwen_key} --model qwen-mt-plus --language "Japanese" --source_lang "English" -
python3 make_book.py --book_name test_books/animal_farm.epub --model tencentransmart -
python3 make_book.py --book_name test_books/animal_farm.epub --model xai --xai_key ${xai_key} -
Support Ollama self-host models, If ollama server is not running on localhost, use
--api_base http://x.x.x.x:port/v1to point to the ollama server addresspython3 make_book.py --book_name test_books/animal_farm.epub --ollama_model ${ollama_model_name} -
GroqCloud currently supports models: you can find from Supported Models
python3 make_book.py --book_name test_books/animal_farm.epub --groq_key [your_key] --model groq --model_list llama3-8b-8192 -
Custom API Provider
If the built-in models don’t cover your needs, you can define custom providers via a JSON config file. This lets you use any OpenAI-compatible API (DeepSeek, SiliconFlow, local proxies, etc.) without modifying source code.
Create
bbm_providers.jsonin the current directory (or~/.bbm/providers.jsonfor global config):{ "providers": { "deepseek": { "api_style": "openai", "base_url": "https://api.deepseek.com/v1", "default_models": ["deepseek-chat", "deepseek-reasoner"], "env_key": "BBM_DEEPSEEK_API_KEY" }, "siliconflow": { "api_style": "openai", "base_url": "https://api.siliconflow.cn/v1", "default_models": ["Qwen/Qwen2.5-72B-Instruct"], "env_key": "BBM_SILICONFLOW_API_KEY" } } }Config fields:
Field Required Description api_styleYes Translator interface style. Supported: openai,claude,gemini,qwenbase_urlNo API endpoint URL. Falls back to the api_style’s default default_modelsNo Default model list. Required if --model_listis not providedenv_keyNo Environment variable name for API key. Required if --api_keyis not providedPriority: project-level
./bbm_providers.jsonoverrides global~/.bbm/providers.json.--providerand--modelare mutually exclusive.python3 make_book.py --provider deepseek --api_key sk-xxx --book_name test_books/animal_farm.epub export BBM_DEEPSEEK_API_KEY=sk-xxx python3 make_book.py --provider deepseek --book_name test_books/animal_farm.epub python3 make_book.py --provider deepseek --api_key sk-xxx --model_list deepseek-reasoner --book_name test_books/animal_farm.epub
Use
- Once the translation is complete, a bilingual book named
${book_name}_bilingual.epubwould be generated for EPUB inputs; for TXT/MD/SRT inputs a bilingual text (or subtitle) file named${book_name}_bilingual.txt(or_bilingual.srt) will be generated. For PDF inputs the tool will produce a bilingual.txtfallback and will also attempt to create${book_name}_bilingual.epub— if EPUB creation fails, the TXT fallback remains so you do not need to retranslate. - If there are any errors or you wish to interrupt the translation by pressing
CTRL+C, a temporary bilingual file (for example{book_name}_bilingual_temp.epubor{book_name}_bilingual_temp.txt) would be generated. You can simply rename it to any desired name.
Params
-
--model:Select the translation model. Default:
chatgptapi. Available values and their behavior:Model Key Source Notes chatgptapi--openai_key/BBM_OPENAI_API_KEYGPT-3.5-turbo. Auto-detects available models from API gpt4--openai_key/BBM_OPENAI_API_KEYGPT-4 family. Auto-balances across available GPT-4 variants gpt4omini--openai_key/BBM_OPENAI_API_KEYGPT-4o-mini gpt4o--openai_key/BBM_OPENAI_API_KEYGPT-4o gpt5mini--openai_key/BBM_OPENAI_API_KEYGPT-5-mini o1preview--openai_key/BBM_OPENAI_API_KEYo1-preview o1--openai_key/BBM_OPENAI_API_KEYo1 o1mini--openai_key/BBM_OPENAI_API_KEYo1-mini o3mini--openai_key/BBM_OPENAI_API_KEYo3-mini openai--openai_key/BBM_OPENAI_API_KEYRequires --model_list. Use any OpenAI-compatible modelclaude-*--claude_key/BBM_CLAUDE_API_KEYPrefix match. e.g. --model claude-sonnet-4-20250514gemini--gemini_key/BBM_GOOGLE_GEMINI_KEYGemini Flash. Supports --model_listgeminipro--gemini_key/BBM_GOOGLE_GEMINI_KEYGemini Pro groq--groq_key/BBM_GROQ_API_KEYRequires --model_listxai--xai_key/BBM_XAI_API_KEYGrok qwen-mt-turbo--qwen_key/BBM_QWEN_API_KEYQwen fast translation model qwen-mt-plus--qwen_key/BBM_QWEN_API_KEYQwen high-quality translation model googleN/A Free. No API key needed caiyun--caiyun_key/BBM_CAIYUN_API_KEYCaiyun deepl--deepl_key/BBM_DEEPL_API_KEYDeepL (paid) deeplfreeN/A DeepL Free tencentransmartN/A Tencent TranSmart. Free customapi--custom_api/BBM_CUSTOM_APICustom translation API For any OpenAI-compatible API not listed above, use
--providerinstead (see Custom API Provider section). -
--test:Use
--testoption to preview the result if you haven’t paid for the service. Note that there is a limit and it may take some time. -
--language:Set the target language like
--language "Simplified Chinese". Default target language is"Simplified Chinese". Read available languages by helper message:python make_book.py --help -
--proxy:Use
--proxyoption to specify proxy server for internet access. Enter a string such ashttp://127.0.0.1:7890. -
--resume:Use
--resumeoption to manually resume the process after an interruption.python3 make_book.py --book_name test_books/animal_farm.epub --model google --resume -
--translate-tags:epub is made of html files. By default, we only translate contents in
<p>. Use--translate-tagsto specify tags need for translation. Use comma to separate multiple tags. For example:--translate-tags h1,h2,h3,p,div -
--exclude-translate-tags:Use
--exclude-translate-tagsto exclude content within specified HTML tags from translation. This is useful for preserving code blocks, preformatted text, or other special content. Use comma to separate multiple tags. Default:sup,code. For example:--exclude-translate-tags code,preTip: Use
--exclude-translate-tags ""to translate all content including code blocks (overrides the default exclusion). -
--book_from:Use
--book_fromoption to specify e-reader type (Now onlykobois available), and use--device_pathto specify the mounting point. -
--api_base:If you want to change api_base like using Cloudflare Workers, use
--api_base <URL>to support it. Note: the api url should be ‘https://xxxx/v1’. Quotation marks are required. -
--allow_navigable_strings:If you want to translate strings in an e-book that aren’t labeled with any tags, you can use the
--allow_navigable_stringsparameter. This will add the strings to the translation queue. Note that it’s best to look for e-books that are more standardized if possible. -
--prompt:To tweak the prompt, use the
--promptparameter. Valid placeholders for theuserrole template include{text}and{language}. It supports a few ways to configure the prompt:-
If you don’t need to set the
systemrole content, you can simply set it up like this:--prompt "Translate {text} to {language}."or--prompt prompt_template_sample.txt(example of a text file can be found at ./prompt_template_sample.txt). -
If you need to set the
systemrole content, you can use the following format:--prompt '{"user":"Translate {text} to {language}", "system": "You are a professional translator."}'or--prompt prompt_template_sample.json(example of a JSON file can be found at ./prompt_template_sample.json). -
You can now use PromptDown format (
.mdfiles) for more structured prompts:--prompt prompt_md.prompt.md. PromptDown supports both traditional system messages and developer messages (used by newer AI models). Example:# Translation Prompt ## Developer Message You are a professional translator who specializes in accurate translations. ## Conversation | Role | Content | | ---- | -------------------------------------------------------------- | | User | Please translate the following text into {language}:\n\n{text} | -
You can also set the
userandsystemrole prompt by setting environment variables:BBM_CHATGPTAPI_USER_MSG_TEMPLATEandBBM_CHATGPTAPI_SYS_MSG.
-
-
--batch_size:Use the
--batch_sizeparameter to specify the number of lines for batch translation (default is 10, currently only effective for txt files). -
--accumulated_num:Wait for how many tokens have been accumulated before starting the translation. gpt3.5 limits the total_token to 4090. For example, if you use
--accumulated_num 1600, maybe openai will output 2200 tokens and maybe 200 tokens for other messages in the system messages user messages, 1600+2200+200=4000, So you are close to reaching the limit. You have to choose your own value, there is no way to know if the limit is reached before sending -
--use_context:prompts the model to create a three-paragraph summary. If it’s the beginning of the translation, it will summarize the entire passage sent (the size depending on
--accumulated_num). For subsequent passages, it will amend the summary to include details from the most recent passage, creating a running one-paragraph context payload of the important details of the entire translated work. This improves consistency of flow and tone throughout the translation. This option is available for all ChatGPT-compatible models and Gemini models. -
--context_paragraph_limit:Use
--context_paragraph_limitto set a limit on the number of context paragraphs when using the--use_contextoption. -
--parallel-workers:Use
--parallel-workersto enable parallel EPUB chapter processing. Values greater than1spin up multiple workers (recommended:2-4) and automatically fall back to sequential mode for single-chapter books. -
--temperature:Use
--temperatureto set the temperature parameter forchatgptapi/gpt4/claudemodels. For example:--temperature 0.7. -
--block_size:Use
--block_sizeto merge multiple paragraphs into one block. This may increase accuracy and speed up the process. For example:--block_size 5. -
--single_translate:Use
--single_translateto output only the translated book without creating a bilingual version. -
--translation_style:example:
--translation_style "color: #808080; font-style: italic;" -
--retranslate "$translated_filepath" "file_name_in_epub" "start_str" "end_str"(optional):Retranslate from start_str to end_str’s tag:
python3 "make_book.py" --book_name "test_books/animal_farm.epub" --retranslate 'test_books/animal_farm_bilingual.epub' 'index_split_002.html' 'in spite of the present book shortage which' 'This kind of thing is not a good symptom. Obviously'Retranslate start_str’s tag:
python3 "make_book.py" --book_name "test_books/animal_farm.epub" --retranslate 'test_books/animal_farm_bilingual.epub' 'index_split_002.html' 'in spite of the present book shortage which' -
--extra_body:Pass additional JSON parameters to the API. This is useful for models that support extra configuration options. Provide a JSON string with the desired parameters.
python3 make_book.py --book_name test_books/animal_farm.epub --openai_key ${openai_key} --extra_body '{"chat_template_kwargs": {"enable_thinking": false}}' -
--provider:Use a custom provider defined in
bbm_providers.json. Mutually exclusive with--model. See the “Custom API Provider” section above. -
--api_key:API key for custom providers (used with
--provider). Can also be set via theenv_keyfield in the provider config.
Examples
Note if use pip install bbook_maker all commands can change to bbook_maker args
# Test quickly
python3 make_book.py --book_name test_books/animal_farm.epub --openai_key ${openai_key} --test --language zh-hans
# Test quickly for src
python3 make_book.py --book_name test_books/Lex_Fridman_episode_322.srt --openai_key ${openai_key} --test
# Or translate the whole book
python3 make_book.py --book_name test_books/animal_farm.epub --openai_key ${openai_key} --language zh-hans
# Or translate the whole book using Gemini flash
python3 make_book.py --book_name test_books/animal_farm.epub --gemini_key ${gemini_key} --model gemini
# Translate an EPUB with parallel chapter processing
python3 make_book.py --book_name test_books/animal_farm.epub --openai_key ${openai_key} --parallel-workers 4
# Use a specific list of Gemini model aliases
python3 make_book.py --book_name test_books/animal_farm.epub --gemini_key ${gemini_key} --model gemini --model_list gemini-2.5-flash,gemini-2.0-flash
# Set env OPENAI_API_KEY to ignore option --openai_key
export OPENAI_API_KEY=${your_api_key}
# Use the GPT-4 model with context to Japanese
python3 make_book.py --book_name test_books/animal_farm.epub --model gpt4 --use_context --language ja
# Use a specific OpenAI model alias
python3 make_book.py --book_name test_books/animal_farm.epub --model openai --model_list gpt-4-1106-preview --openai_key ${openai_key}
**Note** you can use other `openai like` model in this way
python3 make_book.py --book_name test_books/animal_farm.epub --model openai --model_list yi-34b-chat-0205 --openai_key ${openai_key} --api_base "https://api.lingyiwanwu.com/v1"
# Use a specific list of OpenAI model aliases
python3 make_book.py --book_name test_books/animal_farm.epub --model openai --model_list gpt-4-1106-preview,gpt-4-0125-preview,gpt-3.5-turbo-0125 --openai_key ${openai_key}
# Use the DeepL model with Japanese
python3 make_book.py --book_name test_books/animal_farm.epub --model deepl --deepl_key ${deepl_key} --language ja
# Use the Claude model with Japanese
python3 make_book.py --book_name test_books/animal_farm.epub --model claude --claude_key ${claude_key} --language ja
# Use the CustomAPI model with Japanese
python3 make_book.py --book_name test_books/animal_farm.epub --model customapi --custom_api ${custom_api} --language ja
# Use a custom provider (e.g. DeepSeek)
python3 make_book.py --book_name test_books/animal_farm.epub --provider deepseek --api_key sk-xxx --language ja
# Translate contents in <div> and <p>
python3 make_book.py --book_name test_books/animal_farm.epub --translate-tags div,p
# Tweaking the prompt
python3 make_book.py --book_name test_books/animal_farm.epub --prompt prompt_template_sample.txt
# or
python3 make_book.py --book_name test_books/animal_farm.epub --prompt prompt_template_sample.json
# or
python3 make_book.py --book_name test_books/animal_farm.epub --prompt "Please translate \`{text}\` to {language}"
# Translate books download from Rakuten Kobo on kobo e-reader
python3 make_book.py --book_from kobo --device_path /tmp/kobo
# translate txt file
python3 make_book.py --book_name test_books/the_little_prince.txt --test --language zh-hans
# aggregated translation txt file
python3 make_book.py --book_name test_books/the_little_prince.txt --test --batch_size 20
# Using Caiyun model to translate
# (the api currently only support: simplified chinese <-> english, simplified chinese <-> japanese)
# the official Caiyun has provided a test token (3975l6lr5pcbvidl6jl2)
# you can apply your own token by following this tutorial(https://bobtranslate.com/service/translate/caiyun.html)
python3 make_book.py --model caiyun --caiyun_key 3975l6lr5pcbvidl6jl2 --book_name test_books/animal_farm.epub
# Set env BBM_CAIYUN_API_KEY to ignore option --openai_key
export BBM_CAIYUN_API_KEY=${your_api_key}
More understandable example
python3 make_book.py --book_name 'animal_farm.epub' --openai_key sk-XXXXX --api_base 'https://xxxxx/v1'
# Or python3 is not in your PATH
python make_book.py --book_name 'animal_farm.epub' --openai_key sk-XXXXX --api_base 'https://xxxxx/v1'
Microsoft Azure Endpoints
python3 make_book.py --book_name 'animal_farm.epub' --openai_key XXXXX --api_base 'https://example-endpoint.openai.azure.com' --deployment_id 'deployment-name'
# Or python3 is not in your PATH
python make_book.py --book_name 'animal_farm.epub' --openai_key XXXXX --api_base 'https://example-endpoint.openai.azure.com' --deployment_id 'deployment-name'
Docker
You can use Docker if you don’t want to deal with setting up the environment.
# Build image
docker build --tag bilingual_book_maker .
# Run container
# "$folder_path" represents the folder where your book file locates. Also, it is where the processed file will be stored.
# Windows PowerShell
$folder_path=your_folder_path # $folder_path="C:\Users\user\mybook\"
$book_name=your_book_name # $book_name="animal_farm.epub"
$openai_key=your_api_key # $openai_key="sk-xxx"
$language=your_language # see utils.py
docker run --rm --name bilingual_book_maker --mount type=bind,source=$folder_path,target='/app/test_books' bilingual_book_maker --book_name "/app/test_books/$book_name" --openai_key $openai_key --language $language
# Linux
export folder_path=${your_folder_path}
export book_name=${your_book_name}
export openai_key=${your_api_key}
export language=${your_language}
docker run --rm --name bilingual_book_maker --mount type=bind,source=${folder_path},target='/app/test_books' bilingual_book_maker --book_name "/app/test_books/${book_name}" --openai_key ${openai_key} --language "${language}"
For example:
# Linux
docker run --rm --name bilingual_book_maker --mount type=bind,source=/home/user/my_books,target='/app/test_books' bilingual_book_maker --book_name /app/test_books/animal_farm.epub --openai_key sk-XXX --test --test_num 1 --language zh-hant
Notes
- API token from free trial has limit. If you want to speed up the process, consider paying for the service or use multiple OpenAI tokens
- PR is welcome
Thanks
Contribution
- Any issues or PRs are welcome.
- TODOs in the issue can also be selected.
- Please run
black make_book.py2 before submitting the code.
Others better
- 书译 BookTranslator -> Book Translator
Appreciation
Thank you, that’s enough.

https://platform.openai.com/account/api-keys
https://github.com/psf/black
相似文章
@cevenif: 还在一段段复制粘贴翻译电子书?你可能已经浪费了大量时间。 发现一个开源神器,直接把整本书丢进去就完事了:TranslateBookWithLLM 支持 EPUB 电子书、SRT 字幕、DOCX 文档、纯文本等常见格式 本地 Ollama …
TranslateBookWithLLM 是一个开源桌面应用,支持使用本地 Ollama 或云端 API 翻译 EPUB、SRT、DOCX 等格式的文档,保留原始排版并支持断点续传。
@Jolyne_AI: 一个能自动读懂 PDF 书籍的 Python 脚本:AI Reads Books。 把 PDF 丢进去,运行即可按页解析内容,抓取关键知识点,自动生成结构清晰的 Markdown 摘要。 GitHub:https://github.com…
一个 Python 脚本,能自动解析 PDF 书籍内容,提取关键知识点并生成 Markdown 格式的摘要,旨在提升阅读和知识整理效率。
@wsl8297: 想把电子书或文档做成有声书?很多工具不是声音太“机器人”,就是不支持字幕同步,折腾一圈还是不满意。 我后来发现了开源项目 Abogen:支持 ePub、PDF、纯文本等,一键转高质量音频,还能自动生成同步字幕。 它底层用 Kokoro 语…
Abogen 是一个开源工具,可将 ePub、PDF 等文档一键转为高质量音频,并自动生成同步字幕,支持语音混合器和多种部署方式。
@JiweiYuan: 最近做了一款 Mac 原生的 AI 阅读工具 OakReader。读 PDF 论文/电子书,浏览网页的时候,遇到困惑,一个按钮打开侧边栏,圈中一段文字就能和你喜欢的 AI 模型讨论问题,再也不用切到 ChatGPT / Claude / …
OakReader是一款Mac原生的AI阅读工具,支持PDF论文/电子书和网页阅读,内置侧边栏AI对话、笔记、翻译、浏览器和文献管理功能,可配置多种AI模型。
@VincentLogic: LibreTranslate,一个完全离线运行的 AI 翻译工具,数据不出你的电脑 不需要 API Key,没有用量限制,装一次永久使用 跟 Google 翻译最大的区别不是速度,是隐私 你往 Google 翻译里粘贴的每一句话——合同条…
LibreTranslate 是一个完全离线运行的 AI 翻译工具,数据不出本机,不需要 API Key,无用量限制,支持 40 种语言和 5 分钟自部署,适用于对隐私有高要求的场景。