{"id":29979005,"url":"https://github.com/code4craft/ai_story_teller","last_synced_at":"2025-08-30T23:37:54.781Z","repository":{"id":305293269,"uuid":"1022500731","full_name":"code4craft/ai_story_teller","owner":"code4craft","description":"调用火山方舟api将我的文章转成有声读物。","archived":false,"fork":false,"pushed_at":"2025-07-19T10:30:30.000Z","size":1164,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2025-07-19T12:21:52.997Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":null,"language":"TypeScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/code4craft.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null}},"created_at":"2025-07-19T07:52:04.000Z","updated_at":"2025-07-19T10:30:34.000Z","dependencies_parsed_at":"2025-07-19T12:25:33.835Z","dependency_job_id":"067602de-8370-428b-9690-8c4847a1efa3","html_url":"https://github.com/code4craft/ai_story_teller","commit_stats":null,"previous_names":["code4craft/ai_story_teller"],"tags_count":null,"template":false,"template_full_name":null,"purl":"pkg:github/code4craft/ai_story_teller","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/code4craft%2Fai_story_teller","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/code4craft%2Fai_story_teller/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/code4craft%2Fai_story_teller/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/code4craft%2Fai_story_teller/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/code4craft","download_url":"https://codeload.github.com/code4craft/ai_story_teller/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/code4craft%2Fai_story_teller/sbom","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":268697599,"owners_count":24292401,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","status":"online","status_checked_at":"2025-08-04T02:00:09.867Z","response_time":79,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2025-08-04T12:43:19.080Z","updated_at":"2025-08-04T12:43:20.052Z","avatar_url":"https://github.com/code4craft.png","language":"TypeScript","readme":"# 🎭 AI故事讲述器\n\n[![TypeScript](https://img.shields.io/badge/TypeScript-007ACC?style=for-the-badge\u0026logo=typescript\u0026logoColor=white)](https://www.typescriptlang.org/)\n[![React](https://img.shields.io/badge/React-20232A?style=for-the-badge\u0026logo=react\u0026logoColor=61DAFB)](https://reactjs.org/)\n[![Node.js](https://img.shields.io/badge/Node.js-43853D?style=for-the-badge\u0026logo=node.js\u0026logoColor=white)](https://nodejs.org/)\n[![MongoDB](https://img.shields.io/badge/MongoDB-4EA94B?style=for-the-badge\u0026logo=mongodb\u0026logoColor=white)](https://www.mongodb.com/)\n[![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg?style=for-the-badge)](https://opensource.org/licenses/MIT)\n\n基于TypeScript和现代Web技术栈的**智能语音故事创作平台**，集成火山引擎TTS API，为内容创作者提供一站式的剧本创作、角色配音和语音合成解决方案。\n\n## ✨ 核心功能\n\n### 🎵 智能音色管理\n- **音色库管理**：集成火山引擎280+优质音色，支持中英文、多语言\n- **实时试听**：一键试听音色效果，支持自定义文本测试\n- **样本管理**：自动保存音色样本，便于后续对比选择\n- **批量测试**：提供批量音色测试脚本，快速筛选合适音色\n\n### 👥 专业角色管理  \n- **角色档案**：详细的角色信息管理（姓名、性别、年龄、性格特点）\n- **配音绑定**：为每个角色配置专属音色，支持实时预览\n- **智能搜索**：多维度搜索功能（名称、性别、年龄类型、性格）\n- **分类组织**：按故事系列、角色类型等维度灵活分类\n\n### 📖 高效剧本创作\n- **可视化编辑**：支持Markdown格式，实时预览编辑效果\n- **智能解析**：自动识别对话格式 `（角色名）：对话内容`\n- **角色匹配**：智能匹配脚本中的角色与角色库\n- **章节管理**：完善的故事系列和章节组织结构\n\n### 🔄 自动语音转换\n- **批量转换**：一键将整个章节转换为多角色语音\n- **参数调节**：支持语速、音量、音调等细节调节\n- **旁白处理**：自动为旁白配置合适的叙述音色\n- **容错机制**：未配音角色自动使用默认音色，确保转换完整性\n\n### 📊 任务状态监控\n- **实时进度**：可视化显示转换任务进度和状态\n- **任务管理**：支持启动、暂停、取消转换任务\n- **历史记录**：完整的转换历史和文件管理\n- **错误处理**：详细的错误信息和重试机制\n\n## 🎬 功能展示\n\n![功能展示](./images/20250719-232000.gif)\n\n## 🏗️ 架构设计\n\n### 系统架构\n```\n┌─────────────────┐    ┌─────────────────┐    ┌─────────────────┐\n│   前端 React    │───▶│   后端 API      │───▶│  火山引擎 TTS   │\n│                 │    │                 │    │                 │\n│ • 用户界面      │    │ • 业务逻辑      │    │ • 语音合成      │\n│ • 状态管理      │    │ • 数据验证      │    │ • 音色管理      │\n│ • 路由管理      │    │ • 任务调度      │    │                 │\n└─────────────────┘    └─────────────────┘    └─────────────────┘\n         │                       │                       \n         │              ┌─────────────────┐              \n         └──────────────▶│   MongoDB       │              \n                         │                 │              \n                         │ • 用户数据      │              \n                         │ • 故事内容      │              \n                         │ • 音频文件      │              \n                         └─────────────────┘              \n```\n\n### 数据流转\n1. **内容创作**：用户在前端创建故事系列和章节\n2. **脚本解析**：后端解析剧本内容，识别角色和对话\n3. **角色匹配**：自动或手动匹配角色与音色\n4. **语音合成**：调用火山引擎API生成音频\n5. **文件管理**：音频文件存储和访问管理\n\n## 💻 技术栈\n\n### 后端\n- **Node.js** + **TypeScript** + **Express**\n- **MongoDB** + **Mongoose**\n- **火山引擎TTS API**\n- **Joi** 数据验证\n\n### 前端  \n- **React 18** + **TypeScript**\n- **Ant Design** UI组件库\n- **React Router** 路由管理\n- **React Query** 数据请求\n- **Axios** HTTP客户端\n\n## 项目结构\n\n```\nai_story_teller/\n├── backend/                    # 后端API服务\n│   ├── src/\n│   │   ├── controllers/        # 控制器\n│   │   ├── models/            # 数据模型\n│   │   ├── routes/            # 路由定义\n│   │   ├── services/          # 业务服务\n│   │   ├── middleware/        # 中间件\n│   │   └── validators/        # 数据验证\n│   ├── package.json\n│   └── tsconfig.json\n├── frontend/                   # 前端React应用\n│   ├── src/\n│   │   ├── components/        # 组件\n│   │   ├── pages/            # 页面\n│   │   ├── services/         # API服务\n│   │   ├── types/            # 类型定义\n│   │   └── utils/            # 工具函数\n│   ├── package.json\n│   └── tsconfig.json\n├── scripts/                    # 工具脚本\n│   ├── import-data.js         # 数据导入脚本\n│   ├── import-voices.js       # 音色批量导入\n│   ├── batch-test-voices.js   # 音色批量测试\n│   └── package.json\n├── config/                     # 配置文件\n│   └── roles.yml              # 角色配置模板\n├── data/                       # 数据文件\n│   ├── input/                 # 故事Markdown源文件\n│   └── output/                # 生成的音频文件\n├── images/                     # 项目展示图片\n├── docs/                       # 文档\n│   ├── SDK_Integration_zh.md  # SDK集成文档\n│   └── 火山引擎音色列表.md    # 音色清单\n├── database/                   # 数据库相关\n│   └── schemas.js             # 数据模型定义\n└── uploads/                    # 上传文件存储\n    ├── audio/                 # 生成的音频文件\n    └── voices/                # 音色样本文件\n```\n\n## 快速开始\n\n### 1. 环境要求\n\n- Node.js \u003e= 18.0.0\n- MongoDB \u003e= 6.0\n- npm 或 yarn\n\n### 2. 安装依赖\n\n```bash\n# 安装后端依赖\ncd backend\nnpm install\n\n# 安装前端依赖  \ncd ../frontend\nnpm install\n\n# 安装脚本依赖\ncd ../scripts\nnpm install\n```\n\n### 3. 环境配置\n\n#### 后端配置\n复制 `backend/.env.example` 为 `backend/.env`：\n\n```bash\ncd backend\ncp .env.example .env\n```\n\n编辑 `.env` 文件：\n\n```env\n# 数据库配置\nMONGODB_URI=mongodb://localhost:27017/ai_story_teller\n\n# 服务器配置\nPORT=3001\nNODE_ENV=development\nFRONTEND_URL=http://localhost:3000\n\n# 火山引擎TTS配置\nTTS_TOKEN=your_tts_token_here\nTTS_APP_ID=your_app_id_here\nTTS_CLUSTER=volcano_tts\n```\n\n#### 前端配置\n复制 `frontend/.env.example` 为 `frontend/.env`：\n\n```bash\ncd frontend\ncp .env.example .env\n```\n\n### 4. 启动MongoDB\n\n确保MongoDB服务正在运行：\n\n```bash\n# macOS (使用Homebrew)\nbrew services start mongodb-community\n\n# Ubuntu/Debian\nsudo systemctl start mongod\n\n# Windows\n# 启动MongoDB服务\n```\n\n### 5. 导入数据\n\n导入现有的角色配置和故事数据：\n\n```bash\ncd scripts\nnpm run import\n```\n\n### 6. 启动服务\n\n```bash\n# 启动后端服务 (端口3001)\ncd backend\nnpm run dev\n\n# 新终端窗口，启动前端服务 (端口3000)  \ncd frontend\nnpm start\n```\n\n### 7. 访问应用\n\n打开浏览器访问 [http://localhost:3000](http://localhost:3000)\n\n## 🚀 使用指南\n\n### 基本工作流程\n\n#### 1. 音色管理\n```bash\n# 导入火山引擎音色库\ncd scripts\nnode import-voices.js\n\n# 批量测试音色效果\nnode batch-test-voices.js\n```\n\n#### 2. 创建角色\n- 访问\"角色管理\"页面\n- 点击\"添加角色\"，填写角色信息\n- 为角色选择合适的音色\n- 使用\"试听\"功能确认效果\n\n#### 3. 编写剧本\n- 访问\"剧本创作\"页面\n- 创建新的故事系列和章节\n- 使用以下格式编写对话：\n```markdown\n（旁白）：在一个遥远的王国里...\n（小明）：你好，我叫小明！\n（小红）：很高兴认识你，小明。\n```\n\n#### 4. 角色绑定\n- 在章节详情页面，系统会自动解析角色\n- 为每个角色选择对应的配音演员\n- 支持实时试听和调整\n\n#### 5. 语音转换\n- 确保所有角色都已配置音色\n- 创建转换任务，设置语音参数\n- 启动转换，系统将自动生成完整音频\n\n### 高级功能\n\n#### 智能角色匹配\n系统支持自动匹配角色：\n- 根据角色名称进行模糊匹配\n- 支持角色别名和变体识别\n- 手动调整匹配结果\n\n#### 批量操作\n- **批量角色创建**：通过配置文件批量导入角色\n- **批量音色测试**：一键测试所有音色效果\n- **批量转换任务**：同时处理多个章节转换\n\n#### 参数优化\n转换参数建议：\n- **语速**：0.8-1.2 (1.0为正常语速)\n- **音量**：0.8-1.2 (1.0为正常音量)  \n- **音调**：0.9-1.1 (1.0为原始音调)\n\n## 📋 最佳实践\n\n### 剧本编写规范\n1. **对话格式**：严格使用 `（角色名）：对话内容` 格式\n2. **角色命名**：使用简洁、一致的角色名称\n3. **旁白处理**：使用\"旁白\"作为叙述角色名\n4. **内容分段**：适当分段，便于音频生成和播放\n\n### 音色选择建议\n1. **角色匹配**：根据角色年龄、性格选择合适音色\n2. **语言一致**：同一作品内保持语言风格一致\n3. **对比测试**：使用相同文本测试不同音色效果\n4. **样本保存**：为常用音色保存测试样本\n\n### 性能优化\n1. **分批转换**：大型项目建议分章节转换\n2. **参数复用**：相同类型角色使用相似参数\n3. **缓存管理**：定期清理过期的音频文件\n4. **监控资源**：注意API调用频率和配额限制\n\n## 📚 API文档\n\n### 音色管理\n- `GET /api/voices` - 获取音色列表\n- `POST /api/voices` - 创建音色\n- `PUT /api/voices/:id` - 更新音色\n- `DELETE /api/voices/:id` - 删除音色\n- `POST /api/voices/:id/test` - 测试音色\n\n### 角色管理\n- `GET /api/characters` - 获取角色列表\n- `POST /api/characters` - 创建角色\n- `PUT /api/characters/:id` - 更新角色\n- `DELETE /api/characters/:id` - 删除角色\n\n### 故事管理\n- `GET /api/stories` - 获取故事系列\n- `POST /api/stories` - 创建故事系列\n- `GET /api/stories/:id/chapters` - 获取章节列表\n\n### 章节管理\n- `GET /api/chapters` - 获取章节列表\n- `POST /api/chapters` - 创建章节\n- `POST /api/chapters/:id/parse` - 解析章节对话\n\n### 转换任务\n- `GET /api/conversions` - 获取转换任务\n- `POST /api/conversions` - 创建转换任务\n- `POST /api/conversions/:id/start` - 启动转换任务\n\n## 开发指南\n\n### 添加新的音色\n1. 在音色管理页面添加音色配置\n2. 配置音色的基本信息和火山引擎音色ID\n3. 使用试听功能测试音色效果\n\n### 创建新的故事\n1. 在剧本创作页面创建故事系列\n2. 添加章节并编写Markdown内容\n3. 使用 `（角色名）：对话内容` 格式编写对话\n4. 解析章节内容匹配角色\n\n### 语音转换\n1. 确保章节内容已解析并匹配角色\n2. 创建转换任务并设置语音参数\n3. 启动转换任务，系统将自动生成音频文件\n\n## 🔧 故障排除\n\n### 常见问题\n\n#### 1. MongoDB 连接失败\n```bash\n# 检查 MongoDB 服务状态\nbrew services list | grep mongodb  # macOS\nsystemctl status mongod           # Linux\n\n# 重启 MongoDB 服务\nbrew services restart mongodb-community  # macOS\nsudo systemctl restart mongod           # Linux\n```\n\n#### 2. TTS API 调用失败\n- 检查 `.env` 文件中的 TTS 配置\n- 确认火山引擎账户余额和API权限\n- 验证网络连接和防火墙设置\n\n#### 3. 音频文件无法播放\n- 检查浏览器音频支持（推荐Chrome/Firefox）\n- 确认音频文件路径和权限\n- 检查CORS配置\n\n#### 4. 角色匹配失败\n- 确保剧本格式正确：`（角色名）：对话内容`\n- 检查角色名称的一致性\n- 使用手动匹配功能\n\n### 性能调优\n\n#### 数据库优化\n```javascript\n// MongoDB 索引优化\ndb.characters.createIndex({ \"name\": 1, \"story_series\": 1 })\ndb.chapters.createIndex({ \"story_series_id\": 1, \"order\": 1 })\ndb.conversions.createIndex({ \"status\": 1, \"created_at\": -1 })\n```\n\n#### 内存管理\n```bash\n# 设置 Node.js 内存限制\nexport NODE_OPTIONS=\"--max-old-space-size=4096\"\n\n# 清理临时文件\nnpm run clean  # 清理构建文件\n```\n\n## 🤝 贡献指南\n\n### 开发环境\n1. Fork 本仓库\n2. 创建功能分支：`git checkout -b feature/new-feature`\n3. 提交更改：`git commit -am 'Add new feature'`\n4. 推送分支：`git push origin feature/new-feature`\n5. 创建 Pull Request\n\n### 代码规范\n- 使用 TypeScript 严格模式\n- 遵循 ESLint 配置\n- 编写单元测试\n- 更新相关文档\n\n### 提交规范\n```\nfeat: 新功能\nfix: 修复bug\ndocs: 文档更新\nstyle: 代码格式调整\nrefactor: 重构\ntest: 测试相关\nchore: 其他杂项\n```\n\n## 📞 支持与反馈\n\n### 技术支持\n- 📧 邮箱：[your-email@example.com]\n- 💬 讨论：[GitHub Discussions](https://github.com/your-username/ai_story_teller/discussions)\n- 🐛 问题报告：[GitHub Issues](https://github.com/your-username/ai_story_teller/issues)\n\n### 功能建议\n欢迎提出新功能建议和改进意见：\n1. 在 Issues 中详细描述需求\n2. 说明使用场景和预期效果\n3. 提供相关的设计稿或原型\n\n## 🔄 更新日志\n\n### v1.0.0 (2025-07-19)\n- ✨ 初始版本发布\n- 🎵 完整的音色管理系统\n- 👥 角色管理和配音绑定\n- 📖 剧本创作和解析功能\n- 🔄 自动语音转换系统\n- 📊 任务状态监控面板\n\n### 即将发布\n- 🎨 自定义音效和背景音乐\n- 🌐 多语言界面支持\n- 📱 移动端适配\n- ☁️ 云端存储集成\n- 🔗 第三方平台发布\n\n## 📄 许可证\n\n本项目采用 [MIT 许可证](LICENSE)。\n\n---\n\n**⭐ 如果这个项目对您有帮助，请给个星标支持！**\n\n[![Star History Chart](https://api.star-history.com/svg?repos=your-username/ai_story_teller\u0026type=Date)](https://star-history.com/#your-username/ai_story_teller\u0026Date)","funding_links":[],"categories":[],"sub_categories":[],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fcode4craft%2Fai_story_teller","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fcode4craft%2Fai_story_teller","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fcode4craft%2Fai_story_teller/lists"}