@xmov/avatar 2.0.0-beta.10 → 2.0.0-beta.12
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +200 -90
- package/dist/baseRender/AvatarRenderer.d.ts +0 -1
- package/dist/control/RenderScheduler.d.ts +7 -0
- package/dist/index.cjs +1 -1
- package/dist/index.cjs.map +1 -1
- package/dist/index.modern.js +1 -1
- package/dist/index.modern.js.map +1 -1
- package/dist/index.module.js +1 -1
- package/dist/index.module.js.map +1 -1
- package/dist/index.umd.js +1 -1
- package/dist/index.umd.js.map +1 -1
- package/dist/modules/ResourceManager.d.ts +2 -1
- package/package.json +4 -2
- package/src/baseRender/AudioRenderer.ts +16 -5
- package/src/baseRender/AvatarRenderer.ts +11 -20
- package/src/baseRender/MSEAudioPlayer.ts +18 -7
- package/src/control/RenderScheduler.ts +35 -5
- package/src/index.ts +26 -7
- package/src/modules/ResourceManager.ts +19 -6
- package/src/modules/decoder.ts +34 -1
- package/src/view/DebugOverlay.ts +9 -4
package/README.md
CHANGED
|
@@ -1,139 +1,249 @@
|
|
|
1
1
|
# 有灵离线数字人 JS-SDK
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
基于 Web 技术的 3D 虚拟人渲染和交互 SDK,支持离线渲染、低延迟交互、多端适配。
|
|
4
4
|
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
- 根目录和 `app/`目录安装 packages:
|
|
5
|
+
## 安装
|
|
8
6
|
|
|
9
7
|
```bash
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
```
|
|
8
|
+
# npm 官方源
|
|
9
|
+
npm install @xmov/avatar
|
|
13
10
|
|
|
14
|
-
|
|
11
|
+
# 或内网源
|
|
12
|
+
npm install @xmov/avatar --registry=https://npm.xmov.ai
|
|
13
|
+
```
|
|
15
14
|
|
|
16
|
-
|
|
17
|
-
|
|
15
|
+
## 快速开始
|
|
16
|
+
|
|
17
|
+
```typescript
|
|
18
|
+
import XmovAvatar from '@xmov/avatar';
|
|
19
|
+
|
|
20
|
+
const avatar = new XmovAvatar({
|
|
21
|
+
containerId: '#container',
|
|
22
|
+
appId: 'your-app-id',
|
|
23
|
+
appSecret: 'your-app-secret',
|
|
24
|
+
gatewayServer: 'http://your-gateway-server',
|
|
25
|
+
enableClientInterrupt: false,
|
|
26
|
+
enableDebugger: false,
|
|
27
|
+
hardwareAcceleration: 'default',
|
|
28
|
+
onMessage: (error) => console.error('错误:', error),
|
|
29
|
+
onStatusChange: (status) => console.log('状态变化:', status),
|
|
30
|
+
});
|
|
31
|
+
|
|
32
|
+
// 初始化
|
|
33
|
+
await avatar.init({
|
|
34
|
+
onDownloadProgress: (progress) => console.log('下载进度:', progress),
|
|
35
|
+
initModel: 'normal', // 或 'invisible' 进入隐身模式
|
|
36
|
+
});
|
|
37
|
+
|
|
38
|
+
// 播放文本(SSML)
|
|
39
|
+
avatar.speak('<speak>你好,世界!</speak>', true, true, {
|
|
40
|
+
client_speak_id: 'unique-id'
|
|
41
|
+
});
|
|
42
|
+
|
|
43
|
+
// 状态切换
|
|
44
|
+
avatar.idle(); // 空闲状态
|
|
45
|
+
avatar.listen(); // 监听状态
|
|
46
|
+
avatar.think(); // 思考状态
|
|
47
|
+
avatar.interactiveidle(); // 交互空闲状态
|
|
48
|
+
|
|
49
|
+
// 打断当前操作
|
|
50
|
+
avatar.interrupt('speak');
|
|
51
|
+
|
|
52
|
+
// 销毁 SDK
|
|
53
|
+
await avatar.destroy('user');
|
|
18
54
|
```
|
|
19
55
|
|
|
20
|
-
|
|
56
|
+
## 核心 API
|
|
57
|
+
|
|
58
|
+
| 方法 | 说明 |
|
|
59
|
+
| -------------------------------------- | ------------ |
|
|
60
|
+
| `init(params)` | 初始化 SDK,加载资源 |
|
|
61
|
+
| `speak(ssml, is_start, is_end, extra)` | 播放文本(SSML) |
|
|
62
|
+
| `idle()` | 切换到空闲状态 |
|
|
63
|
+
| `listen()` | 切换到监听状态 |
|
|
64
|
+
| `think()` | 切换到思考状态 |
|
|
65
|
+
| `interactiveidle()` | 切换到交互空闲状态 |
|
|
66
|
+
| `interrupt(type)` | 打断当前操作 |
|
|
67
|
+
| `destroy(reason)` | 销毁 SDK |
|
|
68
|
+
| `getStatus()` | 获取当前状态 |
|
|
69
|
+
| `setVolume(volume)` | 设置音量(0-1) |
|
|
70
|
+
| `changeAvatarVisible(visible)` | 改变数字人显隐 |
|
|
71
|
+
| `changeLayout(layout)` | 改变布局 |
|
|
72
|
+
| `switchInvisibleMode()` | 切换隐身模式 |
|
|
73
|
+
| `showDebugInfo()` | 显示调试浮层 |
|
|
74
|
+
| `hideDebugInfo()` | 隐藏调试浮层 |
|
|
75
|
+
| `getSessionId()` | 获取会话id |
|
|
76
|
+
|
|
77
|
+
## 配置项
|
|
78
|
+
|
|
79
|
+
```typescript
|
|
80
|
+
const avatar = new XmovAvatar({
|
|
81
|
+
// 基础配置
|
|
82
|
+
containerId: '#container', // 容器元素选择器
|
|
83
|
+
appId: 'your-app-id', // 应用 ID
|
|
84
|
+
appSecret: 'your-app-secret', // 应用密钥
|
|
85
|
+
gatewayServer: 'http://...', // 网关地址
|
|
86
|
+
|
|
87
|
+
// 渲染配置
|
|
88
|
+
hardwareAcceleration: 'default', // 硬件加速:'default'
|
|
89
|
+
audioOnlyMode: false, // 音频+事件模式(无渲染)
|
|
90
|
+
// 功能开关
|
|
91
|
+
enableClientInterrupt: false, // 客户端打断
|
|
92
|
+
|
|
93
|
+
// 自定义请求头
|
|
94
|
+
headers: {},
|
|
95
|
+
|
|
96
|
+
// 回调事件(见下方详细说明)
|
|
97
|
+
onMessage: (error) => {},
|
|
98
|
+
onStatusChange: (status) => {},
|
|
99
|
+
// ...
|
|
100
|
+
});
|
|
101
|
+
```
|
|
21
102
|
|
|
22
|
-
|
|
23
|
-
|
|
103
|
+
## 回调事件
|
|
104
|
+
|
|
105
|
+
| 回调 | 说明 |
|
|
106
|
+
| ----------------------------------------------- | ------------------------------------------------------------- |
|
|
107
|
+
| `onMessage(error)` | 错误消息回调 |
|
|
108
|
+
| `onStatusChange(status)` | 状态变化:`online` / `offline` / `close` / `visible` / `invisible` |
|
|
109
|
+
| `onRenderChange(state)` | 渲染状态:`init` / `rendering` / `paused` / `resumed` / `stopped` |
|
|
110
|
+
| `onVoiceStateChange(state, duration, speak_id)` | 语音状态变化 |
|
|
111
|
+
| `onSpeakStateChange(state, speak_id)` | 播报状态变化 |
|
|
112
|
+
| `onWalkStateChange(state)` | 行走状态变化 |
|
|
113
|
+
| `onWidgetEvent(data)` | Widget 事件回调 |
|
|
114
|
+
| `onNetworkInfo(info)` | 网络信息回调(rtt、downlink、networkStatus) |
|
|
115
|
+
| `onDownloadProgress(progress)` | 下载进度回调(0-100) |
|
|
116
|
+
| `onFPSUpdate(stats)` | FPS 统计信息回调 |
|
|
117
|
+
| `onStateChange(state)` | 通用状态变化回调 |
|
|
118
|
+
| `onStateRenderChange(state, duration)` | 渲染状态变化回调 |
|
|
119
|
+
| `proxyWidget` | 自定义 Widget 代理 |
|
|
120
|
+
|
|
121
|
+
## Agent SDK
|
|
122
|
+
|
|
123
|
+
Agent SDK 从 `@xmov/avatar/agent` 导入,在数字人渲染和 TTSA 能力上增加文本对话、麦克风 ASR、打断、状态 callbacks 和断线恢复。
|
|
124
|
+
|
|
125
|
+
```typescript
|
|
126
|
+
import XingyunAvatarAgent from '@xmov/avatar/agent';
|
|
24
127
|
```
|
|
25
128
|
|
|
26
|
-
|
|
129
|
+
- [快速接入](./docs/agent/developer-guide/quick-start.md)
|
|
130
|
+
- [API 参考](./docs/agent/developer-guide/api-reference.md)
|
|
131
|
+
- [高级功能](./docs/agent/developer-guide/advanced-features.md)
|
|
132
|
+
- [常见问题](./docs/agent/developer-guide/faq.md)
|
|
133
|
+
- [开发维护文档索引](./docs/agent/README.md)
|
|
27
134
|
|
|
28
|
-
##
|
|
135
|
+
## 开发
|
|
29
136
|
|
|
30
|
-
|
|
137
|
+
### 环境要求
|
|
31
138
|
|
|
32
|
-
|
|
139
|
+
- Node.js v16+
|
|
140
|
+
- pnpm 包管理器
|
|
33
141
|
|
|
34
|
-
|
|
35
|
-
|---------|---------|------|
|
|
36
|
-
| **MAJOR** | 破坏性 API 变更 | 1.2.3 → 2.0.0 |
|
|
37
|
-
| **MINOR** | 新功能(向后兼容) | 1.2.3 → 1.3.0 |
|
|
38
|
-
| **PATCH** | Bug 修复(向后兼容) | 1.2.3 → 1.2.4 |
|
|
142
|
+
### 启动开发
|
|
39
143
|
|
|
40
|
-
|
|
144
|
+
```bash
|
|
145
|
+
# 安装依赖
|
|
146
|
+
pnpm install
|
|
147
|
+
cd app/ && pnpm install
|
|
41
148
|
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
```
|
|
149
|
+
# 同时监听根 SDK 和 Agent SDK
|
|
150
|
+
pnpm sdk
|
|
45
151
|
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
| `master` | @latest | `0.1.0` |
|
|
49
|
-
| `release` | @beta | `0.1.0-beta.0` |
|
|
50
|
-
| `develop` | @alpha | `0.1.0-alpha.0` |
|
|
152
|
+
# 启动 Demo 应用
|
|
153
|
+
pnpm app
|
|
51
154
|
|
|
52
|
-
|
|
155
|
+
# 浏览器访问 http://localhost:5173
|
|
156
|
+
```
|
|
53
157
|
|
|
54
|
-
|
|
158
|
+
`pnpm sdk` 会并行运行 `sdk:core` 和 `sdk:agent`。只需监听其中一个入口时,可以单独运行 `pnpm sdk:core` 或 `pnpm sdk:agent`。
|
|
55
159
|
|
|
56
|
-
|
|
57
|
-
# 新功能 - 次版本递增
|
|
58
|
-
git commit -m "feat(audio): 新增 MSE 音频播放器"
|
|
160
|
+
### 构建
|
|
59
161
|
|
|
60
|
-
|
|
61
|
-
|
|
162
|
+
```bash
|
|
163
|
+
# 生产构建
|
|
164
|
+
pnpm run build
|
|
62
165
|
|
|
63
|
-
#
|
|
64
|
-
|
|
166
|
+
# Lite 版本
|
|
167
|
+
pnpm run lite
|
|
65
168
|
|
|
66
|
-
|
|
169
|
+
# 生成 Protobuf 文件
|
|
170
|
+
pnpm run proto
|
|
67
171
|
```
|
|
68
172
|
|
|
69
|
-
###
|
|
173
|
+
### 构建 Demo 应用
|
|
70
174
|
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
2. 计算新版本号
|
|
74
|
-
3. 更新 CHANGELOG
|
|
75
|
-
4. 构建 SDK
|
|
76
|
-
5. 发布到 npm
|
|
77
|
-
6. 创建 Git Tag
|
|
175
|
+
```bash
|
|
176
|
+
cd app/
|
|
78
177
|
|
|
79
|
-
|
|
178
|
+
# 开发环境
|
|
179
|
+
pnpm run build:dev
|
|
80
180
|
|
|
81
|
-
|
|
181
|
+
# 测试环境
|
|
182
|
+
pnpm run build:test
|
|
82
183
|
|
|
83
|
-
|
|
184
|
+
# 预发布环境
|
|
185
|
+
pnpm run build:pre
|
|
84
186
|
|
|
85
|
-
|
|
187
|
+
# 生产环境
|
|
188
|
+
pnpm run build
|
|
189
|
+
```
|
|
86
190
|
|
|
87
|
-
|
|
191
|
+
### Electron 应用
|
|
88
192
|
|
|
89
|
-
|
|
193
|
+
```bash
|
|
194
|
+
cd app/
|
|
195
|
+
pnpm run dev:electron # 开发模式
|
|
196
|
+
pnpm run build-electron # 构建桌面应用
|
|
197
|
+
```
|
|
90
198
|
|
|
91
|
-
|
|
199
|
+
## 版本管理
|
|
92
200
|
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
- [常见问题](./docs/agent/developer-guide/faq.md)
|
|
97
|
-
- [开发维护文档索引](./docs/agent/README.md)
|
|
201
|
+
采用 **语义化版本(SemVer)** + **自动化发布** 体系。
|
|
202
|
+
|
|
203
|
+
### 分支与发布
|
|
98
204
|
|
|
99
|
-
|
|
205
|
+
```
|
|
206
|
+
feature/* → develop (alpha) → release (beta) → master (latest)
|
|
207
|
+
```
|
|
208
|
+
|
|
209
|
+
| 分支 | npm tag | 版本格式 |
|
|
210
|
+
| --------- | --------- | --------------- |
|
|
211
|
+
| `master` | `@latest` | `2.0.0` |
|
|
212
|
+
| `release` | `@beta` | `2.0.0-beta.0` |
|
|
213
|
+
| `develop` | `@alpha` | `2.0.0-alpha.0` |
|
|
100
214
|
|
|
101
|
-
###
|
|
215
|
+
### 提交规范
|
|
216
|
+
|
|
217
|
+
遵循 **约定式提交(Conventional Commits)**:
|
|
102
218
|
|
|
103
219
|
```bash
|
|
104
|
-
|
|
105
|
-
#
|
|
106
|
-
#
|
|
107
|
-
|
|
220
|
+
feat(audio): 新增 MSE 音频播放器 # 次版本递增
|
|
221
|
+
fix(decoder): 修复视频解码超时问题 # 修订号递增
|
|
222
|
+
refactor(api): 重构初始化接口 # 修订号递增
|
|
223
|
+
BREAKING CHANGE: init() 参数结构调整 # 主版本递增
|
|
224
|
+
```
|
|
108
225
|
|
|
109
|
-
|
|
110
|
-
npm publish --tag latest # 正式版
|
|
111
|
-
npm publish --tag beta # Beta 测试版
|
|
112
|
-
npm publish --tag alpha # Alpha 测试版
|
|
226
|
+
### 自动化发布
|
|
113
227
|
|
|
114
|
-
|
|
115
|
-
# 6. 更新 oss sdk 静态包(xmovAvatar index.umd)
|
|
116
|
-
npm run lite
|
|
228
|
+
代码推送到对应分支后,GitLab CI 自动执行:
|
|
117
229
|
|
|
118
|
-
|
|
119
|
-
|
|
230
|
+
1. semantic-release 计算新版本号
|
|
231
|
+
2. 更新 CHANGELOG
|
|
232
|
+
3. 构建 SDK
|
|
233
|
+
4. 发布到 npm 官方源 + 内网源(双发)
|
|
234
|
+
5. 创建 Git Tag
|
|
120
235
|
|
|
121
|
-
|
|
236
|
+
## 更新日志
|
|
122
237
|
|
|
123
|
-
|
|
124
|
-
# 1. 从 develop 创建功能分支
|
|
125
|
-
git checkout develop
|
|
126
|
-
git checkout -b feature/xxx
|
|
238
|
+
详见 [CHANGELOG](./CHANGELOG.md)
|
|
127
239
|
|
|
128
|
-
|
|
129
|
-
git add .
|
|
130
|
-
git commit -m "feat(module): 新功能描述"
|
|
240
|
+
## SDK 文档
|
|
131
241
|
|
|
132
|
-
|
|
133
|
-
|
|
242
|
+
- [有灵Lite\&Pro 数字人驱动 SDK 使用说明](https://rsjqcmnt5p.feishu.cn/wiki/BXOqwE0PtiduRxk79R9crAtwnRh)
|
|
243
|
+
- [test 发布记录](https://rsjqcmnt5p.feishu.cn/docx/IvQZdW3IIo7pF6xFvcCcGfG2nxd)
|
|
244
|
+
- [pre 发布记录](https://rsjqcmnt5p.feishu.cn/docx/IthldRw5ioE7eAxUNeycauYpnuf)
|
|
245
|
+
- [版本管理规范](./docs/VERSION_MANAGEMENT.md)
|
|
134
246
|
|
|
135
|
-
|
|
136
|
-
```
|
|
247
|
+
## License
|
|
137
248
|
|
|
138
|
-
|
|
139
|
-
[pre发布记录](https://rsjqcmnt5p.feishu.cn/docx/IthldRw5ioE7eAxUNeycauYpnuf)
|
|
249
|
+
ISC
|
|
@@ -122,6 +122,13 @@ export default class RenderScheduler {
|
|
|
122
122
|
_offlineRun(): void;
|
|
123
123
|
ttsaStateChangeHandle(state: StateChangeInfo): void;
|
|
124
124
|
resume(): void;
|
|
125
|
+
/**
|
|
126
|
+
* app 切后台时暂停音频并清空对齐状态(复用断网离线时的 pause())
|
|
127
|
+
* 不能保留缓存续播:Android 后台视频帧号持续递增而音频停留在暂停位置,
|
|
128
|
+
* 恢复后音画基准脱节;且后台期间可能下发新 speak 数据,旧缓存与新 sf 冲突。
|
|
129
|
+
* 恢复后依赖新下发音频的 sf 作为 firstFrameIndex 重新对齐
|
|
130
|
+
*/
|
|
131
|
+
pauseForBackground(): void;
|
|
125
132
|
/**
|
|
126
133
|
* 设置数字人canvas的显隐状态
|
|
127
134
|
* @param visible 是否可见
|