前言说明

随着Index-TTS2在线语音合成专业版用户规模持续爆发式增长,平台原有算力资源长期处于高负载运行状态,高峰期频繁出现算力不足、合成请求排队、接口响应延迟、大批量文本合成超时等问题,极大影响了开发者批量调用、商业配音、自动化语音播报等场景的使用体验。

Index-TTS2插图

为突破算力限制、提升语音合成效率与服务稳定性,接口搭载 RTX5090 32G 强劲算力,基于Index-TTS2官方原生模型,支持专业音色克隆与精细情感调节,零门槛一键生成自然逼真AI语音,Index-TTS2臻享版专属API正式上线。

臻享版API在完整兼容专业版全部核心能力的基础上,依托全新独享GPU算力资源,大幅提升接口并发承载能力、文本合成速度与音频输出质量,有效杜绝高峰期排队、卡顿、超时等问题,完美适配长文本批量合成、高频次接口调用、高清音色克隆、精细化情感配音、中英文混合语音生成等各类商业及开发场景。

在线调试

本在线调试功能仅供接口调试使用,如需完整请求参数,请参考相关接口文档。

本接口文档将详细说明臻享版API的调用规则、参数配置、功能权限及使用规范,助力开发者快速接入、高效使用高性能AI语音合成服务,为各类语音创作、智能配音、程序开发场景提供稳定、优质的技术支撑。

接口概览

接口 URL 方法
异步提交 https://www.yuntts.com/api/v1/indextts-flagship-submit POST
状态查询 https://www.yuntts.com/api/v1/indextts-flagship-status POST

请求头

Header 必填 说明
Authorization Bearer YOUR_API_KEY API 密钥认证
Content-Type application/json 请求体格式

一、异步提交接口

请求 URL

POST https://www.yuntts.com/api/v1/indextts-flagship-submit

请求参数

参数 类型 必填 默认值 说明
text string 要合成的文本,最大 2048 个字符
speaker_audio_url string 音色参考音频 URL,推荐 15 秒以内
emotion_audio_url string 情感参考音频 URL,推荐 15 秒以内
emotion_alpha float 0.5 情感影响因子,范围 0~1
emotion_vector array[float] 8 维情感向量
use_emotion_text boolean false 是否从文本提取情感
emotion_text string 用于情感提取的文本

四种调用模式

模式 1:基本 TTS(仅音色克隆)

无情感控制,仅使用音色参考音频。

{
  "text": "欢迎使用语音合成服务",
  "speaker_audio_url": "https://example.com/voice.mp3"
}

模式 2:情感参考音频

从音频中提取情感特征,emotion_alpha 控制情感强度。

  • emotion_alpha = 0:无情感影响
  • emotion_alpha = 0.5:中等情感影响(默认)
  • emotion_alpha = 1:完全跟随情感音频
{
  "text": "欢迎使用语音合成服务",
  "speaker_audio_url": "https://example.com/voice.mp3",
  "emotion_audio_url": "https://example.com/emotion.wav",
  "emotion_alpha": 0.6
}

模式 3:情感参考文本

从文本中提取情感特征,系统分析文本的情感倾向并应用到合成语音。

{
  "text": "欢迎使用语音合成服务",
  "speaker_audio_url": "https://example.com/voice.mp3",
  "use_emotion_text": true,
  "emotion_text": "哈哈哈哈,今天是个好日子啊"
}

模式 4:情感向量

直接指定 8 维情感向量,精确控制每个情感维度的强度。

情感向量维度顺序:[高兴, 愤怒, 悲伤, 害怕, 厌恶, 忧郁, 惊讶, 平静]

每个值范围 0~1,所有值之和建议接近 1。

维度 索引 说明
高兴 [0] 开心、愉悦
愤怒 [1] 生气、愤怒
悲伤 [2] 难过、悲伤
害怕 [3] 恐惧、害怕
厌恶 [4] 厌烦、恶心
忧郁 [5] 忧愁、低落
惊讶 [6] 惊奇、意外
平静 [7] 平和、淡定
{
  "text": "欢迎使用语音合成服务",
  "speaker_audio_url": "https://example.com/voice.mp3",
  "emotion_vector": [0.95, 0, 0, 0, 0, 0, 0.03, 0.02]
}

