本文引用的文件
本文件面向“音色提供商集成模块”,系统化阐述阿里云、MiniMax等第三方TTS服务的接入实现与运行机制,涵盖API密钥配置、认证机制、请求参数映射、音色差异与质量特性、价格对比与适用场景、Mock Provider的测试与调试策略、完整的配置项说明、错误处理与重试策略、降级方案、音色选择算法与动态切换机制,以及性能基准测试方法与结果。
该模块位于服务端的TTS子系统中,采用“控制器-服务-提供者-工具”的分层组织:
工具类负责音频合并、时长获取、FFmpeg处理等
graph TB
C["tts.controller.ts<br/>HTTP接口"] --> S["tts.service.ts<br/>业务编排"]
S --> P1["aliyun.provider.ts<br/>阿里云HTTP"]
S --> P2["minimax.provider.ts<br/>MiniMax异步"]
S --> P3["mock.provider.ts<br/>Mock Provider"]
S --> R1["aliyun-realtime.provider.ts<br/>阿里云实时WebSocket"]
S --> M["audio-merger.ts<br/>音频合并/时长"]
S --> F["ffmpeg.processor.ts<br/>FFmpeg处理器"]
S --> T["types/index.ts<br/>类型定义"]
S --> CFG["config/index.ts<br/>配置中心"]
CFG --> MJ["config/models.json<br/>模型/供应商配置"]
S --> AS["ai-summary.service.ts<br/>AI摘要/标题/标签"]
图表来源
章节来源
章节来源
整体流程:控制器接收请求,服务层进行参数校验与配额检查,随后按优先级选择Provider,进行文本分段与并发合成,合并音频并上传,生成摘要与标签,更新数据库记录,推送状态变更。
sequenceDiagram
participant Client as "客户端"
participant Ctrl as "tts.controller.ts"
participant Svc as "tts.service.ts"
participant Prov as "Provider(阿里云/MiniMax/Mock)"
participant Merge as "audio-merger.ts"
participant Store as "storage.service.js(外部)"
participant DB as "Prisma(外部)"
Client->>Ctrl : POST /tts/generate
Ctrl->>Svc : 校验参数/配额/创建任务
Svc->>Prov : synthesize(分段+并发)
Prov-->>Svc : 本地文件/云端URL
alt 云端URL
Svc->>Store : 下载并上传到OSS/本地
Store-->>Svc : 返回最终URL
else 本地文件
Svc->>Merge : 合并/时长计算
Merge-->>Svc : 输出文件
Svc->>Store : 上传到OSS/本地
Store-->>Svc : 返回最终URL
end
Svc->>DB : 更新AudioRecord/章节状态
Svc-->>Ctrl : 返回任务ID/URL
Ctrl-->>Client : 200 OK
图表来源
下载与回退
若云端音频下载失败,返回云端URL标记,由上层统一处理下载与上传。
flowchart TD
Start(["开始 synthesize"]) --> Build["构建请求体<br/>模型/音色/文本"]
Build --> Send["发送HTTP请求"]
Send --> Resp{"响应状态/错误码"}
Resp --> |限流/服务器错误| Retry["指数退避重试(<=3次)"]
Retry --> Send
Resp --> |正常| Download["下载云端音频"]
Download --> Ok["保存本地/返回URL"]
Resp --> |失败| Fail["抛出错误"]
图表来源
章节来源
错误处理
对429与5xx错误采用指数退避重试,最多3次。
sequenceDiagram
participant S as "服务层"
participant M as "MiniMax Provider"
S->>M : createTask(文本/音色/参数)
M-->>S : {task_id, task_token, file_id}
loop 轮询
S->>M : queryTask(task_id, task_token)
M-->>S : {status, file_id?}
end
S->>M : downloadAudio(file_id)
M-->>S : MP3二进制
图表来源
章节来源
章节来源
章节来源
章节来源
章节来源
章节来源
章节来源
章节来源
章节来源
外部依赖
HTTP客户端(axios)、WebSocket客户端(ws)、文件系统、FFmpeg/ffprobe、存储服务接口。
graph LR
S["tts.service.ts"] --> AP["aliyun.provider.ts"]
S --> MP["minimax.provider.ts"]
S --> OP["mock.provider.ts"]
S --> AM["audio-merger.ts"]
AM --> FP["ffmpeg.processor.ts"]
S --> CFG["config/index.ts"]
CFG --> MJ["models.json"]
S --> TS["types/index.ts"]
图表来源
章节来源
章节来源
该模块通过Provider抽象与工厂模式实现了对多家TTS服务的统一接入,结合分段、并发、合并与上传等机制,兼顾了性能与可靠性。Mock Provider为开发调试提供了便利,而完善的错误处理与降级策略保障了在复杂网络环境下的稳定性。配合成本分析报告,可为不同场景选择合适的供应商与套餐组合。
章节来源
章节来源
章节来源