tts-proxy API
个人 TTS 中转接口。公网路径统一挂在 /api/tts-proxy,目前接两个上游:
- Google Translate 非官方 TTS:GET,返回 MP3。
- MiMo V2.5 TTS:POST,返回 WAV。
这两个中转接口不做服务端排队,正常按请求并发直发到上游。
路由
GET /api/tts-proxy
GET /api/tts-proxy/health
GET /api/tts-proxy/google?text=Good%20job&lang=en
POST /api/tts-proxy/mimo
GET /api/tts-proxy/google
中转这个上游:
https://translate.google.com/translate_tts?ie=UTF-8&tl=en&client=tw-ob&q=Good+job
服务端拼接规则:
ie=UTF-8
tl=<lang 或 tl,默认 en>
client=tw-ob
q=<text>
参数:
| 字段 | 必填 | 默认 | 说明 |
|---|---|---|---|
text | 是 | - | 要合成的文本。服务端限制 200 字符以内。 |
lang | 否 | en | 语言代码,例如 en、zh-CN、ja。 |
tl | 否 | - | lang 的别名;同时传时优先使用 lang。 |
format | 否 | mp3 | 只作为调用方标识保留;上游固定返回 audio/mpeg,不能调音色、音调或语速。 |
示例:
curl "https://6767.chat/api/tts-proxy/google?text=Good%20job&lang=en" \
--output google.mp3
Google 长度探测
2026-05-22 通过 translate.google.com/translate_tts 实测:
q 字符数 | HTTP | Content-Type |
|---|---|---|
| 1 | 200 | audio/mpeg |
| 50 | 200 | audio/mpeg |
| 100 | 200 | audio/mpeg |
| 150 | 200 | audio/mpeg |
| 200 | 200 | audio/mpeg |
| 201 | 400 | text/html; charset=utf-8 |
因此中转把 text 限制为 200 字符。更长文本需要客户端自己分段,多段音频自行拼接。
POST /api/tts-proxy/mimo
中转 MiMo V2.5 TTS OpenAI 兼容接口:
POST https://api.xiaomimimo.com/v1/chat/completions
服务端使用环境变量:
MIMO_API_KEY=<你的 key>
也兼容:
XIAOMIMIMO_API_KEY=<你的 key>
MIMO_API_URL=https://api.xiaomimimo.com/v1/chat/completions
TTS_PROXY_URL=http://127.0.0.1:7890
海外上游默认走 http://127.0.0.1:7890。如果要直连,设置 TTS_PROXY_URL=direct。
MiMo 是国内上游,中转策略是优先直连;只有网络层请求失败时才 fallback 到代理。HTTP 4xx/5xx 会直接返回错误,不会自动重试。
并发与限流
服务端对全部 /api/* 请求加了并发上限:
MAX_CONCURRENT_API_REQUESTS=500
超过时服务端直接返回:
429 Too Many Requests
Google 和 MiMo 这两个 TTS proxy 不做内部串行队列,也不做列表轮询;单个请求会直接并发发给对应上游。
如果上游自己返回 429,中转会直接透传 429,不会改写成 502。
请求参数:
| 字段 | 必填 | 默认 | 说明 |
|---|---|---|---|
text | 是 | - | 要合成的正文,服务端限制 3000 字符以内。 |
voice | 否 | mimo_default | 预置音色 ID,例如 mimo_default、冰糖、茉莉、苏打、白桦、Mia、Chloe、Milo、Dean。 |
prompt | 否 | 空 | 风格自然语言控制,放到 MiMo 的 user message。 |
style | 否 | 空 | prompt 的别名。 |
服务端固定:
{
"model": "mimo-v2.5-tts",
"audio": {
"format": "wav"
}
}
示例:
curl -X POST "https://6767.chat/api/tts-proxy/mimo" \
-H "Content-Type: application/json" \
--data '{"text":"测试一下 MiMo 语音合成。","voice":"冰糖"}' \
--output mimo.wav
带风格控制:
curl -X POST "https://6767.chat/api/tts-proxy/mimo" \
-H "Content-Type: application/json" \
--data '{"text":"今天的任务完成了。","voice":"Chloe","prompt":"Bright, bouncy, fast pace, rising pitch at the end."}' \
--output mimo.wav
GET /api/tts-proxy/health
返回两个上游的配置状态,不会请求上游。
{
"success": true,
"service": "tts-proxy",
"status": "ok",
"concurrency": {
"active": 0,
"limit": 500
},
"providers": {
"google": {
"upstream": "https://translate.google.com/translate_tts",
"textMaxLength": 200,
"format": "mp3",
"outboundProxyConfigured": true
},
"mimo": {
"upstream": "https://api.xiaomimimo.com/v1/chat/completions",
"model": "mimo-v2.5-tts",
"credentialsConfigured": true,
"textMaxLength": 3000,
"defaultVoice": "mimo_default",
"format": "wav",
"outboundProxyConfigured": true,
"proxyMode": "direct-first"
}
}
}
错误
| 状态码 | 说明 |
|---|---|
400 | 缺少 text、文本过长,或 Google lang/tl 格式无效。 |
500 | MiMo key 没有配置。 |
429 | 服务端并发超过 500,或 Google / MiMo 上游自身返回 429。 |
502 | 上游请求失败、上游返回非音频或 MiMo 没有返回音频 data。 |
更新日志
2026-05-22 初始发布
- 新增
/api/tts-proxy/google,中转 Google Translate 非官方 TTS。 - 新增
/api/tts-proxy/mimo,中转 MiMo V2.5 TTS。 - Google
text限制为 200 字符;MiMotext限制为 3000 字符。 - TTS proxy 不做服务端排队;上游 429 直接透传。