前言

CosyVoice 3.0 是一款具备零样本声音克隆能力的多语言 TTS 模型。它不仅支持中英日韩及多种中文方言的流式极速合成,更能仅通过少量参考音频精准复刻说话人音色。通过精细的参数控制(Instruct/Speed/Seed),您可以轻松驾驭语气、情绪与语速,实现高自然度与高一致性的语音生成。

CosyVoice-3 语音合成 API接口文档 1

概述


接口基础地址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_urlprompt_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. 注意事项

  1. API 密钥:请妥善保管您的 API 密钥,不要在客户端代码中硬编码
  2. 任务轮询:任务提交后请定期查询状态(建议 5 秒/次),直到任务完成或失败
  3. 音频下载:返回的 audio_url 为 OSS 地址,有效期请咨询管理员
  4. 退款政策:任务失败或取消时,费用会自动退还到用户账户
  5. 文件上传:音频文件建议 5-30 秒,大小不超过 10MB
  6. 字符限制:单次合成文本最大 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

声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。