目录

Book Podcast

把书籍内容加工成 N 人对话播客脚本(默认示例双人,独白 / 三人圆桌等同样支持, 角色由脚本自动识别并与当前 backend 段的 speakers 对账),并从 5 个 TTS 引擎里 任选其一生成完整音频:火山引擎 Podcast TTS(自有云)、小米 MiMo-V2.5-TTS(小米第三方云), 以及自托管开源引擎(CosyVoice3 / Fish-Speech / IndexTTS2,远程 GPU)。

书籍/资料 ─(人工 + skill 提示词)─► MD 播客脚本
                                    │
                                    ▼  md_to_tts_json.py
                              TTS JSON(角色/情绪/停顿/重音标准化)
                                    │
            ┌───────────────────────┼───────────────────────┐
            ▼                       ▼                       ▼
    tts_json_to_podcast.py     cosyvoice_call.py        index_call.py
   (火山 WebSocket → MP3)    (CosyVoice3 → WAV)    (IndexTTS2 → WAV)
                                    │
                                    └─ fish_call.py(环境待修,脚本就绪)

当前状态

后端 实测 说明
火山 Podcast 主流程稳定,需要 .env 凭据
小米 MiMo 小米第三方云,OpenAI 风格,需 MIMO_API_KEY
CosyVoice3 远程 Fun-CosyVoice3-0.5B,instruct2 + 倍速可控
IndexTTS2 远程 indextts.api_serveremo_text 文本情绪
Fish-Speech ⚠️ 脚本就绪;远程 venv 是 CPU-only torch,服务起不来

目录结构

book_podcast/
├── README.md
├── docs/
│   ├── USER_MANUAL.md            # 用户手册 + 引擎接入与对比
│   ├── ARCHITECTURE.md           # 架构 + 数据流 + 数据结构契约
│   └── MAINTENANCE.md            # 维护交接 + 路线图
├── ebook/                        # 原始书籍资料(不参与构建)
├── samples/                      # 播客脚本样例
├── prompts/                      # 书 → 播客脚本提示词规范
└── app/
    ├── configs/                  # 角色 + 各后端的配置(config.yaml 及任务配置)
    ├── run.py                    # 统一入口:按 config.backend 路由到引擎
    ├── md_to_tts_json.py         # MD → TTS JSON 入口
    ├── md_transform.py           # MD 解析与文本规范化(纯函数)
    ├── tts_json_to_podcast.py    # 火山 WebSocket 后端(自有云)
    ├── cosyvoice_call.py         # CosyVoice3 入口(自托管)
    ├── fish_call.py              # Fish-Speech 入口(自托管)
    ├── index_call.py             # IndexTTS2 入口(自托管)
    ├── mimo_call.py              # 小米 MiMo-V2.5-TTS 入口(小米第三方云)
    ├── cosyvoice_assets/         # 默认 prompt wav(男声 + 女声)
    ├── tts_engines/              # 自托管 TTS 共享骨架
    │   ├── base.py               # Segment / render_podcast / WAV 工具
    │   ├── runner.py             # CLI 入口共享逻辑
    │   ├── cosyvoice.py          # CosyVoice3 客户端
    │   ├── fish.py               # Fish-Speech 客户端
    │   ├── index.py              # IndexTTS2 客户端
    │   └── mimo.py               # MiMo-V2.5-TTS 客户端
    ├── protocols/                # 火山 WebSocket 二进制协议
    ├── book_pipeline/            # epub → 分章工具
    ├── script/raw/               # 输入 MD 脚本
    ├── script/tts/               # 中间 TTS JSON
    ├── output/                   # 生成的音频
    └── tests/                    # 单元测试

快速开始

cd app
python3 -m venv .venv
.venv/bin/pip install -e '.[test]' requests soundfile numpy

# 1) MD → TTS JSON
.venv/bin/python md_to_tts_json.py --script script/raw/测试.md

# 2) 生成音频:统一入口按 config.backend 路由(改一行 config 就换引擎)
.venv/bin/python run.py --config configs/config.yaml
.venv/bin/python run.py --config configs/config.yaml --backend cosyvoice   # 临时覆盖

# 旧入口仍可用(按脚本名决定引擎):
.venv/bin/python tts_json_to_podcast.py --tts script/tts/测试_tts.json  # 火山
.venv/bin/python cosyvoice_call.py      --tts script/tts/测试_tts.json  # 本地 CosyVoice3

火山后端需要 .env(见 .env.example);本地后端需要先开 SSH 隧道到远程 GPU 主机, 详见 docs/USER_MANUAL.md

输入格式

阿强:[情绪:emphatic] 这就是**消费主义**最大的谎言。[停顿1s]它告诉你所有烦恼都能靠下一单解决。
小慧:[情绪:warm] 没错。真正的自由,不是买得起,而是不需要。

支持标记:

  • [情绪:calm|excited|questioning|emphatic|warm|sarcastic|serious|warm|thoughtful]
  • [停顿0.5s][停顿1s]
  • **重音词**[打断]

角色名必须出现在 config 当前 backend 段的 speakers 中。

测试

cd app
.venv/bin/python -m pytest tests          # 13 passed

安全注意事项

  • 不要提交 .envoutput/.venv/
  • config.yaml 只放非敏感内容。
  • 密钥若曾出现在共享系统或仓库,去火山控制台轮换。

文档索引

关于
1.0 MB
邀请码
    Gitlink(确实开源)
  • 加入我们
  • 官网邮箱:gitlink@ccf.org.cn
  • QQ群
  • QQ群
  • 公众号
  • 公众号

版权所有:中国计算机学会技术支持:开源发展技术委员会
京ICP备13000930号-9 京公网安备 11010802047560号