Skip to content

语音合成 ​

POST /v1/audio/speech 使用 OpenAI-compatible 语音合成(TTS)格式,把文本合成为可下载的音频文件。当前提供 fish-speech 模型,请先调用 /v1/models 确认账户可见。

最小请求 ​

bash
curl --fail-with-body https://relay.withrpm.org/v1/audio/speech \
  -H "Authorization: Bearer $SPEEDYRPM_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "model": "fish-speech",
    "input": "各位听众朋友大家好,欢迎收听今天的内容。",
    "voice": "default"
  }' \
  --output speech.mp3

成功响应的 body 就是音频二进制(默认 MP3),不是 JSON,请直接落盘或流式转发给播放器。

请求参数 ​

字段必填说明
model是fish-speech
input是要合成的文本,1–10000 字;情绪/语气标签(如 (excited))直接写进文本
voice否default(默认音色)或克隆音色 ID,见下文「克隆语音」
response_format否mp3(默认)/ wav / opus / pcm(PCM 为 24kHz 16-bit 单声道)
speed否语速倍率 0.5–2.0,默认 1.0

暂不支持流式输出(stream)与 instructions 字段。

计费 ​

按实际产出音频时长计费:音频每分钟计 1000 tokens,另加输入文本本身的 tokens,再乘模型倍率。字多语速快、字少语速慢都会如实反映在账单上。

参考价位:合成约 20 分钟中文语音(约 5000 字新闻稿语速),费用约 8 元。实时倍率与单价以控制台「定价」页(/api/pricing)和用量日志为准。

长文本:异步语音任务 ​

单次同步请求受 Cloudflare 约 100 秒限制(见上),更长内容请用任务制接口,服务端合成完成后拉取,不受单请求时长限制:

bash
# 1. 提交任务(立即返回任务 ID)
curl --fail-with-body https://relay.withrpm.org/v1/audio/speech/jobs \
  -H "Authorization: Bearer $SPEEDYRPM_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"model": "fish-speech", "input": "<几千字长文>", "voice": "default"}'
# → {"id":"spj_...","object":"audio.speech.job","status":"pending","created_at":...}

# 2. 轮询状态(不计费)
curl https://relay.withrpm.org/v1/audio/speech/jobs/spj_xxx \
  -H "Authorization: Bearer $SPEEDYRPM_API_KEY"
# → {"id":"spj_xxx","status":"pending|processing|completed|failed","error":null,...}

# 3. 下载成品(status=completed 后)
curl https://relay.withrpm.org/v1/audio/speech/jobs/spj_xxx/content \
  -H "Authorization: Bearer $SPEEDYRPM_API_KEY" --output long.mp3

参数与同步端点一致(input 上限 10000 字、voice、response_format、speed)。计费:提交时按文本估算时长预收(每 250 字估 1 分钟 × 1000 tokens × 倍率 + 文本 tokens)——语速快的文本实际音频更短,估算会偏多,后续将改为按实际时长结算;轮询与下载不计费。

克隆语音 ​

可以用自己的参考音频克隆专属音色,全程 API 完成:

第一步:上传参考音频克隆。 准备一段清晰人声(建议 30 秒以上,单个文件不超过 20MB),multipart 表单提交:

bash
curl --fail-with-body https://relay.withrpm.org/v1/audio/voices \
  -H "Authorization: Bearer $SPEEDYRPM_API_KEY" \
  -F "model=fish-speech" \
  -F "title=我的音色" \
  -F "[email protected]"

返回创建的音色 JSON,其中 _id 就是音色 ID。

随时列出自己名下的音色(只返回当前账户的音色,含默认音色除外的全部克隆音色):

bash
curl https://relay.withrpm.org/v1/audio/voices?model=fish-speech \
  -H "Authorization: Bearer $SPEEDYRPM_API_KEY"
# → {"items":[{"_id":"<音色ID>","title":"我的音色","created_at":1718000000}, ...]}

items 为空数组表示还没有克隆过音色。不再需要的音色可删除:

bash
curl -X DELETE https://relay.withrpm.org/v1/audio/voices/<音色ID>?model=fish-speech \
  -H "Authorization: Bearer $SPEEDYRPM_API_KEY"

第二步:用音色 ID 合成。 请求时把 ID 传给 voice 字段:

bash
curl --fail-with-body https://relay.withrpm.org/v1/audio/speech \
  -H "Authorization: Bearer $SPEEDYRPM_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "model": "fish-speech",
    "input": "这段语音使用克隆音色朗读。",
    "voice": "<你的克隆音色 ID>"
  }' \
  --output cloned.mp3

克隆按次计费(每次克隆计 1000 tokens),合成与 default 同价按音频时长计。

音色归属与隔离:克隆的音色与你的账户绑定并记入归属表(voice_id + provider)——GET /v1/audio/voices?model=fish-speech 只列出你自己的音色;合成时使用他人(或其他 provider)的音色 ID 会被 403;DELETE /v1/audio/voices/{id}?model=fish-speech 可删除自己的音色(本地归属与上游库同步删除)。音色 ID 不要在公开仓库或日志中泄露;参考音频内容需有权使用。

使用建议与错误处理 ​

  • 单次请求的合成时长必须控制在约 100 秒以内:API 入口经 Cloudflare 代理,同步请求超过约 100 秒会被掐断(HTTP 524)。实测 1310 字(约 4 分钟音频)可过、3275 字被 524。长内容请按每段不超过 1000 字切分,逐段合成后在客户端拼接;被 524 截断的请求不会完成合成、也不会产生计费。
  • 分段后依然是同一计费口径(按各段实际音频时长累加),20 分钟约 8 元的总价不变。
  • 长文本合成耗时较长,客户端超时建议不少于 120 秒。
  • 504 upstream_outcome_unknown 表示上游结果不确定,不要自动重试,先人工确认是否已产生音频,避免重复扣费。
  • 402 余额不足、429 触发限流、422 参数不被支持,按码处理即可。
  • 不要在公开日志里记录含隐私信息的合成文本。

OpenAI-compatible API gateway