GET
/live/v1/external-lives/{live_id}/stream请求头
Connectionstring*暂无说明
示例值:
UpgradeUpgradestring*暂无说明
示例值:
websocket路径参数
live_idstring*路径参数,创建时返回
Query 参数
conn_idWebSocket 是外接直播的核心通道:既发控制信令,也上行 PCM 音频和转写文本。
连接前校验失败返回 HTTP 错误(不升级为 WebSocket):
状态码 | 场景 |
|---|---|
`401` | header 与 `client_secret` 均缺失,或 `client_secret` 无效 / 过期 |
`403` | live 不属于当前用户 |
`400` | 非外接 live、live 已结束、`live_id` 非法 |
`409` | 该 live 已有活跃连接 |
连接约定:
项 | 约定 |
|---|---|
文本帧 | TextMessage + JSON(WsSignal),最大 64 KiB |
二进制帧 | BinaryMessage(裸 PCM 音频),最大 64 KiB |
首帧要求 | 必须为 `conn_init` |
心跳 | 服务端约 5s 发送 ping,约 15s 无响应则断开 |
通用消息格式
typeinteger信号类型,见「信号类型」
live_idstring须与路径一致
conn_idstring客户端生成的连接 ID(与建连参数一致)
seq_idinteger客户端自增序号;ack 的 seq_id 为请求 seq_id + 1
payloadobject按 type 不同携带对应子结构
信号类型
客户端 → MaaS:
type | 名称 | 说明 | 是否必填 |
|---|---|---|---|
1 | `conn_init` | 连接初始化(首帧必须发送,成功前其他信号忽略) | 是 |
5 | `call_hangup` | 主动挂断;直接关闭 WS 等效 | 否 |
7 | `audio_interrupted` | 打断数字人当前回复 | 否(建议接入,最佳时机为每次 VAD 检测到用户开口时) |
9 | `input_transcription` | 用户语音转写文本;content 为空则忽略 | 是(不传无法驱动数字人) |
10 | `output_transcription` | 模型生成的回复文本;content 为空则忽略 | 是(不传无法驱动数字人) |
MaaS → 客户端:
type | 名称 | 说明 |
|---|---|---|
2 | `conn_init_ack` | 初始化回执 |
6 | `force_hangup` | 服务端强制挂断(发送后约 500ms 断开 WS) |
信令示例
conn_init(type=1)
conn_init_ack(type=2)— 成功
input_transcription(type=9) — 你的 ASR 识别出的用户话:
output_transcription(type=10) — 你的 LLM 生成的回复话:
audio_interrupted(type=7)
call_hangup(type=5)
force_hangup(type=6) — 服务端下发:
音频二进制帧
通过 WebSocket BinaryMessage 发送,无 JSON 封装,直接传输原始 PCM 字节流。
参数 | 值 |
|---|---|
编码 | PCM 16-bit 有符号小端(s16le) |
采样率 | 24,000 Hz |
声道 | 单声道(mono) |
数据速率 | 48 字节 / 毫秒 |
建议帧大小 | 20ms(960 字节)或 100ms(4,800 字节) |

