前言
CosyVoice 3.0 是一款具备零样本声音克隆能力的多语言 TTS 模型。它不仅支持中英日韩及多种中文方言的流式极速合成,更能仅通过少量参考音频精准复刻说话人音色。通过精细的参数控制(Instruct/Speed/Seed),您可以轻松驾驭语气、情绪与语速,实现高自然度与高一致性的语音生成。
概述
接口基础地址:https://www.yuntts.com/api/v1
认证方式:所有请求需要在 Header 中携带 Authorization: Bearer YOUR_API_KEY
1. CosyVoice-3 语音合成接口
提交 CosyVoice-3 语音合成异步任务。
接口地址
POST https://www.yuntts.com/api/v1/cosyyoice3_speech_generate请求头
Content-Type: application/json
Authorization: Bearer YOUR_API_TOKEN // API Key请求参数(JSON)
| 参数名 | 类型 | 必填 | 说明 |
|---|---|---|---|
| inputs | String | 是 | 要合成的文本内容,最大 600 字符 |
| prompt_wav_url | String | 是* | 音色参考音频的 URL 地址(与 prompt_wav_file 二选一) |
| prompt_wav_file | File | 是* | 音色参考音频文件,支持 WAV、MP3 格式(与二选一) |
| prompt_text | String | 否 | 参考音频对应的文字内容,用于语义对齐 |
| instruct_text | String | 否 | 指导文本,控制合成语音的风格和情感 |
| speed | String | 否 | 语速,范围 0.5-2.0,默认 1.0 |
| seed | String/Int | 否 | 随机种子,留空则随机生成 |
注意:prompt_wav_url 和 prompt_wav_file 二选一必填。
提示:推荐使用 prompt_wav_url 方式(JSON 格式),无需上传文件。
请求示例
curl -X POST 'https://www.yuntts.com/api/v1/cosyyoice3_speech_generate'
-H 'Content-Type: application/json'
-H 'Authorization: Bearer YOUR_API_TOKEN'
-d '{
"inputs": "要合成的文本内容",
"prompt_wav_url": "https://example.com/reference.wav",
"prompt_text": "参考音频对应的文字内容",
"instruct_text": "指导文本,控制语音风格",
"speed": 1.0,
"seed": 12345
}'const response = await fetch('https://www.yuntts.com/api/v1/cosyyoice3_speech_generate', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
'Authorization': 'Bearer YOUR_API_TOKEN'
},
body: JSON.stringify({
inputs: '要合成的文本内容',
prompt_wav_url: 'https://example.com/reference.wav',
speed: 1.0
})
});
const data = await response.json();
console.log(data);成功响应
{
"code": 200,
"status": "success",
"message": "任务提交成功",
"data": {
"task_id": "abc123xyz",
"char_count": 25,
"cost": 0.01,
"balance": 99.99,
"status": "pending",
"message": "语音合成任务已提交"
}
}响应字段说明
| 字段名 | 类型 | 说明 |
|---|---|---|
| code | Int | 状态码,200 表示成功 |
| status | String | 状态标识,"success" 表示成功 |
| message | String | 响应消息 |
| data.task_id | String | 任务唯一标识,用于后续查询和取消 |
| data.char_count | Int | 合成文本的字符数 |
| data.cost | Float | 本次任务扣除的费用(元) |
| data.balance | Float | 用户当前余额(元) |
| data.status | String | 任务状态,"pending" 表示已提交等待处理 |
| data.message | String | 任务消息 |
错误响应
{
"code": 400,
"status": "error",
"error": "missing_prompt_audio",
"message": "请提供音色参考音频(文件或URL)"
}2. 任务状态查询接口
查询异步语音合成任务的状态和结果。
接口地址
POST https://www.yuntts.com/api/v1/speech_task_status请求头
Content-Type: application/json
Authorization: Bearer YOUR_API_TOKEN // API Key请求参数(JSON)
| 参数名 | 类型 | 必填 | 说明 |
|---|---|---|---|
| task_id | String | 是 | 任务 ID,从任务提交接口返回 |
请求示例
curl -X POST 'https://www.yuntts.com/api/v1/speech_task_status'
-H 'Content-Type: application/json'
-H 'Authorization: Bearer YOUR_API_TOKEN'
-d '{"task_id":"abc123xyz"}'const response = await fetch('https://www.yuntts.com/api/v1/speech_task_status', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
'Authorization': 'Bearer YOUR_API_TOKEN'
},
body: JSON.stringify({ task_id: 'abc123xyz' })
});
const data = await response.json();
console.log(data);成功响应(任务完成)
{
"code": 200,
"status": "success",
"message": "获取状态成功",
"data": {
"task_id": "abc123xyz",
"status": "completed",
"progress": 100,
"message": "语音合成成功",
"audio_url": "https://oss.example.com/audio/abc123xyz.mp3"
}
}成功响应(任务进行中)
{
"code": 200,
"status": "success",
"message": "获取状态成功",
"data": {
"task_id": "abc123xyz",
"status": "in_progress",
"progress": 45,
"message": "任务正在处理中",
"audio_url": ""
}
}响应字段说明
| 字段名 | 类型 | 说明 |
|---|---|---|
| code | Int | 状态码,200 表示成功 |
| status | String | 状态标识,"success" 表示成功 |
| message | String | 响应消息 |
| data.task_id | String | 任务 ID |
| data.status | String | 任务状态,详见 状态码说明 |
| data.progress | Int | 进度百分比,0-100 |
| data.message | String | 状态描述信息 |
| data.audio_url | String | 合成音频的 OSS 地址,完成时有值 |
错误响应
{
"code": 400,
"status": "error",
"error": "missing_task_id",
"message": "缺少任务ID"
}3. 任务取消接口
取消正在处理中的异步语音合成任务。
接口地址
POST https://www.yuntts.com/api/v1/speech_task_cancel请求头
Content-Type: application/json
Authorization: Bearer YOUR_API_TOKEN // API Key请求参数(JSON)
| 参数名 | 类型 | 必填 | 说明 |
|---|---|---|---|
| task_id | String | 是 | 任务 ID,从任务提交接口返回 |
请求示例
curl -X POST 'https://www.yuntts.com/api/v1/speech_task_cancel'
-H 'Content-Type: application/json'
-H 'Authorization: Bearer YOUR_API_TOKEN'
-d '{"task_id":"abc123xyz"}'const response = await fetch('https://www.yuntts.com/api/v1/speech_task_cancel', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
'Authorization': 'Bearer YOUR_API_TOKEN'
},
body: JSON.stringify({ task_id: 'abc123xyz' })
});
const data = await response.json();
console.log(data);成功响应
{
"code": 200,
"status": "success",
"message": "取消成功",
"data": {
"task_id": "abc123xyz",
"status": "cancelled",
"message": "任务已取消,费用已返还"
}
}响应字段说明
| 字段名 | 类型 | 说明 |
|---|---|---|
| code | Int | 状态码,200 表示成功 |
| status | String | 状态标识,"success" 表示成功 |
| message | String | 响应消息 |
| data.task_id | String | 任务 ID |
| data.status | String | 任务状态,"cancelled" 表示已取消 |
| data.message | String | 取消结果信息 |
错误响应
{
"code": 400,
"status": "error",
"error": "task_completed",
"message": "任务已完成,无法取消"
}4. 通用响应格式
成功响应
{
"code": 200,
"status": "success",
"message": "操作成功",
"data": {
// 业务数据
}
}错误响应
{
"code": 400,
"status": "error",
"error": "error_code",
"message": "错误描述信息"
}响应字段说明
| 字段名 | 类型 | 说明 |
|---|---|---|
| code | Int | HTTP 状态码或业务状态码 |
| status | String | 状态标识,"success" 或 "error" |
| message | String | 人类可读的状态消息 |
| error | String | 错误码(仅错误响应有) |
| data | Object | 业务数据(仅成功响应有) |
5. 错误码说明
| 错误码 | HTTP状态码 | 说明 |
|---|---|---|
| method_not_allowed | 405 | 请求方法不支持,仅支持 POST |
| unauthorized | 401 | 未授权,API 密钥无效或缺失 |
| missing_task_id | 400 | 缺少必填参数 task_id |
| missing_prompt_audio | 400 | 缺少音色参考音频 |
| empty_text | 400 | 合成文本为空 |
| insufficient_balance | 402/403 | 用户余额不足 |
| api_error | 500 | 远程 API 请求失败 |
| task_completed | 400 | 任务已完成,无法取消 |
| task_already_cancelled | 400 | 任务已取消 |
| cancel_failed | 500 | 取消任务失败 |
6. 状态码说明
任务状态说明(用于 /speech_task_status 接口):
| 状态 | 说明 | audio_url |
|---|---|---|
| pending | 任务已提交,等待处理 | 空 |
| in_progress | 任务处理中 | 空 |
| completed | 任务完成 | 有值(OSS 地址) |
| failed | 任务失败 | 空 |
| cancelled | 任务取消(未退款) | 空 |
| refunded | 已退款 | 空 |
前端状态展示建议
function getStatusDisplay(status) {
const statusMap = {
'pending': { text: '等待中', class: 'bg-secondary' },
'in_progress': { text: '处理中', class: 'bg-warning' },
'completed': { text: '已完成', class: 'bg-success' },
'failed': { text: '失败', class: 'bg-danger' },
'cancelled': { text: '已取消', class: 'bg-info' },
'refunded': { text: '已退款', class: 'bg-secondary' }
};
return statusMap[status] || { text: status, class: 'bg-secondary' };
}7. 使用流程
调用流程图
1. 提交任务
│
└─> POST /cosyyoice3_speech_generate
返回: task_id
│
▼
2. 轮询状态(建议 5秒/次)
│
└─> POST /speech_task_status
│
├─ status = 'completed' ──> 获取 audio_url,完成
│
├─ status = 'in_progress' ──> 继续轮询
│
└─ status = 'failed/cancelled' ──> 任务结束
│
▼
3. 可选:取消任务
│
└─> POST /speech_task_cancel
返回: 费用返还轮询策略
// 推荐轮询逻辑
const pollInterval = 5000; // 5秒
const maxAttempts = 120; // 最多轮询10分钟
for (let i = 0; i < maxAttempts; i++) {
const result = await checkStatus(task_id);
if (result.status === 'completed') {
console.log('完成,音频地址:', result.audio_url);
break;
}
if (result.status === 'failed') {
console.log('失败:', result.message);
break;
}
await sleep(pollInterval);
}async function pollTaskStatus(taskId, apiKey) {
const API_BASE = 'https://www.yuntts.com/api/v1';
while (true) {
const response = await fetch(API_BASE + '/speech_task_status', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
'Authorization': 'Bearer ' + apiKey
},
body: JSON.stringify({ task_id: taskId })
});
const data = await response.json();
if (data.code === 200 && data.data) {
console.log('状态:', data.data.status);
console.log('进度:', data.data.progress + '%');
console.log('消息:', data.data.message);
if (data.data.status === 'completed') {
console.log('音频地址:', data.data.audio_url);
break;
}
if (data.data.status === 'failed' || data.data.status === 'cancelled') {
console.log('任务结束:', data.data.message);
break;
}
}
// 等待 5 秒后继续查询
await new Promise(resolve => setTimeout(resolve, 5000));
}
}8. 定价说明
| 项目 | 价格 |
|---|---|
| CosyVoice-3 语音合成 | 0.0003 元/字符 |
| VIP 用户 | 9 折优惠 |
| SVIP 用户 | 8 折优惠 |
| 最低扣费 | 0.01 元 |
示例:合成 100 字文本,普通用户需 0.03 元,VIP 用户需 0.027 元,SVIP 用户需 0.024 元。
9. 注意事项
- API 密钥:请妥善保管您的 API 密钥,不要在客户端代码中硬编码
- 任务轮询:任务提交后请定期查询状态(建议 5 秒/次),直到任务完成或失败
- 音频下载:返回的
audio_url为 OSS 地址,有效期请咨询管理员 - 退款政策:任务失败或取消时,费用会自动退还到用户账户
- 文件上传:音频文件建议 5-30 秒,大小不超过 10MB
- 字符限制:单次合成文本最大 600 字符
10. 常见问题
Q: 任务提交后多久能完成?
A: 完成时间取决于音频长度和服务器负载,通常 10-60 秒内完成。
Q: 如何复现相同的合成结果?
A: 设置相同的 seed 值即可复现相同结果。
Q: 任务失败会退款吗?
A: 是的,任务自动失败或手动取消都会自动退款。
Q: 可以同时提交多个任务吗?
A: 可以,支持并行提交多个任务。
Q: audio_url 的有效期是多久?
A: 具体有效期请咨询管理员,建议及时下载音频文件。
文档版本:1.0.0
最后更新:2024年1月
接口前缀:https://www.yuntts.com/api/v1
声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。


评论(0)