扩展开发
本文引用的文件
- server/src/app.ts
- server/src/config/index.ts
- server/src/config/models.json
- server/src/modules/tts/tts.controller.ts
- server/src/modules/tts/tts.service.ts
- server/src/modules/tts/aliyun.provider.ts
- server/src/modules/tts/minimax.provider.ts
- server/src/modules/tts/mock.provider.ts
- server/src/modules/player/player.service.ts
- server/src/services/storage.service.ts
- server/src/middleware/auth.ts
- server/src/middleware/errorHandler.ts
- server/src/types/index.ts
- server/src/modules/book-generator/book-generator.controller.ts
目录
- 简介
- 项目结构
- 核心组件
- 架构总览
- 详细组件分析
- 依赖分析
- 性能考量
- 故障排查指南
- 结论
- 附录
简介
本扩展开发文档面向希望为AI有声书生成平台新增业务模块、集成第三方服务与定制现有功能的开发者。文档覆盖插件开发框架、API扩展接口、配置管理机制、TTS音色提供商接入、AI模型集成、播放器功能扩展、自定义中间件与业务逻辑扩展、数据模型扩展等主题,并提供最佳实践、性能优化与兼容性保障建议。
项目结构
后端采用Koa应用,模块化组织各领域功能(如TTS、播放器、书籍生成、认证、存储等)。应用入口负责注册中间件、静态资源、路由与服务启动;配置中心统一管理模型与供应商;服务层封装业务逻辑;控制器负责HTTP接口;中间件提供安全、限流、错误处理等横切能力;类型系统定义数据契约。
graph TB
A["应用入口<br/>server/src/app.ts"] --> B["中间件<br/>errorHandler/auth/security"]
A --> C["路由注册<br/>各模块控制器"]
A --> D["服务初始化<br/>数据库/缓存/存储/WebSocket"]
C --> E["TTS 控制器<br/>server/src/modules/tts/tts.controller.ts"]
C --> F["播放器服务<br/>server/src/modules/player/player.service.ts"]
C --> G["书籍生成控制器<br/>server/src/modules/book-generator/book-generator.controller.ts"]
E --> H["TTS 服务<br/>server/src/modules/tts/tts.service.ts"]
H --> I["阿里云TTS提供方<br/>server/src/modules/tts/aliyun.provider.ts"]
H --> J["MiniMaxTTS提供方<br/>server/src/modules/tts/minimax.provider.ts"]
H --> K["Mock提供方<br/>server/src/modules/tts/mock.provider.ts"]
H --> L["存储服务<br/>server/src/services/storage.service.ts"]
A --> M["配置中心<br/>server/src/config/index.ts"]
M --> N["模型配置<br/>server/src/config/models.json"]
图表来源
- server/src/app.ts:57-130
- server/src/modules/tts/tts.controller.ts:10-127
- server/src/modules/player/player.service.ts:1-280
- server/src/modules/book-generator/book-generator.controller.ts:18-119
- server/src/modules/tts/tts.service.ts:160-190
- server/src/modules/tts/aliyun.provider.ts:9-152
- server/src/modules/tts/minimax.provider.ts:42-280
- server/src/modules/tts/mock.provider.ts:11-61
- server/src/services/storage.service.ts:13-278
- server/src/config/index.ts:69-117
- server/src/config/models.json:1-186
章节来源
核心组件
- 应用入口与路由:集中注册中间件、静态资源、路由与服务启动,统一健康检查与指标暴露。
- 配置中心:统一管理模型供应商、默认模型、TTS默认音色、端口与JWT等配置。
- TTS模块:提供音色列表、可用服务商、异步音频生成、状态查询、预览生成、LRC歌词生成与合并。
- 存储服务:统一抽象OSS与本地存储,支持上传、下载、删除、签名URL与目录清理。
- 中间件:错误处理、认证、安全防护、性能监控、限流与使用量限制。
- 播放器服务:播放进度记录、合并章节音频、最近播放记录查询。
- 类型系统:统一用户、音频、订单、分页、音色、会员配额等数据契约。
章节来源
- server/src/app.ts:63-130
- server/src/config/index.ts:69-117
- server/src/modules/tts/tts.service.ts:24-644
- server/src/services/storage.service.ts:43-193
- server/src/middleware/errorHandler.ts:3-67
- server/src/middleware/auth.ts:7-81
- server/src/modules/player/player.service.ts:10-280
- server/src/types/index.ts:1-124
架构总览
平台采用“控制器-服务-提供方-存储”分层架构,TTS模块通过工厂模式动态选择不同提供方,支持阿里云、MiniMax与Mock三种路径;存储服务屏蔽OSS与本地差异;中间件贯穿请求生命周期提供横切能力;配置中心集中管理模型与供应商。
graph TB
subgraph "接口层"
R["TTS控制器<br/>tts.controller.ts"]
RBG["书籍生成控制器<br/>book-generator.controller.ts"]
end
subgraph "服务层"
S1["TTS服务<br/>tts.service.ts"]
S2["播放器服务<br/>player.service.ts"]
end
subgraph "提供方层"
P1["阿里云TTS提供方<br/>aliyun.provider.ts"]
P2["MiniMaxTTS提供方<br/>minimax.provider.ts"]
P3["Mock提供方<br/>mock.provider.ts"]
end
subgraph "基础设施"
CFG["配置中心<br/>config/index.ts"]
ST["存储服务<br/>storage.service.ts"]
MID["中间件<br/>auth/errorHandler"]
end
R --> S1
RBG --> S1
S1 --> P1
S1 --> P2
S1 --> P3
S1 --> ST
CFG --> S1
MID --> R
MID --> RBG
图表来源
- server/src/modules/tts/tts.controller.ts:10-127
- server/src/modules/book-generator/book-generator.controller.ts:18-119
- server/src/modules/tts/tts.service.ts:160-190
- server/src/modules/tts/aliyun.provider.ts:9-152
- server/src/modules/tts/minimax.provider.ts:42-280
- server/src/modules/tts/mock.provider.ts:11-61
- server/src/services/storage.service.ts:13-278
- server/src/config/index.ts:69-117
- server/src/middleware/auth.ts:7-81
- server/src/middleware/errorHandler.ts:3-67
详细组件分析
插件开发框架与扩展点
- 控制器扩展:新增业务模块只需新增控制器文件并在应用入口注册路由,遵循现有路由前缀与响应格式约定。
- 服务层扩展:在对应服务文件中实现业务逻辑,复用现有中间件、存储与配置。
- 提供方扩展:新增TTS提供方时,遵循现有Provider接口规范(如synthesize方法),在工厂函数中注册并支持自动切换。
配置扩展:通过配置中心与模型配置文件统一管理供应商与模型,支持动态启用/禁用与默认值。
classDiagram
class TtsController {
+voices()
+providers()
+generate()
+status()
+preview()
+download()
+batchDownload()
}
class TtsService {
+generateAudio()
+getAudioStatus()
+generatePreview()
+getVoices()
+getAvailableProviders()
}
class AliyunTtsProvider {
+synthesize(text, voiceId, params, outputPath, retries, modelOverride)
}
class MiniMaxTtsProvider {
+synthesize(text, voiceId, params, outputPath, retries)
}
class MockTtsProvider {
+synthesize(text, voiceId, params, outputPath)
}
class StorageService {
+uploadAudio()
+uploadVideo()
+uploadCover()
+uploadFile()
+uploadBuffer()
+deleteFile()
+deleteDirectory()
+downloadFile()
+getSignedUrl()
+testConnection()
}
TtsController --> TtsService : "依赖"
TtsService --> AliyunTtsProvider : "可选"
TtsService --> MiniMaxTtsProvider : "可选"
TtsService --> MockTtsProvider : "可选"
TtsService --> StorageService : "使用"
图表来源
- server/src/modules/tts/tts.controller.ts:10-274
- server/src/modules/tts/tts.service.ts:160-644
- server/src/modules/tts/aliyun.provider.ts:9-152
- server/src/modules/tts/minimax.provider.ts:42-280
- server/src/modules/tts/mock.provider.ts:11-61
- server/src/services/storage.service.ts:43-193
章节来源
- server/src/modules/tts/tts.controller.ts:10-274
- server/src/modules/tts/tts.service.ts:160-644
- server/src/config/index.ts:69-117
- server/src/config/models.json:1-186
API扩展接口
- 新增控制器:在对应模块目录创建控制器文件,导出路由对象;在应用入口注册路由。
- 新增服务:在模块服务目录创建服务文件,实现业务逻辑;在控制器中调用。
- 新增提供方:在模块tts目录新增提供方类,实现synthesize方法;在工厂函数中注册。
响应格式:统一使用{code,message,data}结构,错误通过中间件捕获并标准化返回。
sequenceDiagram
participant Client as "客户端"
participant Ctrl as "TTS控制器"
participant Svc as "TTS服务"
participant Prov as "TTS提供方"
participant Store as "存储服务"
Client->>Ctrl : POST /api/tts/generate
Ctrl->>Svc : generateAudio(userId,text,voiceId,params,options)
Svc->>Prov : synthesize(分段文本, 音色, 参数)
Prov-->>Svc : 本地文件/云端URL
Svc->>Store : uploadAudio(本地文件或下载云端)
Store-->>Svc : 返回统一URL
Svc-->>Ctrl : {audioId,audioUrl}
Ctrl-->>Client : {code,message,data}
图表来源
- server/src/modules/tts/tts.controller.ts:52-127
- server/src/modules/tts/tts.service.ts:200-542
- server/src/modules/tts/aliyun.provider.ts:21-150
- server/src/modules/tts/minimax.provider.ts:234-278
- server/src/services/storage.service.ts:43-93
章节来源
- server/src/modules/tts/tts.controller.ts:10-274
- server/src/modules/tts/tts.service.ts:200-542
配置管理机制
- 环境变量:端口、JWT密钥、存储类型、供应商API Key等。
- 模型配置:models.json集中管理供应商、模型、默认模型与默认音色;config/index.ts提供查询与切换逻辑。
动态切换:根据错误类型自动切换可用模型;支持按类型过滤启用的模型。
flowchart TD
Start(["启动"]) --> LoadCfg["加载环境变量与模型配置"]
LoadCfg --> GetModels["获取启用模型列表"]
GetModels --> Select{"选择模型类型"}
Select --> |文本生成| TextModels["按类型过滤模型"]
Select --> |TTS| TTSModels["按类型过滤模型"]
TextModels --> Switch{"是否需要切换?"}
TTSModels --> Switch
Switch --> |是| Next["getNextModel()"]
Switch --> |否| Use["使用当前模型"]
Next --> Use
Use --> End(["完成"])
图表来源
- server/src/config/index.ts:13-67
- server/src/config/models.json:1-186
章节来源
- server/src/config/index.ts:13-67
- server/src/config/models.json:1-186
添加新的TTS音色提供商
- 实现Provider类:提供synthesize方法,支持重试与错误处理。
- 注册提供方:在工厂函数中识别并返回实例;在可用提供方列表中登记。
- 音色映射:维护前端音色ID到提供方音色名称的映射。
测试与回退:提供Mock提供方作为开发与测试回退。
classDiagram
class Provider {
<<interface>>
+synthesize(text, voiceId, params, outputPath, retries, modelOverride?)
}
class AliyunTtsProvider
class MiniMaxTtsProvider
class MockTtsProvider
Provider <|.. AliyunTtsProvider
Provider <|.. MiniMaxTtsProvider
Provider <|.. MockTtsProvider
图表来源
- server/src/modules/tts/aliyun.provider.ts:9-152
- server/src/modules/tts/minimax.provider.ts:42-280
- server/src/modules/tts/mock.provider.ts:11-61
章节来源
- server/src/modules/tts/tts.service.ts:160-190
- server/src/modules/tts/aliyun.provider.ts:9-152
- server/src/modules/tts/minimax.provider.ts:42-280
- server/src/modules/tts/mock.provider.ts:11-61
集成新的AI模型
- 在models.json中新增供应商与模型项,设置启用状态与输入类型。
- 在config/index.ts中使用统一查询接口获取模型列表与默认值。
- 在服务层按类型筛选可用模型,必要时实现shouldSwitchModel与getNextModel逻辑。
章节来源
- server/src/config/models.json:1-186
- server/src/config/index.ts:13-67
扩展播放器功能
- 合并章节音频:当播放章时自动合并其下小节音频,返回合并后的URL并更新数据库。
- 播放进度:提供保存、更新、删除与查询播放进度的接口。
最近播放:按用户查询最近播放记录并计算进度百分比。
sequenceDiagram
participant Client as "客户端"
participant PlayerSvc as "播放器服务"
participant DB as "数据库"
participant Merger as "音频合并器"
Client->>PlayerSvc : 获取章节音频URL
PlayerSvc->>DB : 查询章节信息
alt 章(level=1)
PlayerSvc->>DB : 查询子节与小节音频URL
PlayerSvc->>Merger : 合并音频
Merger-->>PlayerSvc : 输出文件路径
PlayerSvc->>DB : 更新章节audioUrl
PlayerSvc-->>Client : 返回合并后的URL
else 非章
PlayerSvc-->>Client : 返回原音频URL
end
图表来源
- server/src/modules/player/player.service.ts:147-242
章节来源
- server/src/modules/player/player.service.ts:10-280
自定义中间件开发
- 错误处理:统一捕获异常并返回标准格式;开发环境返回堆栈。
- 认证中间件:支持可选认证与可选用户注入,便于开发调试。
- 安全与性能:提供XSS与SQL注入防护、性能监控与限流中间件。
章节来源
- server/src/middleware/errorHandler.ts:3-67
- server/src/middleware/auth.ts:7-81
业务逻辑扩展
- 使用量限制:在控制器中调用配额检查与消费接口,避免超限。
- 书籍批量生成:通过控制器启动批量任务,支持取消与状态查询。
- 数据一致性:在服务层进行事务性操作与状态更新,确保记录与文件一致。
章节来源
- server/src/modules/tts/tts.controller.ts:87-127
- server/src/modules/book-generator/book-generator.controller.ts:24-119
数据模型扩展
- 类型系统:统一定义用户、音频、订单、分页、音色与会员配额等类型。
- 扩展建议:新增实体时在types中定义接口,在Prisma中同步迁移,并在服务层封装CRUD。
章节来源
- server/src/types/index.ts:1-124
依赖分析
图表来源
- server/src/modules/tts/tts.controller.ts:10-274
- server/src/modules/tts/tts.service.ts:160-644
- server/src/services/storage.service.ts:13-278
- server/src/config/index.ts:69-117
章节来源
- server/src/modules/tts/tts.controller.ts:10-274
- server/src/modules/tts/tts.service.ts:160-644
- server/src/services/storage.service.ts:13-278
- server/src/config/index.ts:69-117
性能考量
- 并发与批处理:TTS服务对分段音频采用并发生成,减少整体延迟;MiniMax异步轮询较长时降低并发度。
- 重试与退避:提供方实现指数退避重试,缓解限流与临时错误。
- 存储与网络:优先使用统一存储服务上传,支持OSS直传与本地回退;云端URL降级到本地下载再上传。
- 监控与指标:内置性能监控与指标接口,便于定位瓶颈。
[本节为通用指导,无需特定文件引用]
故障排查指南
- 错误处理:统一通过错误中间件捕获并返回标准格式;开发环境显示堆栈便于定位。
- 认证问题:检查Authorization头格式与JWT密钥;可开启可选认证以便开发调试。
- TTS失败:查看Provider错误类型,区分是否为额度限制导致的自动切换;检查API Key与网络连通性。
- 存储问题:测试本地或OSS连接,确认目录权限与对象键解析正确。
- 播放进度:确认用户ID与章节ID匹配,检查数据库记录与文件是否存在。
章节来源
- server/src/middleware/errorHandler.ts:3-67
- server/src/middleware/auth.ts:7-81
- server/src/modules/tts/tts.service.ts:518-542
- server/src/services/storage.service.ts:252-272
结论
平台提供了清晰的扩展边界与统一的基础设施:控制器-服务-提供方-存储的分层架构、统一的配置中心、可插拔的提供方与中间件体系,使得新增业务模块、集成第三方服务与定制现有功能变得简单可控。遵循本文的最佳实践与约束,可在保证性能与兼容性的前提下快速迭代。
[本节为总结性内容,无需特定文件引用]
附录
- 开发建议:优先在服务层封装业务规则,控制器只做参数校验与调用;提供方实现遵循统一接口;配置变更通过模型配置文件集中管理。
- 兼容性:保持API响应格式稳定;提供方与存储服务通过接口抽象保证替换兼容。
- 部署提示:通过环境变量切换存储类型与认证开关;关注限流与配额策略对用户体验的影响。
[本节为通用建议,无需特定文件引用]