Skip to content

Repository files navigation

🎙️ book2podcast

把一本书变成一档播客。

丢一本书进去,出来三个活人聊了 40 分钟。不是朗读,不是摘要,是三个人围绕同一本书展开真实对话——有争论、有跑题、有"等一下你说的这个我完全不同意"。

📻 先听成品

「三个人一本书」 已上线小宇宙,五本书、15 集、累计 10+ 小时:

书名 集数 时长 主题
《埃隆·马斯克传》 3 集 113 min 从南非到星舰
《置身事内》 2 集 90 min 中国政府与经济发展
《奥德赛》 3 集 170 min 荷马史诗的现代解读
《第四消费时代》 3 集 132 min 日本消费社会四十年
《纳瓦尔宝典》 3 集 财富与幸福的底层逻辑

🎧 在小宇宙搜索「三个人一本书」 · 每集 35-45 分钟 · 三人对谈 · AI TTS 合成


⚡ 30 秒看懂流程

📖 一本书 (.pdf / .epub)
     │
     ▼
  extract    →  提取章节结构 + 全文
     │
     ▼
  director   →  自动设计三个播客人设 + 剧集规划
     │
     ▼
  scriptgen  →  生成多集对话脚本(不是摘要,是对话)
     │
     ▼
  dedup      →  三层去重 + 跨集概念回归检测
     │
     ▼
  review     →  Pro 模型 10 维度质量审查
     │
     ▼
  tts        →  mimo TTS 合成音频(换人 400ms 停顿)
     │
     ▼
  🎧 播客音频 (.mp3)

一行命令跑完:

python -m b2p your-book.pdf

🧬 为什么不是"AI读书摘要"

市面上大多数 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.yaml

环境变量

LLM_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 轮自然的互相介绍+调侃
后续集重复解释前集概念 概念回归检测自动标出
破折号——太多 人设里加硬规则:零容忍破折号

📄 License

MIT

About

把一本书变成一档三人播客。PDF/EPUB → 人设设计 → 对话脚本生成 → 四层去重 → Pro审查 → TTS合成。已上线小宇宙「三个人一本书」。

Topics

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages