文本转语音 WebSocket
GETwss://api.knoxstudio.ai/v1/text-to-speech/:voice_id/stream-input
面向分块文本(例如 LLM 流)的 WebSocket TTS。全文已知时请使用 HTTP 合成。GET 和 POST 都接受升级。普通 HTTP 返回 400。仅流式 output_format(无 WAV)。按发送的字符计费。
请求
路径参数
| 名称 | 类型 | 必填 | 描述 |
|---|---|---|---|
| voice_id | String | 是 | ElevenLabs 音色 ID。 |
查询参数
| 名称 | 类型 | 必填 | 描述 |
|---|---|---|---|
| model_id | String | 否 | 默认 eleven_multilingual_v2。 |
| output_format | String | 否 | 仅流式格式:mp3_22050_32, mp3_24000_48, mp3_44100_32, mp3_44100_64, mp3_44100_96, mp3_44100_128, mp3_44100_192, pcm_8000, pcm_16000, pcm_22050, pcm_24000, pcm_32000, pcm_44100, pcm_48000, ulaw_8000, alaw_8000, opus_48000_32, opus_48000_64, opus_48000_96, opus_48000_128, opus_48000_192。 |
| enable_logging | Boolean | 否 | 默认 true。 |
| apply_text_normalization | String | 否 | auto、on 或 off。 |
| inactivity_timeout | Integer | 否 | 空闲后关闭套接字的秒数。 |
| sync_alignment | Boolean | 否 | 在音频消息中包含对齐信息。 |
| auto_mode | Boolean | 否 | 自动触发生成。 |
可以使用请求头时不要把 API key 放进查询字符串。浏览器原生 WebSocket 不能设头,可用 ?authorization= / ?api_key=。Knox 也接受 xi-api-key。JSON 消息体中的凭证会被剥离。
请求头
| 名称 | 类型 | 必填 | 描述 |
|---|---|---|---|
| Authorization | String | 是 | Bearer <token> Knox API key。也接受 xi-api-key。 |
| Upgrade | String | 是 | 必须为 websocket。 |
客户端消息
发送 JSON 文本帧:
{
"text": "第一块文本 ",
"try_trigger_generation": true,
"voice_settings": { "stability": 0.5, "similarity_boost": 0.75 }
}
发送 "text": ""(通常配合 try_trigger_generation: true)冲刷剩余音频。冲刷空文本后再关闭套接字以结束生成。
第一条消息上的 model_id 和 voice_settings 会覆盖查询默认值。不要在负载中发送 xi-api-key。
服务端消息
{
"audio": "<base64>",
"isFinal": false,
"normalizedAlignment": {},
"alignment": {}
}
isFinal: true 表示已冲刷文本的音频结束。
示例
const ws = new WebSocket(
"wss://api.knoxstudio.ai/v1/text-to-speech/21m00Tcm4TlvDq8ikWAM/stream-input?model_id=eleven_flash_v2_5&output_format=mp3_44100_128"
);
ws.onopen = () => {
ws.send(JSON.stringify({ text: "你好,这里是 Knox。 ", try_trigger_generation: true }));
ws.send(JSON.stringify({ text: "", try_trigger_generation: true }));
};
在允许自定义头的环境用 Authorization 传递 Knox key,或使用 xi-api-key。
错误响应
校验失败返回 HTTP 422:
{
"detail": [
{
"loc": ["body", "field"],
"msg": "…",
"type": "value_error"
}
]
}
其他错误使用 { "detail": "message" }。
| 状态 | 何时 |
|---|---|
400 | 未携带 Upgrade: websocket 访问 WebSocket 路径。 |
401 | 缺少或无效的 API key。 |
402 | 余额不足。 |
403 | Token 无权使用该模型。 |
404 | 资源不存在。 |
422 | 校验错误。 |
429 | 超出速率限制。 |
500 | 服务器内部错误。 |