|
@@ -0,0 +1,250 @@
|
|
|
|
|
+# CosyVoice / Qwen-TTS 声音设计指南
|
|
|
|
|
+
|
|
|
|
|
+> 数据来源:阿里云官方 [声音设计文档](https://help.aliyun.com/zh/model-studio/voice-design),
|
|
|
|
|
+> 用户下载到 `tts音色/声音设计-...html` 后 playwright 渲染抽取。
|
|
|
|
|
+> 文档生成时间:2026-07。
|
|
|
|
|
+
|
|
|
|
|
+## 一、什么是"声音设计"
|
|
|
|
|
+
|
|
|
|
|
+**声音设计(Voice Design)** 是阿里云百炼提供的一条**合成新音色**的路径,**无需训练数据,纯文本描述即可生成音色**。
|
|
|
|
|
+
|
|
|
|
|
+适用场景:
|
|
|
|
|
+- **快速原型验证** — 给 AI 助手 / 游戏角色试不同人设
|
|
|
|
|
+- **创意内容生产** — 给虚拟主播 / 短视频创作者设计独特声音
|
|
|
|
|
+- **游戏角色配音** — 为 NPC 创造专属声音
|
|
|
|
|
+
|
|
|
|
|
+和**声音复刻**的区别:
|
|
|
|
|
+| 维度 | 声音设计 | 声音复刻 |
|
|
|
|
|
+|------|---------|----------|
|
|
|
|
|
+| 输入 | 自然语言描述 | 真实音频样本 |
|
|
|
|
|
+| 是否需要录音 | ❌ 不需要 | ✅ 需要 |
|
|
|
|
|
+| 适合 | 创造新声音形象 | 还原特定人声 |
|
|
|
|
|
+| 自由度 | 由 Prompt 决定(可多次尝试) | 固定基于样本 |
|
|
|
|
|
+
|
|
|
|
|
+## 二、支持的模型与地域
|
|
|
|
|
+
|
|
|
|
|
+### CosyVoice 系列
|
|
|
|
|
+- ✅ `cosyvoice-v3.5-plus`(北京)
|
|
|
|
|
+- ✅ `cosyvoice-v3.5-flash`(北京)
|
|
|
|
|
+- ✅ `cosyvoice-v3-plus`(北京)
|
|
|
|
|
+- ✅ `cosyvoice-v3-flash`(北京)
|
|
|
|
|
+
|
|
|
|
|
+> ⚠️ CosyVoice 声音设计**仅支持北京地域**,其他地域不可用。
|
|
|
|
|
+
|
|
|
|
|
+### Qwen-TTS 系列
|
|
|
|
|
+- ✅ `qwen3-tts-vd-2026-01-26`(北京 — 最新快照)
|
|
|
|
|
+- ✅ `qwen3-tts-vd-realtime-2026-01-15`(北京 + 新加坡)
|
|
|
|
|
+- ✅ `qwen3-tts-vd-realtime-2025-12-16`(快照版)
|
|
|
|
|
+
|
|
|
|
|
+> 声音描述长度上限:**2048 字符**(Qwen-TTS)。
|
|
|
|
|
+
|
|
|
|
|
+## 三、声音描述 prompt 怎么写
|
|
|
|
|
+
|
|
|
|
|
+### 1. 核心规则(必须遵守)
|
|
|
|
|
+- **字数限制 100 字符**(汉字按 2,其他按 1)
|
|
|
|
|
+- **描述语只支持中文/英文**
|
|
|
|
|
+- **具体而非模糊**:用"低沉 / 清脆 / 语速偏快"
|
|
|
|
|
+- **多维而非单一**:组合"性别 + 年龄 + 情感 + 用途"
|
|
|
|
|
+- **客观而非主观**:用"音调偏高,带有活力"
|
|
|
|
|
+- **原创而非模仿**:不要求模仿特定人物(版权风险)
|
|
|
|
|
+- **简洁而非冗余**
|
|
|
|
|
+
|
|
|
|
|
+### 2. 7 个推荐描述维度
|
|
|
|
|
+
|
|
|
|
|
+| 维度 | 可选值 |
|
|
|
|
|
+|------|--------|
|
|
|
|
|
+| 性别 | 男性 / 女性 / 中性 |
|
|
|
|
|
+| 年龄 | 儿童(5-12) / 青少年(13-18) / 青年(19-35) / 中年(36-55) / 老年(55+) |
|
|
|
|
|
+| 音调 | 高音 / 中音 / 低音 / 偏高 / 偏低 |
|
|
|
|
|
+| 语速 | 快速 / 中速 / 缓慢 / 偏快 / 偏慢 |
|
|
|
|
|
+| 情感 | 开朗 / 沉稳 / 温柔 / 严肃 / 活泼 / 冷静 / 治愈 |
|
|
|
|
|
+| 特点 | 有磁性 / 清脆 / 沙哑 / 圆润 / 甜美 / 浑厚 / 有力 |
|
|
|
|
|
+| 用途 | 新闻播报 / 广告配音 / 有声书 / 动画角色 / 语音助手 / 纪录片 |
|
|
|
|
|
+
|
|
|
|
|
+### 3. 官方示例
|
|
|
|
|
+
|
|
|
|
|
+```
|
|
|
|
|
+✅ 标准播音风格:吐字清晰精准,字正腔圆
|
|
|
|
|
+
|
|
|
|
|
+✅ 年轻活泼女性:语速较快,带有明显的上扬语调,适合介绍时尚产品
|
|
|
|
|
+
|
|
|
|
|
+✅ 沉稳中年男性:语速缓慢,音色低沉有磁性,适合朗读新闻或纪录片解说
|
|
|
|
|
+
|
|
|
|
|
+✅ 温柔知性女性:30 岁左右,语调平和,适合有声书朗读
|
|
|
|
|
+
|
|
|
|
|
+✅ 可爱儿童:大约 8 岁女孩,说话略带稚气,适合动画角色配音
|
|
|
|
|
+```
|
|
|
|
|
+
|
|
|
|
|
+### 4. 同一描述 → 不同结果(有随机性)
|
|
|
|
|
+
|
|
|
|
|
+阿里云官方原话:**"声音设计具有随机性,相同描述可能生成略有差异的音色。建议多次生成后试听,择优使用。"**
|
|
|
|
|
+
|
|
|
|
|
+→ 产品设计建议:让用户**预览 + 重生成**至少 2-3 次,挑最好的保存。
|
|
|
|
|
+
|
|
|
|
|
+## 四、CosyVoice 声音设计完整流程
|
|
|
|
|
+
|
|
|
|
|
+### 步骤 1 — 通过文本描述创建音色
|
|
|
|
|
+
|
|
|
|
|
+```bash
|
|
|
|
|
+curl -X POST 'https://{WorkspaceId}.cn-beijing.maas.aliyuncs.com/api/v1/services/audio/tts/customization' \
|
|
|
|
|
+ -H "Authorization: Bearer $DASHSCOPE_API_KEY" \
|
|
|
|
|
+ -H "Content-Type: application/json" \
|
|
|
|
|
+ -d '{
|
|
|
|
|
+ "model": "voice-enrollment",
|
|
|
|
|
+ "input": {
|
|
|
|
|
+ "action": "create_voice",
|
|
|
|
|
+ "target_model": "cosyvoice-v3.5-plus",
|
|
|
|
|
+ "voice_prompt": "沉稳的中年男性播音员,音色低沉浑厚,富有磁性,语速平稳,吐字清晰,适合用于新闻播报或纪录片解说。",
|
|
|
|
|
+ "preview_text": "各位听众朋友,大家好,欢迎收听晚间新闻。",
|
|
|
|
|
+ "prefix": "announcer"
|
|
|
|
|
+ },
|
|
|
|
|
+ "parameters": {
|
|
|
|
|
+ "sample_rate": 24000,
|
|
|
|
|
+ "response_format": "wav"
|
|
|
|
|
+ }
|
|
|
|
|
+ }'
|
|
|
|
|
+```
|
|
|
|
|
+
|
|
|
|
|
+返回:
|
|
|
|
|
+```json
|
|
|
|
|
+{
|
|
|
|
|
+ "output": {
|
|
|
|
|
+ "voice_id": "voice_announcer_xxxxxx",
|
|
|
|
|
+ "preview_audio_url": "https://...mp3"
|
|
|
|
|
+ }
|
|
|
|
|
+}
|
|
|
|
|
+```
|
|
|
|
|
+
|
|
|
|
|
+### 步骤 2 — 用创建的 voice_id 合成语音
|
|
|
|
|
+
|
|
|
|
|
+```python
|
|
|
|
|
+import dashscope, os
|
|
|
|
|
+from dashscope.audio.tts_v2 import SpeechSynthesizer
|
|
|
|
|
+
|
|
|
|
|
+dashscope.api_key = os.environ['DASHSCOPE_API_KEY']
|
|
|
|
|
+dashscope.base_websocket_api_url = 'wss://{WorkspaceId}.cn-beijing.maas.aliyuncs.com/api-ws/v1/inference'
|
|
|
|
|
+
|
|
|
|
|
+# 关键:声音设计、语音合成要使用相同的模型
|
|
|
|
|
+synthesizer = SpeechSynthesizer(
|
|
|
|
|
+ model='cosyvoice-v3.5-plus', # ← 同一个模型
|
|
|
|
|
+ voice='voice_announcer_xxxxxx', # ← 步骤1返回的 voice_id
|
|
|
|
|
+)
|
|
|
|
|
+audio = synthesizer.call("今天天气怎么样?")
|
|
|
|
|
+with open('output.mp3', 'wb') as f:
|
|
|
|
|
+ f.write(audio)
|
|
|
|
|
+```
|
|
|
|
|
+
|
|
|
|
|
+### Qwen-TTS 流程类似
|
|
|
|
|
+
|
|
|
|
|
+```python
|
|
|
|
|
+import dashscope, os
|
|
|
|
|
+from dashscope.audio.tts_v2 import SpeechSynthesizer
|
|
|
|
|
+
|
|
|
|
|
+VOICE_PROMPT = "年轻活泼的女性声音,语速较快,带有明显的上扬语调,适合介绍时尚产品。"
|
|
|
|
|
+TARGET_MODEL = "qwen3-tts-vd-2026-01-26" # 声音设计 / 合成 必须用同一个
|
|
|
|
|
+
|
|
|
|
|
+# 创建音色
|
|
|
|
|
+from dashscope.audio.tts_v2 import VoiceEnrollment
|
|
|
|
|
+resp = VoiceEnrollment.create_voice(
|
|
|
|
|
+ target_model=TARGET_MODEL,
|
|
|
|
|
+ voice_prompt=VOICE_PROMPT,
|
|
|
|
|
+ preferred_name='my_voice',
|
|
|
|
|
+)
|
|
|
|
|
+voice_id = resp.output.voice_id
|
|
|
|
|
+
|
|
|
|
|
+# 用新音色合成
|
|
|
|
|
+synth = SpeechSynthesizer(model=TARGET_MODEL, voice=voice_id)
|
|
|
|
|
+audio = synth.call("你好,世界")
|
|
|
|
|
+```
|
|
|
|
|
+
|
|
|
|
|
+## 五、配额与计费
|
|
|
|
|
+
|
|
|
|
|
+### 限额
|
|
|
|
|
+- **每个账号最多 1000 个自定义音色**(CosyVoice / Qwen-TTS **各自独立**计算)
|
|
|
|
|
+- 1 年未使用自动清理
|
|
|
|
|
+
|
|
|
|
|
+### 计费
|
|
|
|
|
+| 模型 | 创建费用 |
|
|
|
|
|
+|------|---------|
|
|
|
|
|
+| **CosyVoice** | ✅ 免费 |
|
|
|
|
|
+| **Qwen-TTS** | 0.2 元/个(创建失败不收费) |
|
|
|
|
|
+
|
|
|
|
|
+### 新用户免费额度
|
|
|
|
|
+- 开通后 90 天内可享 **10 次免费**音色创建
|
|
|
|
|
+- 仅限北京地域
|
|
|
|
|
+- 创建失败不占用免费次数
|
|
|
|
|
+
|
|
|
|
|
+## 六、产品设计建议(给"用户选音色"功能的)
|
|
|
|
|
+
|
|
|
|
|
+### 系统音色 vs 自定义音色(用户视角)
|
|
|
|
|
+
|
|
|
|
|
+```
|
|
|
|
|
+音色选择 (UI)
|
|
|
|
|
+├── 系统音色(开箱即用)
|
|
|
|
|
+│ ├── CosyVoice v3-flash 系统音色(88 个)
|
|
|
|
|
+│ ├── Qwen3-TTS 系统音色(48 个)
|
|
|
|
|
+│ └── Edge TTS 系统音色(316 个)
|
|
|
|
|
+└── 自定义音色(声音设计创建)
|
|
|
|
|
+ ├── 我设计过(列表显示)
|
|
|
|
|
+ └── 现在设计一个
|
|
|
|
|
+```
|
|
|
|
|
+
|
|
|
|
|
+### 关键 UX 设计要点
|
|
|
|
|
+
|
|
|
|
|
+1. **每次创建都先试听预览,用户满意再保存**(避免一次性扣费 + 用户后悔)
|
|
|
|
|
+2. **保留多次创建的能力**(同一个 prompt 可能产生 2-3 个不同结果,用户挑最好的)
|
|
|
|
|
+3. **失败时显式提示**(返回 "preview_text 没有发音"/"网络错误" 等)
|
|
|
|
|
+4. **支持删除**(释放配额,避免 1000 个上限)
|
|
|
|
|
+5. **建议首选 CosyVoice**(免费 + 支持中英双语描述)
|
|
|
|
|
+
|
|
|
|
|
+## 七、与现有项目整合的位置
|
|
|
|
|
+
|
|
|
|
|
+### 后端服务
|
|
|
|
|
+- 新建 `server/src/services/voice-design.service.ts`(声音设计 API 封装)
|
|
|
|
|
+- 复用 `server/.env` 里的 `DASHSCOPE_API_KEY`(API Key 已配好)
|
|
|
|
|
+- 新建控制器路由:
|
|
|
|
|
+ - `POST /api/tts/voice-design/preview`(创建 + 预览,**不保存**)
|
|
|
|
|
+ - `POST /api/tts/voice-design/save`(保存到账户)
|
|
|
|
|
+ - `GET /api/tts/voice-design/list`(查已有自定义音色)
|
|
|
|
|
+ - `DELETE /api/tts/voice-design/:voice_id`(删除)
|
|
|
|
|
+ - 所有路由要强制 `target_model` = `voice_id` 创建时的模型(否则音色不匹配)
|
|
|
|
|
+
|
|
|
|
|
+### 前端 UI(后续开发)
|
|
|
|
|
+- 现有音色选择器旁加"+"按钮 → 进入声音设计向导:
|
|
|
|
|
+ 1. 选模型(CosyVoice v3.5-plus 推荐免费)
|
|
|
|
|
+ 2. 输入描述(或选模板示例)
|
|
|
|
|
+ 3. 调 `/preview` 接口拿预览音频播放
|
|
|
|
|
+ 4. "重新生成"重复 3
|
|
|
|
|
+ 5. "保存"调 `/save` 接口
|
|
|
|
|
+- 音色保存后存 `Book.book.voiceId`(已存在的字段,扩展支持用户自定义音色 ID)
|
|
|
|
|
+
|
|
|
|
|
+### 与"语言选择"功能的关系
|
|
|
|
|
+- 声音描述语言:**只支持中/英文**(`voice_prompt` 字段)
|
|
|
|
|
+- 但生成的音色 **可以用于合成多语言语音**(比如生成"温柔女声"后,可以用来合成英语/日语文本)
|
|
|
|
|
+- 如果"用户选日语 + 声音设计" → prompt 用中英文写,生成新音色后合成日语文本
|
|
|
|
|
+
|
|
|
|
|
+## 八、与 `cosyvoice-voice-list` 系统音色的本质区别
|
|
|
|
|
+
|
|
|
|
|
+| 维度 | 系统音色(`voice-list`) | 声音设计(`voice-design`) |
|
|
|
|
|
+|------|----------------------|---------------------------|
|
|
|
|
|
+| 来源 | 阿里云预训练 | 用户文本描述实时生成 |
|
|
|
|
|
+| 数量 | 216 个(CosyVoice)/ 48 个(Qwen) | 上限 1000 个/账号 |
|
|
|
|
|
+| 稳定性 | 确定性,固定可重现 | 有随机性,需试听择优 |
|
|
|
|
|
+| 成本 | 0 | CosyVoice 免费 / Qwen-TTS 0.2 元 |
|
|
|
|
|
+| 速度 | 立即可用 | 1-5 秒生成预览 |
|
|
|
|
|
+| 后端代码 | `ALIYUN_VOICE_MAP` 直接列名字 | 需要 API 调用 + 用户保存 |
|
|
|
|
|
+
|
|
|
|
|
+## 九、迁移指引
|
|
|
|
|
+
|
|
|
|
|
+实现完整"声音设计"功能的预估工作量:
|
|
|
|
|
+- **后端**(2-3 天):
|
|
|
|
|
+ - `voice-design.service.ts` 封装阿里云 API
|
|
|
|
|
+ - 5 个 REST 路由
|
|
|
|
|
+ - 自定义音色列表查询(整合到现有 `pickTtsVendor()` 路由)
|
|
|
|
|
+- **前端**(2-3 天):
|
|
|
|
|
+ - 声音设计向导页(4 步流程)
|
|
|
|
|
+ - 预览音频播放器(网页 audio 标签)
|
|
|
|
|
+ - 用户自定义音色列表管理
|
|
|
|
|
+- **测试**(1 天):每种模型 + 各种 prompt 类型的端到端
|
|
|
|
|
+
|
|
|
|
|
+完整的功能开发建议在"用户选语言"功能稳定后再做(用户反映"想要更多音色")时启动。
|