TTS语音合成服务
本文引用的文件
- tts.service.ts
- tts.controller.ts
- audio-merger.ts
- aliyun.provider.ts
- minimax.provider.ts
- mock.provider.ts
- aliyun-realtime.provider.ts
- ai-summary.service.ts
- ffmpeg.processor.ts
- index.ts
- index.ts
- index.ts
- models.json
- models.json
目录
- 简介
- 项目结构
- 核心组件
- 架构总览
- 详细组件分析
- 依赖关系分析
- 性能考量
- 故障排查指南
- 结论
- 附录
简介
本项目为TTS语音合成服务,提供多供应商音色服务集成(阿里云、MiniMax)、音色选择与管理、参数调节机制,并内置音频合并器、批量音频处理与格式转换能力。系统支持异步生成、状态查询、预览音色、配额控制、AI摘要生成、LRC歌词时间轴生成、以及云端存储上传。文档将从架构、组件、数据流、错误处理、性能优化等方面进行深入说明,并给出实际调用示例与最佳实践。
项目结构
TTS模块位于后端server/src/modules/tts下,包含控制器、服务层、各TTS提供商适配器、音频合并器、AI摘要服务等;同时在server/src/services下提供通用的FFmpeg处理器与存储服务;配置文件位于server/src/config与deploy-package/server/config中。
graph TB
subgraph "TTS模块"
C["tts.controller.ts"]
S["tts.service.ts"]
AM["audio-merger.ts"]
AS["ai-summary.service.ts"]
P1["aliyun.provider.ts"]
P2["minimax.provider.ts"]
P3["mock.provider.ts"]
P4["aliyun-realtime.provider.ts"]
end
subgraph "通用服务"
F["ffmpeg.processor.ts"]
CFG["config/index.ts"]
TYPES["types/index.ts"]
PRISMA["models/index.ts"]
end
subgraph "配置"
M1["config/models.json"]
M2["deploy-package/server/config/models.json"]
end
C --> S
S --> P1
S --> P2
S --> P3
S --> P4
S --> AM
S --> AS
AM --> F
S --> CFG
S --> TYPES
S --> PRISMA
CFG --> M1
CFG --> M2
图表来源
- tts.controller.ts:1-274
- tts.service.ts:1-715
- audio-merger.ts:1-86
- ffmpeg.processor.ts:1-379
- config/index.ts:1-117
- models.json:1-186
- models.json:1-168
章节来源
- tts.controller.ts:1-274
- tts.service.ts:1-715
- audio-merger.ts:1-86
- ffmpeg.processor.ts:1-379
- config/index.ts:1-117
- models.json:1-186
- models.json:1-168
核心组件
- 控制器层:提供REST接口,负责参数校验、配额检查、调用服务层并返回结果。
- 服务层:封装TTS生成主流程,包括文本分段、并发生成、云端/本地降级、合并与上传、AI摘要、LRC歌词生成、状态查询等。
- 提供商适配器:阿里云HTTP/TTS实时、MiniMax异步长文本、Mock占位。
- 音频合并器:支持本地与远程URL合并、时长探测、格式转换。
- FFmpeg处理器:统一处理远程下载、合并、裁剪、音量调整、格式转换、时长探测等。
- AI摘要服务:生成标题、摘要与标签,支持真实AI与Mock降级。
- 配置与类型:统一模型配置、环境变量、类型定义、数据库连接。
章节来源
- tts.controller.ts:1-274
- tts.service.ts:1-715
- aliyun.provider.ts:1-152
- minimax.provider.ts:1-280
- mock.provider.ts:1-61
- aliyun-realtime.provider.ts:1-158
- audio-merger.ts:1-86
- ffmpeg.processor.ts:1-379
- ai-summary.service.ts:1-169
- index.ts:1-124
- index.ts:1-15
- index.ts:1-117
架构总览
系统采用“控制器-服务-适配器-工具”的分层架构。控制器接收请求并进行参数与配额校验,服务层协调提供商适配器与合并器,最终通过存储服务上传至OSS或本地,并持久化到数据库。
sequenceDiagram
participant Client as "客户端"
participant Ctrl as "tts.controller"
participant Svc as "tts.service"
participant Prov as "TTS提供商(阿里云/MiniMax/Mock)"
participant Merge as "AudioMerger/FFmpeg"
participant Store as "StorageService"
participant DB as "Prisma"
Client->>Ctrl : POST /tts/generate
Ctrl->>Ctrl : 校验参数/配额
Ctrl->>Svc : generateAudio(userId,text,voiceId,params,options)
Svc->>Svc : 选择提供商/文本分段/并发生成
Svc->>Prov : synthesize(分段, voiceName, params)
Prov-->>Svc : 本地文件路径或云端URL
Svc->>Merge : 合并/时长探测
Merge-->>Svc : 合并后文件/URL
Svc->>Store : uploadAudio(合并文件, audioId)
Store-->>Svc : 返回最终URL
Svc->>DB : 更新AudioRecord/章节状态
Svc-->>Ctrl : 返回audioId/audioUrl
Ctrl-->>Client : 任务创建成功
图表来源
- tts.controller.ts:52-127
- tts.service.ts:200-542
- audio-merger.ts:9-36
- ffmpeg.processor.ts:69-122
章节来源
- tts.controller.ts:52-127
- tts.service.ts:200-542
- audio-merger.ts:9-36
- ffmpeg.processor.ts:69-122
详细组件分析
控制器层(tts.controller.ts)
- 提供音色列表、可用提供商列表查询。
- 异步生成接口:校验文本与音色、检查用户配额、创建生成任务并立即返回。
- 状态查询接口:基于文件系统与数据库状态返回进度。
- 预览接口:生成短文本预览音频。
- 批量下载接口:返回多个音频的下载信息。
章节来源
服务层(tts.service.ts)
图表来源
- tts.service.ts:98-158
- tts.service.ts:163-190
- tts.service.ts:320-383
- tts.service.ts:428-446
- tts.service.ts:547-597
章节来源
- tts.service.ts:24-89
- tts.service.ts:98-158
- tts.service.ts:163-190
- tts.service.ts:320-383
- tts.service.ts:428-446
- tts.service.ts:547-597
音频合并器(audio-merger.ts)
- 支持本地与远程URL合并,远程场景委托FFmpeg处理器。
- 本地合并:使用ffmpeg命令进行concat合并,MP3转码。
- 时长探测:本地使用ffprobe,远程委托FFmpeg处理器。
章节来源
FFmpeg处理器(ffmpeg.processor.ts)
- 统一处理远程下载、合并、裁剪、音量调整、格式转换、时长探测。
- 支持OSS与本地路径,自动清理临时文件。
- 合并音频时自动上传至存储服务并返回URL。
章节来源
- ffmpeg.processor.ts:24-379
阿里云提供商(aliyun.provider.ts)
- HTTP模式:POST请求生成音频,支持指令控制(速度/音调),具备重试与限流处理。
- 下载失败时返回云端URL,由上层统一处理。
章节来源
MiniMax提供商(minimax.provider.ts)
- 异步长文本:创建任务→轮询→下载,tar格式提取MP3。
- 参数映射:速度、音量、音调转换为平台参数。
- 轮询策略:固定间隔与最大时长限制。
章节来源
- minimax.provider.ts:42-280
Mock提供商(mock.provider.ts)
- 使用FFmpeg生成占位音频,便于测试与演示。
- 无法生成时写入最小MP3文件头作为后备。
章节来源
阿里云实时提供商(aliyun-realtime.provider.ts)
- WebSocket流式合成,适合长文本。
- 支持语速与音调指令,自动分段与提交触发。
章节来源
- aliyun-realtime.provider.ts:11-158
AI摘要服务(ai-summary.service.ts)
- 标题:优先提取文本首行,否则调用AI生成或Mock降级。
- 摘要:支持真实AI与Mock降级,按句号截断。
- 标签:基于词频统计提取Top-N关键词。
章节来源
- ai-summary.service.ts:7-169
配置与类型
- 配置中心:加载环境变量与模型配置,统一管理DashScope与MiniMax等厂商配置。
- 类型定义:音色参数、音频状态、用户与订单类型、分页等。
章节来源
- index.ts:69-117
- index.ts:40-124
- models.json:1-186
- models.json:1-168
依赖关系分析
- 控制器依赖服务层;服务层依赖提供商适配器、合并器、AI摘要、存储服务与数据库。
- 合并器与FFmpeg处理器耦合,前者负责策略选择,后者负责具体执行。
配置与模型文件提供统一的厂商与模型管理,避免硬编码。
classDiagram
class TTSController {
+voices()
+providers()
+generate()
+status()
+preview()
+downloadBatch()
}
class TTSService {
+generateAudio()
+getAudioStatus()
+generatePreview()
+getVoices()
}
class AliyunTtsProvider
class MiniMaxTtsProvider
class MockTtsProvider
class AliyunRealtimeTtsProvider
class AudioMerger {
+merge()
+getDuration()
}
class FFmpegProcessor {
+mergeAudio()
+convertFormat()
+getDuration()
}
class AISummaryService {
+generateTitle()
+generateSummary()
+extractTags()
}
class Config
class Types
class Prisma
TTSController --> TTSService
TTSService --> AliyunTtsProvider
TTSService --> MiniMaxTtsProvider
TTSService --> MockTtsProvider
TTSService --> AliyunRealtimeTtsProvider
TTSService --> AudioMerger
TTSService --> AISummaryService
AudioMerger --> FFmpegProcessor
TTSService --> Config
TTSService --> Types
TTSService --> Prisma
图表来源
- tts.controller.ts:1-274
- tts.service.ts:1-715
- audio-merger.ts:9-86
- ffmpeg.processor.ts:24-379
- aliyun.provider.ts:9-152
- minimax.provider.ts:42-280
- mock.provider.ts:11-61
- aliyun-realtime.provider.ts:11-158
- ai-summary.service.ts:7-169
- index.ts:69-117
- index.ts:40-124
- index.ts:1-15
章节来源
- tts.controller.ts:1-274
- tts.service.ts:1-715
- audio-merger.ts:9-86
- ffmpeg.processor.ts:24-379
- aliyun.provider.ts:9-152
- minimax.provider.ts:42-280
- mock.provider.ts:11-61
- aliyun-realtime.provider.ts:11-158
- ai-summary.service.ts:7-169
- index.ts:69-117
- index.ts:40-124
- index.ts:1-15
性能考量
- 并发策略:MiniMax串行(异步轮询耗时长),其他提供商并行(并发度2),提升吞吐。
- 重试与指数退避:阿里云与MiniMax在限流/服务器错误时进行指数退避重试。
- 云端URL直传:优先下载后统一上传,减少跨域与网络抖动影响。
- 文本分段:按段落与句子拆分,避免超限;超长句子强制切片,保障稳定性。
- 时长与格式:合并后统一时长探测与格式转换,避免重复处理。
- 存储上传:通过统一存储服务上传,支持本地或OSS,降低耦合。
章节来源
- tts.service.ts:348-383
- tts.service.ts:116-136
- aliyun.provider.ts:125-141
- minimax.provider.ts:258-277
- audio-merger.ts:25-36
- ffmpeg.processor.ts:69-122
故障排查指南
- 速率限制与配额:服务层识别“usage limit/rate limit/quota/exceeded”,优先切换提供商;若非额度错误则停止重试。
- 失败标记与僵尸任务:生成失败会在目录写入失败标记;空目录超过阈值判定为僵尸任务并回写数据库状态。
- 云端下载失败降级:MiniMax云端URL下载失败时回退到本地文件合并与上传。
- WebSocket实时模式:当前被强制禁用,如需启用需满足权限与配置要求。
- FFmpeg/网络异常:统一捕获并记录,必要时返回占位文件或抛出错误。
章节来源
- tts.service.ts:518-542
- tts.service.ts:552-596
- tts.service.ts:394-427
- tts.service.ts:91-96
- ffmpeg.processor.ts:346-375
结论
该TTS语音合成服务通过多提供商适配、智能分段与并发策略、统一合并与上传、AI摘要与LRC歌词生成,实现了高可用、可扩展、易维护的音频生成流水线。结合配额控制与状态查询,满足生产环境的稳定性与可观测性需求。建议在生产环境中启用Mock降级与云端直传策略,并持续监控提供商可用性与成本指标。
附录
API定义与调用示例
获取音色列表
- 方法:GET
- 路径:/tts/voices
- 示例:tts.controller.ts:12-21
获取可用提供商
- 方法:GET
- 路径:/tts/providers
- 示例:tts.controller.ts:23-32
异步生成音频
- 方法:POST
- 路径:/tts/generate
- 请求体字段:text, voiceId, voiceParams(speed/pitch/volume), bookId, chapterTitle, ttsProvider(可选)
- 示例:tts.controller.ts:52-127
查询生成状态
- 方法:GET
- 路径:/tts/status/:audioId
- 示例:tts.controller.ts:129-143
预览音色
- 方法:POST
- 路径:/tts/preview
- 示例:tts.controller.ts:145-180
批量下载
- 方法:POST
- 路径:/tts/download/batch
- 示例:tts.controller.ts:223-272
音色参数与配置
音色参数类型:speed(0.5-2.0), pitch(-500-500), volume(0-100)
阿里云配置:API Key、模型、音色、TTS模型列表、实时模式开关
MiniMax配置:API Key、模型(speech-2.8-hd)
- 定义:config/index.ts:95-111,models.json:68-74
音频合并与格式转换
AI摘要与歌词
标题/摘要/标签:支持真实AI与Mock降级。
- 实现:ai-summary.service.ts:22-164
LRC歌词:按字数估算时长,生成时间轴。
- 实现:tts.service.ts:604-635
数据模型与状态