豆包大模型 + 多音色 TTS + 混音 + 智能字幕
从创意到成品,只需 2 分钟 | 成本低至 ¥0.68/集
快速开始 • 案例展示 • 特性介绍 • 播客配置 • 成本说明
# 克隆项目
git clone https://github.com/uiuing/ai-podcast-workflow.git
cd ai-podcast-workflow
# 安装依赖
npm install
# 配置 API 密钥(.env)
# 开始生成
npm start风格:幽默对谈 | 时长:3分38秒 | 成本:¥0.68 | 音色:双人配音
✨ AI 根据播客内容自动生成的 1:1 方形封面图 (1024×1024)
|
🎙️ 音频信息 |
|
|
💬 精选对话片段(带时间轴) |
1
00:00:06,000 --> 00:00:20,200
侃然:哎哟喂,悦心你说这35岁危机是不是真的啊?我最近刷朋友圈,
全是30岁的人在那儿焦虑,说什么马上就要被职场淘汰了...
2
00:00:20,700 --> 00:00:33,700
悦心:哈哈,侃然你这还没到35呢就开始紧张啦?其实啊,35岁危机
这个说法,最早是从互联网行业传出来的...
...
16
00:03:17,200 --> 00:03:26,600
悦心:哈哈,可不是嘛!所以啊,别被年龄数字绑架,专注提升自己
才是王道。35岁不是终点,是新的起点呢!📄 完整字幕下载(3种格式自动生成):
|
|
📊 本案例实际成本拆解 |
||
| 项目 | 用量 | 成本 |
| 🤖 AI 文本生成 | ~6,000 tokens | ¥0.0158 |
| 🎨 封面图生成 | 1 张 (1024×1024) | ¥0.2000 |
| 🗣️ TTS 配音合成 | ~2,000 字符 (双音色) | ¥0.4617 |
| 🎵 BGM 混音处理 | 本地 FFmpeg 处理 | ¥0.0000 |
| 💎 总计 | 3分38秒完整播客 | ¥0.6775 |
| 📊 对比项 | ✅ 大模型方案 | ❌ 人工方案 |
| 制作速度 | ⚡ 2 分钟 | ⏳ 数小时 |
| 制作成本 | 💰 ¥0.68/集 | 💸 百元起 |
| 技术门槛 | 🎯 极简配置 | 🔧 需专业设备、环境、技能、经验 |
| 基础设施 | ✅ 电脑 | 📦 麦克风、声卡、耳机、环境、技能、经验 |
| 输出质量 | 🎨 专业级 | 📈 参差不齐 |
|
|
graph TD
A[💭 输入播客主题] --> B[🤖 步骤1: AI生成脚本]
B --> C[🎨 步骤2: 生成封面]
C --> D[🎵 步骤3: 合成音频]
D --> E[📝 步骤4: 生成字幕]
E --> F[✅ 完成!]
B -.显示.-> B1[💰 Token用量&成本]
C -.显示.-> C1[💰 图片大小&成本]
D -.显示.-> D1[💰 音频时长&成本]
E -.显示.-> E1[📄 字幕文件路径]
F -.输出.-> F1[🎵 MP3音频]
F -.输出.-> F2[🖼️ PNG封面]
F -.输出.-> F3[📝 SRT/VTT/TXT字幕]
style A fill:#e1f5ff
style B fill:#fff4e1
style C fill:#ffe1f5
style D fill:#e1ffe5
style E fill:#f5e1ff
style F fill:#90EE90
flowchart TB
subgraph INPUT["📥 输入层"]
A1[用户输入主题]
A2[选择风格/长度]
end
subgraph CLI["🎯 CLI交互层 cli.ts"]
B1[参数解析]
B2[配置验证]
end
subgraph WORKFLOW["🎬 工作流编排层 workflow.service.ts"]
C1[流程控制]
C2[成本统计]
C3[错误处理]
end
subgraph SERVICES["⚙️ 服务层"]
D1[DoubaoService<br/>豆包大模型]
D2[ImageService<br/>封面生成]
D3[TTSService<br/>语音合成]
D4[SubtitleService<br/>字幕生成]
D5[PodcastService<br/>配置管理]
end
subgraph CONFIG["📋 配置层"]
E1[podcast.config.json<br/>风格/长度配置]
E2[podcast-voices.json<br/>音色配置]
E3[model-pricing.config.json<br/>定价配置]
E4[ffmpeg.config.ts<br/>音频处理配置]
end
subgraph API["🌐 外部API"]
F1[火山引擎<br/>豆包大模型API]
F2[火山引擎<br/>图片生成API]
F3[火山引擎<br/>TTS API]
end
subgraph PROCESSING["🔧 本地处理"]
G1[FFmpeg<br/>音频混音]
G2[BGM处理<br/>前奏/尾奏]
G3[音频标准化]
end
subgraph OUTPUT["📁 输出层"]
H1[🎵 MP3音频文件]
H2[🖼️ PNG封面图片]
H3[📝 字幕文件<br/>SRT/VTT/TXT]
H4[💰 成本报告]
end
A1 --> B1
A2 --> B1
B1 --> B2
B2 --> C1
C1 --> D1
C1 --> D2
C1 --> D3
C1 --> D4
D1 --> F1
D2 --> F2
D3 --> F3
F1 -.返回脚本.-> D1
F2 -.返回图片.-> D2
F3 -.返回音频.-> D3
D1 --> D5
D2 --> D5
D3 --> G1
E1 --> D5
E2 --> D5
E3 --> C2
E4 --> G1
G1 --> G2
G2 --> G3
G3 --> H1
D2 --> H2
D4 --> H3
C2 --> H4
style INPUT fill:#e1f5ff
style CLI fill:#fff4e1
style WORKFLOW fill:#ffe1f5
style SERVICES fill:#e1ffe5
style CONFIG fill:#f5e1ff
style API fill:#ffebcc
style PROCESSING fill:#e5ccff
style OUTPUT fill:#90EE90
🔄 数据流说明
- 实线箭头 → 表示数据/控制流
- 虚线箭头 ⇢ 表示API响应
- 各层独立解耦,便于扩展和维护
|
AI 生成脚本 调用豆包大模型 💰 |
生成封面 根据提示词 💰 |
合成音频 多音色 TTS 配音 💰 |
生成字幕 SRT 格式 💰 |
| 特性 | 说明 |
|---|---|
| ✅ 零基础设施 | 无需数据库、Redis、消息队列等复杂组件 |
| ⚡ 极速生成 | 单个终端会话完成全流程,3分钟交付成品 |
| 💰 成本透明 | 每个步骤实时显示 API 成本,终端输出详细统计 |
| 📦 开箱即用 | 配置环境变量即可开始,无复杂部署流程 |
| 🎛️ 高度灵活 | 9种播客风格 × 3种时长 = 27种个性化组合 |
|
准备环境 安装 Node.js (≥18.x) 🎁 新用户有免费额度 |
安装配置 克隆项目 ⚡ 无需数据库等组件 |
开始生成 输入播客主题 ✅ 播客制作完成! |
🔧 安装 FFmpeg(音频处理必需)
Windows:
choco install ffmpegmacOS:
brew install ffmpegLinux:
sudo apt update && sudo apt install ffmpeg📦 克隆项目并安装依赖
# 克隆项目
git clone https://github.com/uiuing/ai-podcast-workflow.git
cd ai-podcast-workflow
# 安装依赖(选择其一)
npm install
# 或 yarn install
# 或 pnpm install💡 零依赖部署:无需数据库、Redis、消息队列等复杂基础设施!
🔑 配置环境变量
- 复制配置模板
cp .env.example .env- 编辑
.env文件,填入火山引擎 API 密钥:
# 豆包大模型配置
DOUBAO_API_KEY=your_doubao_api_key_here
# 图片生成配置
IMAGE_API_KEY=your_image_api_key_here
# TTS 语音合成配置
TTS_APP_ID=your_tts_app_id_here
TTS_ACCESS_TOKEN=your_tts_access_token_here- 获取 API 密钥:访问 火山引擎控制台 注册并创建密钥
|
🎯 交互式模式(推荐新手) npm start系统会引导你:
|
⚡ 命令行模式(适合批量/自动化) npm start -- \
--input "35岁危机真困境还是伪命题" \
--format standard \
--style humorous_dialogue一条命令搞定:
|
|
快闪洞察 📊 1200-2000 字 💡 适用场景:
|
沉浸解读 📊 2000-3000 字 💡 适用场景:
|
透彻剖析 📊 3000-4000 字 💡 适用场景:
|
|
|
|
🚇 通勤场景(5-10分钟轻松内容)
# 幽默对谈 - 轻松了解 AI 技术
npm start -- --input "ChatGPT 背后的技术原理" --format brief --style humorous_dialogue
# 热点解读 - 快速理解热点
npm start -- --input "元宇宙到底是什么" --format brief --style hot_topic📚 学习场景(10-15分钟系统内容)
# 深度访谈 - 系统学习新知识
npm start -- --input "区块链技术详解" --format standard --style interview
# 实战课堂 - 边听边学实践技能
npm start -- --input "Python 数据分析入门" --format standard --style tutorial🧠 深度场景(15-20分钟专业内容)
# 纪实探索 - 深度探究复杂主题
npm start -- --input "量子计算的现状与未来" --format deep --style documentary
# 思辨论坛 - 多角度分析问题
npm start -- --input "人工智能的伦理困境" --format deep --style debate🌙 睡前场景(温柔治愈内容)
# 深夜电台 - 治愈系播客
npm start -- --input "冥想与正念的科学" --format standard --style midnight_radio
# 故事剧场 - 睡前故事
npm start -- --input "宇宙的起源与演化" --format standard --style storytellingai-podcast-workflow/
├── src/
│ ├── cli.ts # 🎯 CLI 入口(命令行交互)
│ ├── config/
│ │ ├── config.ts # 配置管理(环境变量)
│ │ ├── ffmpeg.config.ts # FFmpeg 配置
│ │ ├── podcast.config.json # 播客格式和风格(9种×3种)
│ │ ├── podcast-voices.json # TTS 声音配置(多音色配音)
│ │ ├── model-pricing.config.json # API 定价配置(成本计算)
│ │ ├── audio-normalization.config.json # 音频标准化配置
│ │ └── bgm/ # 内置 BGM 音频文件
│ ├── services/
│ │ ├── workflow.service.ts # 🎬 工作流编排(核心逻辑)
│ │ ├── doubao.service.ts # 豆包大模型服务(AI 内容生成)
│ │ ├── image.service.ts # 图片生成服务(封面生成)
│ │ ├── tts.service.ts # TTS 语音合成服务(配音 + 口播)
│ │ ├── podcast.service.ts # 播客配置服务
│ │ └── model-config.service.ts # 模型配置和定价服务(成本计算)
│ ├── types/
│ │ ├── podcast.types.ts # 播客类型定义
│ │ ├── image.types.ts # 图片类型定义
│ │ └── index.ts # 类型导出
│ └── plugins/
│ └── volcengine/ # 火山引擎 TTS 插件
│ ├── protocols.ts
│ └── unidirectional_stream.ts
├── output/ # 📁 生成的文件输出目录
│ ├── audios/ # MP3 音频文件(配音 + BGM 混音)
│ ├── covers/ # PNG 封面图片
│ └── subtitles/ # 字幕文件(SRT/VTT/TXT)
├── .env.example # 环境变量模板
├── .gitignore # Git 忽略规则
├── LICENSE # MIT 许可证
├── package.json # 依赖配置(极简依赖)
├── tsconfig.json # TypeScript 配置
├── README.md # 本文档
├── QUICKSTART.md # 快速开始指南
├── CHANGELOG.md # 更新日志
└── PROJECT_SUMMARY.md # 项目改造总结
💡 核心特点:
- ✅ 无数据库 - 不需要 MySQL、PostgreSQL、MongoDB
- ✅ 无 Redis - 不需要缓存服务器
- ✅ 无消息队列 - 不需要 Bull、RabbitMQ、Kafka
- ✅ 无 Web 服务器 - 不需要 Express、Fastify
- ✅ 纯工作流 - 专注于 AI 播客生成流程,极简架构
- ✅ 终端输出 - 所有结果和成本实时输出到终端
基于实际生成的播客《35岁危机:真困境还是伪命题?》:
| 步骤 | API | 用量 | 单价 | 成本 |
|---|---|---|---|---|
| AI 文本生成 | 豆包大模型 | ~6,000 tokens | ¥0.26/万tokens | ¥0.0158 |
| 封面图生成 | 豆包 Seedream 4.0 | 1 张图 (1024×1024) | ¥0.20/张 | ¥0.2000 |
| TTS 配音合成 | 火山引擎 TTS | ~2,000 字符 | ¥23/万字符 | ¥0.4617 |
| BGM 混音 | FFmpeg(本地) | - | 免费 | ¥0.0000 |
| 总计 | - | - | - | ¥0.6775 |
💡 成本优化建议:
- 选择
brief格式(5-10分钟)可降低 TTS 成本 40%+- 使用 TTS 标准音色替代精品音色可降低成本
- 重复使用已生成的封面
- 批量生成多集播客分摊固定成本
🎁 新用户福利: 火山引擎新用户有免费额度,可免费生成多集播客!
📊 成本统计
AI 文本生成: ¥0.0158
封面图生成: ¥0.2000
TTS 音频合成: ¥0.4617
────────────────────────────────
总计: ¥0.6775
📁 输出文件
🎵 音频: output/audios/35岁危机真困境还是伪命题_1762311727550.mp3 (3分38秒)
🖼️ 封面: output/covers/35岁危机真困境还是伪命题_1762311727550.png
📝 字幕 (SRT): output/subtitles/35岁危机真困境还是伪命题_1762311727550.srt
📝 字幕 (VTT): output/subtitles/35岁危机真困境还是伪命题_1762311727550.vtt
📝 字幕 (TXT): output/subtitles/35岁危机真困境还是伪命题_1762311727550.txt
项目内置 无版权背景音乐,AI 会根据播客主题和风格自动选择最合适的 BGM:
| 类型 | 文件名 | 适用场景 |
|---|---|---|
| 访谈类 | interview-podcast-background-music-*.mp3 |
专业访谈、深度对话 |
| 爵士风格 | podcast-smooth-jazz-*.mp3 |
轻松对话、文化节目 |
| 轻松氛围 | aesthetic-boomopera-podcast-lofi-lounge-*.mp3 |
生活分享、深夜电台 |
| 节奏感强 | positive-hip-hop-beat-music-*.mp3 |
年轻话题、热点解读 |
| 通用 | intro-*.mp3, flow-*.mp3 |
各类播客通用 |
BGM 特性:
- ✅ 智能混音 - 自动调节 BGM 和人声音量
- ✅ 前奏/尾奏 - 可配置播放时长
- ✅ 专业效果 - 媲美人工后期制作
- ✅ 无版权风险 - 可自由添加自己的 BGM
项目自动生成 3 种格式的字幕文件,适配不同播放场景:
| 格式 | 文件扩展名 | 适用场景 | 特性 |
|---|---|---|---|
| SRT | .srt |
通用播放器 | 最通用的字幕格式,支持几乎所有播放器 |
| VTT | .vtt |
Web 播放器 | HTML5 视频标准字幕格式,支持样式 |
| TXT | .txt |
文本阅读 | 纯文本格式,带时间戳和说话人标注 |
字幕内容示例(SRT):
1
00:00:05,000 --> 00:00:12,400
主持人:大家好,欢迎来到今天的播客节目。
2
00:00:12,900 --> 00:00:20,300
嘉宾:很高兴能参加这期节目。
3
00:00:20,800 --> 00:00:35,600
主持人:今天我们要聊的话题是人工智能的伦理问题。
字幕特性:
- ✅ 时间轴同步 - 根据语音时长自动计算时间戳
- ✅ 说话人标注 - 每句字幕标明说话人姓名
- ✅ 智能断句 - 按对话轮次自然分割
- ✅ 多格式支持 - 同时生成 SRT/VTT/TXT 三种格式
- ✅ 开箱即用 - 无需额外配置,自动生成
编辑 src/config/podcast-voices.json,添加你的声音配置:
{
"id": "custom_voice_01",
"name": "BV001_streaming",
"originalName": "通用女声",
"description": "温柔的女声,适合讲故事",
"gender": "female",
"lang": "zh-CN",
"model": "streaming"
}编辑 src/config/podcast.config.json:
{
"audio_mixing": {
"bgm_volume": 0.25, // BGM 音量 (0.0-1.0)
"voice_volume": 1.0 // 人声音量 (0.0-1.0)
}
}编辑 src/config/audio-normalization.config.json:
{
"normalization": {
"enabled": true,
"mode": "loudnorm" // 或 "compressor"
},
"loudnorm": {
"I": -16, // 目标响度 (dB)
"TP": -1.5, // 真峰值限制 (dB)
"LRA": 11 // 响度范围 (dB)
}
}npm run buildnpm testnpm run lintnpm start -- [选项]
选项:
-i, --input <text> 播客主题(必填)
-f, --format <type> 播客格式: brief | standard | deep (默认: standard)
-s, --style <type> 播客风格: humorous_dialogue | manzai | storytelling
interview | debate | tutorial | documentary
hot_topic | midnight_radio (默认: interview)
-o, --output <dir> 输出目录 (默认: ./output)
-v, --verbose 显示详细日志
-h, --help 显示帮助信息# 基础用法
npm start -- --input "人工智能的伦理问题"
# 完整配置
npm start -- \
--input "ChatGPT 如何改变我们的工作方式" \
--format standard \
--style interview \
--output ./my-podcasts \
--verbose
# 快速模式(短播客 + 幽默风格)
npm start -- -i "什么是元宇宙" -f brief -s manzai这个纯工作流案例适合:
- 📚 学习 AI 应用开发 - 完整的端到端实现,无复杂基础设施,适合学习和参考
- 🚀 快速原型开发 - 零部署成本,快速验证 AI 播客生成想法
- 🎨 二次开发 - 清晰的模块化设计,易于定制和扩展(添加数据库、Web API 等)
- 📖 技术分享 - 展示如何整合豆包大模型、TTS、音频处理等 AI 服务
- 🎓 教学演示 - 直观的终端输出和成本统计,适合课堂演示
- 🎙️ 个人播客制作 - 支持 BGM、配音、口播,快速生成专业播客内容
- 🔧 工作流研究 - 纯工作流实现,专注于 AI 服务编排和流程设计
编辑 src/config/podcast-voices.json,添加你的声音配置:
{
"id": "custom_voice_01",
"name": "BV001_streaming",
"originalName": "通用女声",
"description": "温柔的女声,适合讲故事",
"gender": "female",
"lang": "zh-CN",
"model": "streaming"
}编辑 src/config/podcast.config.json:
{
"audio_mixing": {
"bgm_volume": 0.25, // BGM 音量 (0.0-1.0)
"voice_volume": 1.0 // 人声音量 (0.0-1.0)
}
}编辑 src/config/audio-normalization.config.json:
{
"normalization": {
"enabled": true,
"mode": "loudnorm" // 或 "compressor"
},
"loudnorm": {
"I": -16, // 目标响度 (dB)
"TP": -1.5, // 真峰值限制 (dB)
"LRA": 11 // 响度范围 (dB)
}
}npm run buildnpm run devnpm run prod欢迎提交 Issue 和 Pull Request!
- Fork 本仓库
- 创建你的特性分支 (
git checkout -b feature/AmazingFeature) - 提交你的更改 (
git commit -m 'Add some AmazingFeature') - 推送到分支 (
git push origin feature/AmazingFeature) - 打开一个 Pull Request
Q: 为什么不使用数据库?
A: 这是一个纯工作流案例,重点展示 AI 播客生成的完整流程。去除数据库、Redis、消息队列等复杂基础设施,让项目更简单、易学习、易部署。所有结果输出到文件和终端,成本透明可见。如果需要用户系统、任务管理等功能,可以在此基础上添加数据库支持。
Q: 成本会很高吗?
A: 非常低!根据真实案例,生成一集 3-4 分钟的播客(包含 BGM、双音色配音、封面、字幕)约 ¥0.68。火山引擎新用户还有免费额度,可以免费生成多集播客。所有成本实时显示在终端。你可以通过使用更短的格式、标准音色等方式进一步降低成本。
Q: 支持哪些播客形式?
A: 支持多种形式:
- 单人口播 - 一人讲述,适合知识分享、故事讲述
- 双人对话 - 两人对话,适合访谈、讨论
- 多人讨论 - 三人以上,适合圆桌讨论、辩论 AI 会根据主题和风格自动选择最合适的形式和音色配音。
Q: 可以用其他 AI 服务替代吗?
A: 可以!项目采用模块化设计,你可以轻松替换成其他大模型(如 OpenAI GPT、Claude、Azure OpenAI)或 TTS 服务(如 OpenAI TTS、Azure TTS、Google TTS)。只需修改对应的 service 文件即可。
Q: 如何添加自己的 BGM?
A: 将 MP3 文件放入 src/config/bgm/ 目录,AI 会根据播客主题和风格自动选择合适的 BGM。你也可以在配置中指定特定的 BGM 文件名(参考依据为BGM名称,建议以风格以及乐器以及场景命名BGM)。
Q: 这个项目可以商用吗?
A: 本项目采用 MIT 许可证,可以自由使用、修改和商用。但请注意:
- 火山引擎 API 调用需要你自己的账号和付费
- 如需商用,建议添加用户认证、数据库等功能
- 请遵守火山引擎的服务条款
本项目采用 MIT 许可证,可自由使用、修改和商用。详见 LICENSE 文件。