本文档引用的文件
本文件面向AI有声书生成平台,系统性梳理从用户输入到最终输出的完整数据流,重点覆盖:
后端采用Koa应用,集中注册各类模块路由,并在启动时初始化数据库、Redis、存储与WebSocket服务,随后启动书籍生成队列处理器与恢复中断任务。
graph TB
A["应用入口<br/>server/src/app.ts"] --> B["中间件与日志<br/>错误、性能、安全、限流"]
A --> C["静态资源服务<br/>音频/视频上传目录"]
A --> D["路由注册<br/>认证、TTS、视频、书籍生成等"]
A --> E["服务初始化<br/>数据库、Redis、存储、WebSocket"]
A --> F["队列处理器<br/>书籍生成队列"]
图表来源
章节来源
章节来源
系统采用“HTTP API + 异步队列 + WebSocket推送”的架构,数据在模块间通过请求体、响应体、文件系统与数据库进行传递,存储层支持OSS与本地两种模式。
graph TB
subgraph "客户端"
FE["前端/小程序"]
end
subgraph "后端"
HTTP["HTTP服务<br/>server/src/app.ts"]
WS["WebSocket服务<br/>server/src/services/websocket.service.ts"]
QUEUE["队列服务<br/>server/src/services/queue.service.ts"]
STORE["存储服务<br/>server/src/services/storage.service.ts"]
DB["数据库<br/>server/src/models/index.ts"]
end
subgraph "业务模块"
BG["书籍生成<br/>book-generator.*"]
TTS["TTS服务<br/>tts.*"]
VG["视频生成<br/>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
图表来源
批量生成编排器支持多步骤串联:内容生成→音频生成→音频合并→视频生成→视频合并,每步通过WebSocket推送进度
sequenceDiagram
participant U as "用户"
participant API as "书籍生成API<br/>book-generator.controller.ts"
participant Svc as "编排服务<br/>book-generator.service.ts"
participant Q as "队列处理器<br/>book-queue.processor.ts"
participant LG as "LangGraph生成器<br/>book-generator/index.ts"
participant DB as "数据库<br/>models/index.ts"
participant WS as "WebSocket<br/>websocket.service.ts"
U->>API : POST /api/book-generator/langgraph/books
API->>Svc : 创建书籍并加入队列
Svc->>Q : addBookGenerationTask
Q->>LG : 处理任务并执行生成
LG->>DB : 更新书籍状态/大纲/章节
LG-->>WS : 推送生成进度/完成事件
API-->>U : 返回任务状态
图表来源
章节来源
支持取消标志,中途取消会清理状态并推送失败事件
flowchart TD
Start(["开始"]) --> CheckCancel["检查取消标志"]
CheckCancel --> Step1["内容生成<br/>LangGraph生成大纲/内容"]
Step1 --> Step2["音频生成<br/>异步生成+轮询完成"]
Step2 --> MergeA["音频合并<br/>按父章节合并"]
MergeA --> Step3["视频生成<br/>FFmpeg生成视频"]
Step3 --> MergeV["视频合并<br/>简化处理"]
MergeV --> Done(["完成"])
Step1 -.->|失败| Fail["失败并清理"]
Step2 -.->|失败| Fail
MergeA -.->|失败| Fail
Step3 -.->|失败| Fail
MergeV -.->|失败| Fail
图表来源
章节来源
生成完成后更新数据库状态并推送WebSocket事件,支持预览与批量下载
sequenceDiagram
participant U as "用户"
participant API as "TTS API<br/>tts.controller.ts"
participant Svc as "TTS服务<br/>tts.service.ts"
participant Prov as "TTS提供商<br/>aliyun/minimax/mock"
participant Store as "存储服务<br/>storage.service.ts"
participant DB as "数据库<br/>models/index.ts"
participant WS as "WebSocket<br/>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 : 返回任务已创建
图表来源
章节来源
支持带/不带背景音乐两种生成路径
sequenceDiagram
participant U as "用户"
participant API as "视频API<br/>video-generator.controller.ts"
participant Svc as "视频服务<br/>video-generator.service.ts"
participant FF as "FFmpeg生成器"
participant Store as "存储服务<br/>storage.service.ts"
participant DB as "数据库<br/>models/index.ts"
participant WS as "WebSocket<br/>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/时长/大小
图表来源
章节来源
支持任务状态查询、进度回调、统计与暂停/恢复
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 : "使用"
图表来源
章节来源
文件上传通过koa-body中间件接收multipart/form-data
graph LR
Svc["业务服务<br/>tts.service.ts / video-generator.service.ts"] --> Store["存储服务<br/>storage.service.ts"]
Store --> OSS["OSS服务<br/>oss.service.ts"]
Store --> Local["本地文件系统"]
OSS --> CDN["CDN加速(可选)"]
图表来源
章节来源
前端可通过clientId区分接收范围
sequenceDiagram
participant FE as "前端客户端"
participant WS as "WebSocket服务<br/>websocket.service.ts"
participant Svc as "业务服务"
FE->>WS : 连接 /ws?clientId=...
WS-->>FE : connected
Svc->>WS : pushAudioGenerationComplete(...)
WS-->>FE : 广播事件
Svc->>WS : pushBatchGenerationProgress(...)
WS-->>FE : 广播事件
图表来源
章节来源
WebSocket服务与业务服务松耦合,通过事件广播解耦
graph TB
Ctrl["控制器层<br/>*.controller.ts"] --> Svc["服务层<br/>*.service.ts"]
Svc --> DB["数据库<br/>models/index.ts"]
Svc --> Store["存储服务<br/>storage.service.ts"]
Svc --> Queue["队列服务<br/>queue.service.ts"]
Svc --> WS["WebSocket服务<br/>websocket.service.ts"]
Queue --> LG["LangGraph生成器<br/>book-generator/index.ts"]
图表来源
章节来源
章节来源
本平台通过HTTP API、异步队列与WebSocket实现了高并发、可扩展的AI有声书生成体系。数据在模块间以清晰的职责边界传递,存储与数据库持久化策略明确,具备良好的可观测性与可维护性。建议在生产环境中启用Redis队列、OSS存储与CDN加速,并结合WebSocket事件实现前端实时反馈。