qasset:// URI 反复引用同一真人形象,无需每次重新上传。本文是真人人像素材的完整教程。如果您要使用的是虚拟人像(AIGC)素材(无需刷脸、建组同步完成),请改读 七牛云虚拟人像素材使用指南。两类素材共用同一套素材/视频管线,仅在建组方式上不同。
pending → awaiting_auth → active/failedbyted_token 换取真人组,该凭证只能用一次,必须刷脸成功后才触发回查(详见一次性凭证硬约束)qasset://{qassetid} 在多个视频任务里反复引用建认证会话 ──awaiting_auth──▶ 刷脸 ──回查(resolve)──▶ active ──上传真人素材──▶ approved ──qasset:// 引用──▶ Seedance 视频生成我该用哪种素材? 一般创作场景用素人形象的,直接用七牛云虚拟人像素材使用指南即可,无需刷脸;只有涉及公众 IP(明星、知名人物等需要核验真人授权的真实形象)时,才需要使用真人人像素材。真人人像的活体认证(刷脸)正是为了核验"被使用的是经本人确认授权的真实形象"——素人形象用不到这层核验,走虚拟人像更省事。
qasset:// 视频引用的用法完全一致。两 者唯一的本质差异在建组:| 维度 | 虚拟人像(AIGC) | 真人人像(LivenessFace) |
|---|---|---|
| 建组方式 | POST /v1/asset-groups 后很快变 active | 异步 + 用户交互:建会话 → 刷脸 → 回查换组 |
| 建组中间态 | 无(pending → active) | 新增 awaiting_auth(等用户刷脸) |
callback_url | 忽略 | 必填(刷脸完成后的跳转地址) |
| 自动建组 | 支持(上传素材不传 group_id 时自动选/建默认组) | 不支持,上传素材必须显式传已 active 的真人组 group_id |
| 默认组 | 同一用户 (type, model) 首个组自动设默认 | 真人组不参与默认组,is_default 恒为 false |
| 上传 / 审核 / 视频引用 | —— | 与虚拟人完全一致 |
| 概念 | 说明 |
|---|---|
| Group(分组) | 素材的分组容器,绑定 model;真人组类型为 liveness_face |
| Asset(素材) | 单个真人人像,状态机 pending → reviewing → approved/failed |
| 活体认证 | 真人组建组时的刷脸环节,由用户在 H5 页面完成 |
| qgroupid | 用户可见的分组 ID,格式 qgroup-{uid}-{ts} |
| qassetid | 用户可见的素材 ID,格式 qasset-{uid}-{ts} |
callback_url | 客户自己的回调地址(不是七牛、不是供应商)。刷脸完成后浏览器跳转到此地址 |
h5_link | 活体认证 H5 页面链接,用户在此刷脸。⚠️ 有效期约 120 秒 |
byted_token | 一次性认证凭证。刷脸后用于触发认证回查,查询一次即失效 |
result_code | 刷脸结果码,来自跳转回 callback_url 时拼接的 resultCode 参数。10000=成功 |
awaiting_auth | 真人组专用中间态:会话已建、h5_link 已下发,等待用户刷脸并触发回查 |
| qasset:// | 在 Seedance 视频请求里嵌入素材的引用 URI,形如 qasset://qasset-uid001-1716100100000000000 |
https://api.qnaigc.com| 接口 | 方法 | 说明 |
|---|---|---|
| /v1/asset-groups | POST | 创建真人认证组(type=liveness_face,真人入口) |
| /v1/asset-groups/:qgroupid | GET | 查询单个分组详情,用于轮询拿 h5_link 与认证结果 |
| /v1/asset-groups/:qgroupid/visual-validate-result | POST | 真人专用:刷脸成功后触发认证回查(resolve) |
| /v1/asset-groups | GET | 分页查询当前用户的素材分组 |
| /v1/asset-groups/:qgroupid | PATCH | 修改分组的 name / description |
| /v1/assets | POST | 上传真人素材并提交审核 |
| /v1/assets/:qassetid | GET | 查询单个素材详情,用于轮询审核状态 |
| /v1/assets | GET | 分页查询当前用户的素材 |
| 模型 ID | 说明 | 状态 |
|---|---|---|
| bytedance/doubao-seedance-2-0-260128 | 字节跳动豆包 Seedance 2.0,支持真人人像视频生成 | ✅ 已上线 |
注意: qasset://引用仅在 Seedance 2.0 系列模型生效。Sora / Kling / Vidu / Veo 等其他视频模型不支持真人/虚拟人素材引用。
byted_token 展开:① 您 POST /v1/asset-groups {type:liveness_face, model, callback_url}
→ 平台返回 qgroupid,状态 pending
② 平台后台向供应商建认证会话,拿到 h5_link + byted_token
→ 组状态推进到 awaiting_auth
③ 您轮询 GET /v1/asset-groups/:qgroupid,状态变 awaiting_auth 后拿到 h5_link
→ 引导用户打开 h5_link 刷脸(⚠️ 链接约 120 秒有效,需尽快打开)
④ 用户刷脸完成 → 浏览器跳转回【您的 callback_url】,拼接 ?bytedToken=...&resultCode=10000&...
→ 您的服务器收到回调,确认 resultCode==10000(刷脸成功)
⑤ 您 POST /v1/asset-groups/:qgroupid/visual-validate-result {result_code:"10000"}
→ 平台凭一次性 byted_token 向供应商换取真人组(resolve),仅调一次
→ 组状态 awaiting_auth → active(成功)/ failed(失败)
之后:上传真人素材 → 审核 → 视频引用(与虚拟人一致)callback_url是您自己的服务器。七牛只把它透传给供应商;刷脸完成后浏览器 带着resultCode跳转到这里。您的服务收到后,由您主动调七牛visual-validate-result接口触发回查。
⚠️⚠️ 最关键的约束: visual-validate-result触发的认证回查使用一次性凭证——只能在刷脸成功(resultCode==10000)后调用,且最多调一次。刷脸前调用或反复调用都会烧掉凭证,导致该组无法恢复、只能重建。详见一次性凭证硬约束。
h5_link 刷脸(⚠️ 链接约 120 秒有效,拿到后请尽快打开)。callback_url,拼接 ?bytedToken=...&resultCode=10000&...。您的服务确认 resultCode==10000。POST /v1/asset-groups| 参数名 | 类型 | 必填 | 说明 |
|---|---|---|---|
| Authorization | string | 是 | API Key,格式:Bearer YOUR_API_KEY |
| Content-Type | string | 是 | 固定值:application/json |
| 参数名 | 类型 | 必填 | 默认值 | 说明 |
|---|---|---|---|---|
| type | string | 是 | - | 固定为 liveness_face(真人人像) |
| name | string | 是 | - | 分组展示名,1–64 字符 |
| model | string | 是 | - | 绑定的模型 ID,当前仅 bytedance/doubao-seedance-2-0-260128 |
| callback_url | string | 是 | - | 客户自定义回调地址,必须是合法 https URL(不能指向内网)。刷脸完成后浏览器跳转到此地址 |
| description | string | 否 | - | 分组描述,最长 300 字符 |
为什么 callback_url必填:供应商的认证会话强制要求回调地址,它是刷脸完成后浏览器跳转、您据resultCode触发回查的唯一信号。不传或填了非 https / 内网地址会在入口返回 400。
pending,平台随后在后台建认证会话,组状态会推进到 awaiting_auth。| 字段名 | 类型 | 说明 |
|---|---|---|
| qgroupid | string | 用户可见分组 ID,格式 qgroup-{uid}-{ts} |
| type | string | 固定 liveness_face |
| name | string | 展示名 |
| model | string | 绑定模型 |
| status | string | 初始为 pending,详见状态流转 |
| is_default | boolean | 真人组恒为 false |
| h5_link | string | 仅 status=awaiting_auth 时返回 |
| byted_token | string | 仅 status=awaiting_auth 时返回 |
| fail_reason | string | 仅 status=failed 时有值 |
| created_at | integer | Unix 时间戳(秒) |
| updated_at | integer | Unix 时间戳(秒) |
{
"qgroupid": "qgroup-uid001-1716100000000000000",
"type": "liveness_face",
"name": "代言人形象",
"description": "用于品牌视频的真人形象",
"model": "bytedance/doubao-seedance-2-0-260128",
"status": "pending",
"is_default": false,
"created_at": 1716100000,
"updated_at": 1716100000
}GET /v1/asset-groups/:qgroupidpending 变为 awaiting_auth,此时响应会带上 h5_link 与 byted_token。{
"qgroupid": "qgroup-uid001-1716100000000000000",
"type": "liveness_face",
"status": "awaiting_auth",
"h5_link": "https://h5-v2.kych5.com?accessKeyId=...&bytedToken=...&lng=zh",
"byted_token": "202603311449168C23BA26...",
"model": "bytedance/doubao-seedance-2-0-260128",
"created_at": 1716100000,
"updated_at": 1716100020
}h5_link 后,引导用户在浏览器/手机端打开链接完成刷脸。⚠️ 120 秒窗口: h5_link与byted_token有效期约 120 秒。建议前端拿到qgroupid后立即开始轮询(2–3 秒一次),第一时间抢到h5_link引导用户打开,避免窗口被链路延迟消耗。链接失效后只能重建组。
callback_url,并拼接查询参数:https://your-domain.com/liveness/callback?bytedToken=202603311449168C23BA26...&resultCode=10000&...resultCode==10000(刷脸成功),再调用本接口触发回查。POST /v1/asset-groups/:qgroupid/visual-validate-result| 参数名 | 类型 | 必填 | 说明 |
|---|---|---|---|
| result_code | string | 是 | 刷脸结果码,即 callback 拼接参数里的 resultCode。10000=成功 |
| byted_token | string | 否 | 认证凭证。留空则用平台已存储的;如传入必须与该组存储的一致,否则返回 400 |