成功响应

{
  "code": 200,
  "message": "任务提交成功",
  "data": {
    "task_id": "3b00652e-eff5-467a-b7f1-c3b9922ab359",
    "char_count": 120,
    "cost": 0.0126,
    "status": "submitted",
    "message": "任务提交成功"
  }
}

错误响应

{
  "code": 400,
  "error": "text_too_long",
  "message": "文本长度不能超过2048个字符"
}
错误码 HTTP 状态码 说明
empty_text 400 文本为空
missing_speaker_audio 400 缺少音色参考音频
invalid_url 400 无效的音频 URL
text_too_long 400 文本超长
insufficient_balance 402 余额不足
api_error 500 API 提交失败

二、状态查询接口

请求 URL

POST https://www.yuntts.com/api/v1/indextts-flagship-status

请求参数

参数 类型 必填 说明
task_id string 提交任务时返回的 task_id
{
  "task_id": "3b00652e-eff5-467a-b7f1-c3b9922ab359"
}

响应

合成成功

{
  "code": 200,
  "message": "语音合成成功",
  "data": {
    "task_id": "3b00652e-eff5-467a-b7f1-c3b9922ab359",
    "status": "completed",
    "audio_url": "https://www.yuntts.com/wp-content/uploads/indextts302/xxx.wav",
    "message": "语音合成成功"
  }
}

处理中

{
  "code": 200,
  "message": "任务正在处理中",
  "data": {
    "task_id": "3b00652e-eff5-467a-b7f1-c3b9922ab359",
    "status": "processing",
    "state": "STARTED",
    "message": "任务正在处理中"
  }
}

合成失败

{
  "code": 500,
  "error": "task_failed",
  "message": "语音合成失败"
}

状态说明

状态码 图标 进度 说明
pending ⏳ 待执行 0% 任务已创建,正在排队等待提交到GPU服务器
submitted 📤 已提交 0% 任务已成功提交到GPU服务器,等待首次状态更新
queued ⏰ 排队中 10% 远程服务器队列中等待资源分配
processing 🔄 处理中 50% AI 正在合成语音中,请稍候
completed ✅ 已完成 100% 语音合成成功,点击播放按钮试听
failed ❌ 失败 语音合成失败,请重试或联系客服

状态流转图

提交 → pending(待执行) → submitted(已提交) → queued(排队中) → processing(处理中) → completed(已完成)
                                                     ↓
                                                 failed(失败)

接口响应格式

提交成功

{
    "task_id": "7525b686-aa2b-45cf-8736-e4ffc54a2b55",
    "char_count": 100,
    "cost": 0.5,
    "status": "submitted",
    "message": "任务提交成功"
}

查询进行中

{
    "task_id": "7525b686-aa2b-45cf-8736-e4ffc54a2b55",
    "status": "processing",
    "progress": 50,
    "state": "processing",
    "message": "任务正在处理中"
}

查询已完成

{
    "task_id": "7525b686-aa2b-45cf-8736-e4ffc54a2b55",
    "status": "completed",
    "audio_url": "https://your-domain.com/uploads/audio/xxx.wav",
    "message": "语音合成成功"
}

查询失败

{
    "error": "task_failed",
    "message": "语音合成失败原因",
    "code": 500
}

HTTP 状态码

HTTP 状态码 含义 常见原因
200 请求成功 正常返回数据
400 请求参数错误 文本为空、URL无效、字符超限
401 认证失败 API密钥无效或未提供
402 余额不足 用户账户余额不足
403 权限不足 非VIP会员
405 请求方法不允许 使用了非POST请求
429 任务数达上限 同时处理的任务太多,稍后重试
500 服务器错误 API调用失败或系统异常

建议轮询策略

参数
轮询间隔 2~3 秒
最大轮询次数 300 次(约 10 分钟)
网络错误重试 最多 3 次

四、计费说明

项目 说明
计费方式 按字符数预扣费
计费规则 汉字算 2 字符,其他算 1 字符
单价 ¥150 / 百万 Tokens
最低扣费 ¥0.001
文本上限 2048 个字符
任务失败 自动退款

五、完整调用示例

cURL

