扩展开发.md 21 KB

扩展开发

本文引用的文件

  • 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

目录

  1. 简介
  2. 项目结构
  3. 核心组件
  4. 架构总览
  5. 详细组件分析
  6. 依赖分析
  7. 性能考量
  8. 故障排查指南
  9. 结论
  10. 附录

简介

本扩展开发文档面向希望为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

章节来源

  • server/src/app.ts:57-130

核心组件

  • 应用入口与路由:集中注册中间件、静态资源、路由与服务启动,统一健康检查与指标暴露。
  • 配置中心:统一管理模型供应商、默认模型、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

依赖分析

  • 控制器依赖服务层;服务层依赖提供方与存储服务;配置中心被服务层与控制器共同依赖。
  • 提供方之间无直接耦合,通过统一接口解耦;存储服务屏蔽OSS与本地差异。
  • 中间件贯穿请求链路,提供横切能力。

    graph LR
    Ctrl["控制器"] --> Svc["服务层"]
    Svc --> Prov["提供方"]
    Svc --> Store["存储服务"]
    Svc --> Cfg["配置中心"]
    Mid["中间件"] --> Ctrl
    Mid --> Svc
    

图表来源

  • 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响应格式稳定;提供方与存储服务通过接口抽象保证替换兼容。
  • 部署提示:通过环境变量切换存储类型与认证开关;关注限流与配额策略对用户体验的影响。

[本节为通用建议,无需特定文件引用]