把一本书(Markdown 格式)喂给 AI,自动产出一整套学习材料:逐章总结、深入浅出的教案、核心知识点,乃至全书长文、有声书文稿和语音。
- TTS(语音合成):使用目前免费的 小米 MiMo-V2.5-TTS API(OpenAI 兼容接口),将听感文稿合成为自然流畅的语音
- OCR(图片替换为文本):默认调用 智谱 GLM-4.1v-thinking-flash 视觉模型,也可切换为 opencode.ai 网关的
mimo-v2.5-free视觉模型(免费),自动识别并描述书中的图片内容。
每个阶段都是一个独立的命令行脚本,可以单独运行,也可以串成流水线。底层基于 Claude Agent SDK 驱动 agent 逐章读原文、写产物,并可选切换到 Codex 作为后端。
| 书名 | 产出 |
|---|---|
| 西方现代思想讲义 (刘擎) | examples |
原书.md
├─ add_ocr 处理md中的图片,插入对图片的文字性描述,没有图片会自动跳过。
├─ book_summarize 逐章总结 → summaries/
├─ book_teach 生成教案 → <书目录>/NN-章节.md
├─ book_keypoints 提炼核心知识点 → keypoints/ + <书目录>/00-全书核心知识点.md
├─ book_skeleton 抽取目录骨架 → skeleton/
├─ book_breakdown 拆解全书框架 → <书目录>/<书名>_breakdown.md
├─ book_article 生成全书长文 → <书目录>/<书名>_article.md ⚠️ 实验中:脚本当前只把 prompt 复制到剪贴板,需手动跑 agent
├─ book_restyle 调整长文文风 → <书目录>/<书名>_restyled.md ⚠️ 依赖 book_article 产出
├─ book_audiobook 改写为听感文稿 → audiobook/NN-章节.md(基于教案)
├─ book_tts 合成 .wav 语音 → audio/NN-章节.wav(基于听感稿)
└─ book_epub 教案合集转 EPUB → <书目录>/<书名>_教案合集.epub
summarize 是其余多数阶段的基础:它会切分章节、生成 summaries/progress.json,后续脚本据此定位每章在原文中的行号范围。
需要 Python 3.10+。
pip install -r requirements.txt可选:若需进行文档格式转换(如 HTML/DOCX/EPUB → Markdown,或教案 → EPUB),请先安装 pandoc 本体:
conda install -c conda-forge pandocbook_epub.py 会自动查找 pandoc(优先 conda book-tutor 环境,其次系统 PATH,也可用 PANDOC_PATH 指定)。
若还需让智能体学会调用 pandoc 进行格式转换(如 HTML/DOCX → Markdown),可安装 pandoc skill:
npx -y skills add plinde/claude-plugins --skill pandoc --agent claude-code
本流水线只支持 .md 输入。若原始书籍是 EPUB,先用 data_process/ 下的脚本转换并清洗:
bash data_process/epub2md.sh "example1/资本论 作者:马克思.epub"
# 输出: 与 epub 同目录、同名 .md + Images/(图片自动解包)脚本依次完成:pandoc 转换 → 抽取图片 → 修正图片引用路径 → 清理 HTML/pandoc 残留([]{#...} 锚点、::: div 指令、[x]{.class} span 属性、{style=...} 等,详见 data_process/README.md)。也支持传入第二个参数指定输出路径。
手动分步执行时注意:pandoc 3.10 中
--atx-headers已改名为--markdown-headings=atx;--extract-media生成的图片引用可能多出一级目录或写成绝对路径,需统一修正为Images/xxx(一键脚本已处理)。
在运行前,需要在项目根目录创建 .env 文件,或通过环境变量配置以下 API Key:
| 变量名 | 说明 | 获取地址 |
|---|---|---|
OPENCODE_API_KEY |
opencode.ai OCR(mimo-v2.5-free,备选) | opencode.ai |
ZHIPU_API_KEY |
智谱 OCR(GLM-4.1v 视觉模型,默认) | GLM-4.1V-Thinking - 智谱AI开放文档 |
MIMO_API_KEY |
小米 MiMo-V2.5-TTS 文本转语音 | MiMo-TTS |
可选配置(按需):
| 变量名 | 说明 | 默认值 |
|---|---|---|
ANTHROPIC_AUTH_TOKEN |
Claude Agent SDK 认证 Token | - |
ANTHROPIC_BASE_URL |
Claude API 代理地址 | 未设置时走 SDK 内置默认 |
BOOK_TUTOR_AGENT_PROVIDER |
Agent 后端:claude 或 codex |
claude |
BOOK_TUTOR_CLAUDE_CLI |
Claude CLI 路径(不设置则用 SDK 捆绑版) | - |
LLM_MODEL |
各阶段使用的 LLM 模型 | claude-opus-4.7 |
BOOK_TUTOR_CODEX_BIN |
Codex CLI 可执行文件路径 | - |
BOOK_TUTOR_CODEX_SDK_PYTHON |
Codex SDK Python 路径 | - |
AGENT_MAX_RETRIES |
Claude Agent 调用最大重试次数 | 3 |
AGENT_RETRY_BACKOFF |
重试退避间隔(秒,逗号分隔) | 10,30,60 |
示例 .env:
OPENCODE_API_KEY=your_opencode_key_here
ZHIPU_API_KEY=your_zhipu_key_here
MIMO_API_KEY=your_mimo_key_here只支持 .md 输入。一条命令跑完全流程(OCR → 总结 → 教案 → 知识点 → 教案合集 EPUB):
# 一键跑完全部阶段
python book.py path/to/book.md
# 只跑总结 + 教案(跳过 OCR 和知识点)
python book.py path/to/book.md --skip-ocr --skip-keypoints
# 只跑教案(跳过 OCR 和总结)
python book.py path/to/book.md --skip-ocr --skip-summarize
# 不生成 EPUB(其余全部阶段)
python book.py path/to/book.md --skip-epub
# 单独跑某一步
python add_ocr.py "path/to/book.md" # 只跑 OCR(默认 zhipu,可 --ocr-provider mimo)
python book_summarize.py "path/to/book.md" # 只跑总结
python book_teach.py "path/to/book.md" # 只跑教案
python book_keypoints.py "path/to/book.md" # 只跑知识点
python book_epub.py "path/to/book.md" # 教案合集 → EPUB(需 pandoc)book_epub.py 说明:自动拼接 NN-*.md 教案(跳过 00-全书核心知识点)为一个临时文件,一次性把中文语境的英文直引号修复为中文弯引号(英文专名如 "alone" 保留直引号),再用 pandoc 转换为 EPUB。临时文件在书目录下生成以保证图片路径解析,转换后自动清理,原教案文件不被修改。输出为 <书目录>/<书名>_教案合集.epub,可用 --output 指定路径。book.py 在知识点阶段之后也会自动执行此步骤。
常用参数(多数脚本通用):
--seqs 1,3,5—— 只处理指定章节--start-seq N—— 从第 N 章开始(断点续传)--ratio 0.4—— 总结压缩比:每章总结 token = 本章原文 × ratio(默认 0.4,范围 0.05~1.0)--skip-ocr—— 跳过图片 OCR 描述--skip-summarize/--skip-teach/--skip-keypoints/--skip-epub—— 跳过对应阶段--ocr-provider zhipu|mimo—— OCR 服务商(默认 zhipu,opencode 作为备选)--ocr-concurrency N—— OCR 最大并发数(默认 5)--ocr-retries N—— OCR 每张图片重试次数(默认 3)
各脚本的完整参数见文件顶部 docstring 或 python <script>.py -h。
prompts/book_breakdown_lite.md(脚本实际加载的版本)改写自prompts/book_breakdown.md,后者基于 lijigang/ljg-skills 中的 skill 修改而来。- 代码部分借鉴forestpeas/book-tutor修改而来。