把一本书变成一档播客。
丢一本书进去,出来三个活人聊了 40 分钟。不是朗读,不是摘要,是三个人围绕同一本书展开真实对话——有争论、有跑题、有"等一下你说的这个我完全不同意"。
「三个人一本书」 已上线小宇宙,五本书、15 集、累计 10+ 小时:
| 书名 | 集数 | 时长 | 主题 |
|---|---|---|---|
| 《埃隆·马斯克传》 | 3 集 | 113 min | 从南非到星舰 |
| 《置身事内》 | 2 集 | 90 min | 中国政府与经济发展 |
| 《奥德赛》 | 3 集 | 170 min | 荷马史诗的现代解读 |
| 《第四消费时代》 | 3 集 | 132 min | 日本消费社会四十年 |
| 《纳瓦尔宝典》 | 3 集 | — | 财富与幸福的底层逻辑 |
🎧 在小宇宙搜索「三个人一本书」 · 每集 35-45 分钟 · 三人对谈 · AI TTS 合成
📖 一本书 (.pdf / .epub)
│
▼
extract → 提取章节结构 + 全文
│
▼
director → 自动设计三个播客人设 + 剧集规划
│
▼
scriptgen → 生成多集对话脚本(不是摘要,是对话)
│
▼
dedup → 三层去重 + 跨集概念回归检测
│
▼
review → Pro 模型 10 维度质量审查
│
▼
tts → mimo TTS 合成音频(换人 400ms 停顿)
│
▼
🎧 播客音频 (.mp3)
一行命令跑完:
python -m b2p your-book.pdf市面上大多数 AI 播客工具做的是摘要 + 朗读——把书的内容压缩成要点,然后用两个 AI 声音念出来。听上去像是在背课文。
book2podcast 做的是对话生成:
| 摘要朗读 | book2podcast | |
|---|---|---|
| 输出 | 两人交替念段落 | 三人围绕内容展开讨论 |
| 人设 | 无 | 每人有完整背景、性格、口头禅 |
| 节奏 | A→B→A→B(机械轮替) | 自然插话、跑题、追问 |
| 去重 | 无 | L0→L1→L2→L3 四层去重 |
| 质量控制 | 无 | Pro LLM 10 维度审查 |
| 跨集连贯 | 无 | 概念回归检测 + 关键词展开追踪 |
不是每本书都从零设计角色。book2podcast 维护一个角色库(characters/universe.yaml),同一个主持人/专家可以跨书复用:
- 老刘 — 前大厂技术管理,创业三次,对"成功学"叙事零容忍
- 小雨 — 牛津古典学博士,能把《奥德赛》讲得像八卦
- 阿楚 — 社会心理学背景,擅长用流行文化梗解释学术概念
每本书的 series.yaml 引用角色 ID + 叠加书本特定调整,角色音色锁定后不会漂移。
b2p/
├── extract.py # PDF/EPUB → chapters.json + book.txt
├── director.py # 角色设计 + 剧集规划
├── scriptgen.py # 对话脚本生成
├── dedup.py # L0→L1→L2 三层去重
├── review.py # Pro 模型 10 维审查
├── tts.py # mimo TTS 合成 + 交叉淡化
├── pipeline.py # 全流程编排
└── gen_tts.py # 独立 TTS CLI
每个模块可独立运行、独立调试。不满意某一步?单独重跑就行。
| 层级 | 方法 | 作用 |
|---|---|---|
| L0 | 句内 Jaccard | 检测同一句话前半段和后半段重复 |
| L1 | 字符级 n-gram Jaccard | 毫秒级,零依赖 |
| L2 | TF-IDF + cosine | 轻量语义匹配 |
| L3 | Pro LLM 全文复审 | 最终仲裁 |
| 跨集 | 概念回归检测 | 防止后续集重复解释前集已覆盖的概念 |
| 跨集 | 关键词展开追踪 | 提到术语后 2 轮内必须解释,否则标为 Critical |
# 1. 安装
git clone https://github.com/SPA3K/book2podcast.git
cd book2podcast
pip install -r requirements.txt
# 2. 配置 .env
cp .env.example .env
# 编辑 .env 填入 API Key
# 3. 生成播客
python -m b2p your-book.pdf
# 4. 只跑某一步?
python -m b2p.extract your-book.pdf output/my-book
python -m b2p.director output/my-book
python -m b2p.scriptgen output/my-book --episode 1
python -m b2p.gen_tts output/my-book/scripts/ep01_chunks.json output/my-book/audio/ep01.mp3 --characters output/my-book/characters.yamlLLM_API_KEY=sk-xxx # LLM(角色设计 + 脚本生成 + 审查)
LLM_BASE_URL=https://api.xiaomimimo.com/v1
LLM_MODEL=mimo-v2.5
MIMO_API_KEY=sk-xxx # TTS(可复用 LLM_API_KEY)pip install ebooklib pypdf beautifulsoup4 pyyaml pydub numpy python-dotenv
# MP3 导出需要 ffmpeg
apt install ffmpeg每本书的音频在 output/<book-name>/ 目录下,对话脚本可直接阅读(.md 格式)。
输出结构:
output/your-book/
├── book.txt # 全书文本
├── chapters.json # 章节结构
├── characters.yaml # 三人人设
├── series_plan.yaml # 剧集规划
├── scripts/
│ ├── ep01_chunks.json # 对话脚本(结构化)
│ └── ep01_script.md # 对话脚本(可读)
└── audio/
└── ep01.mp3 # 最终音频
| 问题 | 解决方案 |
|---|---|
| TTS voice_design 无效,所有人同音 | voice_design 放在 user message 里,不能用 voice 参数 |
| 对话太机械(A→B→C 轮替) | prompt 里明确"副咖连续 5 轮不说话是正常的" |
| 音频拼接有爆音 | 80ms fade-in/out + 换人 400ms 间隔 |
| 首集没有自我介绍 | E1 开头加 5-8 轮自然的互相介绍+调侃 |
| 后续集重复解释前集概念 | 概念回归检测自动标出 |
| 破折号——太多 | 人设里加硬规则:零容忍破折号 |
MIT