本指南覆盖从注册账号到角色上线的完整流程。两种接入方式,按你的技术栈选择最合适的。所有代码示例均可直接复制运行。
接入前你需要完成三件事:注册开发者账号、创建 API Key、选择角色。
访问 注册页面,支持「普通用户」与「创作者」两种类型。普通用户即可调用 API,创作者额外可上传数字人资产。
登录后进入 控制台 → 密钥管理,点击「创建新密钥」。系统会生成以 hw-chr- 开头的密钥,仅显示一次,请立即保存。
最快的方式:用 cURL 发一次对话请求,看到角色回复就算接入成功。
# 1. 创建会话(用你的 API Key 替换 hw-chr-xxx) curl -X POST https://api.hwavatar.com/api/chat \ -H "Authorization: Bearer hw-chr-xxx" \ -H "Content-Type: application/json" \ -d '{"message":"你好,你叫什么名字?"}' # 预期响应(纯文本流式): # 嗨~我是你的数字角色,很高兴认识你!
// 浏览器端(需通过后端代理,避免暴露 Key) const res = await fetch("/api/chat", { method: "POST", headers: { "Content-Type": "application/json", "Authorization": "Bearer " + TOKEN // 从你的后端获取 }, body: JSON.stringify({ message: "你好" }) }); // 流式读取 const reader = res.body.getReader(); const decoder = new TextDecoder(); let text = ""; while (true) { const { done, value } = await reader.read(); if (done) break; text += decoder.decode(value, { stream: true }); console.log(text); // 实时输出 }
import requests API_BASE = "https://api.hwavatar.com" API_KEY = "hw-chr-xxx" # 替换为你的密钥 # 流式读取对话 response = requests.post( f"{API_BASE}/api/chat", headers={ "Authorization": f"Bearer {API_KEY}", "Content-Type": "application/json" }, json={"message": "你好,你叫什么名字?"}, stream=True ) for line in response.iter_content(chunk_size=1, decode_unicode=True): print(line, end="", flush=True) # 输出:嗨~我是你的数字角色,很高兴认识你!
npm 包或 CDN 引入,5 行 JS 完成初始化。本地渲染角色,可挂载事件、自定义交互。适合 App、网站主功能。
<!-- 直接引入 SDK 文件,全局暴露 DigitalPetSDK --> <script src="https://hwavatar.com/assets/js/digitalpet-sdk.js"></script>
// 作为 ES Module 引入(Vite/Webpack 项目推荐) import { DigitalPetSDK } from "./digitalpet-sdk.js";
⚠ npm 包 @digitalpet/web-sdk 尚未发布(计划 v1.0.0,2026.11)。 当前请用上方 <script> 或 ES Module 方式引入。 发布后可用:npm install @digitalpet/web-sdk
// 用嵌入 Token 初始化(不暴露 API Key) const pet = new DigitalPetSDK({ token: "embed_xxx", // 在控制台生成的嵌入 Token endpoint: "https://api.hwavatar.com" // 平台地址 }); // 加载角色到指定容器 await pet.loadCharacter("char_xxx", { container: document.getElementById("pet-container"), width: 320, height: 480 }); // 让角色直接说话(豆包 TTS 自动播报) pet.speak("你好,很高兴认识你!"); // 对话并说话(调 /api/chat 流式拿回复 → 自动 TTS) await pet.chatAndSpeak("你今天心情怎么样?"); // 开启会话(多次对话复用,自动维护历史) const session = await pet.startSession(); session.on("reply", (text) => console.log("角色回复:", text)); await session.send("讲个笑话吧"); // 停止当前语音 pet.stop(); // 静态方法:列出可用角色 const chars = await DigitalPetSDK.listCharacters("https://api.hwavatar.com");
pet.on("ready", () => console.log("角色加载完成")); pet.on("speaking", (data) => console.log("流式中:", data.partial)); pet.on("reply", (text) => console.log("完整回复:", text)); pet.on("idle", () => console.log("说话结束")); pet.on("error", (err) => console.error("错误:", err));
自己渲染角色,调 API 拿对话、TTS、口型数据。最灵活,适合自研数字人、直播、游戏 NPC。
POST /api/chat Authorization: Bearer hw-chr-xxx Content-Type: application/json { "message": "你今天心情怎么样?" } # 响应:text/plain 流式(逐字下发) # Transfer-Encoding: chunked # Content-Type: text/plain; charset=utf-8 # # 今天心情超级好呀~因为见到了你!
GET /api/characters # 响应: { "characters": [ { "id": "char_xxx", "name": "示例角色", "desc": "角色简介…", "type": "2D", "price": 29.9, "status": "live" } ] }
# 创建密钥 POST /api/keys Authorization: Bearer <session-token> # 响应(完整 Key 仅显示一次): { "ok": true, "key": "hw-chr-9xK2mQ7vB3nR8sT1wY4zA6cD5eF0gH2j" } # 列出密钥 GET /api/keys Authorization: Bearer <session-token> # 删除密钥 DELETE /api/keys/key_xxx Authorization: Bearer <session-token>
平台使用三种凭证,对应不同场景,确保密钥安全。
| 类型 | 格式 | 获取方式 | 可暴露前端 |
|---|---|---|---|
| 会话 Token | 随机 hex | 登录接口 | ❌(仅 HttpOnly Cookie) |
| API Key | hw-chr-xxx | 控制台创建 | ❌(必须后端) |
| 嵌入 Token | embed_xxx | 控制台创建 | ✅(绑定域名) |
对话接口使用 HTTP chunked transfer 逐字下发,无需 WebSocket,兼容性更好。
Content-Type: text/plain; charset=utf-8 Cache-Control: no-cache X-Accel-Buffering: no Transfer-Encoding: chunked
// JavaScript 流式读取 const res = await fetch("/api/chat", { /* ... */ }); const reader = res.body.getReader(); const decoder = new TextDecoder(); let fullText = ""; while (true) { const { done, value } = await reader.read(); if (done) break; const chunk = decoder.decode(value, { stream: true }); fullText += chunk; updateBubble(fullText); // 实时更新气泡 } speak(fullText); // 流结束后触发 TTS
所有错误响应为 JSON 格式 { "error": "错误描述" },HTTP 状态码如下:
| 状态码 | 含义 | 处理方式 |
|---|---|---|
| 400 | 请求参数错误 | 检查 message 字段是否存在、长度 ≤ 500 |
| 401 | 未登录或 Token 失效 | 重新登录获取新 session |
| 403 | 权限不足或账号被封禁 | 联系管理员解封 |
| 404 | 资源不存在 | 检查角色 ID / Key ID 是否正确 |
| 413 | 请求体过大 | 消息控制在 500 字以内 |
| 503 | LLM 未配置或不可用 | 检查后端 DEEPSEEK_API_KEY 环境变量 |
平台对每个账号设置调用频率与额度限制,确保资源公平使用。
| 限制项 | 免费版 | 付费版 | 管理员 |
|---|---|---|---|
| 月度积分 | 300 积分 | 900 / 2,000 / 6,000 积分 | 不限 |
| 积分换算 | 语音 1 秒 = 1 积分 · 对话 1 次 = 1 积分 · 视频导出 1 条 = 100 积分 | ||
| 视频单条时长 | ≤ 1 分钟 | ||
| 单次消息长度 | ≤ 500 字 | ||
| 频率限制 | 30 次/分钟(可配置) | ||
| 文件上传 | — | 单文件 ≤ 100MB | |
立即在 控制台 删除该 Key,创建新 Key 并更新你的后端配置。旧 Key 删除后立即失效。建议给每个环境(开发/生产)单独创建 Key,便于隔离与轮换。
语音由平台后端的豆包 TTS(火山引擎大模型语音合成)合成,前端只负责播放,与浏览器内置语音无关。若无声请依次检查:1) POST /api/tts 是否返回 200 与 audio/mpeg(返回 503 表示服务端未配置 TTS,401 表示未授权);2) 浏览器是否拦截了自动播放(首次需用户点击过页面);3) 是否触发了限流(429)。
可以。用 REST API 方式,你只调对话接口拿文本,自己用 Three.js / PixiJS / Live2D Cubism SDK 渲染角色。平台不限制渲染技术,只要能播放音频和驱动口型即可。
按积分计费,已随 V1.0 公测上线:语音 1 秒 = 1 积分,对话 1 次 = 1 积分,视频导出 1 条 = 100 积分,套餐内共用一个积分池,超出部分按量计费。内测期发放的额度在迁移时已按同等规则折算为积分,不会失效。
当前可上传 GLB / glTF 2.0(.glb / .gltf,单文件 ≤ 100MB,可附主图)。创作者可在 创作者中心 上传模型、主图与音频资产,审核通过后上架;Live2D Cubism 3/4 与 Spine 3.8+ 后续开放。
内测期间向内部合作伙伴开放模型上传(GLB / glTF 2.0,单文件 ≤ 100MB,可附主图)。请通过「企业定制」联系我们获取上传权限与审核流程。后续将开放更广的上传通道。
1) 设置 DEEPSEEK_API_KEY 与 VOLC_TTS_API_KEY 环境变量,不要硬编码;2) 启用 HTTPS(麦克风输入需要安全上下文);3) 配置 CORS_ORIGIN 限制跨域;4) 前端走后端代理调用 API,不暴露 Key。
| 版本 | 日期 | 主要变更 |
|---|---|---|
| v0.9.0 | 2026-09 | 内测版:角色库、对话 API、TTS 播报、控制台、创作者上传 |
| v1.0.0 | 2026-11 | 公测:积分制计费、套餐与超量计费、Web SDK 正式发布、TTS 流式接口、多角色切换 |
扫码加微信

定制需求 · 商务合作 · 使用问题
工作日 10:00 - 19:00 回复