# 语音合成 WebSocket 单向流（火山原生协议透传，SAMI 帧）

**WebSocket 端点，非普通 HTTP**：`wss://api.xrtoken.net/v1/audio/speech/unidirectional/stream?model=seed-tts-2.0`。

建连后走火山 SAMI 单向语音合成二进制协议：客户端发送一帧 `req_params`（结构同
`POST /v1/audio/speech/unidirectional` 请求体）后，持续接收音频分片帧，直至收到
`code==20000000` 结束标志。**帧格式与火山官方完全一致，仅需更换域名与鉴权 key**，
可直接复用火山官方 Demo 客户端代码对接。

**鉴权**：服务端用 `Authorization: Bearer <tr-key>` 或 `X-Api-Key: <tr-key>`；浏览器
无法带 header 时用 `Sec-WebSocket-Protocol: ["xrtoken.bearer", "<tr-key>"]` 携带，
不走 URL query。

**选模型**：`?model=` 优先；`X-Api-Resource-Id` header 兜底。

**计费**：按文本字符数计费（含标点），`context_texts` 语音指令不计费，结算以上游
返回的 `usage.text_words` 为准（未回传时按客户端实发文本字符数兜底）。

**并发**：单 key 最多 10 路并发流。

## GET /v1/audio/speech/unidirectional/stream

> 语音合成 WebSocket 单向流（火山原生协议透传，SAMI 帧）

**WebSocket 端点，非普通 HTTP**：`wss://api.xrtoken.net/v1/audio/speech/unidirectional/stream?model=seed-tts-2.0`。

建连后走火山 SAMI 单向语音合成二进制协议：客户端发送一帧 `req_params`（结构同
`POST /v1/audio/speech/unidirectional` 请求体）后，持续接收音频分片帧，直至收到
`code==20000000` 结束标志。**帧格式与火山官方完全一致，仅需更换域名与鉴权 key**，
可直接复用火山官方 Demo 客户端代码对接。

**鉴权**：服务端用 `Authorization: Bearer <tr-key>` 或 `X-Api-Key: <tr-key>`；浏览器
无法带 header 时用 `Sec-WebSocket-Protocol: ["xrtoken.bearer", "<tr-key>"]` 携带，
不走 URL query。

**选模型**：`?model=` 优先；`X-Api-Resource-Id` header 兜底。

**计费**：按文本字符数计费（含标点），`context_texts` 语音指令不计费，结算以上游
返回的 `usage.text_words` 为准（未回传时按客户端实发文本字符数兜底）。

**并发**：单 key 最多 10 路并发流。

### Authentication

`Authorization: Bearer tr-xxx`

### Query Parameters

- **model** `string`  
  语音合成模型 / 渠道 ID

### Error Codes

- `101`: WebSocket 协议升级成功，后续为 SAMI 单向二进制帧
- `401`: 
- `402`: 
- `429`: 并发流数量超过单 key 上限（10 路）
- `502`:
