@xmov/avatar 2.0.1 → 2.1.0

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 CHANGED
@@ -146,7 +146,7 @@ import XingyunAvatarAgent from '@xmov/avatar/agent';
146
146
  pnpm install
147
147
  cd app/ && pnpm install
148
148
 
149
- # 启动 SDK 实时编译(监听模式)
149
+ # 同时监听根 SDK 和 Agent SDK
150
150
  pnpm sdk
151
151
 
152
152
  # 启动 Demo 应用
@@ -155,6 +155,8 @@ pnpm app
155
155
  # 浏览器访问 http://localhost:5173
156
156
  ```
157
157
 
158
+ `pnpm sdk` 会并行运行 `sdk:core` 和 `sdk:agent`。只需监听其中一个入口时,可以单独运行 `pnpm sdk:core` 或 `pnpm sdk:agent`。
159
+
158
160
  ### 构建
159
161
 
160
162
  ```bash
@@ -0,0 +1 @@
1
+ export {};
@@ -27,7 +27,6 @@ type Option = {
27
27
  body_id: number;
28
28
  id: number;
29
29
  }) => void;
30
- onError: (error: any) => void;
31
30
  sendSdkPoint: (point: string, data: any) => void;
32
31
  };
33
32
  export default class AvatarRender {
@@ -118,10 +118,26 @@ export default class RenderScheduler {
118
118
  next_state: string;
119
119
  };
120
120
  sendVoiceEnd(): void;
121
+ /**
122
+ * 重连成功恢复(含窗口内 socket.io 自动重连恢复、窗口外重开房间):
123
+ * 数据缓存在断网进入离线时已清空(_offlineMode/_offlineRun),此处仅恢复播放状态:
124
+ * - 标记帧号对齐:首个 BODY/AUDIO 数据到达时按 sf 重设帧时钟
125
+ * - 恢复音频播放
126
+ * - 解码器退出离线模式(重置 _offlineLastFrame、清空离线队列)
127
+ * 避免离线 idle 播放推进的帧号领先服务端续推数据导致人物卡死、音画不同步
128
+ */
129
+ markReconnectRecover(): void;
121
130
  _offlineMode(): void;
122
131
  _offlineRun(): void;
123
132
  ttsaStateChangeHandle(state: StateChangeInfo): void;
124
133
  resume(): void;
134
+ /**
135
+ * app 切后台时暂停音频并清空对齐状态(复用断网离线时的 pause())
136
+ * 不能保留缓存续播:Android 后台视频帧号持续递增而音频停留在暂停位置,
137
+ * 恢复后音画基准脱节;且后台期间可能下发新 speak 数据,旧缓存与新 sf 冲突。
138
+ * 恢复后依赖新下发音频的 sf 作为 firstFrameIndex 重新对齐
139
+ */
140
+ pauseForBackground(): void;
125
141
  /**
126
142
  * 设置数字人canvas的显隐状态
127
143
  * @param visible 是否可见
@@ -129,7 +145,7 @@ export default class RenderScheduler {
129
145
  setAvatarCanvasVisible(visible: boolean): void;
130
146
  setCharacterCanvasLayout(layout?: Layout): void;
131
147
  setWalkConfig(walkConfig: WalkConfig): void;
132
- interrupt(type?: string): number;
148
+ interrupt(type?: string, targetSpeechId?: number): number;
133
149
  seekToFrame(frame: number): void;
134
150
  getCurrentFrameIndex(): number;
135
151
  getSpeechId(): number;
@@ -24,6 +24,7 @@ interface ITtsaOptions {
24
24
  enterOfflineMode: () => void;
25
25
  reStartSDK: () => void;
26
26
  reconnect_client_timeout: number;
27
+ reconnect_timeout: number;
27
28
  sendVoiceEnd: () => void;
28
29
  getCurrentFrameIndex: () => number;
29
30
  }
@@ -45,7 +46,9 @@ export default class Ttsa {
45
46
  private enterOfflineMode;
46
47
  private reStartSDK;
47
48
  private reconnect_client_timeout;
49
+ private reconnect_timeout;
48
50
  private reconnectTimer;
51
+ private socketReconnectTimer;
49
52
  private wsConnectTimer;
50
53
  private enterOfflineFlag;
51
54
  private sendVoiceEnd;
@@ -57,9 +60,13 @@ export default class Ttsa {
57
60
  private heartbeatTimer;
58
61
  private readonly HEARTBEAT_INTERVAL;
59
62
  /**
60
- * 清除WebSocket重连定时器
63
+ * 清除WebSocket重连定时器(含停止 socket.io 自动重连的定时器)
61
64
  */
62
65
  clearReconnectTimer(): void;
66
+ /**
67
+ * 清除停止 socket.io 自动重连的定时器
68
+ */
69
+ private clearSocketReconnectTimer;
63
70
  /**
64
71
  * 启动客户端心跳(每 2s 发送一次 client_heartbeat)
65
72
  */