基础路径:http://<host>:<listenport>
所有接口统一返回格式:
{ "code": 0, "msg": "ok", "data": {} }code 为 0 表示成功,非 0 表示错误。
交换 SDP 以建立 WebRTC 连接,扩展参数在 JSON body 中。
POST /offer
Content-Type: application/json
| 参数 | 必填 | 类型 | 默认值 | 说明 |
|---|---|---|---|---|
sdp |
是 | string | — | WebRTC Offer SDP |
type |
是 | string | — | 必须为 offer |
avatar |
否 | string | 启动参数值 | 指定数字人 ID |
refaudio |
否 | string | — | 参考音频 |
reftext |
否 | string | — | 参考文本 |
custom_config |
否 | string | — | 动作编排配置 JSON 字符串 |
响应 (200):
{
"sdp": "v=0\r\n...",
"type": "answer",
"sessionid": "session-uuid"
}符合 WHEP 协议(WebRTC HTTP Egress Protocol)。
SDP offer 以 application/sdp 裸文本发送,扩展参数通过 query string 传递。
POST /whep
Content-Type: application/sdp
Query 参数:
| 参数 | 必填 | 类型 | 默认值 | 说明 |
|---|---|---|---|---|
avatar |
否 | string | 启动参数值 | 指定数字人 ID |
refaudio |
否 | string | — | 参考音频 |
reftext |
否 | string | — | 参考文本 |
tts |
否 | string | — | TTS 引擎 |
tts_server |
否 | string | — | TTS 服务地址 |
tts_speed |
否 | number | — | TTS 语速 |
custom_config |
否 | string | — | 动作编排配置 JSON 字符串 |
Body: SDP offer 裸文本,例如:
v=0\r\no=- 0 0 IN IP4 127.0.0.1\r\n...
响应 (201):
Content-Type:application/sdpX-Session-ID: 生成的会话 ID(UUID)
Body 为 SDP answer 裸文本:
v=0\r\no=- ...\r\n...
客户端示例:
const params = new URLSearchParams({
avatar: 'wav2lip256_avatar1',
refaudio: 'zh-CN-YunxiaNeural',
});
const res = await fetch('/whep?' + params.toString(), {
method: 'POST',
headers: { 'Content-Type': 'application/sdp' },
body: pc.localDescription.sdp,
});
const answerSdp = await res.text();
const sessionid = res.headers.get('X-Session-ID');
await pc.setRemoteDescription({ type: 'answer', sdp: answerSdp });发送文本驱动数字人说话,支持直接复读或 LLM 对话。
POST /human
Content-Type: application/json
| 参数 | 必填 | 类型 | 默认值 | 说明 |
|---|---|---|---|---|
sessionid |
是 | string | — | 会话 ID |
text |
是 | string | — | 输入文本 |
type |
是 | string | — | echo: 直接复读; chat: 触发 LLM 回答 |
interrupt |
否 | bool | false | 是否打断当前播报 |
tts |
否 | object | — | 透传给 TTS 的配置(如 voice, emotion) |
响应:
{ "code": 0, "msg": "ok" }上传音频文件驱动数字人。
POST /humanaudio
Content-Type: multipart/form-data
| 参数 | 必填 | 类型 | 说明 |
|---|---|---|---|
sessionid |
是 | string | 会话 ID |
file |
是 | file | 音频文件 |
响应:
{ "code": 0, "msg": "ok" }立即清空当前会话的音频队列。
POST /interrupt_talk
| 参数 | 必填 | 类型 | 说明 |
|---|---|---|---|
sessionid |
是 | string | 会话 ID |
响应:
{ "code": 0, "msg": "ok" }POST /is_speaking
| 参数 | 必填 | 类型 | 说明 |
|---|---|---|---|
sessionid |
是 | string | 会话 ID |
响应:
{
"code": 0,
"msg": "ok",
"data": true
}控制服务器端的渲染录制。
POST /record
| 参数 | 必填 | 类型 | 说明 |
|---|---|---|---|
sessionid |
是 | string | 会话 ID |
type |
是 | string | start_record: 开始录制; end_record: 停止并合成 |
响应:
{ "code": 0, "msg": "ok" }下载录制完成的 MP4 文件。
GET /record/{sessionid}
路径参数: sessionid — 会话 ID
响应: MP4 文件流。若文件不存在返回 404。
POST /set_audiotype
| 参数 | 必填 | 类型 | 说明 |
|---|---|---|---|
sessionid |
是 | string | 会话 ID |
audiotype |
是 | int | 预定义的动作/状态索引 |
响应:
{ "code": 0, "msg": "ok" }GET /sse?sessionid=<sessionid>
协议: Server-Sent Events (SSE)
用于接收服务器→客户端的异步状态推送(播报事件、状态变化等)
请求参数 (Query):
| 参数 | 必填 | 类型 | 说明 |
|---|---|---|---|
sessionid |
是 | string | 会话 ID |
响应格式: Content-Type: text/event-stream
每条事件一行 JSON,格式为:
data: {"status": "start"}
客户端示例:
const es = new EventSource(`/sse?sessionid=${sessionid}`);
es.onmessage = (event) => {
const data = JSON.parse(event.data);
// data 为服务器推送的播报状态/事件
};
es.onerror = () => {
// 连接出错或服务端主动断开,EventSource 会自动重连
};
// 断开时
es.close();