# 数据流设计
**本文档引用的文件**
- [server/src/app.ts](file://server/src/app.ts)
- [server/src/modules/book-generator/index.ts](file://server/src/modules/book-generator/index.ts)
- [server/src/modules/book-generator/book-generator.controller.ts](file://server/src/modules/book-generator/book-generator.controller.ts)
- [server/src/modules/book-generator/book-generator.service.ts](file://server/src/modules/book-generator/book-generator.service.ts)
- [server/src/modules/book-generator/book-queue.processor.ts](file://server/src/modules/book-generator/book-queue.processor.ts)
- [server/src/modules/tts/tts.controller.ts](file://server/src/modules/tts/tts.controller.ts)
- [server/src/modules/tts/tts.service.ts](file://server/src/modules/tts/tts.service.ts)
- [server/src/modules/video-generator/video-generator.controller.ts](file://server/src/modules/video-generator/video-generator.controller.ts)
- [server/src/modules/video-generator/video-generator.service.ts](file://server/src/modules/video-generator/video-generator.service.ts)
- [server/src/services/queue.service.ts](file://server/src/services/queue.service.ts)
- [server/src/services/websocket.service.ts](file://server/src/services/websocket.service.ts)
- [server/src/services/storage.service.ts](file://server/src/services/storage.service.ts)
- [server/src/services/oss.service.ts](file://server/src/services/oss.service.ts)
- [server/src/models/index.ts](file://server/src/models/index.ts)
## 目录
1. [简介](#简介)
2. [项目结构](#项目结构)
3. [核心组件](#核心组件)
4. [架构总览](#架构总览)
5. [详细组件分析](#详细组件分析)
6. [依赖关系分析](#依赖关系分析)
7. [性能考量](#性能考量)
8. [故障排查指南](#故障排查指南)
9. [结论](#结论)
10. [附录](#附录)
## 简介
本文件面向AI有声书生成平台,系统性梳理从用户输入到最终输出的完整数据流,重点覆盖:
- 异步数据处理流程:任务队列调度机制、LangGraph工作流的数据传递、TTS服务的音频生成流程
- 数据在不同系统组件间的传输方式:HTTP请求的数据交换、WebSocket的实时数据推送、文件上传下载的数据传输
- 数据的持久化策略:数据库写入时机、缓存更新机制、文件存储位置
- 关键业务场景的数据流图:书籍生成、音频合成、视频制作
## 项目结构
后端采用Koa应用,集中注册各类模块路由,并在启动时初始化数据库、Redis、存储与WebSocket服务,随后启动书籍生成队列处理器与恢复中断任务。
```mermaid
graph TB
A["应用入口
server/src/app.ts"] --> B["中间件与日志
错误、性能、安全、限流"]
A --> C["静态资源服务
音频/视频上传目录"]
A --> D["路由注册
认证、TTS、视频、书籍生成等"]
A --> E["服务初始化
数据库、Redis、存储、WebSocket"]
A --> F["队列处理器
书籍生成队列"]
```
图表来源
- [server/src/app.ts:133-194](file://server/src/app.ts#L133-L194)
章节来源
- [server/src/app.ts:57-131](file://server/src/app.ts#L57-L131)
## 核心组件
- 应用与路由:统一创建HTTP服务、注册路由、挂载静态资源、健康检查与指标接口
- 书籍生成:LangGraph工作流编排、批量生成编排器、队列处理器与中断恢复
- TTS服务:异步音频生成、提供商选择与降级、分段与合并、存储上传、WebSocket事件推送
- 视频生成:视频项目管理、FFmpeg生成、进度与状态持久化、WebSocket事件推送
- 队列服务:Bull队列封装、并发控制、进度回调、Redis/内存双栈
- 存储服务:OSS与本地存储无缝切换、上传/下载/删除/签名URL
- WebSocket服务:客户端连接管理、事件广播、音频/视频生成完成通知
章节来源
- [server/src/app.ts:26-55](file://server/src/app.ts#L26-L55)
- [server/src/modules/book-generator/index.ts:60-77](file://server/src/modules/book-generator/index.ts#L60-L77)
- [server/src/modules/book-generator/book-generator.service.ts:45-143](file://server/src/modules/book-generator/book-generator.service.ts#L45-L143)
- [server/src/modules/tts/tts.service.ts:200-280](file://server/src/modules/tts/tts.service.ts#L200-L280)
- [server/src/modules/video-generator/video-generator.service.ts:157-312](file://server/src/modules/video-generator/video-generator.service.ts#L157-L312)
- [server/src/services/queue.service.ts:48-346](file://server/src/services/queue.service.ts#L48-L346)
- [server/src/services/storage.service.ts:13-278](file://server/src/services/storage.service.ts#L13-L278)
- [server/src/services/websocket.service.ts:6-136](file://server/src/services/websocket.service.ts#L6-L136)
## 架构总览
系统采用“HTTP API + 异步队列 + WebSocket推送”的架构,数据在模块间通过请求体、响应体、文件系统与数据库进行传递,存储层支持OSS与本地两种模式。
```mermaid
graph TB
subgraph "客户端"
FE["前端/小程序"]
end
subgraph "后端"
HTTP["HTTP服务
server/src/app.ts"]
WS["WebSocket服务
server/src/services/websocket.service.ts"]
QUEUE["队列服务
server/src/services/queue.service.ts"]
STORE["存储服务
server/src/services/storage.service.ts"]
DB["数据库
server/src/models/index.ts"]
end
subgraph "业务模块"
BG["书籍生成
book-generator.*"]
TTS["TTS服务
tts.*"]
VG["视频生成
video-generator.*"]
end
FE --> HTTP
HTTP --> BG
HTTP --> TTS
HTTP --> VG
BG --> QUEUE
BG --> DB
TTS --> DB
TTS --> STORE
VG --> DB
VG --> STORE
BG --> WS
TTS --> WS
VG --> WS
```
图表来源
- [server/src/app.ts:100-129](file://server/src/app.ts#L100-L129)
- [server/src/services/websocket.service.ts:102-136](file://server/src/services/websocket.service.ts#L102-L136)
- [server/src/services/queue.service.ts:72-122](file://server/src/services/queue.service.ts#L72-L122)
- [server/src/services/storage.service.ts:43-93](file://server/src/services/storage.service.ts#L43-L93)
- [server/src/models/index.ts:5-13](file://server/src/models/index.ts#L5-L13)
## 详细组件分析
### 书籍生成数据流(LangGraph工作流)
- 用户通过API触发书籍生成,系统根据书籍规模与类型推导大纲层级,创建书籍并尝试加入队列
- 队列处理器异步执行LangGraph生成器,更新书籍状态并在完成后推送进度
- 批量生成编排器支持多步骤串联:内容生成→音频生成→音频合并→视频生成→视频合并,每步通过WebSocket推送进度
```mermaid
sequenceDiagram
participant U as "用户"
participant API as "书籍生成API
book-generator.controller.ts"
participant Svc as "编排服务
book-generator.service.ts"
participant Q as "队列处理器
book-queue.processor.ts"
participant LG as "LangGraph生成器
book-generator/index.ts"
participant DB as "数据库
models/index.ts"
participant WS as "WebSocket
websocket.service.ts"
U->>API : POST /api/book-generator/langgraph/books
API->>Svc : 创建书籍并加入队列
Svc->>Q : addBookGenerationTask
Q->>LG : 处理任务并执行生成
LG->>DB : 更新书籍状态/大纲/章节
LG-->>WS : 推送生成进度/完成事件
API-->>U : 返回任务状态
```
图表来源
- [server/src/modules/book-generator/book-generator.controller.ts:383-530](file://server/src/modules/book-generator/book-generator.controller.ts#L383-L530)
- [server/src/modules/book-generator/book-queue.processor.ts:16-83](file://server/src/modules/book-generator/book-queue.processor.ts#L16-L83)
- [server/src/modules/book-generator/index.ts:60-77](file://server/src/modules/book-generator/index.ts#L60-L77)
- [server/src/services/websocket.service.ts:91-95](file://server/src/services/websocket.service.ts#L91-L95)
- [server/src/models/index.ts:5-13](file://server/src/models/index.ts#L5-L13)
章节来源
- [server/src/modules/book-generator/book-generator.controller.ts:24-119](file://server/src/modules/book-generator/book-generator.controller.ts#L24-L119)
- [server/src/modules/book-generator/book-generator.service.ts:45-143](file://server/src/modules/book-generator/book-generator.service.ts#L45-L143)
- [server/src/modules/book-generator/book-queue.processor.ts:48-124](file://server/src/modules/book-generator/book-queue.processor.ts#L48-L124)
- [server/src/modules/book-generator/index.ts:60-104](file://server/src/modules/book-generator/index.ts#L60-L104)
### 批量生成编排器(多步骤流水线)
- 编排器按步骤推进,每个步骤完成后通过WebSocket推送进度
- 步骤包括:内容生成(LangGraph)、音频生成(异步队列/轮询)、音频合并(章节聚合)、视频生成(FFmpeg)、视频合并(简化处理)
- 支持取消标志,中途取消会清理状态并推送失败事件
```mermaid
flowchart TD
Start(["开始"]) --> CheckCancel["检查取消标志"]
CheckCancel --> Step1["内容生成
LangGraph生成大纲/内容"]
Step1 --> Step2["音频生成
异步生成+轮询完成"]
Step2 --> MergeA["音频合并
按父章节合并"]
MergeA --> Step3["视频生成
FFmpeg生成视频"]
Step3 --> MergeV["视频合并
简化处理"]
MergeV --> Done(["完成"])
Step1 -.->|失败| Fail["失败并清理"]
Step2 -.->|失败| Fail
MergeA -.->|失败| Fail
Step3 -.->|失败| Fail
MergeV -.->|失败| Fail
```
图表来源
- [server/src/modules/book-generator/book-generator.service.ts:77-143](file://server/src/modules/book-generator/book-generator.service.ts#L77-L143)
- [server/src/modules/book-generator/book-generator.service.ts:149-217](file://server/src/modules/book-generator/book-generator.service.ts#L149-L217)
- [server/src/modules/book-generator/book-generator.service.ts:222-285](file://server/src/modules/book-generator/book-generator.service.ts#L222-L285)
- [server/src/modules/book-generator/book-generator.service.ts:289-359](file://server/src/modules/book-generator/book-generator.service.ts#L289-L359)
- [server/src/modules/book-generator/book-generator.service.ts:364-453](file://server/src/modules/book-generator/book-generator.service.ts#L364-L453)
- [server/src/modules/book-generator/book-generator.service.ts:458-528](file://server/src/modules/book-generator/book-generator.service.ts#L458-L528)
章节来源
- [server/src/modules/book-generator/book-generator.service.ts:45-143](file://server/src/modules/book-generator/book-generator.service.ts#L45-L143)
### TTS服务数据流(异步音频生成)
- 用户提交文本、音色、参数,服务创建AudioRecord记录并异步生成
- 文本分段(阿里云限制)或直传(MiniMax),并发生成后合并,上传至存储(OSS或本地)
- 生成完成后更新数据库状态并推送WebSocket事件,支持预览与批量下载
```mermaid
sequenceDiagram
participant U as "用户"
participant API as "TTS API
tts.controller.ts"
participant Svc as "TTS服务
tts.service.ts"
participant Prov as "TTS提供商
aliyun/minimax/mock"
participant Store as "存储服务
storage.service.ts"
participant DB as "数据库
models/index.ts"
participant WS as "WebSocket
websocket.service.ts"
U->>API : POST /api/tts/generate
API->>Svc : generateAudio(userId,text,voice,...)
Svc->>DB : 创建AudioRecord(processing)
Svc->>Prov : 分段/直传合成
Prov-->>Svc : 音频片段/云端URL
Svc->>Store : 合并后上传(oss/local)
Store-->>Svc : 返回文件URL
Svc->>DB : 更新AudioRecord(completed)
Svc->>WS : 推送音频生成完成事件
API-->>U : 返回任务已创建
```
图表来源
- [server/src/modules/tts/tts.controller.ts:53-127](file://server/src/modules/tts/tts.controller.ts#L53-L127)
- [server/src/modules/tts/tts.service.ts:200-280](file://server/src/modules/tts/tts.service.ts#L200-L280)
- [server/src/modules/tts/tts.service.ts:285-542](file://server/src/modules/tts/tts.service.ts#L285-L542)
- [server/src/services/storage.service.ts:43-93](file://server/src/services/storage.service.ts#L43-L93)
- [server/src/services/websocket.service.ts:70-76](file://server/src/services/websocket.service.ts#L70-L76)
- [server/src/models/index.ts:5-13](file://server/src/models/index.ts#L5-L13)
章节来源
- [server/src/modules/tts/tts.controller.ts:13-127](file://server/src/modules/tts/tts.controller.ts#L13-L127)
- [server/src/modules/tts/tts.service.ts:200-542](file://server/src/modules/tts/tts.service.ts#L200-L542)
### 视频生成数据流(FFmpeg流水线)
- 用户创建视频项目或从书籍章节生成项目,系统校验素材并生成视频
- FFmpeg生成完成后更新项目状态,若关联章节则更新章节视频URL并推送完成事件
- 支持带/不带背景音乐两种生成路径
```mermaid
sequenceDiagram
participant U as "用户"
participant API as "视频API
video-generator.controller.ts"
participant Svc as "视频服务
video-generator.service.ts"
participant FF as "FFmpeg生成器"
participant Store as "存储服务
storage.service.ts"
participant DB as "数据库
models/index.ts"
participant WS as "WebSocket
websocket.service.ts"
U->>API : POST /api/video/projects/ : id/generate
API->>Svc : generateVideoForProject(projectId)
Svc->>DB : 更新状态为processing
Svc->>FF : 生成视频(带/不带BGM)
FF-->>Svc : 输出文件路径/时长/大小
Svc->>DB : 更新状态为completed并写入URL
Svc->>WS : 推送视频生成完成事件
API-->>U : 返回输出URL/时长/大小
```
图表来源
- [server/src/modules/video-generator/video-generator.controller.ts:111-129](file://server/src/modules/video-generator/video-generator.controller.ts#L111-L129)
- [server/src/modules/video-generator/video-generator.service.ts:157-312](file://server/src/modules/video-generator/video-generator.service.ts#L157-L312)
- [server/src/services/websocket.service.ts:81-86](file://server/src/services/websocket.service.ts#L81-L86)
- [server/src/models/index.ts:5-13](file://server/src/models/index.ts#L5-L13)
章节来源
- [server/src/modules/video-generator/video-generator.controller.ts:24-242](file://server/src/modules/video-generator/video-generator.controller.ts#L24-L242)
- [server/src/modules/video-generator/video-generator.service.ts:157-312](file://server/src/modules/video-generator/video-generator.service.ts#L157-L312)
### 队列服务与并发控制
- 队列服务封装Bull,支持Redis队列与内存队列双栈,自动降级
- 书籍生成队列最大并发3,处理完成后更新书籍状态
- 支持任务状态查询、进度回调、统计与暂停/恢复
```mermaid
classDiagram
class QueueService {
+addTask(queueType,data,options) Promise~string|null~
+addBookGenerationTask(data) Promise~string|null~
+getTaskStatus(queueType,jobId) Promise
+updateProgress(queueType,jobId,progress,data) Promise
+onProgress(jobId,callback) void
+getQueueStats(queueType) Promise
}
class BookQueueProcessor {
+initBookGenerationQueue() void
+resumeInterruptedTasks() void
}
QueueService <.. BookQueueProcessor : "使用"
```
图表来源
- [server/src/services/queue.service.ts:48-346](file://server/src/services/queue.service.ts#L48-L346)
- [server/src/modules/book-generator/book-queue.processor.ts:48-124](file://server/src/modules/book-generator/book-queue.processor.ts#L48-L124)
章节来源
- [server/src/services/queue.service.ts:48-346](file://server/src/services/queue.service.ts#L48-L346)
- [server/src/modules/book-generator/book-queue.processor.ts:48-124](file://server/src/modules/book-generator/book-queue.processor.ts#L48-L124)
### 存储与文件传输
- 存储服务支持OSS与本地存储无缝切换,提供上传/下载/删除/签名URL能力
- TTS与视频生成均通过存储服务统一分发,OSS模式下支持CDN加速
- 文件上传通过koa-body中间件接收multipart/form-data
```mermaid
graph LR
Svc["业务服务
tts.service.ts / video-generator.service.ts"] --> Store["存储服务
storage.service.ts"]
Store --> OSS["OSS服务
oss.service.ts"]
Store --> Local["本地文件系统"]
OSS --> CDN["CDN加速(可选)"]
```
图表来源
- [server/src/services/storage.service.ts:43-93](file://server/src/services/storage.service.ts#L43-L93)
- [server/src/services/oss.service.ts:38-117](file://server/src/services/oss.service.ts#L38-L117)
- [server/src/modules/tts/tts.service.ts:406-436](file://server/src/modules/tts/tts.service.ts#L406-L436)
- [server/src/modules/video-generator/video-generator.service.ts:257-268](file://server/src/modules/video-generator/video-generator.service.ts#L257-L268)
章节来源
- [server/src/services/storage.service.ts:13-278](file://server/src/services/storage.service.ts#L13-L278)
- [server/src/services/oss.service.ts:13-256](file://server/src/services/oss.service.ts#L13-L256)
- [server/src/app.ts:76-83](file://server/src/app.ts#L76-L83)
### WebSocket实时推送
- 服务启动时初始化WebSocket,只接受/ws路径连接
- 推送音频/视频生成完成事件与批量生成进度事件
- 前端可通过clientId区分接收范围
```mermaid
sequenceDiagram
participant FE as "前端客户端"
participant WS as "WebSocket服务
websocket.service.ts"
participant Svc as "业务服务"
FE->>WS : 连接 /ws?clientId=...
WS-->>FE : connected
Svc->>WS : pushAudioGenerationComplete(...)
WS-->>FE : 广播事件
Svc->>WS : pushBatchGenerationProgress(...)
WS-->>FE : 广播事件
```
图表来源
- [server/src/services/websocket.service.ts:102-136](file://server/src/services/websocket.service.ts#L102-L136)
- [server/src/services/websocket.service.ts:70-95](file://server/src/services/websocket.service.ts#L70-L95)
章节来源
- [server/src/services/websocket.service.ts:6-136](file://server/src/services/websocket.service.ts#L6-L136)
## 依赖关系分析
- 控制器层依赖服务层,服务层依赖数据库与存储服务
- 队列服务独立于业务服务,通过任务数据解耦
- WebSocket服务与业务服务松耦合,通过事件广播解耦
```mermaid
graph TB
Ctrl["控制器层
*.controller.ts"] --> Svc["服务层
*.service.ts"]
Svc --> DB["数据库
models/index.ts"]
Svc --> Store["存储服务
storage.service.ts"]
Svc --> Queue["队列服务
queue.service.ts"]
Svc --> WS["WebSocket服务
websocket.service.ts"]
Queue --> LG["LangGraph生成器
book-generator/index.ts"]
```
图表来源
- [server/src/modules/book-generator/book-generator.controller.ts:18-199](file://server/src/modules/book-generator/book-generator.controller.ts#L18-L199)
- [server/src/modules/tts/tts.controller.ts:10-274](file://server/src/modules/tts/tts.controller.ts#L10-L274)
- [server/src/modules/video-generator/video-generator.controller.ts:20-244](file://server/src/modules/video-generator/video-generator.controller.ts#L20-L244)
- [server/src/services/queue.service.ts:48-346](file://server/src/services/queue.service.ts#L48-L346)
- [server/src/services/websocket.service.ts:6-136](file://server/src/services/websocket.service.ts#L6-L136)
- [server/src/services/storage.service.ts:13-278](file://server/src/services/storage.service.ts#L13-L278)
- [server/src/models/index.ts:5-13](file://server/src/models/index.ts#L5-L13)
章节来源
- [server/src/app.ts:100-129](file://server/src/app.ts#L100-L129)
## 性能考量
- 队列并发:书籍生成队列最大并发3,避免资源争用
- 文本分段:TTS服务对阿里云进行分段,减少单次请求压力
- 并发合成:MiniMax异步轮询较长时降低并发至1,其他提供商为2
- 存储上传:统一通过存储服务上传,支持OSS直传与CDN加速
- WebSocket:事件广播轻量,前端按bookId过滤,避免过多无效推送
## 故障排查指南
- 队列不可用:Redis连接失败时自动降级为内存队列,检查Redis配置与连通性
- 任务超时:僵尸任务检测(空目录超过2分钟)会更新数据库状态为失败
- 存储失败:OSS连接失败时可切换为本地存储,检查OSS配置与凭证
- WebSocket连接:确认只接受/ws路径,客户端需携带clientId参数
- TTS配额:检查用户音频分钟配额,额度不足会阻止生成
章节来源
- [server/src/services/queue.service.ts:72-122](file://server/src/services/queue.service.ts#L72-L122)
- [server/src/modules/tts/tts.service.ts:574-597](file://server/src/modules/tts/tts.service.ts#L574-L597)
- [server/src/services/storage.service.ts:252-272](file://server/src/services/storage.service.ts#L252-L272)
- [server/src/services/websocket.service.ts:104-130](file://server/src/services/websocket.service.ts#L104-L130)
## 结论
本平台通过HTTP API、异步队列与WebSocket实现了高并发、可扩展的AI有声书生成体系。数据在模块间以清晰的职责边界传递,存储与数据库持久化策略明确,具备良好的可观测性与可维护性。建议在生产环境中启用Redis队列、OSS存储与CDN加速,并结合WebSocket事件实现前端实时反馈。
## 附录
- 关键API路径
- 书籍生成:/api/book-generator/langgraph/books
- 批量生成:/api/book-generator/books/:id/batch-generate
- TTS生成:/api/tts/generate
- 视频生成:/api/video/projects/:id/generate
- 关键事件
- audio_generation_complete
- video_generation_complete
- batch_generation_progress