TTS语音合成服务.md 21 KB

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

目录

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

简介

本项目为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.controller.ts:12-274

服务层(tts.service.ts)

  • 音色映射与默认书籍管理:维护前端音色ID到阿里云音色的映射,必要时创建默认“我的音频”书籍。
  • 文本分段策略:针对阿里云限制进行段落与句子级拆分,保证安全上限。
  • 提供商工厂:优先级选择(MiniMax → 阿里云 → Mock),支持显式指定。
  • 并发与降级:按提供商类型设置并发度,MiniMax串行,其他并行;云端URL优先下载后统一上传。
  • AI摘要与LRC歌词:生成标题、摘要、标签与歌词时间轴。
  • 状态查询:基于文件系统与数据库判定处理中/完成/失败。
  • 预览生成:短文本快速生成。

    flowchart TD
    Start(["开始生成"]) --> Split["文本分段"]
    Split --> ChooseProv{"选择提供商"}
    ChooseProv --> |MiniMax| MM["异步任务创建/轮询/下载"]
    ChooseProv --> |阿里云| ALI["HTTP请求/下载/重试"]
    ChooseProv --> |Mock| MK["FFmpeg生成占位音频"]
    MM --> Merge["合并/时长/上传"]
    ALI --> Merge
    MK --> Merge
    Merge --> AI["AI摘要/LRC歌词"]
    AI --> Save["更新数据库/推送事件"]
    Save --> End(["完成"])
    

图表来源

  • 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处理器。

章节来源

  • audio-merger.ts:9-86

FFmpeg处理器(ffmpeg.processor.ts)

  • 统一处理远程下载、合并、裁剪、音量调整、格式转换、时长探测。
  • 支持OSS与本地路径,自动清理临时文件。
  • 合并音频时自动上传至存储服务并返回URL。

章节来源

  • ffmpeg.processor.ts:24-379

阿里云提供商(aliyun.provider.ts)

  • HTTP模式:POST请求生成音频,支持指令控制(速度/音调),具备重试与限流处理。
  • 下载失败时返回云端URL,由上层统一处理。

章节来源

  • aliyun.provider.ts:9-152

MiniMax提供商(minimax.provider.ts)

  • 异步长文本:创建任务→轮询→下载,tar格式提取MP3。
  • 参数映射:速度、音量、音调转换为平台参数。
  • 轮询策略:固定间隔与最大时长限制。

章节来源

  • minimax.provider.ts:42-280

Mock提供商(mock.provider.ts)

  • 使用FFmpeg生成占位音频,便于测试与演示。
  • 无法生成时写入最小MP3文件头作为后备。

章节来源

  • mock.provider.ts:11-61

阿里云实时提供商(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)

    • 定义:types/index.ts:40-44
  • 阿里云配置:API Key、模型、音色、TTS模型列表、实时模式开关

    • 定义:config/index.ts:83-93
  • MiniMax配置:API Key、模型(speech-2.8-hd)

    • 定义:config/index.ts:95-111,models.json:68-74

音频合并与格式转换

  • 合并策略:本地文件concat,远程URL委托FFmpeg处理器;MP3转码,其他格式复制。

    • 实现:audio-merger.ts:11-36,ffmpeg.processor.ts:69-122
  • 时长探测:本地ffprobe,远程下载后探测。

    • 实现:audio-merger.ts:70-85,ffmpeg.processor.ts:190-208

AI摘要与歌词

  • 标题/摘要/标签:支持真实AI与Mock降级。

    • 实现:ai-summary.service.ts:22-164
  • LRC歌词:按字数估算时长,生成时间轴。

    • 实现:tts.service.ts:604-635

数据模型与状态

  • 音频状态:processing/completed/failed

    • 定义:types/index.ts:46-46
  • 数据库连接与Prisma客户端

    • 定义:models/index.ts:1-15