从零接入数字角色 API

本指南覆盖从注册账号到角色上线的完整流程。两种接入方式,按你的技术栈选择最合适的。所有代码示例均可直接复制运行。

前置准备

接入前你需要完成三件事:注册开发者账号、创建 API Key、选择角色。

1

注册开发者账号

访问 注册页面,支持「普通用户」与「创作者」两种类型。普通用户即可调用 API,创作者额外可上传数字人资产。

2

创建 API Key

登录后进入 控制台 → 密钥管理,点击「创建新密钥」。系统会生成以 hw-chr- 开头的密钥,仅显示一次,请立即保存。

⚠ 安全提示 API Key 等同于你的账户凭证。切勿提交到 Git 仓库或暴露在前端代码中。生产环境必须通过后端代理调用。
3

选择角色

在 角色库 浏览可用角色,记录角色 ID(角色库每张卡上显示的那串 ID)。已上线角色可直接使用,即将上线角色需等待版本发布。

当前可用角色 以 角色库 当前展示为准,上传或上架后即时生效。

5 分钟快速开始

最快的方式:用 cURL 发一次对话请求,看到角色回复就算接入成功。

cURL
JavaScript
Python
# 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)
# 输出:嗨~我是你的数字角色,很高兴认识你!
✓ 成功标志 收到角色以第一人称、简短中文回复(不超过 40 字),即代表对话链路打通。接下来选择接入方式。

方式一:Web SDK

npm 包或 CDN 引入,5 行 JS 完成初始化。本地渲染角色,可挂载事件、自定义交互。适合 App、网站主功能。

1. 引入 SDK

<script> 标签
ES Module
npm(即将发布)
<!-- 直接引入 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

2. 初始化并加载角色

// 用嵌入 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");

3. 事件监听

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));
✓ 适用场景 Web 应用主功能、SaaS 后台、教育/陪伴类产品。需要自定义角色位置、交互逻辑、UI 集成的场景。

方式二:REST API

自己渲染角色,调 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"
    }
  ]
}

管理 API Key

# 创建密钥
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 的区别 session-token:登录后获取,用于管理操作(创建/删除 Key、管理 Token)
hw-chr-xxx (API Key):用于业务调用(对话、TTS),可暴露在后端
embed_xxx:嵌入 Token,绑定角色+域名,可暴露在前端

鉴权说明

平台使用三种凭证,对应不同场景,确保密钥安全。

类型格式获取方式可暴露前端
会话 Token随机 hex登录接口❌(仅 HttpOnly Cookie)
API Keyhw-chr-xxx控制台创建❌(必须后端)
嵌入 Tokenembed_xxx控制台创建✅(绑定域名)
⚠ 生产环境必读 永远不要把 hw-chr-xxx 写在前端代码里。正确做法:前端请求你的后端 → 你的后端用 API Key 调用幻维 API → 返回结果给前端。参考 获取 API 页的接入示例。

流式响应

对话接口使用 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
✓ TTS + 口型同步 流式接收完成后,把整段文本 POST 给 /api/tts(服务端对接豆包 TTS,Key 不下发前端),拿到 audio/mpeg 直接播放即可。口型可用文本字符节奏驱动(第三方 TTS 不返回音素边界,无法像浏览器 speechSynthesis 那样拿 onboundary;如需精细口型可让上游开启字级时间戳)。

错误码

所有错误响应为 JSON 格式 { "error": "错误描述" },HTTP 状态码如下:

状态码含义处理方式
400请求参数错误检查 message 字段是否存在、长度 ≤ 500
401未登录或 Token 失效重新登录获取新 session
403权限不足或账号被封禁联系管理员解封
404资源不存在检查角色 ID / Key ID 是否正确
413请求体过大消息控制在 500 字以内
503LLM 未配置或不可用检查后端 DEEPSEEK_API_KEY 环境变量
错误处理示例 建议在网络错误或 503 时降级到本地兜底回复,保证用户体验不中断。

频率与额度

平台对每个账号设置调用频率与额度限制,确保资源公平使用。

限制项免费版付费版管理员
月度积分300 积分900 / 2,000 / 6,000 积分不限
积分换算语音 1 秒 = 1 积分 · 对话 1 次 = 1 积分 · 视频导出 1 条 = 100 积分
视频单条时长≤ 1 分钟
单次消息长度≤ 500 字
频率限制30 次/分钟(可配置)
文件上传—单文件 ≤ 100MB
查询当前用量 登录后调用 GET /api/auth/me 可查看 credits 和 creditsUsed 字段,实时掌握积分消耗。

常见问题

API Key 暴露了怎么办?

立即在 控制台 删除该 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.02026-09内测版:角色库、对话 API、TTS 播报、控制台、创作者上传
v1.0.02026-11公测:积分制计费、套餐与超量计费、Web SDK 正式发布、TTS 流式接口、多角色切换

准备好接入了?

注册即送 300 积分,约等于 300 秒语音或 3 条视频导出,免费跑通完整流程。