# 文本转音频
**本文引用的文件**
- [tts.service.ts](file://server/src/modules/tts/tts.service.ts)
- [tts.controller.ts](file://server/src/modules/tts/tts.controller.ts)
- [aliyun.provider.ts](file://server/src/modules/tts/aliyun.provider.ts)
- [aliyun-realtime.provider.ts](file://server/src/modules/tts/aliyun-realtime.provider.ts)
- [minimax.provider.ts](file://server/src/modules/tts/minimax.provider.ts)
- [mock.provider.ts](file://server/src/modules/tts/mock.provider.ts)
- [audio-merger.ts](file://server/src/modules/tts/audio-merger.ts)
- [ffmpeg.processor.ts](file://server/src/services/ffmpeg.processor.ts)
- [index.ts](file://server/src/config/index.ts)
- [index.ts](file://server/src/types/index.ts)
- [ai-summary.service.ts](file://server/src/modules/tts/ai-summary.service.ts)
- [app.ts](file://server/src/app.ts)
- [API.md](file://docs/API.md)
## 目录
1. [引言](#引言)
2. [项目结构](#项目结构)
3. [核心组件](#核心组件)
4. [架构总览](#架构总览)
5. [详细组件分析](#详细组件分析)
6. [依赖关系分析](#依赖关系分析)
7. [性能考量](#性能考量)
8. [故障排查指南](#故障排查指南)
9. [结论](#结论)
10. [附录](#附录)
## 引言
本技术文档围绕“文本转音频”(TTS)能力进行系统化梳理,覆盖异步音频生成流程、队列与状态管理、智能分段算法、音频拼接、质量控制、错误处理与重试、以及 API 使用与最佳实践。文档面向开发者与产品/运营人员,既提供代码级细节,也给出概念性说明与可视化图示。
## 项目结构
TTS 功能位于后端服务的 TTS 模块,主要由控制器、服务层、提供者(Provider)、合并器与 FFmpeg 处理器组成,并通过配置中心与类型定义支撑运行时行为。
```mermaid
graph TB
subgraph "应用入口"
APP["app.ts
注册路由/中间件/静态资源"]
end
subgraph "TTS 模块"
CTRL["tts.controller.ts
REST 控制器"]
SVC["tts.service.ts
业务服务"]
MERGE["audio-merger.ts
本地合并/时长"]
FPROC["ffmpeg.processor.ts
远程下载/合并/时长"]
SUMM["ai-summary.service.ts
标题/摘要/标签"]
end
subgraph "TTS 提供者"
ALI["aliyun.provider.ts
HTTP 合成"]
REAL["aliyun-realtime.provider.ts
WebSocket 实时"]
MINI["minimax.provider.ts
异步长文本"]
MOCK["mock.provider.ts
模拟/占位"]
end
subgraph "配置与类型"
CFG["config/index.ts
DashScope/模型/上传"]
TYPES["types/index.ts
VoiceParams/AudioStatus"]
end
APP --> CTRL --> SVC
SVC --> ALI
SVC --> REAL
SVC --> MINI
SVC --> MOCK
SVC --> MERGE
MERGE --> FPROC
SVC --> SUMM
SVC --> CFG
SVC --> TYPES
```
**图表来源**
- [app.ts:99-130](file://server/src/app.ts#L99-L130)
- [tts.controller.ts:10-13](file://server/src/modules/tts/tts.controller.ts#L10-L13)
- [tts.service.ts:1-20](file://server/src/modules/tts/tts.service.ts#L1-L20)
- [audio-merger.ts:9-36](file://server/src/modules/tts/audio-merger.ts#L9-L36)
- [ffmpeg.processor.ts:24-122](file://server/src/services/ffmpeg.processor.ts#L24-L122)
- [aliyun.provider.ts:9-19](file://server/src/modules/tts/aliyun.provider.ts#L9-L19)
- [aliyun-realtime.provider.ts:11-21](file://server/src/modules/tts/aliyun-realtime.provider.ts#L11-L21)
- [minimax.provider.ts:42-51](file://server/src/modules/tts/minimax.provider.ts#L42-L51)
- [mock.provider.ts:11-17](file://server/src/modules/tts/mock.provider.ts#L11-L17)
- [index.ts:69-117](file://server/src/config/index.ts#L69-L117)
- [index.ts:40-46](file://server/src/types/index.ts#L40-L46)
**章节来源**
- [app.ts:99-130](file://server/src/app.ts#L99-L130)
- [tts.controller.ts:10-13](file://server/src/modules/tts/tts.controller.ts#L10-L13)
- [tts.service.ts:1-20](file://server/src/modules/tts/tts.service.ts#L1-L20)
- [index.ts:69-117](file://server/src/config/index.ts#L69-L117)
## 核心组件
- 控制器(tts.controller.ts):负责参数校验、配额检查、调用服务层并返回统一响应格式。
- 服务层(tts.service.ts):实现异步生成、文本分段、Provider 选择与回退、并发合成、合并与上传、状态更新、回调与 WebSocket 通知。
- 提供者(Provider):封装不同 TTS 供应商的调用细节,含重试与错误分类。
- 合并器(audio-merger.ts):本地文件合并与时长探测;远程场景委托 FFmpeg 处理器。
- FFmpeg 处理器(ffmpeg.processor.ts):统一处理远程 URL 的下载、合并、格式转换、裁剪、音量调节与上传。
- 配置与类型(config/index.ts、types/index.ts):提供 DashScope/MiniMax 等配置、模型列表、上传目录、音质参数等。
- AI 摘要(ai-summary.service.ts):生成标题、摘要与标签,提升内容可发现性。
**章节来源**
- [tts.controller.ts:52-127](file://server/src/modules/tts/tts.controller.ts#L52-L127)
- [tts.service.ts:200-542](file://server/src/modules/tts/tts.service.ts#L200-L542)
- [audio-merger.ts:9-86](file://server/src/modules/tts/audio-merger.ts#L9-L86)
- [ffmpeg.processor.ts:69-208](file://server/src/services/ffmpeg.processor.ts#L69-L208)
- [index.ts:83-93](file://server/src/config/index.ts#L83-L93)
- [index.ts:40-46](file://server/src/types/index.ts#L40-L46)
- [ai-summary.service.ts:7-169](file://server/src/modules/tts/ai-summary.service.ts#L7-L169)
## 架构总览
TTS 采用“控制器-服务-提供者-存储”的分层设计,结合 Provider 工厂与优先级回退策略,确保在多供应商环境下具备高可用与弹性。异步生成流程通过文件系统状态与 WebSocket 事件实现进度通知,同时通过配额与订阅服务保障资源使用合规。
```mermaid
sequenceDiagram
participant C as "客户端"
participant R as "tts.controller.ts"
participant S as "tts.service.ts"
participant P as "Provider(阿里云/MiniMax/模拟)"
participant M as "AudioMerger/FFmpeg"
participant ST as "存储服务"
participant WS as "WebSocket"
C->>R : POST /api/tts/generate
R->>R : 校验参数/配额检查
R->>S : generateAudio(userId,text,voice,voiceParams,...)
S->>S : 选择Provider/分段/并发合成
S->>P : synthesize(分段xN)
P-->>S : 本地文件/云端URL
S->>M : 合并/时长探测
M-->>S : 合成文件/URL
S->>ST : 上传/返回最终URL
ST-->>S : 最终URL
S->>WS : 推送完成事件
S-->>R : 返回{audioId,audioUrl}
R-->>C : 统一响应
```
**图表来源**
- [tts.controller.ts:52-127](file://server/src/modules/tts/tts.controller.ts#L52-L127)
- [tts.service.ts:200-542](file://server/src/modules/tts/tts.service.ts#L200-L542)
- [audio-merger.ts:9-86](file://server/src/modules/tts/audio-merger.ts#L9-L86)
- [ffmpeg.processor.ts:69-122](file://server/src/services/ffmpeg.processor.ts#L69-L122)
## 详细组件分析
### 异步音频生成流程与状态跟踪
- 入口:控制器接收请求,进行参数与配额校验后调用服务层异步生成。
- 服务层:
- 生成唯一音频 ID,创建记录(processing),并进入异步处理。
- 选择 Provider(优先级:MiniMax → 阿里云 → 模拟),按类型决定分段策略与并发度。
- 并行合成各段音频,聚合本地文件与云端 URL。
- 合并为最终 MP3,计算时长与大小,上传至存储服务。
- 生成标题/摘要/标签,写入书籍章节(如存在),更新记录状态为 completed。
- 回调 onComplete(如有),推送 WebSocket 完成事件。
- 状态查询:基于文件系统与失败标记判断(not_found/processing/completed/failed)。
```mermaid
flowchart TD
Start(["开始"]) --> Validate["参数与配额校验"]
Validate --> CreateRec["创建处理记录(processing)"]
CreateRec --> SelectProv["选择Provider(优先级)"]
SelectProv --> DecideSplit{"是否分段?"}
DecideSplit --> |是| Split["智能分段(段落/句子/强制切分)"]
DecideSplit --> |否| NoSplit["整段直传(如MiniMax)"]
Split --> Concurrency["并发合成(1/2)"]
NoSplit --> Concurrency
Concurrency --> Merge["合并/时长/上传"]
Merge --> AI["AI生成标题/摘要/标签"]
AI --> Save["写入书籍章节/更新记录"]
Save --> Callback["回调/推送事件"]
Callback --> End(["结束"])
```
**图表来源**
- [tts.controller.ts:87-120](file://server/src/modules/tts/tts.controller.ts#L87-L120)
- [tts.service.ts:285-542](file://server/src/modules/tts/tts.service.ts#L285-L542)
**章节来源**
- [tts.controller.ts:52-127](file://server/src/modules/tts/tts.controller.ts#L52-L127)
- [tts.service.ts:200-542](file://server/src/modules/tts/tts.service.ts#L200-L542)
- [tts.service.ts:547-597](file://server/src/modules/tts/tts.service.ts#L547-L597)
### 智能分段处理算法
- 分段策略:
- 按段落(按换行)合并,超过阈值(550 字)再按句子切分。
- 句子仍超限则强制按字符块切分。
- 最终安全检查:超过阈值的段落截断,避免越界。
- 适用范围:HTTP Provider(阿里云);MiniMax 异步长文本不进行分段。
- 设计动机:兼顾供应商字符上限与自然语义边界,保证合成质量与稳定性。
```mermaid
flowchart TD
A["输入文本"] --> Clean["清理/去回车"]
Clean --> Para["按段落拆分"]
Para --> CheckLen{"当前段<=550?"}
CheckLen --> |是| Acc["累加到当前段"]
CheckLen --> |否| OverPara["段超限"]
OverPara --> Sent["按句号/感叹号等切分"]
Sent --> SentCheck{"句<=550?"}
SentCheck --> |是| Acc
SentCheck --> |否| Force["强制按字符块切分"]
Force --> Acc
Acc --> NextPara["下一个段落"]
NextPara --> Done["汇总为若干段(≤550)"]
```
**图表来源**
- [tts.service.ts:98-158](file://server/src/modules/tts/tts.service.ts#L98-L158)
**章节来源**
- [tts.service.ts:98-158](file://server/src/modules/tts/tts.service.ts#L98-L158)
### 音频生成与拼接
- 合成阶段:Provider 返回本地文件路径或云端 URL。
- 合并阶段:
- 本地:使用 FFmpeg concat 合并,MP3 转码为 192k。
- 远程:委托 FFmpeg 处理器下载、合并、上传,统一返回最终 URL。
- 时长探测:本地使用 ffprobe;远程通过 FFmpeg 处理器探测。
- 上传:统一经存储服务处理(本地/oss 可切换)。
```mermaid
classDiagram
class AudioMerger {
+merge(inputFiles,outputPath) Promise~string~
+getDuration(filePath) Promise~number~
-mergeLocalFiles(inputFiles,outputPath) Promise~string~
}
class FFmpegProcessor {
+mergeAudio(urls,format) Promise~string~
+getDuration(url) Promise~number~
+convertFormat(url,format,bitrate) Promise~string~
+trimAudio(url,start,duration) Promise~string~
+adjustVolume(url,volume) Promise~string~
-downloadFile(url) Promise~string~
}
AudioMerger --> FFmpegProcessor : "远程场景委托"
```
**图表来源**
- [audio-merger.ts:9-86](file://server/src/modules/tts/audio-merger.ts#L9-L86)
- [ffmpeg.processor.ts:69-208](file://server/src/services/ffmpeg.processor.ts#L69-L208)
**章节来源**
- [audio-merger.ts:9-86](file://server/src/modules/tts/audio-merger.ts#L9-L86)
- [ffmpeg.processor.ts:69-208](file://server/src/services/ffmpeg.processor.ts#L69-L208)
### Provider 与质量控制
- 阿里云(HTTP):支持 instruct 模型的指令控制(速度/音调),带指数退避重试与速率限制处理。
- 阿里云(实时 WebSocket):长文本流式合成,支持会话配置与音频流拼接。
- MiniMax:异步长文本任务,轮询状态,tar 包内提取 MP3,音频采样率 32kHz、码率 128kbps、单声道 MP3。
- 模拟 Provider:FFmpeg 生成占位音频,便于开发调试。
```mermaid
classDiagram
class AliyunTtsProvider {
+synthesize(text,voice,params,output,retries,model?) Promise~string~
}
class AliyunRealtimeTtsProvider {
+synthesize(text,voice,params,output) Promise~string~
}
class MiniMaxTtsProvider {
+synthesize(text,voice,params,output,retries,_) Promise~string~
}
class MockTtsProvider {
+synthesize(text,voice,params,output) Promise~string~
}
```
**图表来源**
- [aliyun.provider.ts:9-152](file://server/src/modules/tts/aliyun.provider.ts#L9-L152)
- [aliyun-realtime.provider.ts:11-158](file://server/src/modules/tts/aliyun-realtime.provider.ts#L11-L158)
- [minimax.provider.ts:42-280](file://server/src/modules/tts/minimax.provider.ts#L42-L280)
- [mock.provider.ts:11-61](file://server/src/modules/tts/mock.provider.ts#L11-L61)
**章节来源**
- [aliyun.provider.ts:21-150](file://server/src/modules/tts/aliyun.provider.ts#L21-L150)
- [aliyun-realtime.provider.ts:23-156](file://server/src/modules/tts/aliyun-realtime.provider.ts#L23-L156)
- [minimax.provider.ts:53-278](file://server/src/modules/tts/minimax.provider.ts#L53-L278)
- [mock.provider.ts:12-60](file://server/src/modules/tts/mock.provider.ts#L12-L60)
### 错误处理与重试机制
- 速率限制/服务器错误:指数退避重试(2^attempt × 1000 ms),最多 N 次。
- Provider 回退:若为额度受限错误,切换下一个 Provider;否则直接抛错。
- 文件系统状态:失败标记文件、空目录僵尸任务检测、超时失败回写数据库。
- WebSocket 通知:生成成功/失败均推送事件,前端可订阅。
```mermaid
flowchart TD
Call["调用Provider"] --> Resp{"响应状态"}
Resp --> |200+有效| OK["成功返回"]
Resp --> |429/配额| Rate["速率限制/配额超限"]
Resp --> |5xx/网络| Retry["指数退避重试"]
Resp --> |其他| Fail["抛错/回退"]
Rate --> NextProv["切换下一Provider"]
Retry --> Call
NextProv --> Call
Fail --> End["结束"]
OK --> End
```
**图表来源**
- [tts.service.ts:518-542](file://server/src/modules/tts/tts.service.ts#L518-L542)
- [aliyun.provider.ts:125-145](file://server/src/modules/tts/aliyun.provider.ts#L125-L145)
- [minimax.provider.ts:258-278](file://server/src/modules/tts/minimax.provider.ts#L258-L278)
**章节来源**
- [tts.service.ts:518-542](file://server/src/modules/tts/tts.service.ts#L518-L542)
- [tts.service.ts:547-597](file://server/src/modules/tts/tts.service.ts#L547-L597)
- [aliyun.provider.ts:125-145](file://server/src/modules/tts/aliyun.provider.ts#L125-L145)
- [minimax.provider.ts:258-278](file://server/src/modules/tts/minimax.provider.ts#L258-L278)
### API 使用示例与最佳实践
- 获取音色列表与可用供应商
- GET /api/tts/voices
- GET /api/tts/providers
- 生成音频(异步)
- POST /api/tts/generate
- 请求体包含 text、voiceId、voiceParams(speed/pitch/volume)、可选 bookId/chapterTitle/ttsProvider
- 响应返回 audioId(立即可用),最终 URL 通过回调/WebSocket/状态接口获取
- 预览音色
- POST /api/tts/preview
- 下载音频
- GET /api/tts/download/:audioId
- 批量下载:POST /api/tts/download/batch
最佳实践
- 参数校验:必填字段与数值范围(速度 0.5-2.0、音调 -500~500、音量 0-100)。
- 并发与配额:合理设置并发度(MiniMax 1,其他 2),关注订阅配额与字数限制。
- Provider 选择:优先 MiniMax(长文本),否则阿里云 HTTP;无密钥回退模拟。
- 状态查询:使用 /api/tts/status/:audioId 或 WebSocket 事件。
- 质量控制:MP3 192k、采样率 32kHz(MiniMax),必要时通过 FFmpeg 转换。
**章节来源**
- [API.md:95-158](file://docs/API.md#L95-L158)
- [tts.controller.ts:12-180](file://server/src/modules/tts/tts.controller.ts#L12-L180)
- [tts.controller.ts:182-272](file://server/src/modules/tts/tts.controller.ts#L182-L272)
- [index.ts:40-46](file://server/src/types/index.ts#L40-L46)
- [minimax.provider.ts:72-77](file://server/src/modules/tts/minimax.provider.ts#L72-L77)
## 依赖关系分析
- 控制器依赖服务层与中间件(鉴权、限流、错误处理、性能监控、安全防护)。
- 服务层依赖 Provider、合并器、AI 摘要、存储服务、WebSocket 服务、数据库。
- Provider 依赖配置中心(DashScope/MiniMax)与网络库。
- 合并器与 FFmpeg 处理器依赖系统命令(ffmpeg/ffprobe)与存储服务。
```mermaid
graph LR
CTRL["tts.controller.ts"] --> SVC["tts.service.ts"]
SVC --> ALI["aliyun.provider.ts"]
SVC --> REAL["aliyun-realtime.provider.ts"]
SVC --> MINI["minimax.provider.ts"]
SVC --> MOCK["mock.provider.ts"]
SVC --> MERGE["audio-merger.ts"]
MERGE --> FPROC["ffmpeg.processor.ts"]
SVC --> SUMM["ai-summary.service.ts"]
SVC --> CFG["config/index.ts"]
CTRL --> TYPES["types/index.ts"]
```
**图表来源**
- [tts.controller.ts:1-10](file://server/src/modules/tts/tts.controller.ts#L1-L10)
- [tts.service.ts:1-14](file://server/src/modules/tts/tts.service.ts#L1-L14)
- [audio-merger.ts:1-7](file://server/src/modules/tts/audio-merger.ts#L1-L7)
- [ffmpeg.processor.ts:1-12](file://server/src/services/ffmpeg.processor.ts#L1-L12)
- [index.ts:1-11](file://server/src/config/index.ts#L1-L11)
- [index.ts:1-12](file://server/src/types/index.ts#L1-L12)
**章节来源**
- [tts.controller.ts:1-10](file://server/src/modules/tts/tts.controller.ts#L1-L10)
- [tts.service.ts:1-14](file://server/src/modules/tts/tts.service.ts#L1-L14)
- [audio-merger.ts:1-7](file://server/src/modules/tts/audio-merger.ts#L1-L7)
- [ffmpeg.processor.ts:1-12](file://server/src/services/ffmpeg.processor.ts#L1-L12)
- [index.ts:1-11](file://server/src/config/index.ts#L1-L11)
- [index.ts:1-12](file://server/src/types/index.ts#L1-L12)
## 性能考量
- 并发策略:MiniMax 异步轮询耗时较长,采用并发=1;HTTP Provider 并发=2,提升吞吐。
- 分段阈值:550 字安全余量,平衡字符上限与语义完整性。
- 合并优化:本地合并直接复制流(非 MP3)或转码(MP3),远程场景统一通过 FFmpeg 处理器。
- 存储上传:统一经存储服务,支持本地/oss 切换,减少耦合。
- 时长与大小:合并后即时统计,避免重复探测。
[本节为通用性能讨论,不直接分析具体文件]
## 故障排查指南
常见问题与定位步骤
- 生成失败:检查 Provider 日志与错误类型(速率限制/配额/网络),确认回退链路是否生效。
- 文件缺失:确认上传目录存在、权限正确;检查失败标记文件与僵尸任务检测逻辑。
- 时长/大小异常:确认合并与探测流程是否执行;远程场景检查 FFmpeg 处理器下载与探测。
- WebSocket 未推送:确认初始化与事件推送逻辑;检查回调是否被正确 await。
- 配额不足:核对订阅状态与字数消耗;必要时提示升级会员等级。
**章节来源**
- [tts.service.ts:547-597](file://server/src/modules/tts/tts.service.ts#L547-L597)
- [tts.service.ts:272-279](file://server/src/modules/tts/tts.service.ts#L272-L279)
- [ffmpeg.processor.ts:190-208](file://server/src/services/ffmpeg.processor.ts#L190-L208)
## 结论
该 TTS 方案通过“控制器-服务-Provider-存储”的清晰分层,结合智能分段、并发合成、统一合并与上传、AI 摘要与状态跟踪,实现了高可用、可扩展、可维护的文本转音频能力。配合订阅配额与错误回退机制,可在多供应商环境下稳定运行,并为后续扩展(队列、批处理、更多 Provider)奠定基础。
## 附录
- 关键配置项
- DashScope API Key、模型、音色、TTS 模型列表、是否启用实时模式
- 上传目录、最大文件大小
- 关键类型
- VoiceParams:speed/pitch/volume
- AudioStatus:processing/completed/failed
- 常用接口
- GET /api/tts/voices
- GET /api/tts/providers
- POST /api/tts/generate
- GET /api/tts/status/:audioId
- POST /api/tts/preview
- GET /api/tts/download/:audioId
- POST /api/tts/download/batch
**章节来源**
- [index.ts:83-93](file://server/src/config/index.ts#L83-L93)
- [index.ts:113-117](file://server/src/config/index.ts#L113-L117)
- [index.ts:40-46](file://server/src/types/index.ts#L40-L46)
- [API.md:95-158](file://docs/API.md#L95-L158)