Files
Podcast-Generator/README.md
hex2077 c2930e4340 feat(api): 新增FastAPI服务接口及完善TTS配置管理
实现FastAPI服务接口,支持播客生成任务提交、状态查询和音频下载功能
重构TTS配置管理,统一处理不同TTS服务商的API URL配置
更新README文档,添加API使用说明和项目徽章
添加定时清理输出目录功能,优化资源管理
2025-08-11 22:09:18 +08:00

279 lines
11 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 🎙️ 简易播客生成器 (Simple Podcast Generator)
> 轻松将您的想法,一键生成为生动有趣的多人对话播客!
> [English Version](README_EN.md)
这是一个强大的脚本工具,它利用 **OpenAI API** 的智慧生成富有洞察力的播客脚本,并通过 **TTS (Text-to-Speech)** API服务将冰冷的文字转化为有温度的音频。您只需提供一个主题剩下的交给它
✨ 本项目的播客脚本生成逻辑深受 [SurfSense](https://github.com/MODSetter/SurfSense) 项目的启发,在此向其开源贡献表示衷心感谢!
---
## ✨ 核心亮点
* **🤖 AI 驱动脚本**: 借助强大的 OpenAI 模型,自动创作高质量、有深度的播客对话脚本。
* **👥 多角色支持**: 自由定义多个播客角色(如主持、嘉宾),并为每个角色指定独一无二的 TTS 语音。
* **🔌 灵活的 TTS 集成**: 通过简单的 API URL 配置,无缝对接您自建的或第三方的 TTS 服务。
* **🔊 智能音频合成**: 自动将各个角色的语音片段精准拼接,并支持**音量与语速调整**,合成一个完整的、流畅的播客音频文件 (`.wav` 格式)。
* **⌨️ 便捷的命令行接口**: 提供清晰的命令行参数,让您对播客生成过程的每一个环节都了如指掌。
---
## 🛠️ 安装指南
### 📝 前提条件
1. **Python 3.x**
* 请确保您的系统中已安装 Python 3。
2. **FFmpeg**
* 本项目依赖 FFmpeg 进行音频合并。请访问 [FFmpeg 官网](https://ffmpeg.org/download.html) 下载并安装。
* **重要提示**: 安装完成后,请确保 `ffmpeg` 命令已添加到您系统的环境变量 (PATH) 中,以便脚本可以正常调用。
### 🐍 Python 依赖
打开您的终端或命令提示符,使用 pip 安装所需的 Python 库:
```bash
pip install requests openai pydub msgpack
```
> **依赖说明**:
> - `requests`: 用于向TTS服务API发送HTTP请求
> - `openai`: 用于与OpenAI API交互生成播客脚本
> - `pydub`: 用于音频处理,如调整音量和语速
> - `msgpack`: 用于与某些TTS服务如Fish Audio进行高效的数据序列化
---
## 🚀 快速开始
### 1. 准备输入文件
在运行前,请确保以下文件已准备就绪:
* `input.txt`: 在此文件中输入您想讨论的**播客主题**或核心观点。
* `prompt/prompt-overview.txt`: 用于指导 AI 生成播客**整体大纲**的系统提示。
* `prompt/prompt-podscript.txt`: 用于指导 AI 生成**详细对话脚本**的系统提示。它包含动态占位符(如 `{{numSpeakers}}`, `{{turnPattern}}`),脚本会自动替换。
### 2. 配置 TTS 服务与角色
* `config/` 目录下存放您的 TTS 配置文件(例如 `edge-tts.json`)。该文件定义了 TTS 服务的 API 接口、播客角色 (`podUsers`) 及其对应的语音 (`voices`)。
### 3. 运行脚本
在项目根目录下执行以下命令:
```bash
python podcast_generator.py [可选参数]
```
#### **可选参数**
* `--api-key <YOUR_OPENAI_API_KEY>`: 您的 OpenAI API 密钥。若不提供,将从配置文件或 `OPENAI_API_KEY` 环境变量中读取。
* `--base-url <YOUR_OPENAI_BASE_URL>`: OpenAI API 的代理地址。若不提供,将从配置文件或 `OPENAI_BASE_URL` 环境变量中读取。
* `--model <OPENAI_MODEL_NAME>`: 指定使用的 OpenAI 模型(如 `gpt-4o`, `gpt-4-turbo`)。默认值为 `gpt-3.5-turbo`
* `--threads <NUMBER_OF_THREADS>`: 指定生成音频的并行线程数(默认为 `1`),提高处理速度。
#### **运行示例**
```bash
# 使用 gpt-4o 模型、edge-tts 服务和 4 个线程来生成播客
python podcast_generator.py --api-key sk-xxxxxx --model gpt-4o --tts-provider edge --threads 4
```
### 5. 使用 Web API (main.py)
本项目还提供了一个基于 FastAPI 的 Web 服务,允许您通过 HTTP 请求生成播客。
#### 启动 Web 服务
```bash
python main.py
```
默认情况下,服务将在 `http://localhost:8000` 上运行。
#### API 端点
1. **生成播客** - `POST /generate-podcast`
- 参数:
- `api_key`: OpenAI API 密钥
- `base_url`: OpenAI API 基础 URL (可选)
- `model`: OpenAI 模型名称 (可选)
- `input_txt_content`: 输入文本内容
- `tts_providers_config_content`: TTS 提供商配置内容
- `podUsers_json_content`: 播客用户 JSON 配置
- `threads`: 线程数 (可选,默认为 1)
- `tts_provider`: TTS 提供商名称 (可选,默认为 "index-tts")
2. **获取播客生成状态** - `GET /podcast-status`
- 需要提供 `X-Auth-Id` 头部
3. **下载播客** - `GET /download-podcast/`
- 参数:
- `file_name`: 要下载的文件名
4. **获取语音列表** - `GET /get-voices`
- 参数:
- `tts_provider`: TTS 提供商名称 (可选,默认为 "tts")
#### API 使用示例
```bash
# 启动服务后,使用 curl 发送请求生成播客
curl -X POST "http://localhost:8000/generate-podcast" \
-H "X-Auth-Id: your-auth-id" \
-F "api_key=sk-xxxxxx" \
-F "model=gpt-4o" \
-F "input_txt_content=人工智能的未来发展" \
-F "tts_providers_config_content={\"index\": {\"api_key\": \"your-api-key\"}}" \
-F "podUsers_json_content=[{\"code\":\"zh-CN-XiaoxiaoNeural\",\"role\":\"主持人\"}],\"voices\":[{\"name\":\"Xiaoxiao\",\"code\":\"zh-CN-XiaoxiaoNeural\"}]" \
-F "threads=4" \
-F "tts_provider=index-tts"
```
### 4. 自定义 AI 提示词 (`custom` 代码块)
为了提供更细致的 AI 指令或添加特定上下文,您可以在 `input.txt` 文件中嵌入 `custom` 代码块。此代码块中的内容将作为额外指示,被内置到播客脚本生成的核心提示词(`prompt-podscript.txt`)之中,从而影响 AI 的生成行为。
**使用方法**
`input.txt` 文件的任意位置,使用以下格式定义您的自定义内容:
```
```custom-begin
您希望提供给 AI 的额外指令或上下文,例如:
- “请确保讨论中包含对 [特定概念] 的深入分析。”
- “请在对话中加入一些幽默元素,特别是关于 [某个主题] 的笑话。”
- “所有角色的发言都必须是简短的,并且每句话不超过两行。”
```custom-end
```
---
## ⚙️ 配置文件详解
### `config/[tts-provider].json` (TTS 角色与语音配置)
这是您的 TTS 核心配置文件,文件名与您通过 `--tts-provider` 参数指定的提供商对应。它告诉脚本如何与 TTS 服务协同工作。
```json
{
"podUsers": [
{
"code": "zh-CN-XiaoxiaoNeural",
"role": "主持人"
},
{
"code": "zh-CN-YunxiNeural",
"role": "技术专家"
}
],
"voices": [
{
"name": "XiaoMin",
"code": "yue-CN-XiaoMinNeural",
"volume_adjustment": 1.0,
"speed_adjustment": 5.0
}
],
"apiUrl": "http://localhost:5000/api/tts?text={{text}}&voiceCode={{voiceCode}}",
"turnPattern": "random",
"tts_max_retries": 3
}
```
* `podUsers`: 定义播客中的**角色**。每个角色的 `code` 必须对应 `voices` 列表中的一个有效语音。
* `voices`: 定义所有可用的 TTS **语音**
* `volume_adjustment` (可选): 音量调整 (dB)。例如 `6.0` 增加 6dB。
* `speed_adjustment` (可选): 语速调整 (%)。例如 `10.0` 增加 10% 语速。
* `apiUrl`: 您的 TTS 服务 API 端点。`{{text}}``{{voiceCode}}` 是占位符。
* `turnPattern`: 定义角色对话的**轮流模式**,例如 `random` (随机) 或 `sequential` (顺序)。
* `tts_max_retries` (可选): TTS API 调用失败时的最大重试次数(默认为 `3`)。
### `config/tts_providers.json` (TTS 服务商认证)
此文件用于统一管理所有 TTS 服务提供商的认证信息(如 API 密钥)。
```json
{
"index": { "api_key": null },
"edge": { "api_key": null },
"doubao": { "X-Api-App-Id": "null", "X-Api-Access-Key": "null" },
"fish": { "api_key": "null" },
"minimax": { "group_id": "null", "api_key": "null" },
"gemini": { "api_key": "null" }
}
```
**注意**: 实际使用时,请将 `"null"` 替换为有效的认证信息。可以创建一个 `tts_providers-local.json` 来存放真实密钥,此文件已被 `.gitignore` 忽略。
---
## 🔌 支持的 TTS 服务
本项目设计为高度灵活,支持多种 TTS 服务。
| 服务商 | 类型 | 支持状态 |
| :--- | :--- | :---: |
| **Index-TTS** | 本地 | ✅ 已支持 |
| **Edge-TTS** | 本地 | ✅ 已支持 |
| **豆包 (Doubao)** | 网络 | ✅ 已支持 |
| **Minimax** | 网络 | ✅ 已支持 |
| **Fish Audio**| 网络 | ✅ 已支持 |
| **Gemini** | 网络 | ✅ 已支持 |
| **OpenAI TTS**| 网络 | 计划中 |
| **Azure TTS** | 网络 | 计划中 |
---
## 🎉 输出成果
所有成功生成的播客音频文件将自动保存在 `output/` 目录下。文件名格式为 `podcast_` 加上生成时的时间戳,例如 `podcast_1678886400.wav`
---
## 🎧 示例音频
您可以在 `example/` 文件夹中找到使用不同 TTS 服务生成的播客示例音频。
| TTS 服务 | 试听链接 |
| :--- | :--- |
| **Edge TTS** | [▶️ edgeTTS.wav](example/edgeTTS.wav) |
| **Index TTS** | [▶️ indexTTS.wav](example/indexTTS.wav) |
| **豆包 TTS** | [▶️ doubaoTTS.wav](example/doubaoTTS.wav) |
| **Minimax** | [▶️ minimax.wav](example/minimax.wav) |
| **Fish Audio**| [▶️ fish.wav](example/fish.wav) |
| **Gemini TTS**| [▶️ geminiTTS.wav](example/geminiTTS.wav) |
---
## 📂 文件结构
```
.
├── config/ # ⚙️ 配置文件目录
│ ├── doubao-tts.json # ... (各 TTS 服务商的配置)
│ └── tts_providers.json # 统一的 TTS 认证文件
├── prompt/ # 🧠 AI 提示词目录
│ ├── prompt-overview.txt
│ └── prompt-podscript.txt
├── example/ # 🎧 示例音频目录
├── output/ # 🎉 输出音频目录
├── input.txt # 🎙️ 播客主题输入文件
├── openai_cli.py # OpenAI 命令行工具
├── podcast_generator.py # 🚀 主运行脚本
├── tts_adapters.py # TTS 适配器文件
├── README.md # 📄 项目说明文档 (中文)
└── README_EN.md # 📄 项目说明文档 (英文)
```
---
## 📝 免责声明
* **许可证**: 本项目采用 [GPL-3.0](https://www.gnu.org/licenses/gpl-3.0.html) 授权。
* **无担保**: 本软件按“现状”提供,不附带任何明示或暗示的担保。
* **责任限制**: 在任何情况下,作者或版权持有者均不对因使用本软件而产生的任何损害承担责任。
* **第三方服务**: 用户需自行承担使用第三方服务(如 OpenAI API、TTS 服务)的风险和责任。
* **使用目的**: 本项目仅供学习和研究目的使用,请遵守所有适用的法律法规。
* **最终解释权**: 我们保留随时修改本免责声明的权利。