# 音色选择 **本文引用的文件** - [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) - [minimax.provider.ts](file://server/src/modules/tts/minimax.provider.ts) - [mock.provider.ts](file://server/src/modules/tts/mock.provider.ts) - [index.ts(类型定义)](file://server/src/types/index.ts) - [index.ts(配置)](file://server/src/config/index.ts) - [audio.ts(Pinia Store)](file://my-uniapp-vue3/src/store/audio.ts) - [create/index.vue(生成页面)](file://my-uniapp-vue3/src/pages/create/index.vue) - [MiniPlayer.vue(迷你播放器)](file://my-uniapp-vue3/src/components/MiniPlayer.vue) - [AudioDownload.vue(下载组件)](file://my-uniapp-vue3/src/components/AudioDownload.vue) ## 目录 1. [简介](#简介) 2. [项目结构](#项目结构) 3. [核心组件](#核心组件) 4. [架构总览](#架构总览) 5. [详细组件分析](#详细组件分析) 6. [依赖关系分析](#依赖关系分析) 7. [性能考量](#性能考量) 8. [故障排查指南](#故障排查指南) 9. [结论](#结论) 10. [附录](#附录) ## 简介 本指南围绕“音色选择”功能,面向平台用户提供从音色特点与适用场景、音色提供商集成架构、参数配置、预览与切换体验到最佳实践的全链路使用说明。平台提供10+音色,覆盖不同性别、年龄与风格,并支持语速、音调、音量等基础参数与高级参数设置。后端通过统一的服务层聚合多家TTS提供商(如阿里云、MiniMax),前端提供直观的音色选择、参数调节与预览播放体验。 ## 项目结构 - 后端模块位于 server/src/modules/tts,包含服务层、控制器、各提供商适配器与工具类。 - 前端位于 my-uniapp-vue3,包含音色选择页面、播放器与下载组件等。 ```mermaid graph TB subgraph "前端" UI["生成页面
create/index.vue"] Store["音频状态与播放
store/audio.ts"] Player["迷你播放器
components/MiniPlayer.vue"] DL["下载组件
components/AudioDownload.vue"] end subgraph "后端" C["控制器
tts.controller.ts"] S["服务层
tts.service.ts"] A["阿里云提供商
aliyun.provider.ts"] M["MiniMax提供商
minimax.provider.ts"] K["Mock提供商
mock.provider.ts"] T["类型定义
types/index.ts"] CFG["配置
config/index.ts"] end UI --> Store UI --> C Store --> C C --> S S --> A S --> M S --> K S --> CFG S --> T Player --> Store DL --> C ``` 图表来源 - [tts.controller.ts:1-274](file://server/src/modules/tts/tts.controller.ts#L1-L274) - [tts.service.ts:1-715](file://server/src/modules/tts/tts.service.ts#L1-L715) - [aliyun.provider.ts:1-152](file://server/src/modules/tts/aliyun.provider.ts#L1-L152) - [minimax.provider.ts:1-280](file://server/src/modules/tts/minimax.provider.ts#L1-L280) - [mock.provider.ts:1-40](file://server/src/modules/tts/mock.provider.ts#L1-L40) - [index.ts(类型定义):1-124](file://server/src/types/index.ts#L1-L124) - [index.ts(配置):1-117](file://server/src/config/index.ts#L1-L117) - [audio.ts(Pinia Store):1-297](file://my-uniapp-vue3/src/store/audio.ts#L1-L297) - [create/index.vue(生成页面):1-800](file://my-uniapp-vue3/src/pages/create/index.vue#L1-L800) - [MiniPlayer.vue(迷你播放器):44-89](file://my-uniapp-vue3/src/components/MiniPlayer.vue#L44-L89) - [AudioDownload.vue(下载组件):1-179](file://my-uniapp-vue3/src/components/AudioDownload.vue#L1-L179) 章节来源 - [tts.controller.ts:1-274](file://server/src/modules/tts/tts.controller.ts#L1-L274) - [tts.service.ts:1-715](file://server/src/modules/tts/tts.service.ts#L1-L715) - [audio.ts(Pinia Store):1-297](file://my-uniapp-vue3/src/store/audio.ts#L1-L297) ## 核心组件 - 音色列表与映射:后端维护10个内置音色,前端展示并支持试听。 - 参数体系:语速(0.5–2.0x)、音调(-500–500)、音量(0–100%)。 - 提供商适配:阿里云(HTTP)、MiniMax(异步长文本)、Mock(本地占位)。 - 预览机制:短文本快速生成并播放,便于用户即时评估音色。 - 生成流程:异步生成、合并分段、上传存储、推送状态、回调通知。 章节来源 - [tts.service.ts:24-55](file://server/src/modules/tts/tts.service.ts#L24-L55) - [index.ts(类型定义):40-44](file://server/src/types/index.ts#L40-L44) - [tts.controller.ts:13-32](file://server/src/modules/tts/tts.controller.ts#L13-L32) - [create/index.vue(生成页面):39-122](file://my-uniapp-vue3/src/pages/create/index.vue#L39-L122) ## 架构总览 后端采用“控制器-服务层-提供商适配器”的分层架构。服务层负责: - 音色与提供商选择 - 文本分段与并发生成 - 合并与上传 - 状态查询与回调 ```mermaid sequenceDiagram participant U as "用户" participant FE as "前端页面
create/index.vue" participant ST as "状态管理
store/audio.ts" participant CTRL as "控制器
tts.controller.ts" participant SVC as "服务层
tts.service.ts" participant ALI as "阿里云提供商
aliyun.provider.ts" participant MM as "MiniMax提供商
minimax.provider.ts" U->>FE : 选择音色/调节参数 FE->>CTRL : POST /tts/generate CTRL->>SVC : generateAudio(text, voiceId, voiceParams) SVC->>SVC : 选择提供商优先级 alt MiniMax优先 SVC->>MM : synthesize(长文本, params) MM-->>SVC : 输出MP3路径 else 阿里云优先 SVC->>ALI : synthesize(分段, params) ALI-->>SVC : 输出MP3路径 end SVC->>SVC : 合并分段/上传存储 SVC-->>CTRL : 返回音频ID/URL CTRL-->>FE : 生成任务已创建 FE-->>ST : 触发播放/下载 ``` 图表来源 - [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) - [aliyun.provider.ts:21-150](file://server/src/modules/tts/aliyun.provider.ts#L21-L150) - [minimax.provider.ts:237-278](file://server/src/modules/tts/minimax.provider.ts#L237-L278) - [create/index.vue(生成页面):543-612](file://my-uniapp-vue3/src/pages/create/index.vue#L543-L612) - [audio.ts(Pinia Store):88-109](file://my-uniapp-vue3/src/store/audio.ts#L88-L109) ## 详细组件分析 ### 音色特点与适用场景 - 音色清单与描述:后端维护10个音色,包含多款女性与男性音色,描述涵盖“阳光积极”“温柔”“二次元”“撒娇搞怪”“知性温柔”“舒缓放松”“不会翘舌音”等风格。 - 性别与风格分布:覆盖女性(多款不同性格)与男性(温暖、帅气、知性、放松等),满足多样化内容需求。 - 地域与语种:音色映射至阿里云官方音色,适合中文普通话内容朗读。 章节来源 - [tts.service.ts:24-55](file://server/src/modules/tts/tts.service.ts#L24-L55) ### 音色提供商集成架构 - 提供商选择优先级:默认优先MiniMax,其次阿里云,最后Mock。 - MiniMax:异步长文本任务,轮询查询状态,下载tar格式并提取MP3。 - 阿里云:HTTP直连,支持分段与并发,具备重试与速率限制处理。 - Mock:本地占位,用于开发或无API Key场景。 ```mermaid classDiagram class TtsService { +getVoices() +generateAudio(...) +processAudioGeneration(...) +getAvailableProviders() +generatePreview(...) } class AliyunTtsProvider { +synthesize(text, voiceId, params, outputPath, retries, modelOverride) } class MiniMaxTtsProvider { +synthesize(text, voiceId, params, outputPath, retries, _modelOverride) -createTask(...) -queryTask(...) -pollUntilComplete(...) -downloadAudio(...) -extractMp3FromTar(...) } class MockTtsProvider { +synthesize(text, voiceId, params, outputPath) } TtsService --> AliyunTtsProvider : "调用" TtsService --> MiniMaxTtsProvider : "调用" TtsService --> MockTtsProvider : "降级" ``` 图表来源 - [tts.service.ts:160-190](file://server/src/modules/tts/tts.service.ts#L160-L190) - [aliyun.provider.ts:9-152](file://server/src/modules/tts/aliyun.provider.ts#L9-L152) - [minimax.provider.ts:42-280](file://server/src/modules/tts/minimax.provider.ts#L42-L280) - [mock.provider.ts:11-40](file://server/src/modules/tts/mock.provider.ts#L11-L40) 章节来源 - [tts.service.ts:160-190](file://server/src/modules/tts/tts.service.ts#L160-L190) - [minimax.provider.ts:56-100](file://server/src/modules/tts/minimax.provider.ts#L56-L100) - [aliyun.provider.ts:21-150](file://server/src/modules/tts/aliyun.provider.ts#L21-L150) ### 音色参数配置 - 基础参数 - 语速:0.5–2.0x(滑块映射) - 音调:-500–500(正负值表示高低) - 音量:0–100% - 高级参数 - 阿里云Instruct模型支持通过指令控制语速与音调(服务层会拼装指令)。 - 参数生效范围 - 前端页面提供滑块调节,控制器接收并透传至服务层。 - 服务层在不同提供商间进行参数归一化与转换。 章节来源 - [index.ts(类型定义):40-44](file://server/src/types/index.ts#L40-L44) - [create/index.vue(生成页面):62-122](file://my-uniapp-vue3/src/pages/create/index.vue#L62-L122) - [tts.controller.ts:58-103](file://server/src/modules/tts/tts.controller.ts#L58-L103) - [aliyun.provider.ts:50-66](file://server/src/modules/tts/aliyun.provider.ts#L50-L66) ### 音色预览功能 - 触发方式:点击音色卡片右侧“试听”按钮,前端调用后端预览接口。 - 后端逻辑:使用固定短文本与当前参数生成预览音频,返回URL。 - 前端播放:H5环境直接播放,非H5环境提示试听已播放。 ```mermaid sequenceDiagram participant FE as "前端页面" participant CTRL as "控制器
tts.controller.ts" participant SVC as "服务层
tts.service.ts" participant PRV as "提供商适配器" FE->>CTRL : POST /tts/preview {voiceId, voiceParams} CTRL->>SVC : generatePreview(voiceId, voiceParams) SVC->>PRV : generate(短文本, voiceName, params) PRV-->>SVC : 音频Buffer/URL SVC-->>CTRL : {audioId, audioUrl} CTRL-->>FE : 返回预览URL FE->>FE : 播放/提示 ``` 图表来源 - [tts.controller.ts:145-180](file://server/src/modules/tts/tts.controller.ts#L145-L180) - [tts.service.ts:646-715](file://server/src/modules/tts/tts.service.ts#L646-L715) - [create/index.vue(生成页面):486-541](file://my-uniapp-vue3/src/pages/create/index.vue#L486-L541) 章节来源 - [tts.controller.ts:145-180](file://server/src/modules/tts/tts.controller.ts#L145-L180) - [tts.service.ts:646-715](file://server/src/modules/tts/tts.service.ts#L646-L715) - [create/index.vue(生成页面):486-541](file://my-uniapp-vue3/src/pages/create/index.vue#L486-L541) ### 音色切换的用户体验设计 - 选择界面:网格布局展示音色,点击选中,右侧提供“试听”按钮。 - 参数调节:滑块直观调节语速、音调、音量,数值实时显示。 - 预览播放:试听按钮支持一键播放与停止,避免重复生成。 - 确认机制:生成完成后弹窗提示,支持立即播放与分享。 ```mermaid flowchart TD Start(["进入生成页"]) --> LoadVoices["加载音色列表"] LoadVoices --> SelectVoice["点击音色卡片"] SelectVoice --> AdjustParams["调节语速/音调/音量"] AdjustParams --> Preview["点击试听"] Preview --> Play["播放预览"] Play --> Decide{"确认使用该音色?"} Decide --> |是| Generate["提交生成请求"] Decide --> |否| AdjustParams Generate --> Success["生成成功弹窗"] Success --> Action{"选择操作"} Action --> |立即播放| Player["跳转播放器"] Action --> |分享| Share["复制链接"] Action --> |继续生成| AdjustParams ``` 图表来源 - [create/index.vue(生成页面):39-122](file://my-uniapp-vue3/src/pages/create/index.vue#L39-L122) - [create/index.vue(生成页面):486-612](file://my-uniapp-vue3/src/pages/create/index.vue#L486-L612) - [MiniPlayer.vue(迷你播放器):44-89](file://my-uniapp-vue3/src/components/MiniPlayer.vue#L44-L89) 章节来源 - [create/index.vue(生成页面):39-122](file://my-uniapp-vue3/src/pages/create/index.vue#L39-L122) - [create/index.vue(生成页面):486-612](file://my-uniapp-vue3/src/pages/create/index.vue#L486-L612) - [MiniPlayer.vue(迷你播放器):44-89](file://my-uniapp-vue3/src/components/MiniPlayer.vue#L44-L89) ### 音频生成与播放 - 生成流程:前端提交文本、音色与参数,后端异步生成并返回任务ID;前端轮询状态或接收WebSocket推送后触发播放。 - 播放器:支持播放/暂停、上一首/下一首、播放模式切换、倍速播放与进度跳转。 - 下载:通过下载组件或控制器接口获取下载信息,支持断点重试与进度反馈。 章节来源 - [tts.controller.ts:52-143](file://server/src/modules/tts/tts.controller.ts#L52-L143) - [tts.service.ts:200-542](file://server/src/modules/tts/tts.service.ts#L200-L542) - [audio.ts(Pinia Store):88-141](file://my-uniapp-vue3/src/store/audio.ts#L88-L141) - [AudioDownload.vue(下载组件):34-129](file://my-uniapp-vue3/src/components/AudioDownload.vue#L34-L129) ## 依赖关系分析 - 服务层依赖提供商适配器与配置中心,统一参数与模型选择。 - 控制器仅负责参数校验与路由转发,业务逻辑集中在服务层。 - 前端通过Pinia集中管理播放状态,组件化复用播放与下载能力。 ```mermaid graph LR CTRL["tts.controller.ts"] --> SVC["tts.service.ts"] SVC --> ALI["aliyun.provider.ts"] SVC --> MM["minimax.provider.ts"] SVC --> MOCK["mock.provider.ts"] SVC --> CFG["config/index.ts"] SVC --> TYPES["types/index.ts"] FE["create/index.vue"] --> STORE["store/audio.ts"] STORE --> CTRL ``` 图表来源 - [tts.controller.ts:1-274](file://server/src/modules/tts/tts.controller.ts#L1-L274) - [tts.service.ts:1-715](file://server/src/modules/tts/tts.service.ts#L1-L715) - [aliyun.provider.ts:1-152](file://server/src/modules/tts/aliyun.provider.ts#L1-L152) - [minimax.provider.ts:1-280](file://server/src/modules/tts/minimax.provider.ts#L1-L280) - [mock.provider.ts:1-40](file://server/src/modules/tts/mock.provider.ts#L1-L40) - [index.ts(配置):1-117](file://server/src/config/index.ts#L1-L117) - [index.ts(类型定义):1-124](file://server/src/types/index.ts#L1-L124) - [audio.ts(Pinia Store):1-297](file://my-uniapp-vue3/src/store/audio.ts#L1-L297) - [create/index.vue(生成页面):1-800](file://my-uniapp-vue3/src/pages/create/index.vue#L1-L800) 章节来源 - [tts.controller.ts:1-274](file://server/src/modules/tts/tts.controller.ts#L1-L274) - [tts.service.ts:1-715](file://server/src/modules/tts/tts.service.ts#L1-L715) ## 性能考量 - 并发与分段:HTTP提供商采用并发分段生成,提升吞吐;MiniMax异步长文本无需分段。 - 重试与降级:阿里云提供指数退避重试与速率限制处理;无API Key时自动降级至Mock。 - 存储与合并:本地生成后统一上传,支持云端URL回退与时长计算。 - 播放优化:前端播放器监听readyState与duration,避免异常时长导致UI抖动。 章节来源 - [tts.service.ts:345-383](file://server/src/modules/tts/tts.service.ts#L345-L383) - [aliyun.provider.ts:125-141](file://server/src/modules/tts/aliyun.provider.ts#L125-L141) - [audio.ts(Pinia Store):53-62](file://my-uniapp-vue3/src/store/audio.ts#L53-L62) ## 故障排查指南 - 额度/配额限制:若出现“额度/配额”相关错误,服务层会尝试下一个提供商;前端弹出配额用尽提示。 - 速率限制:阿里云在429时自动等待并重试;MiniMax在轮询阶段遇到超时会抛出明确错误。 - 生成失败:服务层写入失败标记文件,前端可通过状态接口查询;必要时检查网络与API Key配置。 - 播放异常:前端播放器捕获错误并打印详细信息,检查音频URL有效性与跨域策略。 章节来源 - [tts.service.ts:518-542](file://server/src/modules/tts/tts.service.ts#L518-L542) - [aliyun.provider.ts:125-141](file://server/src/modules/tts/aliyun.provider.ts#L125-L141) - [tts.controller.ts:129-143](file://server/src/modules/tts/tts.controller.ts#L129-L143) - [audio.ts(Pinia Store):64-74](file://my-uniapp-vue3/src/store/audio.ts#L64-L74) ## 结论 平台通过统一的服务层抽象多家TTS提供商,结合前端直观的音色选择与参数调节界面,为用户提供了高效、稳定的音色选择与生成体验。依托预览与播放器能力,用户可在生成前快速试听并确认音色,显著提升创作效率。建议在正式生产环境中优先配置可用的API Key,并结合会员配额策略合理规划用量。 ## 附录 - 配置项参考 - 阿里云DashScope:API Key、默认模型、默认音色、可用模型列表、是否启用实时模式等。 - MiniMax:API Key、默认模型、轮询间隔与最大轮询时间。 - 前端常用交互 - 音色网格选择、滑块参数调节、试听播放、生成成功弹窗、播放器控制与下载。 章节来源 - [index.ts(配置):83-93](file://server/src/config/index.ts#L83-L93) - [index.ts(配置):95-117](file://server/src/config/index.ts#L95-L117) - [create/index.vue(生成页面):39-122](file://my-uniapp-vue3/src/pages/create/index.vue#L39-L122) - [audio.ts(Pinia Store):111-141](file://my-uniapp-vue3/src/store/audio.ts#L111-L141)