# 扩展开发 **本文引用的文件** - [server/src/app.ts](file://server/src/app.ts) - [server/src/config/index.ts](file://server/src/config/index.ts) - [server/src/config/models.json](file://server/src/config/models.json) - [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/tts/aliyun.provider.ts](file://server/src/modules/tts/aliyun.provider.ts) - [server/src/modules/tts/minimax.provider.ts](file://server/src/modules/tts/minimax.provider.ts) - [server/src/modules/tts/mock.provider.ts](file://server/src/modules/tts/mock.provider.ts) - [server/src/modules/player/player.service.ts](file://server/src/modules/player/player.service.ts) - [server/src/services/storage.service.ts](file://server/src/services/storage.service.ts) - [server/src/middleware/auth.ts](file://server/src/middleware/auth.ts) - [server/src/middleware/errorHandler.ts](file://server/src/middleware/errorHandler.ts) - [server/src/types/index.ts](file://server/src/types/index.ts) - [server/src/modules/book-generator/book-generator.controller.ts](file://server/src/modules/book-generator/book-generator.controller.ts) ## 目录 1. [简介](#简介) 2. [项目结构](#项目结构) 3. [核心组件](#核心组件) 4. [架构总览](#架构总览) 5. [详细组件分析](#详细组件分析) 6. [依赖分析](#依赖分析) 7. [性能考量](#性能考量) 8. [故障排查指南](#故障排查指南) 9. [结论](#结论) 10. [附录](#附录) ## 简介 本扩展开发文档面向希望为AI有声书生成平台新增业务模块、集成第三方服务与定制现有功能的开发者。文档覆盖插件开发框架、API扩展接口、配置管理机制、TTS音色提供商接入、AI模型集成、播放器功能扩展、自定义中间件与业务逻辑扩展、数据模型扩展等主题,并提供最佳实践、性能优化与兼容性保障建议。 ## 项目结构 后端采用Koa应用,模块化组织各领域功能(如TTS、播放器、书籍生成、认证、存储等)。应用入口负责注册中间件、静态资源、路由与服务启动;配置中心统一管理模型与供应商;服务层封装业务逻辑;控制器负责HTTP接口;中间件提供安全、限流、错误处理等横切能力;类型系统定义数据契约。 ```mermaid graph TB A["应用入口
server/src/app.ts"] --> B["中间件
errorHandler/auth/security"] A --> C["路由注册
各模块控制器"] A --> D["服务初始化
数据库/缓存/存储/WebSocket"] C --> E["TTS 控制器
server/src/modules/tts/tts.controller.ts"] C --> F["播放器服务
server/src/modules/player/player.service.ts"] C --> G["书籍生成控制器
server/src/modules/book-generator/book-generator.controller.ts"] E --> H["TTS 服务
server/src/modules/tts/tts.service.ts"] H --> I["阿里云TTS提供方
server/src/modules/tts/aliyun.provider.ts"] H --> J["MiniMaxTTS提供方
server/src/modules/tts/minimax.provider.ts"] H --> K["Mock提供方
server/src/modules/tts/mock.provider.ts"] H --> L["存储服务
server/src/services/storage.service.ts"] A --> M["配置中心
server/src/config/index.ts"] M --> N["模型配置
server/src/config/models.json"] ``` **图表来源** - [server/src/app.ts:57-130](file://server/src/app.ts#L57-L130) - [server/src/modules/tts/tts.controller.ts:10-127](file://server/src/modules/tts/tts.controller.ts#L10-L127) - [server/src/modules/player/player.service.ts:1-280](file://server/src/modules/player/player.service.ts#L1-L280) - [server/src/modules/book-generator/book-generator.controller.ts:18-119](file://server/src/modules/book-generator/book-generator.controller.ts#L18-L119) - [server/src/modules/tts/tts.service.ts:160-190](file://server/src/modules/tts/tts.service.ts#L160-L190) - [server/src/modules/tts/aliyun.provider.ts:9-152](file://server/src/modules/tts/aliyun.provider.ts#L9-L152) - [server/src/modules/tts/minimax.provider.ts:42-280](file://server/src/modules/tts/minimax.provider.ts#L42-L280) - [server/src/modules/tts/mock.provider.ts:11-61](file://server/src/modules/tts/mock.provider.ts#L11-L61) - [server/src/services/storage.service.ts:13-278](file://server/src/services/storage.service.ts#L13-L278) - [server/src/config/index.ts:69-117](file://server/src/config/index.ts#L69-L117) - [server/src/config/models.json:1-186](file://server/src/config/models.json#L1-L186) **章节来源** - [server/src/app.ts:57-130](file://server/src/app.ts#L57-L130) ## 核心组件 - 应用入口与路由:集中注册中间件、静态资源、路由与服务启动,统一健康检查与指标暴露。 - 配置中心:统一管理模型供应商、默认模型、TTS默认音色、端口与JWT等配置。 - TTS模块:提供音色列表、可用服务商、异步音频生成、状态查询、预览生成、LRC歌词生成与合并。 - 存储服务:统一抽象OSS与本地存储,支持上传、下载、删除、签名URL与目录清理。 - 中间件:错误处理、认证、安全防护、性能监控、限流与使用量限制。 - 播放器服务:播放进度记录、合并章节音频、最近播放记录查询。 - 类型系统:统一用户、音频、订单、分页、音色、会员配额等数据契约。 **章节来源** - [server/src/app.ts:63-130](file://server/src/app.ts#L63-L130) - [server/src/config/index.ts:69-117](file://server/src/config/index.ts#L69-L117) - [server/src/modules/tts/tts.service.ts:24-644](file://server/src/modules/tts/tts.service.ts#L24-L644) - [server/src/services/storage.service.ts:43-193](file://server/src/services/storage.service.ts#L43-L193) - [server/src/middleware/errorHandler.ts:3-67](file://server/src/middleware/errorHandler.ts#L3-L67) - [server/src/middleware/auth.ts:7-81](file://server/src/middleware/auth.ts#L7-L81) - [server/src/modules/player/player.service.ts:10-280](file://server/src/modules/player/player.service.ts#L10-L280) - [server/src/types/index.ts:1-124](file://server/src/types/index.ts#L1-L124) ## 架构总览 平台采用“控制器-服务-提供方-存储”分层架构,TTS模块通过工厂模式动态选择不同提供方,支持阿里云、MiniMax与Mock三种路径;存储服务屏蔽OSS与本地差异;中间件贯穿请求生命周期提供横切能力;配置中心集中管理模型与供应商。 ```mermaid graph TB subgraph "接口层" R["TTS控制器
tts.controller.ts"] RBG["书籍生成控制器
book-generator.controller.ts"] end subgraph "服务层" S1["TTS服务
tts.service.ts"] S2["播放器服务
player.service.ts"] end subgraph "提供方层" P1["阿里云TTS提供方
aliyun.provider.ts"] P2["MiniMaxTTS提供方
minimax.provider.ts"] P3["Mock提供方
mock.provider.ts"] end subgraph "基础设施" CFG["配置中心
config/index.ts"] ST["存储服务
storage.service.ts"] MID["中间件
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](file://server/src/modules/tts/tts.controller.ts#L10-L127) - [server/src/modules/book-generator/book-generator.controller.ts:18-119](file://server/src/modules/book-generator/book-generator.controller.ts#L18-L119) - [server/src/modules/tts/tts.service.ts:160-190](file://server/src/modules/tts/tts.service.ts#L160-L190) - [server/src/modules/tts/aliyun.provider.ts:9-152](file://server/src/modules/tts/aliyun.provider.ts#L9-L152) - [server/src/modules/tts/minimax.provider.ts:42-280](file://server/src/modules/tts/minimax.provider.ts#L42-L280) - [server/src/modules/tts/mock.provider.ts:11-61](file://server/src/modules/tts/mock.provider.ts#L11-L61) - [server/src/services/storage.service.ts:13-278](file://server/src/services/storage.service.ts#L13-L278) - [server/src/config/index.ts:69-117](file://server/src/config/index.ts#L69-L117) - [server/src/middleware/auth.ts:7-81](file://server/src/middleware/auth.ts#L7-L81) - [server/src/middleware/errorHandler.ts:3-67](file://server/src/middleware/errorHandler.ts#L3-L67) ## 详细组件分析 ### 插件开发框架与扩展点 - 控制器扩展:新增业务模块只需新增控制器文件并在应用入口注册路由,遵循现有路由前缀与响应格式约定。 - 服务层扩展:在对应服务文件中实现业务逻辑,复用现有中间件、存储与配置。 - 提供方扩展:新增TTS提供方时,遵循现有Provider接口规范(如synthesize方法),在工厂函数中注册并支持自动切换。 - 配置扩展:通过配置中心与模型配置文件统一管理供应商与模型,支持动态启用/禁用与默认值。 ```mermaid 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](file://server/src/modules/tts/tts.controller.ts#L10-L274) - [server/src/modules/tts/tts.service.ts:160-644](file://server/src/modules/tts/tts.service.ts#L160-L644) - [server/src/modules/tts/aliyun.provider.ts:9-152](file://server/src/modules/tts/aliyun.provider.ts#L9-L152) - [server/src/modules/tts/minimax.provider.ts:42-280](file://server/src/modules/tts/minimax.provider.ts#L42-L280) - [server/src/modules/tts/mock.provider.ts:11-61](file://server/src/modules/tts/mock.provider.ts#L11-L61) - [server/src/services/storage.service.ts:43-193](file://server/src/services/storage.service.ts#L43-L193) **章节来源** - [server/src/modules/tts/tts.controller.ts:10-274](file://server/src/modules/tts/tts.controller.ts#L10-L274) - [server/src/modules/tts/tts.service.ts:160-644](file://server/src/modules/tts/tts.service.ts#L160-L644) - [server/src/config/index.ts:69-117](file://server/src/config/index.ts#L69-L117) - [server/src/config/models.json:1-186](file://server/src/config/models.json#L1-L186) ### API扩展接口 - 新增控制器:在对应模块目录创建控制器文件,导出路由对象;在应用入口注册路由。 - 新增服务:在模块服务目录创建服务文件,实现业务逻辑;在控制器中调用。 - 新增提供方:在模块tts目录新增提供方类,实现synthesize方法;在工厂函数中注册。 - 响应格式:统一使用{code,message,data}结构,错误通过中间件捕获并标准化返回。 ```mermaid 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](file://server/src/modules/tts/tts.controller.ts#L52-L127) - [server/src/modules/tts/tts.service.ts:200-542](file://server/src/modules/tts/tts.service.ts#L200-L542) - [server/src/modules/tts/aliyun.provider.ts:21-150](file://server/src/modules/tts/aliyun.provider.ts#L21-L150) - [server/src/modules/tts/minimax.provider.ts:234-278](file://server/src/modules/tts/minimax.provider.ts#L234-L278) - [server/src/services/storage.service.ts:43-93](file://server/src/services/storage.service.ts#L43-L93) **章节来源** - [server/src/modules/tts/tts.controller.ts:10-274](file://server/src/modules/tts/tts.controller.ts#L10-L274) - [server/src/modules/tts/tts.service.ts:200-542](file://server/src/modules/tts/tts.service.ts#L200-L542) ### 配置管理机制 - 环境变量:端口、JWT密钥、存储类型、供应商API Key等。 - 模型配置:models.json集中管理供应商、模型、默认模型与默认音色;config/index.ts提供查询与切换逻辑。 - 动态切换:根据错误类型自动切换可用模型;支持按类型过滤启用的模型。 ```mermaid 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](file://server/src/config/index.ts#L13-L67) - [server/src/config/models.json:1-186](file://server/src/config/models.json#L1-L186) **章节来源** - [server/src/config/index.ts:13-67](file://server/src/config/index.ts#L13-L67) - [server/src/config/models.json:1-186](file://server/src/config/models.json#L1-L186) ### 添加新的TTS音色提供商 - 实现Provider类:提供synthesize方法,支持重试与错误处理。 - 注册提供方:在工厂函数中识别并返回实例;在可用提供方列表中登记。 - 音色映射:维护前端音色ID到提供方音色名称的映射。 - 测试与回退:提供Mock提供方作为开发与测试回退。 ```mermaid classDiagram class Provider { <> +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](file://server/src/modules/tts/aliyun.provider.ts#L9-L152) - [server/src/modules/tts/minimax.provider.ts:42-280](file://server/src/modules/tts/minimax.provider.ts#L42-L280) - [server/src/modules/tts/mock.provider.ts:11-61](file://server/src/modules/tts/mock.provider.ts#L11-L61) **章节来源** - [server/src/modules/tts/tts.service.ts:160-190](file://server/src/modules/tts/tts.service.ts#L160-L190) - [server/src/modules/tts/aliyun.provider.ts:9-152](file://server/src/modules/tts/aliyun.provider.ts#L9-L152) - [server/src/modules/tts/minimax.provider.ts:42-280](file://server/src/modules/tts/minimax.provider.ts#L42-L280) - [server/src/modules/tts/mock.provider.ts:11-61](file://server/src/modules/tts/mock.provider.ts#L11-L61) ### 集成新的AI模型 - 在models.json中新增供应商与模型项,设置启用状态与输入类型。 - 在config/index.ts中使用统一查询接口获取模型列表与默认值。 - 在服务层按类型筛选可用模型,必要时实现shouldSwitchModel与getNextModel逻辑。 **章节来源** - [server/src/config/models.json:1-186](file://server/src/config/models.json#L1-L186) - [server/src/config/index.ts:13-67](file://server/src/config/index.ts#L13-L67) ### 扩展播放器功能 - 合并章节音频:当播放章时自动合并其下小节音频,返回合并后的URL并更新数据库。 - 播放进度:提供保存、更新、删除与查询播放进度的接口。 - 最近播放:按用户查询最近播放记录并计算进度百分比。 ```mermaid 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](file://server/src/modules/player/player.service.ts#L147-L242) **章节来源** - [server/src/modules/player/player.service.ts:10-280](file://server/src/modules/player/player.service.ts#L10-L280) ### 自定义中间件开发 - 错误处理:统一捕获异常并返回标准格式;开发环境返回堆栈。 - 认证中间件:支持可选认证与可选用户注入,便于开发调试。 - 安全与性能:提供XSS与SQL注入防护、性能监控与限流中间件。 **章节来源** - [server/src/middleware/errorHandler.ts:3-67](file://server/src/middleware/errorHandler.ts#L3-L67) - [server/src/middleware/auth.ts:7-81](file://server/src/middleware/auth.ts#L7-L81) ### 业务逻辑扩展 - 使用量限制:在控制器中调用配额检查与消费接口,避免超限。 - 书籍批量生成:通过控制器启动批量任务,支持取消与状态查询。 - 数据一致性:在服务层进行事务性操作与状态更新,确保记录与文件一致。 **章节来源** - [server/src/modules/tts/tts.controller.ts:87-127](file://server/src/modules/tts/tts.controller.ts#L87-L127) - [server/src/modules/book-generator/book-generator.controller.ts:24-119](file://server/src/modules/book-generator/book-generator.controller.ts#L24-L119) ### 数据模型扩展 - 类型系统:统一定义用户、音频、订单、分页、音色与会员配额等类型。 - 扩展建议:新增实体时在types中定义接口,在Prisma中同步迁移,并在服务层封装CRUD。 **章节来源** - [server/src/types/index.ts:1-124](file://server/src/types/index.ts#L1-L124) ## 依赖分析 - 控制器依赖服务层;服务层依赖提供方与存储服务;配置中心被服务层与控制器共同依赖。 - 提供方之间无直接耦合,通过统一接口解耦;存储服务屏蔽OSS与本地差异。 - 中间件贯穿请求链路,提供横切能力。 ```mermaid graph LR Ctrl["控制器"] --> Svc["服务层"] Svc --> Prov["提供方"] Svc --> Store["存储服务"] Svc --> Cfg["配置中心"] Mid["中间件"] --> Ctrl Mid --> Svc ``` **图表来源** - [server/src/modules/tts/tts.controller.ts:10-274](file://server/src/modules/tts/tts.controller.ts#L10-L274) - [server/src/modules/tts/tts.service.ts:160-644](file://server/src/modules/tts/tts.service.ts#L160-L644) - [server/src/services/storage.service.ts:13-278](file://server/src/services/storage.service.ts#L13-L278) - [server/src/config/index.ts:69-117](file://server/src/config/index.ts#L69-L117) **章节来源** - [server/src/modules/tts/tts.controller.ts:10-274](file://server/src/modules/tts/tts.controller.ts#L10-L274) - [server/src/modules/tts/tts.service.ts:160-644](file://server/src/modules/tts/tts.service.ts#L160-L644) - [server/src/services/storage.service.ts:13-278](file://server/src/services/storage.service.ts#L13-L278) - [server/src/config/index.ts:69-117](file://server/src/config/index.ts#L69-L117) ## 性能考量 - 并发与批处理:TTS服务对分段音频采用并发生成,减少整体延迟;MiniMax异步轮询较长时降低并发度。 - 重试与退避:提供方实现指数退避重试,缓解限流与临时错误。 - 存储与网络:优先使用统一存储服务上传,支持OSS直传与本地回退;云端URL降级到本地下载再上传。 - 监控与指标:内置性能监控与指标接口,便于定位瓶颈。 [本节为通用指导,无需特定文件引用] ## 故障排查指南 - 错误处理:统一通过错误中间件捕获并返回标准格式;开发环境显示堆栈便于定位。 - 认证问题:检查Authorization头格式与JWT密钥;可开启可选认证以便开发调试。 - TTS失败:查看Provider错误类型,区分是否为额度限制导致的自动切换;检查API Key与网络连通性。 - 存储问题:测试本地或OSS连接,确认目录权限与对象键解析正确。 - 播放进度:确认用户ID与章节ID匹配,检查数据库记录与文件是否存在。 **章节来源** - [server/src/middleware/errorHandler.ts:3-67](file://server/src/middleware/errorHandler.ts#L3-L67) - [server/src/middleware/auth.ts:7-81](file://server/src/middleware/auth.ts#L7-L81) - [server/src/modules/tts/tts.service.ts:518-542](file://server/src/modules/tts/tts.service.ts#L518-L542) - [server/src/services/storage.service.ts:252-272](file://server/src/services/storage.service.ts#L252-L272) ## 结论 平台提供了清晰的扩展边界与统一的基础设施:控制器-服务-提供方-存储的分层架构、统一的配置中心、可插拔的提供方与中间件体系,使得新增业务模块、集成第三方服务与定制现有功能变得简单可控。遵循本文的最佳实践与约束,可在保证性能与兼容性的前提下快速迭代。 [本节为总结性内容,无需特定文件引用] ## 附录 - 开发建议:优先在服务层封装业务规则,控制器只做参数校验与调用;提供方实现遵循统一接口;配置变更通过模型配置文件集中管理。 - 兼容性:保持API响应格式稳定;提供方与存储服务通过接口抽象保证替换兼容。 - 部署提示:通过环境变量切换存储类型与认证开关;关注限流与配额策略对用户体验的影响。 [本节为通用建议,无需特定文件引用]