基于TypeScript和现代Web技术栈的智能语音故事创作平台,集成火山引擎TTS API,为内容创作者提供一站式的剧本创作、角色配音和语音合成解决方案。
- 音色库管理:集成火山引擎280+优质音色,支持中英文、多语言
- 实时试听:一键试听音色效果,支持自定义文本测试
- 样本管理:自动保存音色样本,便于后续对比选择
- 批量测试:提供批量音色测试脚本,快速筛选合适音色
- 角色档案:详细的角色信息管理(姓名、性别、年龄、性格特点)
- 配音绑定:为每个角色配置专属音色,支持实时预览
- 智能搜索:多维度搜索功能(名称、性别、年龄类型、性格)
- 分类组织:按故事系列、角色类型等维度灵活分类
- 可视化编辑:支持Markdown格式,实时预览编辑效果
- 智能解析:自动识别对话格式
(角色名):对话内容 - 角色匹配:智能匹配脚本中的角色与角色库
- 章节管理:完善的故事系列和章节组织结构
- 批量转换:一键将整个章节转换为多角色语音
- 参数调节:支持语速、音量、音调等细节调节
- 旁白处理:自动为旁白配置合适的叙述音色
- 容错机制:未配音角色自动使用默认音色,确保转换完整性
- 实时进度:可视化显示转换任务进度和状态
- 任务管理:支持启动、暂停、取消转换任务
- 历史记录:完整的转换历史和文件管理
- 错误处理:详细的错误信息和重试机制
┌─────────────────┐ ┌─────────────────┐ ┌─────────────────┐
│ 前端 React │───▶│ 后端 API │───▶│ 火山引擎 TTS │
│ │ │ │ │ │
│ • 用户界面 │ │ • 业务逻辑 │ │ • 语音合成 │
│ • 状态管理 │ │ • 数据验证 │ │ • 音色管理 │
│ • 路由管理 │ │ • 任务调度 │ │ │
└─────────────────┘ └─────────────────┘ └─────────────────┘
│ │
│ ┌─────────────────┐
└──────────────▶│ MongoDB │
│ │
│ • 用户数据 │
│ • 故事内容 │
│ • 音频文件 │
└─────────────────┘
- 内容创作:用户在前端创建故事系列和章节
- 脚本解析:后端解析剧本内容,识别角色和对话
- 角色匹配:自动或手动匹配角色与音色
- 语音合成:调用火山引擎API生成音频
- 文件管理:音频文件存储和访问管理
- Node.js + TypeScript + Express
- MongoDB + Mongoose
- 火山引擎TTS API
- Joi 数据验证
- React 18 + TypeScript
- Ant Design UI组件库
- React Router 路由管理
- React Query 数据请求
- Axios HTTP客户端
ai_story_teller/
├── backend/ # 后端API服务
│ ├── src/
│ │ ├── controllers/ # 控制器
│ │ ├── models/ # 数据模型
│ │ ├── routes/ # 路由定义
│ │ ├── services/ # 业务服务
│ │ ├── middleware/ # 中间件
│ │ └── validators/ # 数据验证
│ ├── package.json
│ └── tsconfig.json
├── frontend/ # 前端React应用
│ ├── src/
│ │ ├── components/ # 组件
│ │ ├── pages/ # 页面
│ │ ├── services/ # API服务
│ │ ├── types/ # 类型定义
│ │ └── utils/ # 工具函数
│ ├── package.json
│ └── tsconfig.json
├── scripts/ # 工具脚本
│ ├── import-data.js # 数据导入脚本
│ ├── import-voices.js # 音色批量导入
│ ├── batch-test-voices.js # 音色批量测试
│ └── package.json
├── config/ # 配置文件
│ └── roles.yml # 角色配置模板
├── data/ # 数据文件
│ ├── input/ # 故事Markdown源文件
│ └── output/ # 生成的音频文件
├── images/ # 项目展示图片
├── docs/ # 文档
│ ├── SDK_Integration_zh.md # SDK集成文档
│ └── 火山引擎音色列表.md # 音色清单
├── database/ # 数据库相关
│ └── schemas.js # 数据模型定义
└── uploads/ # 上传文件存储
├── audio/ # 生成的音频文件
└── voices/ # 音色样本文件
- Node.js >= 18.0.0
- MongoDB >= 6.0
- npm 或 yarn
# 安装后端依赖
cd backend
npm install
# 安装前端依赖
cd ../frontend
npm install
# 安装脚本依赖
cd ../scripts
npm install复制 backend/.env.example 为 backend/.env:
cd backend
cp .env.example .env编辑 .env 文件:
# 数据库配置
MONGODB_URI=mongodb://localhost:27017/ai_story_teller
# 服务器配置
PORT=3001
NODE_ENV=development
FRONTEND_URL=http://localhost:3000
# 火山引擎TTS配置
TTS_TOKEN=your_tts_token_here
TTS_APP_ID=your_app_id_here
TTS_CLUSTER=volcano_tts复制 frontend/.env.example 为 frontend/.env:
cd frontend
cp .env.example .env确保MongoDB服务正在运行:
# macOS (使用Homebrew)
brew services start mongodb-community
# Ubuntu/Debian
sudo systemctl start mongod
# Windows
# 启动MongoDB服务导入现有的角色配置和故事数据:
cd scripts
npm run import# 启动后端服务 (端口3001)
cd backend
npm run dev
# 新终端窗口,启动前端服务 (端口3000)
cd frontend
npm start打开浏览器访问 http://localhost:3000
# 导入火山引擎音色库
cd scripts
node import-voices.js
# 批量测试音色效果
node batch-test-voices.js- 访问"角色管理"页面
- 点击"添加角色",填写角色信息
- 为角色选择合适的音色
- 使用"试听"功能确认效果
- 访问"剧本创作"页面
- 创建新的故事系列和章节
- 使用以下格式编写对话:
(旁白):在一个遥远的王国里...
(小明):你好,我叫小明!
(小红):很高兴认识你,小明。- 在章节详情页面,系统会自动解析角色
- 为每个角色选择对应的配音演员
- 支持实时试听和调整
- 确保所有角色都已配置音色
- 创建转换任务,设置语音参数
- 启动转换,系统将自动生成完整音频
系统支持自动匹配角色:
- 根据角色名称进行模糊匹配
- 支持角色别名和变体识别
- 手动调整匹配结果
- 批量角色创建:通过配置文件批量导入角色
- 批量音色测试:一键测试所有音色效果
- 批量转换任务:同时处理多个章节转换
转换参数建议:
- 语速:0.8-1.2 (1.0为正常语速)
- 音量:0.8-1.2 (1.0为正常音量)
- 音调:0.9-1.1 (1.0为原始音调)
- 对话格式:严格使用
(角色名):对话内容格式 - 角色命名:使用简洁、一致的角色名称
- 旁白处理:使用"旁白"作为叙述角色名
- 内容分段:适当分段,便于音频生成和播放
- 角色匹配:根据角色年龄、性格选择合适音色
- 语言一致:同一作品内保持语言风格一致
- 对比测试:使用相同文本测试不同音色效果
- 样本保存:为常用音色保存测试样本
- 分批转换:大型项目建议分章节转换
- 参数复用:相同类型角色使用相似参数
- 缓存管理:定期清理过期的音频文件
- 监控资源:注意API调用频率和配额限制
GET /api/voices- 获取音色列表POST /api/voices- 创建音色PUT /api/voices/:id- 更新音色DELETE /api/voices/:id- 删除音色POST /api/voices/:id/test- 测试音色
GET /api/characters- 获取角色列表POST /api/characters- 创建角色PUT /api/characters/:id- 更新角色DELETE /api/characters/:id- 删除角色
GET /api/stories- 获取故事系列POST /api/stories- 创建故事系列GET /api/stories/:id/chapters- 获取章节列表
GET /api/chapters- 获取章节列表POST /api/chapters- 创建章节POST /api/chapters/:id/parse- 解析章节对话
GET /api/conversions- 获取转换任务POST /api/conversions- 创建转换任务POST /api/conversions/:id/start- 启动转换任务
- 在音色管理页面添加音色配置
- 配置音色的基本信息和火山引擎音色ID
- 使用试听功能测试音色效果
- 在剧本创作页面创建故事系列
- 添加章节并编写Markdown内容
- 使用
(角色名):对话内容格式编写对话 - 解析章节内容匹配角色
- 确保章节内容已解析并匹配角色
- 创建转换任务并设置语音参数
- 启动转换任务,系统将自动生成音频文件
# 检查 MongoDB 服务状态
brew services list | grep mongodb # macOS
systemctl status mongod # Linux
# 重启 MongoDB 服务
brew services restart mongodb-community # macOS
sudo systemctl restart mongod # Linux- 检查
.env文件中的 TTS 配置 - 确认火山引擎账户余额和API权限
- 验证网络连接和防火墙设置
- 检查浏览器音频支持(推荐Chrome/Firefox)
- 确认音频文件路径和权限
- 检查CORS配置
- 确保剧本格式正确:
(角色名):对话内容 - 检查角色名称的一致性
- 使用手动匹配功能
// MongoDB 索引优化
db.characters.createIndex({ "name": 1, "story_series": 1 })
db.chapters.createIndex({ "story_series_id": 1, "order": 1 })
db.conversions.createIndex({ "status": 1, "created_at": -1 })# 设置 Node.js 内存限制
export NODE_OPTIONS="--max-old-space-size=4096"
# 清理临时文件
npm run clean # 清理构建文件- Fork 本仓库
- 创建功能分支:
git checkout -b feature/new-feature - 提交更改:
git commit -am 'Add new feature' - 推送分支:
git push origin feature/new-feature - 创建 Pull Request
- 使用 TypeScript 严格模式
- 遵循 ESLint 配置
- 编写单元测试
- 更新相关文档
feat: 新功能
fix: 修复bug
docs: 文档更新
style: 代码格式调整
refactor: 重构
test: 测试相关
chore: 其他杂项
- 📧 邮箱:[your-email@example.com]
- 💬 讨论:GitHub Discussions
- 🐛 问题报告:GitHub Issues
欢迎提出新功能建议和改进意见:
- 在 Issues 中详细描述需求
- 说明使用场景和预期效果
- 提供相关的设计稿或原型
- ✨ 初始版本发布
- 🎵 完整的音色管理系统
- 👥 角色管理和配音绑定
- 📖 剧本创作和解析功能
- 🔄 自动语音转换系统
- 📊 任务状态监控面板
- 🎨 自定义音效和背景音乐
- 🌐 多语言界面支持
- 📱 移动端适配
- ☁️ 云端存储集成
- 🔗 第三方平台发布
本项目采用 MIT 许可证。
⭐ 如果这个项目对您有帮助,请给个星标支持!