Skip to content

语音合成 API(TTS)​

New API 的语音合成走异步任务:提交合成请求拿到任务 ID,再轮询任务状态取回音频。 同一套接口还提供音色设计(用文字描述生成新音色)与官方音色列表。

本页字段、校验规则与状态码直接对应仓库实现,改动代码时请同步更新: relay/channel/task/ttscenter/models.go(请求/响应结构)、relay/channel/task/ttscenter/validation.go (校验规则与长度上限)、controller/tts.go(状态映射与响应组装)、router/tts-router.go(路由)。

端点一览​

方法路径说明
POSThttps://api.yu-yu.ai/v1/audio/speech/tasks提交语音合成任务
POSThttps://api.yu-yu.ai/v1/voices/design/tasks提交音色设计任务
GEThttps://api.yu-yu.ai/v1/tts/tasks/{task_id}查询任务状态与结果
GEThttps://api.yu-yu.ai/v1/voices/official/all拉取官方音色列表

鉴权与请求标识​

http
Authorization: Bearer sk-xxxxxxxxxxxxxxxx
Content-Type: application/json
Idempotency-Key: your-unique-key-001
  • Idempotency-Key 可选。同一个 key + 同一个请求体重复提交,只会创建一个任务,返回首次的任务 ID; 同一个 key 换成不同请求体会得到 409 IDEMPOTENCY_CONFLICT。不传时网关按本次请求自动生成。 key 最长 191 个字符。
  • X-Request-Id 可选。不传时网关自动生成并在响应头回传,排查问题时带上它即可定位。

语音合成​

请求字段​

字段类型必填说明
modelstring是模型名,语音合成为 volcengine
inputstring是待合成文本,最长 3000 字(按字符计)
voicestring否音色标识。可用官方音色列表接口查询;不传用模型默认音色
response_formatstring否音频格式,mp3(默认)/wav/pcm 三选一
speednumber否语速,取值 0.5 ~ 2.0;超出范围报 INVALID_SPEED
referencesarray否参考素材数组,用于复刻/指定音色,见下

references[] 元素字段:

字段类型说明
audio_datastring参考音频(Base64),与 audio_url 互斥
audio_urlstring参考音频 URL,与 audio_data 互斥
image_datastring参考图片(Base64),与 image_url 互斥
image_urlstring参考图片 URL,与 image_data 互斥

每个元素至少要有一个音频或图片来源,否则报 EMPTY_REFERENCE。 注意:stream_format 在异步任务接口上不支持,传了会报 STREAM_NOT_SUPPORTED。

请求示例​

bash
curl -X POST 'https://api.yu-yu.ai/v1/audio/speech/tasks' \
  -H 'Authorization: Bearer sk-xxxxxxxxxxxxxxxx' \
  -H 'Content-Type: application/json' \
  -H 'Idempotency-Key: speech-20260101-001' \
  -d '{
    "model": "volcengine",
    "input": "欢迎使用 New API 语音合成接口。",
    "voice": "zh_female_shuangkuaisisi_moon_bigtts",
    "response_format": "mp3",
    "speed": 1.0
  }'

音色设计​

用一段描述生成一个可复用的新音色。字段比语音合成多,且必填项更多:

字段类型必填说明
namestring是音色名称
voice_slot_idstring是音色位标识
promptstring是音色描述提示词,最长 200 字
preview_textstring是试听文本,最长 300 字
languagestring是zh、zh-CN、en、en-US 四选一
scenestring否使用场景,最长 64 字
descriptionstring否补充描述,最长 500 字
agestring否年龄特征,最长 32 字
genderstring否性别特征,最长 32 字
avatarstring否头像 URL,最长 1024 字
trialURLstring否试听音频 URL,最长 1024 字
emotionsarray否情绪列表,元素形如 { "Icon": "...", "Label": "...", "Value": "..." }
bash
curl -X POST 'https://api.yu-yu.ai/v1/voices/design/tasks' \
  -H 'Authorization: Bearer sk-xxxxxxxxxxxxxxxx' \
  -H 'Content-Type: application/json' \
  -d '{
    "name": "沉稳男声",
    "voice_slot_id": "slot-001",
    "prompt": "四十岁男性,声音低沉平稳,适合纪录片旁白",
    "preview_text": "这里是试听文本。",
    "language": "zh-CN"
  }'

提交响应​

两个提交端点的返回结构一致:

