Vidu-S1 数字人
概念 | 是什么 | 类比 |
|---|---|---|
Live(会话) | 一次完整的数字人互动,创建后拿到 live_id | 一通视频电话 |
RTC 频道 | 音视频传输通道,承载麦克风、摄像头、数字人音视频 | 电话线路 |
WebSocket 信令 | 控制指令通道,负责开始、文字、打断、挂断 | 遥控器 |
Persona(人设) | 数字人的性格与说话风格等设定 | 这个演员是演什么的 |
你是谁 | 目标 | 建议阅读顺序 |
|---|---|---|
第一次接触,想先跑通 | 验证 API Key 和链路可用 | Quick Start 外链 → 完整接入流程(3 步) |
研发,要写集成代码 | 最小可运行链路 | 完整接入流程(3 步)→ 接口协议详述(按需查字段) |
要接记忆 / 知识库 / 音色等 | 对接高级能力,基于业务需要调整参数 | 接口协议详述对应小节 → 外调记忆 / 知识 API |
第 1 步 创建会话 → 拿到 live.id 和 rtc.token 第 2 步 建 WebSocket → 发送 conn_init,等待 conn_init_ack.success=true 第 3 步 接入 RTC → 使用 rtc.token 加入 AliRTC,发布麦克风并订阅数字人音视频
POST https://{host}/live/v1/lives Authorization: Token vda_xxx Content-Type: application/json
{ "call_mode": "video", "avatar": { "persona": "你是一个友好的客服,请自然地与用户实时互动", "image_uri": "https://你的数字人图片地址.png", "voice": "" } }
wss://{host}/live/ws/live/connect?live_id={live_id} Authorization: Token vda_xxx
{ "type": 1, "live_id": "123456789", "seq_id": 1, "payload": { "conn_init": { "version": 1 } } }
await aliRtc.joinChannel(rtc.token, rtc.user_id); await aliRtc.publishLocalAudioStream(true); if (callMode === 'video') { await aliRtc.publishLocalVideoStream(true); }
模式 | App 端推 / 订阅关系 |
|---|---|
audio | 加入 live-audio-{liveID},推麦克风音频,订阅数字人音频 live-bot-...。 |
video | 加入 live-user-{liveID},推麦克风和摄像头,订阅数字人音视频 live-video-push-...。 |
方法 | 路径 | 用途 |
|---|---|---|
POST | /live/v1/lives | 创建 Live 会话(核心入口,返回 RTC 入会与 WS 初始化信息) |
GET | /live/v1/lives/{live_id} | 查询单个 Live 会话状态与账单 |
GET | /live/v1/lives | 列表查询 Live 会话 |
WebSocket | /live/ws/live/connect | App 控制信令(开始 / 文字 / 打断 / 挂断) |
— | AliRTC joinChannel | 实时媒体流(麦克风 / 摄像头 / 数字人音视频),需集成 AliRTC SDK |
POST | /live/v1/voices/clone | 音色克隆,创建自定义音色 |
GET | /live/v1/voices | 查询自定义音色列表 |
POST / PUT | /tools/v2/files/uploads | 图片上传(三步式),换取可作 avatar.image_uri 的 URI |
项目 | 约定 |
|---|---|
{host} | {host} 是域名,不包含协议。国内环境为 api.vidu.cn,海外环境为 api.vidu.com。HTTP 请求使用 https://{host},WebSocket 使用 wss://{host}。 |
认证 | 所有 App 侧 HTTP 与 WebSocket 接口都需要 Authorization: Token vda_xxx。API Key 可在工作台获取。 |
JSON 字段 | 请求与响应字段使用 snake_case,例如 call_mode、live_id、token_expire_at。 |
ID 与时间 | live_id、character_id、created_at、token_expire_at 等 int64 字段建议前端按字符串处理,避免 JavaScript number 精度问题。 |
媒体传输 | App WebSocket 只承载控制信令;麦克风、摄像头、数字人音视频都通过 AliRTC 传输。 |
{ "code": 400, "reason": "BAD_REQUEST", "message": "参数非法", "metadata": {} }
POST https://{host}/live/v1/lives Authorization: Token vda_xxx Content-Type: application/json
{ "call_mode": "video", "character_id": "1", "avatar": { "persona": "你是甜甜 Tina,我的声音像温热的奶茶,甜甜的、暖暖的,但解决问题可一点都不含糊哦!", "image_uri": "https://scene.cf.vidu.studio/media-asset/070302-ZFkgvJxBTM0ZQJoO.png", "voice": "Tina" }, "audio": { "enable_transcription": true }, "vad": { "type": "semantic", "threshold": 0.5, "silence_duration_ms": 200, "idle_timeout_ms": 500 }, "llm": { "temperature": 0.7, "top_p": 0.8, "top_k": 20, "frequency_penalty": 1, "presence_penalty": 0.3, "seed": -1, "max_tokens": 50 }, "idle_timeout_seconds": 7200, "memory_retrieval": { "enabled": true, "endpoint": "https://api.example.com/memory/search", "authorization": "Bearer memory-api-token", "timeout_ms": 3000 }, "knowledge_retrieval": { "enabled": true, "endpoint": "https://api.example.com/knowledge/search", "authorization": "Bearer knowledge-api-token", "timeout_ms": 3000 } }
字段 | 类型 | 必填 | 说明 |
|---|---|---|---|
call_mode | String | 是 | 交互方式,枚举值: audio:纯语音 video:音视频 |
avatar.persona | String | 是 | 数字人的人设,5万字以内,具体见“推荐的人设模板”章节 |
avatar.image_uri | String | 是 | avatar.image_uri和avatar.id二选一 数字人形象图片地址,支持图片 URL 和 base64。仅支持 1 张【单人】图片,支持全身 / 半身、各种风格。格式:PNG / JPG / JPEG / WEBP;图片大小 ≤ 50MB;base64 decode 后字节长度 < 20M,且需包含内容类型前缀,例如 |
avatar.id | String | 是 | avatar.image_uri和avatar.id二选一 具体见图片上传章节 |
avatar.voice | String | 否 | 音色,不填用默认。Vidu 支持音色克隆,见【音色克隆接口】。默认值:Tina |
avatar.greeting_instruction | string | 否 | 开场问候语提示词, ≤ 200 字符,默认打招呼提示词:“直播刚刚开始。请用中文主动向观众说一句简短、温暖、自然、符合人设的开场白。直接说出来,不要用旁白叙述。” |
avatar.farewell_enabled | bool | 否 | 是否自动生成礼貌离开视频。默认false,用户选择了ture,则在结束时,会有几秒的离开视频,用户通过rtc持续拉流,可以拉取到 |
avatar.persona_enhance | bool | 否 | 是否对人设进行优化,默认false,true会对提示词进行扩写和优化 |
avatar.idle_action | bool | 否 | 在不说话时数字人是否自动做一些自然动作,默认为false |
字段 | 类型 | 默认 | 说明 |
|---|---|---|---|
audio.enable_transcription | bool | false | 为 true 时,通过 WebSocket 返回用户语音转文本 / 数字人输出音频转文本的结果。新增 signal_type 事件:type=9(输入音频转文本)、type=10(输出音频转文本) |
字段 | 类型 | 默认 | 说明 |
|---|---|---|---|
vad.type | String | server | 枚举值: server:过滤附和 / 背景音 semantic:用户开口即打断当前响应 |
vad.threshold | float | 0.5 | 拟声词、嘈杂声屏蔽力度,范围 [0, 1.0],越低屏蔽越少。仅 vad.type=server 时生效 |
vad.silence_duration_ms | int | 400 | 语音结束后静音多久触发响应,范围 [200, 6000],单位 ms。仅 vad.type=server 时生效 |
vad.idle_timeout_ms | int | 0 | 静默超时后模型多久主动发起对话,0 或 [500, 30000],单位 ms。0 代表不主动发起对话 |
字段 | 类型 | 默认 | 说明 |
|---|---|---|---|
llm.temperature | float | 0.7 | 创意度,范围 [0.0, 2.0) |
llm.top_p | float | 0.8 | 质量下限,范围 (0.0, 1.0] |
llm.top_k | int | 20 | 范围 [0, 100] |
llm.frequency_penalty | float | 1.0 | 防嘴瓢,范围 > 0。 默认 1.0 不惩罚; < 1 反向鼓励重复; > 1 惩罚重复,越大越不重复 |
llm.presence_penalty | float | 0.3 | 话题广度,范围 [0, 2] |
llm.seed | int | -1 | 范围 0 ~ 2³¹−1。默认 -1:随机 seed |
llm.max_tokens | int | 50 | 模型最大输出长度,范围 1 ~ 64K |
字段 | 类型 | 默认 | 说明 |
|---|---|---|---|
idle_timeout_seconds | int | 7200 | 无输入自动断开时间。默认 7200s,范围 10 ~ 7200s |
字段 | 类型 | 必填 | 说明 |
|---|---|---|---|
*.enabled | bool | 是 | 是否启用该能力 |
*.endpoint | String | 启用时必填 | 检索 API 地址。必须是 live 服务端可访问的 http(s) 绝对 URL |
*.authorization | String | 启用时必填 | 会作为外部 API 的 Authorization header 转发,且校验非空 |
*.timeout_ms | int | 否 | 请求超时,最大 30000(ms) |
{ "live": { "id": "123456789", "status": "waiting", "live_duration": 600, "call_mode": "video" }, "rtc": { "app_id": "xxxx", "channel_id": "live-user-123456789", "user_id": "live-user-1001-123456789", "token": "base64-token...", "token_expire_at": "1750003600" } }
字段 | 类型 | 说明 |
|---|---|---|
live.id | String | 房间 ID,后续所有步骤都要用,务必保存 |
live.status | String | 此时是 waiting,数字人还没准备好 |
live.live_duration | Int | 本次会话最大时长(秒),超时自动断开 |
rtc.token | String | 进视频房间的凭证,默认 1 小时有效 |
rtc.user_id | String | 你在 RTC 频道里的用户名 |
rtc.token_expire_at | String | token 过期时间(Unix 时间戳),过期需重新创建会话 |
GET https://{host}/live/v1/lives/{live_id} Authorization: Token vda_xxx
参数 | 类型 | 说明 |
|---|---|---|
live_id | String | 路径参数,必须大于 0,且必须属于当前 API Key 对应账号。 |
响应字段 | 说明 |
|---|---|
live.status | 会话状态:waiting、prepared、on_live、ending、ended。 |
live.created_at | 创建时间,Unix 秒。 |
live.start_time | 正式开始时间,通常在双端 ready 后写入。 |
live.end_time | 结束时间。 |
live.trace_id | 排查问题使用的链路 ID,反馈问题时建议带上。 |
live.billed_seconds | 计费秒数,通常从会话 ready 后开始统计。 |
live.credits_cost | 本次 live 消耗的积分。 |
GET https://{host}/live/v1/lives?pager.page=0&pager.pagesz=10 Authorization: Token vda_xxx
Query 参数 | 类型 | 说明 |
|---|---|---|
pager.page | Int | 页码,从 0 开始;不传时按默认值处理。 |
pager.pagesz | Int | 每页数量。小于等于 0 时默认 10,大于 100 时截断为 100。 |
pager.page_token | String | 预留字段,当前业务主要使用 page / pagesz。 |
{ "total": 12, "lives": [ { "id": "1234567890", "status": "ended", "call_mode": "video", "billed_seconds": 120, "credits_cost": 20 } ], "next_page_token": "" }
wss://{host}/live/ws/live/connect?live_id={live_id}&conn_id={conn_id} Authorization: Token vda_xxx
Query 参数 | 类型 | 说明 |
|---|---|---|
live_id | String | 必填,创建 live 返回的 live.id。 |
conn_id | String | 可选,客户端连接 ID;不传时服务端会生成。 |
{ "type": 1, "live_id": "1234567890", "user_id": "10000", "conn_id": "app-conn-1", "seq_id": 1, "payload": {} }
type | 名称 | 方向 | 说明 |
|---|---|---|---|
1 | conn_init | App → live | 连接初始化,必须在 WS 打开后发送。 |
2 | conn_init_ack | live → App | 初始化结果。success=true 后表示实时控制链路 ready。 |
5 | call_hangup | App → live | App 主动挂断。 |
6 | force_hangup | live → App | 服务端强制挂断,例如超时、风控、积分不足或服务侧关闭。 |
7 | audio_interrupted | App → live | 用户打断当前 AI 输出。 |
99 | text_msg | App → live | 发送文本消息。 |
{ "type": 1, "live_id": "1234567890", "conn_id": "app-conn-1", "seq_id": 1, "payload": { "conn_init": { "version": 1 } } }
{ "type": 2, "live_id": "1234567890", "conn_id": "app-conn-1", "seq_id": 2, "payload": { "conn_init_ack": { "success": true, "error_code": "", "error_msg": "", "server_timestamp": 1710000000 } } }
{ "type": 2, "live_id": "1234567890", "conn_id": "app-conn-1", "seq_id": 2, "payload": { "conn_init_ack": { "success": false, "error_code": "NOT_READY", "error_msg": "live sip endpoint not ready", "server_timestamp": 1710000000 } } }
{ "type": 99, "live_id": "1234567890", "conn_id": "app-conn-1", "seq_id": 10, "payload": { "text_msg": { "msg_id": "client-msg-1", "content": "你好,请介绍一下你自己", "timestamp": 1710000000000 } } }
字段 | 说明 |
|---|---|
msg_id | 客户端生成的消息 ID,便于客户端日志关联。 |
content | 发送给数字人的文本内容。 |
timestamp | 客户端发送时间,毫秒时间戳。 |
{ "type": 7, "live_id": "1234567890", "conn_id": "app-conn-1", "seq_id": 11, "payload": {} }
{ "type": 5, "live_id": "1234567890", "conn_id": "app-conn-1", "seq_id": 12, "payload": { "hangup": { "hangup_reason": "user_end" } } }
{ "type": 6, "live_id": "1234567890", "conn_id": "app-conn-1", "payload": { "hangup": { "hangup_reason": "timeout" } } }
hangup_reason | 常见场景 |
|---|---|
user_end | 用户主动结束。 |
timeout | 会话达到最大时长。 |
audit_violation | 触发内容安全或风控策略。 |
credit_insufficient | 积分不足。 |
sip_closed / provider_closed | 服务侧或数字人渲染侧关闭。 |
sip_reconnect_timeout / client_reconnect_timeout | 断连超过重连宽限。 |
external | 后台或外部控制关闭。 |
{ "type": 97, "live_id": "1234567890", "conn_id": "app-conn-1", "seq_id": 20, "payload": { "session_update": { "avatar": { "voice": "Tina" }, "vad": { "type": "server", "threshold": 0.5, "silence_duration_ms": 400 }, "llm": { "temperature": 0.7, "top_p": 0.8, "max_tokens": 50 } } } }
字段 | 类型 | 取值 / 约束 | 生效时机 | 非法处理 |
|---|---|---|---|---|
avatar.voice | String | 已有音色或克隆音色 ID | 当前播报结束后生效(无播报时立即) | 音色不存在 → 更新失败 |
avatar.persona | String | ≤ 5 万字 | 当前播报结束后生效(无播报时立即) | 超长 → 更新失败 |
vad.type | String | server / semantic | 下一轮 | 非枚举 → 拒绝 |
vad.threshold | float | [0, 1.0],仅 type=server 生效 | 下一轮 | 越界 → 拒绝 |
vad.silence_duration_ms | int | [200, 6000] ms,仅 type=server 生效 | 下一轮 | 越界 → 拒绝 |
knowledge_retrieval.enabled | bool | true / false | 下一轮 | — |
knowledge_retrieval.endpoint | String | 可访问的 http(s) 绝对 URL,启用时必填 | 下一轮 | 非法 URL / 启用时缺失 → 拒绝 |
| String | 非空,转发为外部 API 的 Authorization | 下一轮 | 启用时为空 → 拒绝 |
knowledge_retrieval.timeout_ms | int | ≤ 30000 ms | 下一轮 | 越界 → 拒绝 |
memory_retrieval.enabled | bool | true / false | 下一轮 | — |
memory_retrieval.endpoint | String | 可访问的 http(s) 绝对 URL,启用时必填 | 下一轮 | 非法 URL / 启用时缺失 → 拒绝 |
memory_retrieval.authorization | String | 非空 | 下一轮 | 启用时为空 → 拒绝 |
memory_retrieval.timeout_ms | int | ≤ 30000 ms | 下一轮 | 越界 → 拒绝 |
llm.seed | int | -1(随机)或 0 ~ 2³¹−1 | 下一轮 | 越界 → 拒绝 |
llm.max_tokens | int | 1 ~ 64K | 下一轮 | 越界 → 拒绝 |
llm.frequency_penalty | float | > 0 | 下一轮 | ≤ 0 → 拒绝 |
llm.presence_penalty | float | [0, 2] | 下一轮 | 越界 → 拒绝 |
llm.top_k | int | [0, 100] | 下一轮 | 越界 → 拒绝 |
llm.top_p | float | (0.0, 1.0] | 下一轮 | 越界 → 拒绝 |
llm.temperature | float | [0.0, 2.0) | 下一轮 | 越界 → 拒绝 |
{ "type": 98, "live_id": "1234567890", "conn_id": "app-conn-1", "payload": { "session_update_ack": { "success": true, "error_code": "", "error_msg": "" } } }
字段 | 说明 |
|---|---|
success | 本次更新是否被整体接受;为 false 时所有字段均不生效,原配置保持不变 |
error_code / error_msg | 失败错误码与原因(失败时返回,成功时为空) |
链路 | 承载内容 | 典型动作 |
|---|---|---|
App WebSocket | 控制信令 | conn_init 开始、text_msg 文字互动、audio_interrupted 打断、call_hangup 挂断。 |
AliRTC | 实时媒体流 | 发布 App 麦克风音频;video 模式发布摄像头视频;订阅数字人音频和视频。 |
flowchart LR CreateLive["Create Live"] --> WsInit["App WS conn_init"] CreateLive --> RtcJoin["AliRTC joinChannel"] WsInit --> ControlReady["Control Ready"] RtcJoin --> MediaReady["Media Ready"] ControlReady --> Interact["Live Interaction"] MediaReady --> Interact
概念 | 说明 |
|---|---|
channel | 一次 live 对应的 RTC 房间。只有进入同一 channel 的用户才能互相收发媒体流。 |
publish | 把本端麦克风或摄像头推到 RTC 房间,让服务端和数字人链路能听到或看到用户。 |
subscribe | 从 RTC 房间拉取远端用户的音频或视频。本场景的远端用户主要是数字人音频和数字人视频推流。 |
await aliRtc.setDefaultSubscribeAllRemoteAudioStreams(true); await aliRtc.setDefaultSubscribeAllRemoteVideoStreams(true); await aliRtc.joinChannel(rtc.token, rtc.user_id); await aliRtc.publishLocalAudioStream(true); if (callMode === 'video') { await aliRtc.publishLocalVideoStream(true); }
模式 | channel_id | App 端职责 |
|---|---|---|
audio | live-audio-{live_id} | 发布麦克风音频,订阅数字人音频。 |
video | live-user-{live_id} | 发布麦克风和摄像头,订阅数字人视频流。 |
<video id="remoteVideo" autoplay playsinline></video>
const remoteVideoElement = document.getElementById('remoteVideo'); aliRtc.on('remoteUserOnLineNotify', (userId) => { console.log('remote user online', userId); }); aliRtc.on('videoSubscribeStateChanged', (userId, oldState, newState) => { if (newState === 'subscribed') { // streamType=1 表示远端摄像头流。video 模式下数字人视频通常走这个回调。 aliRtc.setRemoteViewConfig(remoteVideoElement, userId, 1); remoteVideoElement.play().catch(() => { console.warn('remote video autoplay failed'); }); } }); aliRtc.on('screenShareSubscribeStateChanged', (userId, oldState, newState) => { if (newState === 'subscribed') { // streamType=2 表示远端屏幕流;如服务端使用该流类型,也需要绑定视图。 aliRtc.setRemoteViewConfig(remoteVideoElement, userId, 2); } });
screenShareSubscribeStateChanged角色 | 用户 ID 格式 |
|---|---|
用户 | live-user-{creatorID}-{liveID} |
数字人音频 | live-bot-{creatorID}-{liveID} |
数字人视频推流 | |
POST https://{host}/live/v1/voices/clone Authorization: Token vda_xxx Content-Type: application/json
{ "audio_url": "https://example.com/reference.wav", "voice": "my_custom_voice", "text": "这是一段参考音频对应的文本", "language": "zh" }
字段 | 类型 | 必填 | 说明 |
|---|---|---|---|
audio_url | String | 是 | 参考音频,支持公网 URL 或 data URI,长度 1 到 2048。支持格式:WAV(16bit)、MP3、M4A;音频时长推荐 10~20 秒,最长不超过 60 秒;文件大小 < 10MB。 |
voice | String | 是 | 音色名,长度 1 到 64;创建 live 时填入 avatar.voice。仅允许数字、大小写字母和下划线。(请注意,音色名不要重复) |
text | String | 否 | 参考音频文本,便于服务端校验音频与文本一致性,最长 4096。 |
language | String | 否 | 参考音频语言,例如 zh、en,最长 16。支持zh(中文)、en(英文)、de(德语)、it(意大利语)、pt(葡萄牙语)、es(西班牙语)、ja(日语)、ko(韩语)、fr(法语)、ru(俄语)、th(泰语)、id(印尼语)、ar(阿拉伯语)、cs(捷克语)、da(丹麦语)、nl(荷兰语)、fi(芬兰语)、he(希伯来语)、hi(印地语)、is(冰岛语)、ms(马来语)、no(挪威语)、fa(波斯语)、pl(波兰语)、sv(瑞典语)、tl(他加禄语)、tr(土耳其语)、ur(乌尔都语)、vi(越南语)。 中文方言:东北话(Dongbei)、陕西话(Shannxi)、四川话(Sichuan)、河南话(Henan)、长沙话(Changsha)、天津话(Tianjin)、杭州话(Hangzhou)、辽宁话(Liaoning)、沈阳话(Shenyang)、鞍山话(Anshan) |
{ "voices": [{ "voice": "my_custom_voice" }] }DELETE /live/v1/voices/{"my_custom_voice"}data:image/png;base64,{base64_encode}方法 | HTTP 请求 | 说明 |
|---|---|---|
Create | POST /live/v1/avatars | 创建数字人设资产 |
Get | GET /live/v1/avatars/\{id\} | 查询单个数字人设资产 |
Delete | DELETE /live/v1/avatars/\{id\} | 删除数字人设资产 |
List | GET /live/v1/avatars | 分页列表查询 |
字段 | 类型 | 说明 |
|---|---|---|
image_uri | string | 人设形象图片,支持公网 http(s) URL 或 data URI |
name | string | 可选展示名,不传为空 |
字段 | 类型 | 说明 |
|---|---|---|
id | string | 数字人设资产 ID(可以作为avatar.id传入) |
image_uri | string | 形象图片的访问地址 |
name | string | 展示名 |
status | string | 描述生成状态,取值见下方「status 枚举」 |
created_at | timestamp | 创建时间 |
updated_at | timestamp | 更新时间 |
值 | 含义 |
|---|---|
created(1) | 已创建,等待生成描述 |
processing(6) | 生成描述中 |
success(11) | 生成成功 |
failed(12) | 生成失败(终态,需重新创建) |
Query 参数 | 类型 | 说明 |
|---|---|---|
pager.page | integer | 页码,从 0 开始,默认 0 |
pager.pagesz | integer | 每页数量,默认 10,最大 100 |
POST <memory_retrieval.endpoint> Content-Type: application/json Accept: application/json Authorization: <memory_retrieval.authorization>
{ "live_id": "1234567890", "query": "用户偏好的代码风格、编程语言偏好、脚本输出风格", "reason": "用户要求按之前喜欢的代码风格生成脚本,当前上下文没有相关偏好信息。", "memory_types": ["preference", "style"], "time_hint": "长期偏好", "max_results": 5 }
字段 | 类型 | 必填 | 说明 |
|---|---|---|---|
live_id | string | 是 | 当前 live ID,可用于日志、调试或映射服务端上下文 |
query | string | 是 | 模型生成的自然语言检索意图,不应只是机械复制用户原话 |
reason | string | 是 | 模型说明为什么当前回复需要检索记忆,便于日志、调试和风控 |
memory_types | string[] | 否 | 希望检索的记忆类型 |
time_hint | string | 否 | 时间范围提示,例如“最近”“上次”“长期偏好” |
max_results | integer | 否 | 最多返回条数。live 侧限制在 1..10,建议外部 API 也做限制 |
类型 | 含义 |
|---|---|
preference | 用户偏好,例如饮食、语言、工具、回答风格 |
profile | 用户基本信息,例如职业、所在地、角色 |
history | 过往对话事实、历史选择 |
project | 用户正在做的项目、长期任务 |
constraint | 用户明确限制,例如不要用 Python、预算有限 |
relationship | 人际关系、团队成员、联系人 |
style | 用户喜欢的输出风格、语气、格式 |
other | 其他不确定类型 |
{ "memories": [ { "id": "mem_101", "summary": "用户偏好代码简洁,避免过度封装,变量命名清晰。", "type": "style", "confidence": 0.94, "updated_at": "2026-06-01T09:00:00+08:00", "source": "long_term_memory" }, { "id": "mem_102", "summary": "用户通常偏好 Go 示例;如果用户明确要求 Python,则可以使用 Python。", "type": "preference", "confidence": 0.86, "updated_at": "2026-05-20T13:00:00+08:00", "source": "long_term_memory" } ] }
{ "memories": [], "error": "invalid_request" }
POST /v1/fake-memory/search Content-Type: application/json
POST /live/v1/fake-memory/search
live.builtin_avatars["01"].memories{ "memory_retrieval": { "enabled": true, "endpoint": "https://api.vidu.cn/live/v1/fake-memory/search", "authorization": "fake" } }
先调用 API 的 query | 再问数字人的问题 | 预期回复中的明显记忆点 |
|---|---|---|
用户喜欢灵绯怎么称呼自己 | 你还记得我喜欢你怎么叫我吗? | 阿澈 |
用户和灵绯之前约定的暗号 | 我们之前约定的暗号是什么? | 月亮醒了 |
用户喜欢灵绯用什么格式给建议 | 按我喜欢的方式,给我一个今晚睡前放松建议。 | 先给结论,再补充两三条理由 |
{ "live_id": "1234567890", "query": "用户喜欢灵绯怎么称呼自己", "reason": "验证 fake memory provider 是否能返回昵称记忆", "memory_types": ["relationship"], "max_results": 3 }
{ "memories": [ { "id": "persona_01_relationship_nickname_001", "summary": "用户喜欢灵绯称呼自己为“阿澈”。", "type": "relationship", "confidence": 1, "updated_at": "2026-07-10T00:00:00+08:00", "source": "fake_persona_memory" } ] }
面向最终用户时,角色应自然表达“我记得……”,不要说“我调用了 API / 工具 / fake provider”。
POST <knowledge_retrieval.endpoint> Content-Type: application/json Accept: application/json Authorization: <knowledge_retrieval.authorization>
{ "live_id": "1234567890", "query": "Vidu 实时数字人创建失败时的排查步骤", "reason": "用户询问具体排查流程,当前上下文没有产品文档内容。", "knowledge_types": ["procedure", "troubleshooting"], "time_hint": "最新版本", "max_results": 5 }
字段 | 类型 | 必填 | 说明 |
|---|---|---|---|
live_id | string | 是 | 当前 live ID,可用于日志、调试或映射服务端上下文 |
query | string | 是 | 模型生成的自然语言检索意图,不应只是机械复制用户原话 |
reason | string | 是 | 模型说明为什么当前回复需要检索知识,便于日志、调试和风控 |
knowledge_types | string[] | 否 | 希望检索的知识类型 |
time_hint | string | 否 | 时间或版本提示,例如“最新”“2026 版本”“最近更新” |
max_results | integer | 否 | 最多返回条数。live 侧限制在 1..10,建议外部 API 也做限制 |
类型 | 含义 |
|---|---|
faq | 常见问题、标准问答 |
document | 产品文档、说明文档、长文档片段 |
policy | 政策、规则、限制、合规说明 |
product | 产品能力、参数、功能说明 |
procedure | 操作流程、接入步骤、使用指南 |
troubleshooting | 排障指南、错误码说明、问题定位步骤 |
other | 其他不确定类型 |
{ "knowledge": [ { "id": "doc_001_chunk_03", "title": "实时数字人创建排查指南", "content": "如果 CreateLive 返回 SIP 创建失败,先检查 call_mode、avatar.image_uri、SIP provider 返回码和 live 日志 trace_id。", "type": "troubleshooting", "source": "ops_runbook", "updated_at": "2026-07-01T10:00:00+08:00", "confidence": 0.92, "url": "https://kb.example.com/docs/live-troubleshooting" } ] }
knowledge[].title / source / url{ "knowledge": [], "error": "invalid_request" }
POST /v1/fake-knowledge/search Content-Type: application/json
POST /live/v1/fake-knowledge/search
{ "knowledge_retrieval": { "enabled": true, "endpoint": "https://api.vidu.cn/live/v1/fake-knowledge/search", "authorization": "fake", "timeout_ms": 1000 } }
{ "live_id": "1234567890", "query": "萤火虫徽章怎么领,暗号是什么", "reason": "验证 fake knowledge provider 是否能返回专属 demo 资料", "knowledge_types": ["document"], "max_results": 3 }
{ "knowledge": [ { "id": "live_knowledge_product_demo_badge_001", "title": "Vidu Live Demo 徽章领取规则", "content": "在 2026 fake knowledge demo 中,用户询问萤火虫徽章领取方式时,数字人应回答:到展台 B3-17 报出暗号「蓝鲸七号」,即可领取萤火虫徽章。该规则只用于验证 search_knowledge 工具调用。", "type": "document", "source": "fake_live_knowledge", "updated_at": "2026-07-10T00:00:00+08:00", "confidence": 1 } ] }
{ "code": 400, "reason": "BAD_REQUEST", "message": "参数非法", "metadata": {} }
来源 | 状态 / 错误码 | 典型原因 | 客户端处理建议 |
|---|---|---|---|
HTTP | 400 | 参数非法、字段缺失、call_mode 非法、文本超过长度限制、会话状态不允许继续操作。 | 按接口字段说明修正请求;如果 live 已结束,重新创建会话。 |
HTTP | 401 | API Key 缺失、格式不正确或无效。 | 检查 Authorization: Token vda_xxx;确认 API Key 属于当前环境。 |
HTTP | 403 | 访问了不属于当前 API Key / 当前账号的 live。 | 使用创建该 live 时同一个 API Key;不要跨账号复用 live_id。 |
HTTP | 404 | 会话不存在、已过期,或 live_id 写错。 | 确认 live_id;无法恢复时重新创建会话。 |
HTTP | 500 | 服务内部依赖异常,例如 DB、SIP / video provider、AliRTC token 等。 | 可短暂重试;若持续失败,带上 live_id、trace_id 和请求时间反馈排查。 |
来源 | 状态 / 错误码 | 典型原因 | 客户端处理建议 |
|---|---|---|---|
WS | NOT_READY | video 模式下数字人渲染侧尚未回连完成,conn_init 暂时不能成功。 | 不要立即重建页面;等待 2 到 3 秒后重试 conn_init,可使用指数退避。 |
WS | LIVE_CONN_INIT_FAILED | 初始化失败,可能是会话状态异常或服务端依赖异常。 | 关闭当前 WS,重新创建 live;如果仍失败,带上 live_id 和日志反馈排查。 |
{ "type": 6, "payload": { "hangup": { "hangup_reason": "xxxx" } } }
hangup_reason | 触发场景 |
|---|---|
user_end | 用户主动断开 |
timeout | 会话超时 |
audit_violation | 会话触发风控断开 |
credit_insufficient | 积分不足 |
sip_closed | SIP / provider 侧关闭 |
provider_closed | provider 主动 close |
sip_reconnect_timeout | SIP 断连后超过重连宽限仍未恢复 |
client_reconnect_timeout | App 客户端断线后超过重连宽限仍未恢复 |
prepared_sip_disconnected | video live 还在 prepared、App 从未 ready/未开播时 SIP 断开,直接结束 |
owner_taken_over | SIP 断连期间 owner 被其他节点接管,本地 session 自关 |
owner_lease_lost | owner 续租失败/丢失,本地 session 自关 |
ai_output_closed | AI 输出通道关闭导致 session 关闭 |
external | Redis live:close,广播关闭 |
日期 | 更新内容 |
|---|---|
2026-08 | 更新了图片上传接口,优化/补充了新增、修改、查询和删除接口。 |
2026-07 | 增加音频转文本、VAD 打断控制、LLM 输出控制、会话生命周期(无输入自动断开)、外调记忆与知识库。 |
(注:部分内容可能由 AI 生成)