# CosyVoice 指南(本地提示音频克隆 / CosyVoice Guide)
> dsh-plugin-tts 的 CosyVoice 能力专册。CosyVoice 是纯本地零样本克隆:用一段提示音频 + 它的文字稿,直接按该音色朗读任意新文本。
> 主 README:[中文](../README.zh.md) / [English](../README.md) · 使用手册:[《执行手册》](USER-GUIDE.md)
>
> 🤖 **给 AI Agent 的说明**:本文档可直接喂给 AI Agent 照着落地。如果觉得晦涩难懂,或想直接脱手实现,
> 把本文档全文粘贴给你的 AI Agent,让它按文末「给 AI Agent 的落地附录」一步步执行验证即可。
**目录**
- [CosyVoice 是什么](#cosyvoice-是什么)
- [开始前准备](#开始前准备)
- [启动本地 CosyVoice 服务](#启动本地-cosyvoice-服务)
- [设置面板配置](#设置面板配置)
- [提示音频与文字稿(最关键)](#提示音频与文字稿最关键)
- [长文本分块播放](#长文本分块播放)
- [设置项详解](#设置项详解)
- [CosyVoice 疑难排查](#cosyvoice-疑难排查)
- [隐私与版权提示](#隐私与版权提示)
- [给 AI Agent 的落地附录](#给-ai-agent-的落地附录)
- [English](#english)
---
## CosyVoice 是什么
CosyVoice 是本地运行的零样本语音克隆:给它一段提示音频(告诉它“是谁的声音”),
再给新文本,它就用同一个声音读出新文本。
```
新文本 + 提示音频(+ 提示音频的文字稿)→ 本机 CosyVoice 服务 → wav → 播放
```
与 Index-TTS2 的区别只在配套方式:CosyVoice 要求同时提供提示音频的**文字稿**(transcript),
且对多语提示稿的完整性更敏感;与 RVC 的区别:不需要 Edge TTS 原声,直接合成。
全程在本机完成,不上传。
---
## 开始前准备
| 需要 | 是什么 | 必须吗 |
|---|---|---|
| 本地 CosyVoice 服务包 | 提供 HTTP API 的本地合成服务 | ✅ 必须 |
| 提示音频 | 决定朗读是谁的声音的音频片段 | ✅ 必须(至少一段) |
| 提示音频的文字稿 | 提示音频里说的内容,按顺序全文 | ✅ 必须(多语必须全语种写全) |
| 独立显卡 | 加速合成;没有也能用 CPU 跑,只是更慢 | ❌ 可选 |
> 提示音频一般用 5-20 秒清晰人声最佳;单人、安静、无背景音乐、无混响最稳。
---
## 启动本地 CosyVoice 服务
步骤是通行的三段式,与具体安装位置无关:
1. 解压 / 准备好本地服务包到任意位置;
2. 运行服务包内的 CosyVoice 启动脚本(一般是一个一键启动脚本),保持启动后的窗口 / 终端**别关**;
3. 看到服务就绪提示(默认监听本地回环地址上的 CosyVoice 端口)后再回到插件配置。
通用说明:
- **服务地址** 默认指向本地回环地址上的 CosyVoice 端口;只有把服务改到其他端口 / 其他机器时才需要改;
- 想换提示音频不需要重启服务,在设置面板里重新选择即可;
- 提示端口被占用(`Address already in use` / 端口冲突)= 旧服务还在跑,先关旧的再启动;
- 首次合成较慢是正常的(模型加载 + 预热),之后会快。
服务至少提供四类接口(插件依次用到):健康检查、提示音频列表、提示音频上传、文本合成。
只要这四类接口可达,插件就能工作,不关心服务包具体放在哪个目录。
---
## 设置面板配置
打开 **设置 → 插件 → 语音**:
- **TTS提供者** 选「**本地克隆(CosyVoice)**」;
- **服务地址**:一般保持默认(本地 CosyVoice 服务的地址);
- **提示音频**:点「**刷新音色**」拉取服务端的提示音频列表,然后选中一段;
- **提示音频文字稿**:填写所选提示音频里说的内容(见下一节);
- 点面板底部「试听测试」输入一句话试听,确认是想要的声音。
---
## 提示音频与文字稿(最关键)
这是 CosyVoice 用好与否的分水岭:
1. **提示音频怎么选**
- 优先单人、安静、无音乐、无混响的人声;
- 5-20 秒最稳;过短容易不稳定,过长增加加载负担;
- 新增音频后点「刷新音色」同步;也可用面板上传常见语音格式,上传后自动存入服务端的提示音频区。
2. **文字稿怎么写**
- 按**顺序**、**全文**填写提示音频里说的内容,不要只写一半;
- **多语提示音频必须把每个语种都写全**:例如提示音频里中英日三段都有,就必须中英日三段全写,
缺一段模型会把缺的那段复读一遍再读新文字;
- 不确定的地方宁可换一段内容明确的提示音频,也不要留空蒙混。
3. **直接填写**:也支持直接粘贴服务端已有的提示音频文件名;上传入口支持常见语音容器格式。
---
## 长文本分块播放
长回复会自动按句切块、边合成边播放:先合成前几块立即开播,其余块在播放的同时后台合成,
块间连续播放。短文本走单文件链路,零额外开销。播放期间按钮会显示 chunk 进度。
---
## 设置项详解
| 设置项 | 作用 | 建议 |
|---|---|---|
| 服务地址 | 本地 CosyVoice 服务的地址 | 一般保持默认 |
| 提示音频 | 决定朗读是谁的声音 | 用「刷新音色」同步列表后选择 |
| 提示音频文字稿 | 提示音频的内容全文 | 必须按顺序写全;多语全写 |
| 语速 | 合成语速 | `1.0` = 正常;`0.5` 慢速 ~ `2.0` 快速 |
| 随机种子 | 控制合成随机性 | `0` = 每次随机;填固定值可复现同一次合成 |
| 试听文本 | 面板底部的试听输入 | 换提示音频 / 改文字稿后务必试听一句确认 |
> 语速只改变合成节奏,不改变音色;种子只影响可复现性,不影响音质。
---
## CosyVoice 疑难排查
> 💡 设置面板有「**诊断**」按钮:一键检查本地 CosyVoice 服务与提示音频是否正常,
> 并按「连接 / 协议 / 音色」分类给出可读提示。
| 症状 | 最常见原因 | 怎么办 |
|---|---|---|
| 提示无法连接本地服务 | 服务窗口没开 / 被关了 / 服务地址不对 | 重新运行服务包的启动脚本并保留窗口;确认「服务地址」与服务实际端口一致 |
| 点「刷新音色」为空 | 服务端提示音频区没有音频 / 服务未就绪 | 往提示音频区放入音频或用面板上传后再刷新;确认服务已完全启动 |
| 提示音频列表读取失败 | 服务未就绪或接口异常 | 等服务就绪后重试;看服务端窗口的报错 |
| 合成失败 / 返回音频过小 | 文本为空、提示音频损坏、服务端异常 | 先换一段提示音频 + 短文本试听;仍失败看服务端窗口报错 |
| 模型把提示稿复读一遍再读新文字 | 多语提示音频的文字稿没写全 | 把提示音频里每个语种的内容都补全到文字稿 |
| 首次合成等很久 | 正常:模型加载 + 预热 | 等它;之后会快 |
| 反馈问题时请附带 | 定位需要的信息 | F12 控制台 `[tts]` 开头的行;`copy(JSON.stringify(__dshTtsDebug.dump()))` 的输出;服务端窗口的红色报错 |
---
## 隐私与版权提示
CosyVoice 全程本地合成,音频与文本不上传。只使用你有权使用的提示音频(自己录制的、
或已获授权的);未经同意克隆他人声音可能涉及法律与平台规则问题。
---
## 给 AI Agent 的落地附录
> 以下契约对所有机器通用,不含任何个人路径。按顺序执行即可打通本地服务与 dsh 的联通。
- **provider id**:`cosyvoice`(`/speak` 的 `provider` 字段就填这个)。
- **默认服务地址**:`http://127.0.0.1:7890`(回环地址 + 默认端口;只有改过端口 / 远端部署才改)。
- **本地服务最小接口**(插件只依赖这四个,目录位置不重要):
`GET /health`(存活)、`GET /voices` → `{ voices: [] }`(提示音频列表)、
`POST /upload`(上传提示音频)、`POST /tts`(合成,body 含 `text` / `prompt` / `prompt_text` / `speed` / `seed`,
返回 `{ audio_base64 }`)。
- **经插件 Host 中转的调用**(前端不直连本地服务):
提示音频列表 `GET /dsh-tts-api/cosy-voices?baseUrl=<服务地址>`;
上传提示音频 `POST /dsh-tts-api/cosy-upload`;
服务地址持久化 `GET /dsh-tts-api/cosy-config` / `POST /dsh-tts-api/cosy-config-save`;
合成 `POST /dsh-tts-api/speak` body `{ text, provider: "cosyvoice", custom: { baseUrl, voice, promptText, speed, seed } }`
→ 短文本 `{ url }`,长文本 `{ jobId, chunks, total }`(后续块 `GET /dsh-tts-api/rvc-next?job=`)。
- **文字稿必填校验**:`promptText` 必须与所选提示音频的内容按序全文一致;多语提示音频缺任一段都会复读,
这是联通成功但“读错”的头号原因,先查它再查服务。
- **诊断验证**:`POST /dsh-tts-api/diagnose` body `{ cosyBaseUrl }` → 看 `checks` 里
`cosy-server`(服务是否在线)与 `cosy-voice`(提示音频是否非空)。
- **验收标准**:提示音频列表非空 → 任选一段 + 写对文字稿合成一句短文本能播 → 一句长文本能出 `chunks` 且首块可播。
---
## English
CosyVoice is local zero-shot voice cloning: a prompt clip (+ its transcript) defines the voice,
and any new text is read in that voice — all on your own machine, no Edge TTS base voice needed.
### Quick start
1. **Prepare**: a local CosyVoice service bundle, at least one prompt clip (5-20s of clean speech works best),
and its transcript.
2. **Start the service** (keep the window open): run the bundle's launcher, wait until it reports ready
on its loopback port.
3. **Configure**: 设置 → 插件 → 语音 → provider = local CosyVoice; keep the service URL default;
click Refresh voices, pick a prompt clip, fill its **full transcript in order**, and preview one sentence.
### The transcript rule (most important)
- Write **everything** the prompt clip says, **in order**.
- **Multilingual prompts must include every language part**: if the clip speaks three languages,
all three transcripts are required — otherwise the model re-reads the missing part before the new text.
- When in doubt, switch to a clip whose content you can transcribe exactly.
### Settings explained (abridged)
| Setting | Effect | Guidance |
|---|---|---|
| Service URL | Local CosyVoice address | keep default |
| Prompt audio | Who reads | refresh then pick |
| Prompt transcript | What the prompt clip says | full, in order, all languages |
| Speed | Synthesis pace | 1.0 normal (0.5 slow ~ 2.0 fast) |
| Seed | Randomness | 0 = random each time; fixed = reproducible |
### Troubleshooting
- Cannot connect → the service window is closed or the URL/port mismatches; restart it and keep it open.
- Empty prompt list → no prompt clips on the server yet; add or upload one, then refresh.
- Model repeats the prompt before new text → the transcript is incomplete; complete every language part.
- First synthesis is slow → normal (model load + warmup).
> ⚠️ Privacy & rights: fully local — nothing is uploaded. Only clone voices you have the right to use.