json
{
  "task_id": "task_xxxxxxxxxxxxxxxx",
  "task_type": "speech_generation",
  "status": 1,
  "status_text": "排队中",
  "progress": 0,
  "status_url": "/v1/tts/tasks/task_xxxxxxxxxxxxxxxx",
  "created_at": "2026-01-01T12:00:00"
}
字段类型说明
task_idstring任务 ID,后续查询用它
task_typestringspeech_generation(语音合成)或 voice_design(音色设计)
business_idstring仅音色设计返回,业务侧标识
statusinteger任务状态码,见下表
status_textstring状态中文说明,与 status 一一对应
progressinteger进度百分比,0~100
status_urlstring该任务的查询路径
created_atstring创建时间,格式 YYYY-MM-DDTHH:mm:ss

查询任务​

bash
curl 'https://api.yu-yu.ai/v1/tts/tasks/task_xxxxxxxxxxxxxxxx' \
  -H 'Authorization: Bearer sk-xxxxxxxxxxxxxxxx'

响应在提交响应的字段基础上,补充了结果与时间信息:

字段类型说明
task_id / task_type / status / status_text / progress / status_url / created_at—同提交响应,status/progress 会随任务推进变化
started_atstring开始时间;未开始时不返回该字段
finished_atstring完成时间;未完成时不返回该字段
errorobject失败/取消/不存在时的 { code, message };其他状态不返回该字段
结果字段—成功时上游返回的结果字段(音频地址等)会被原样展开在顶层,字段名以实际上游返回为准

状态码​

statusstatus_text含义是否结束
1排队中已受理,等待生成否
2生成中正在合成否
3生成成功完成,可取回音频是
4生成失败失败,看 error.message是
5已取消已取消是
-1未知或任务不存在任务 ID 不属于当前 Key,或状态异常是

注意查询一个不存在的任务返回 HTTP 200,靠 status = -1 与 error.code = TASK_NOT_FOUND 判定, 不要只看状态码。

官方音色列表​

bash
curl 'https://api.yu-yu.ai/v1/voices/official/all' \
  -H 'Authorization: Bearer sk-xxxxxxxxxxxxxxxx'

返回官方可用音色集合(字段由语音服务提供,网关原样透传)。该端点不可用时返回 503,错误码 UPSTREAM_UNAVAILABLE。

轮询建议​

  • 合成通常几秒到十几秒完成,建议首次延迟 2~3 秒、之后每 2 秒查询一次,上限 15 次左右。
  • 命中 3 / 4 / 5 / -1 立即停止轮询。
  • 用 Idempotency-Key + 失败重试可以安全重发,不会产生重复任务。

错误响应​

错误体形如:

json
{
  "error": {
    "message": "input is required",
    "type": "invalid_request_error",
    "param": "input",
    "code": "REQUIRED_FIELD_MISSING"
  }
}
错误码触发条件处理方式
READ_REQUEST_BODY_FAILED请求体读取失败或超长检查请求体大小与编码
INVALID_JSON请求体不是合法 JSON校验 JSON 语法
REQUIRED_FIELD_MISSING缺少必填字段(param 指出是哪一个)按字段表补齐
FIELD_TOO_LONG文本超出长度上限(param 指出字段)按上表裁剪
INVALID_RESPONSE_FORMATresponse_format 不是 mp3/wav/pcm改用支持的值
INVALID_SPEEDspeed 不在 0.5~2.0调整语速
STREAM_NOT_SUPPORTED传了 stream_format去掉该字段(异步任务不支持流式)
MUTUALLY_EXCLUSIVE_REFERENCE_FIELDS同一参考素材同时给了 data 与 url二选一
EMPTY_REFERENCEreferences[] 元素没有任何素材至少给音频或图片来源
UNSUPPORTED_LANGUAGElanguage 不在白名单用 zh/zh-CN/en/en-US
UNSUPPORTED_TTS_PATH提交到了不支持的路径用本文档列出的两个提交端点
IDEMPOTENCY_CONFLICT同一个 Idempotency-Key 配了不同请求体换 key 或改用同样的请求体
IDEMPOTENCY_KEY_TOO_LONGIdempotency-Key 超过 191 字符缩短 key
TASK_QUERY_FAILED查询任务时服务端异常稍后重试
TASK_NOT_FOUND查询的任务不存在或不属于当前 Key核对任务 ID
UPSTREAM_UNAVAILABLE语音服务暂时不可用稍后重试

常见问题​

  • 合成成功但没找到音频地址:成功时结果字段由语音服务返回,名称以实际响应为准;也可以直接用 响应里的 status_url 配合本文档的查询端点复查。
  • 音色设计报缺少 voice_slot_id:该字段必填,取值由你的业务侧约定(例如 slot-001)。
  • 重复提交产生了两个任务:检查是否每次都传了不同的 Idempotency-Key;同一个 key 才会去重。
  • 查询一直返回 1:任务在排队。语音服务并发有限,排队时间随并发量波动。

在线调试​