# 提交任务
curl -X POST https://www.yuntts.com/api/v1/indextts-flagship-submit 
  -H "Authorization: Bearer YOUR_API_KEY" 
  -H "Content-Type: application/json" 
  -d '{
    "text": "欢迎使用语音合成服务",
    "speaker_audio_url": "https://example.com/voice.mp3"
  }'

# 查询状态
curl -X POST https://www.yuntts.com/api/v1/indextts-flagship-status 
  -H "Authorization: Bearer YOUR_API_KEY" 
  -H "Content-Type: application/json" 
  -d '{
    "task_id": "3b00652e-eff5-467a-b7f1-c3b9922ab359"
  }'

Python

import requests
import time

API_BASE = "https://www.yuntts.com/api/v1"
HEADERS = {
    "Authorization": "Bearer YOUR_API_KEY",
    "Content-Type": "application/json"
}

def submit_task(text, speaker_audio_url, **kwargs):
    payload = {
        "text": text,
        "speaker_audio_url": speaker_audio_url,
        **kwargs
    }
    resp = requests.post(f"{API_BASE}/indextts-flagship-submit", json=payload, headers=HEADERS)
    result = resp.json()
    if result.get("code") == 200:
        return result["data"]["task_id"]
    else:
        raise Exception(result.get("message", "提交失败"))

def wait_for_result(task_id, max_retries=300, interval=2):
    for i in range(max_retries):
        resp = requests.post(
            f"{API_BASE}/indextts-flagship-status",
            json={"task_id": task_id},
            headers=HEADERS
        )
        result = resp.json()
        status = result.get("data", {}).get("status")

        if status == "completed":
            return result["data"]["audio_url"]
        elif status == "failed":
            raise Exception(result.get("message", "合成失败"))

        time.sleep(interval)

    raise Exception("轮询超时")

# 基本TTS
task_id = submit_task("欢迎使用语音合成服务", "https://example.com/voice.mp3")
audio_url = wait_for_result(task_id)
print(f"音频下载链接: {audio_url}")

# 情感参考音频
task_id = submit_task(
    "欢迎使用语音合成服务",
    "https://example.com/voice.mp3",
    emotion_audio_url="https://example.com/emotion.wav",
    emotion_alpha=0.6
)

# 情感参考文本
task_id = submit_task(
    "欢迎使用语音合成服务",
    "https://example.com/voice.mp3",
    use_emotion_text=True,
    emotion_text="哈哈哈哈,今天是个好日子啊"
)

# 情感向量
task_id = submit_task(
    "欢迎使用语音合成服务",
    "https://example.com/voice.mp3",
    emotion_vector=[0.95, 0, 0, 0, 0, 0, 0.03, 0.02]
)

JavaScript

const API_BASE = 'https://www.yuntts.com/api/v1';
const HEADERS = {
  'Authorization': 'Bearer YOUR_API_KEY',
  'Content-Type': 'application/json'
};

async function submitTask(text, speakerAudioUrl, options = {}) {
  const payload = { text, speaker_audio_url: speakerAudioUrl, ...options };
  const resp = await fetch(`${API_BASE}/indextts-flagship-submit`, {
    method: 'POST',
    headers: HEADERS,
    body: JSON.stringify(payload)
  });
  const result = await resp.json();
  if (result.code === 200) return result.data.task_id;
  throw new Error(result.message || '提交失败');
}

async function waitForResult(taskId, maxRetries = 300, interval = 2000) {
  for (let i = 0; i < maxRetries; i++) {
    const resp = await fetch(`${API_BASE}/indextts-flagship-status`, {
      method: 'POST',
      headers: HEADERS,
      body: JSON.stringify({ task_id: taskId })
    });
    const result = await resp.json();
    const status = result.data?.status;

    if (status === 'completed') return result.data.audio_url;
    if (status === 'failed') throw new Error(result.message || '合成失败');

    await new Promise(r => setTimeout(r, interval));
  }
  throw new Error('轮询超时');
}

// 使用示例
const taskId = await submitTask('欢迎使用语音合成服务', 'https://example.com/voice.mp3');
const audioUrl = await waitForResult(taskId);
console.log('音频下载链接:', audioUrl);
声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。