@xmov/avatar 2.0.0-alpha.38

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.
Files changed (160) hide show
  1. package/README.md +139 -0
  2. package/dist/agent/__tests__/agent.test.d.ts +1 -0
  3. package/dist/agent/audio-debug.d.ts +3 -0
  4. package/dist/agent/audio-uplink.d.ts +62 -0
  5. package/dist/agent/avatar.cjs +2 -0
  6. package/dist/agent/avatar.cjs.map +1 -0
  7. package/dist/agent/avatar.modern.js +2 -0
  8. package/dist/agent/avatar.modern.js.map +1 -0
  9. package/dist/agent/avatar.module.js +2 -0
  10. package/dist/agent/avatar.module.js.map +1 -0
  11. package/dist/agent/avatar.umd.js +2 -0
  12. package/dist/agent/avatar.umd.js.map +1 -0
  13. package/dist/agent/e2e-client.d.ts +32 -0
  14. package/dist/agent/fixed-audio-track.d.ts +48 -0
  15. package/dist/agent/index.cjs +5 -0
  16. package/dist/agent/index.d.ts +104 -0
  17. package/dist/agent/index.umd.js +10 -0
  18. package/dist/agent/microphone.d.ts +49 -0
  19. package/dist/agent/types.d.ts +153 -0
  20. package/dist/baseRender/AudioRenderer.d.ts +46 -0
  21. package/dist/baseRender/AudioWorklet.d.ts +78 -0
  22. package/dist/baseRender/AvatarRenderer.d.ts +226 -0
  23. package/dist/baseRender/MSEAudioPlayer.d.ts +51 -0
  24. package/dist/baseRender/UIRenderer.d.ts +39 -0
  25. package/dist/baseRender/pcm-audio-processor.d.ts +63 -0
  26. package/dist/control/APIForwarder.d.ts +23 -0
  27. package/dist/control/DataCacheQueue.d.ts +69 -0
  28. package/dist/control/EventDispatcher.d.ts +35 -0
  29. package/dist/control/RenderScheduler.d.ts +162 -0
  30. package/dist/control/SaveAndDownload.d.ts +14 -0
  31. package/dist/control/StreamingClient.d.ts +33 -0
  32. package/dist/control/VideoPlayer.d.ts +47 -0
  33. package/dist/control/ttsa.d.ts +111 -0
  34. package/dist/encoding/media-recorder-encoder.d.ts +33 -0
  35. package/dist/encoding/pcm-webm-encoder.d.ts +13 -0
  36. package/dist/encoding/webcodec-opus-encoder.d.ts +41 -0
  37. package/dist/encoding/webm-muxer.d.ts +90 -0
  38. package/dist/index.cjs +2 -0
  39. package/dist/index.cjs.map +1 -0
  40. package/dist/index.d.ts +231 -0
  41. package/dist/index.modern.js +2 -0
  42. package/dist/index.modern.js.map +1 -0
  43. package/dist/index.module.js +2 -0
  44. package/dist/index.module.js.map +1 -0
  45. package/dist/index.umd.js +2 -0
  46. package/dist/index.umd.js.map +1 -0
  47. package/dist/modules/Composition.d.ts +28 -0
  48. package/dist/modules/ResourceManager.d.ts +295 -0
  49. package/dist/modules/TrackRenderer/base-track.d.ts +4 -0
  50. package/dist/modules/TrackRenderer/index.d.ts +12 -0
  51. package/dist/modules/TrackRenderer/render-implements.d.ts +19 -0
  52. package/dist/modules/TrackRenderer/track-pic.d.ts +8 -0
  53. package/dist/modules/TrackRenderer/track-subtitle.d.ts +8 -0
  54. package/dist/modules/cache-manager.d.ts +5 -0
  55. package/dist/modules/decoder.d.ts +84 -0
  56. package/dist/modules/error-handle.d.ts +17 -0
  57. package/dist/modules/network.d.ts +21 -0
  58. package/dist/proto/face_data_pb.d.ts +0 -0
  59. package/dist/types/capability.d.ts +15 -0
  60. package/dist/types/error.d.ts +70 -0
  61. package/dist/types/event.d.ts +25 -0
  62. package/dist/types/frame-data.d.ts +107 -0
  63. package/dist/types/index.d.ts +187 -0
  64. package/dist/types/render.d.ts +18 -0
  65. package/dist/utils/DataInterface.d.ts +113 -0
  66. package/dist/utils/GLDevice.d.ts +46 -0
  67. package/dist/utils/GLPipeline.d.ts +84 -0
  68. package/dist/utils/GLPipelineDebugTools.d.ts +5 -0
  69. package/dist/utils/Math.d.ts +21 -0
  70. package/dist/utils/__tests__/capability-checker.test.d.ts +1 -0
  71. package/dist/utils/audio-session.d.ts +11 -0
  72. package/dist/utils/audio.d.ts +1 -0
  73. package/dist/utils/capability-checker.d.ts +23 -0
  74. package/dist/utils/encodeToken.d.ts +7 -0
  75. package/dist/utils/face.d.ts +1 -0
  76. package/dist/utils/float32-decoder.d.ts +26 -0
  77. package/dist/utils/fpsTracker.d.ts +27 -0
  78. package/dist/utils/index.d.ts +22 -0
  79. package/dist/utils/logger.d.ts +9 -0
  80. package/dist/utils/media-recorder-timestamp.d.ts +15 -0
  81. package/dist/utils/pcmAnalyzer.d.ts +40 -0
  82. package/dist/utils/perfermance.d.ts +15 -0
  83. package/dist/utils/request.d.ts +19 -0
  84. package/dist/utils/requestAnimateFrames.d.ts +31 -0
  85. package/dist/utils/time.d.ts +9 -0
  86. package/dist/view/DebugOverlay.d.ts +54 -0
  87. package/dist/worker/streaming-video.d.ts +1 -0
  88. package/package.json +82 -0
  89. package/src/agent/__tests__/agent.test.ts +3787 -0
  90. package/src/agent/audio-debug.ts +36 -0
  91. package/src/agent/audio-uplink.ts +392 -0
  92. package/src/agent/e2e-client.ts +215 -0
  93. package/src/agent/fixed-audio-track.ts +547 -0
  94. package/src/agent/index.ts +1393 -0
  95. package/src/agent/microphone.ts +534 -0
  96. package/src/agent/types.ts +197 -0
  97. package/src/baseRender/AudioRenderer.ts +317 -0
  98. package/src/baseRender/AudioWorklet.ts +776 -0
  99. package/src/baseRender/AvatarRenderer.ts +1559 -0
  100. package/src/baseRender/MSEAudioPlayer.ts +243 -0
  101. package/src/baseRender/UIRenderer.ts +195 -0
  102. package/src/baseRender/pcm-audio-processor.js +267 -0
  103. package/src/control/APIForwarder.ts +67 -0
  104. package/src/control/DataCacheQueue.ts +372 -0
  105. package/src/control/EventDispatcher.ts +106 -0
  106. package/src/control/RenderScheduler.ts +945 -0
  107. package/src/control/SaveAndDownload.js +77 -0
  108. package/src/control/StreamingClient.ts +138 -0
  109. package/src/control/VideoPlayer.ts +306 -0
  110. package/src/control/ttsa.ts +676 -0
  111. package/src/encoding/media-recorder-encoder.ts +175 -0
  112. package/src/encoding/pcm-webm-encoder.ts +72 -0
  113. package/src/encoding/webcodec-opus-encoder.ts +258 -0
  114. package/src/encoding/webm-muxer.ts +337 -0
  115. package/src/global.d.ts +105 -0
  116. package/src/index.ts +1920 -0
  117. package/src/modules/Composition.ts +79 -0
  118. package/src/modules/ResourceManager.ts +899 -0
  119. package/src/modules/TrackRenderer/base-track.ts +7 -0
  120. package/src/modules/TrackRenderer/index.ts +40 -0
  121. package/src/modules/TrackRenderer/render-implements.ts +269 -0
  122. package/src/modules/TrackRenderer/track-pic.ts +19 -0
  123. package/src/modules/TrackRenderer/track-subtitle.ts +16 -0
  124. package/src/modules/cache-manager.ts +10 -0
  125. package/src/modules/decoder.ts +515 -0
  126. package/src/modules/error-handle.ts +20 -0
  127. package/src/modules/network.ts +71 -0
  128. package/src/proto/face_data.proto +45 -0
  129. package/src/proto/face_data_pb.js +1297 -0
  130. package/src/proto/protobuf.min.js +8 -0
  131. package/src/types/capability.ts +23 -0
  132. package/src/types/error.ts +211 -0
  133. package/src/types/event.ts +38 -0
  134. package/src/types/frame-data.ts +121 -0
  135. package/src/types/index.ts +207 -0
  136. package/src/types/render.ts +18 -0
  137. package/src/utils/DataInterface.ts +746 -0
  138. package/src/utils/GLDevice.ts +286 -0
  139. package/src/utils/GLPipeline.ts +1293 -0
  140. package/src/utils/GLPipelineDebugTools.ts +174 -0
  141. package/src/utils/Math.ts +266 -0
  142. package/src/utils/__tests__/capability-checker.test.ts +159 -0
  143. package/src/utils/audio-session.ts +144 -0
  144. package/src/utils/audio.ts +44 -0
  145. package/src/utils/blueimp-md5.d.ts +3 -0
  146. package/src/utils/capability-checker.ts +379 -0
  147. package/src/utils/encodeToken.ts +100 -0
  148. package/src/utils/face.ts +29 -0
  149. package/src/utils/float32-decoder.js +130 -0
  150. package/src/utils/fpsTracker.ts +100 -0
  151. package/src/utils/index.ts +182 -0
  152. package/src/utils/logger.js +36 -0
  153. package/src/utils/media-recorder-timestamp.ts +79 -0
  154. package/src/utils/pcmAnalyzer.ts +154 -0
  155. package/src/utils/perfermance.ts +141 -0
  156. package/src/utils/request.ts +95 -0
  157. package/src/utils/requestAnimateFrames.ts +195 -0
  158. package/src/utils/time.ts +32 -0
  159. package/src/view/DebugOverlay.ts +404 -0
  160. package/src/worker/streaming-video.ts +4647 -0
@@ -0,0 +1,33 @@
1
+ /**
2
+ * StreamingClient - 薄客户端模式下的 WebSocket 连接管理器
3
+ * 负责与 Streaming Server 建立连接,管理消息路由、心跳和重连。
4
+ */
5
+ export interface StreamingClientOptions {
6
+ url: string;
7
+ onReady?: () => void;
8
+ onOffer?: (sdp: string) => void;
9
+ onIce?: (candidate: RTCIceCandidateInit) => void;
10
+ onEventProxy?: (eventType: string, data: any, serverFrame?: number) => void;
11
+ onError?: (error: string) => void;
12
+ onDisconnect?: () => void;
13
+ }
14
+ export declare class StreamingClient {
15
+ private ws;
16
+ private options;
17
+ private retryCount;
18
+ private maxRetry;
19
+ private retryTimer;
20
+ private destroyed;
21
+ private connected;
22
+ constructor(options: StreamingClientOptions);
23
+ connect(): void;
24
+ private handleMessage;
25
+ send(msg: object): void;
26
+ /**
27
+ * 发送 API 调用
28
+ */
29
+ sendApiCall(method: string, params?: any[]): void;
30
+ private scheduleRetry;
31
+ isConnected(): boolean;
32
+ destroy(): void;
33
+ }
@@ -0,0 +1,47 @@
1
+ /**
2
+ * VideoPlayer - 薄客户端模式下的 WebRTC 收流与播放管理
3
+ * 支持两种模式:
4
+ * - 普通模式:直接 <video> 播放
5
+ * - Alpha Mask 模式:canvas 渲染 + 双路流 alpha 合成(透明背景)
6
+ */
7
+ import { StreamingClient } from './StreamingClient';
8
+ export interface VideoPlayerOptions {
9
+ container: HTMLElement;
10
+ streamingClient: StreamingClient;
11
+ useAlphaMask?: boolean;
12
+ onConnected?: () => void;
13
+ onDisconnected?: () => void;
14
+ }
15
+ export declare class VideoPlayer {
16
+ private video;
17
+ private canvas;
18
+ private canvasCtx;
19
+ private pc;
20
+ private stream;
21
+ private options;
22
+ private destroyed;
23
+ private animFrameId;
24
+ private tempCanvas;
25
+ private tempCtx;
26
+ constructor(options: VideoPlayerOptions);
27
+ private createVideoElement;
28
+ private createCanvasElement;
29
+ /**
30
+ * 处理远端 SDP offer,创建 answer 并通过 StreamingClient 回传
31
+ */
32
+ handleOffer(sdp: string): Promise<void>;
33
+ /**
34
+ * Alpha Mask 渲染循环
35
+ * 将双路流(RGB + Alpha)合成为带透明度的画面
36
+ */
37
+ private startAlphaRendering;
38
+ /**
39
+ * 添加 ICE candidate
40
+ */
41
+ addIceCandidate(candidate: RTCIceCandidateInit): Promise<void>;
42
+ getVideoElement(): HTMLVideoElement | null;
43
+ getCanvasElement(): HTMLCanvasElement | null;
44
+ isConnected(): boolean;
45
+ private destroyPeer;
46
+ destroy(): void;
47
+ }
@@ -0,0 +1,111 @@
1
+ import { EFrameDataType, IRawFrameData, StateChangeInfo } from "../types/frame-data";
2
+ import type XmovAvatar from "../index";
3
+ import { DeviceInfo, Layout, WalkConfig } from "../types";
4
+ import { IResumeParams } from "../modules/ResourceManager";
5
+ import '../proto/protobuf.min';
6
+ import '../proto/face_data_pb';
7
+ interface ITtsaOptions {
8
+ sdkInstance: XmovAvatar;
9
+ url: string;
10
+ room: string;
11
+ session_id: string;
12
+ token: string;
13
+ appInfo: {
14
+ appId: string;
15
+ env: string;
16
+ };
17
+ framedata_proto_version: number;
18
+ onReady(): void;
19
+ handleMessage: (type: EFrameDataType, data: IRawFrameData[]) => void;
20
+ handleAAFrame: (data: any) => void;
21
+ runStartFrameIndex: (server_time: number) => void;
22
+ ttsaStateChangeHandle: (state: StateChangeInfo) => void;
23
+ reloadSuccess: () => void;
24
+ enterOfflineMode: () => void;
25
+ reStartSDK: () => void;
26
+ reconnect_client_timeout: number;
27
+ sendVoiceEnd: () => void;
28
+ getCurrentFrameIndex: () => number;
29
+ }
30
+ export default class Ttsa {
31
+ private TAG;
32
+ private ws;
33
+ private room;
34
+ private session_id;
35
+ private token;
36
+ private framedata_proto_version;
37
+ private getResumeInfo?;
38
+ private runStartFrameIndex;
39
+ private ttsaStateChangeHandle;
40
+ private sdk;
41
+ private reloadSuccess;
42
+ private _lastSessionId;
43
+ private _uniqueSpeakId;
44
+ private session_speak_req_id;
45
+ private enterOfflineMode;
46
+ private reStartSDK;
47
+ private reconnect_client_timeout;
48
+ private reconnectTimer;
49
+ private wsConnectTimer;
50
+ private enterOfflineFlag;
51
+ private sendVoiceEnd;
52
+ private syncTimestampInterval;
53
+ private syncTimestampNum;
54
+ private readonly SYNC_INTERVAL;
55
+ private lastSyncTime;
56
+ private getCurrentFrameIndex;
57
+ private heartbeatTimer;
58
+ private readonly HEARTBEAT_INTERVAL;
59
+ /**
60
+ * 清除WebSocket重连定时器
61
+ */
62
+ clearReconnectTimer(): void;
63
+ /**
64
+ * 启动客户端心跳(每 2s 发送一次 client_heartbeat)
65
+ */
66
+ private startHeartbeat;
67
+ /**
68
+ * 停止客户端心跳
69
+ */
70
+ private stopHeartbeat;
71
+ private _isResume;
72
+ private appInfo;
73
+ constructor(options: ITtsaOptions);
74
+ clearOldWsTimeoutTimer: () => void;
75
+ initWsTimeoutTimer: () => void;
76
+ start(): void;
77
+ idle(): void;
78
+ listen(): void;
79
+ think(): void;
80
+ interactiveidle(): void;
81
+ /**
82
+ * 通知后端进入隐身模式
83
+ */
84
+ enterInvisibleMode(): void;
85
+ /**
86
+ * 通知后端退出隐身模式
87
+ */
88
+ exitInvisibleMode(): void;
89
+ firstStartTimestamp(server_time: number): void;
90
+ syncTimestamp(): void;
91
+ sendSyncTimestamp(client_frame: number): void;
92
+ sendText(ssml: string, is_start: boolean, is_end: boolean, extra?: {
93
+ client_speak_id: string;
94
+ }): string | undefined;
95
+ sendSdkPoint(name: string, params?: any, extra?: any): void;
96
+ stateChange(state: string, params?: object): void;
97
+ sendPerfLog(payload: object): void;
98
+ changeLayout(layout: Layout): void;
99
+ changeWalkConfig(walkConfig: WalkConfig): void;
100
+ send(event: string, payload: Object): void;
101
+ sendDeviceInfo(deviceInfo: DeviceInfo): void;
102
+ getStatus(): boolean;
103
+ _setResumeInfoCallback(lastSessionId: string, _getResumeInfo: () => IResumeParams): void;
104
+ _getResumeInfo(): IResumeParams | null;
105
+ updateUniqueSpeakId(): void;
106
+ getUniqueSpeakId(): string;
107
+ close(): void;
108
+ connect(): void;
109
+ seekToFrame(frame: number): void;
110
+ }
111
+ export {};
@@ -0,0 +1,33 @@
1
+ /**
2
+ * MediaRecorder 降级编码器
3
+ * 对于不支持 WebCodecs Opus 但支持 MediaRecorder webm/opus 的平台(Safari 18.4+)
4
+ * 通过 16kHz AudioContext + PCMInjectorProcessor + MediaRecorder 实现 Opus 编码
5
+ */
6
+ export declare class MediaRecorderEncoder {
7
+ private audioCtx;
8
+ private workletNode;
9
+ private destination;
10
+ private recorder;
11
+ private isRecording;
12
+ private nextResolve;
13
+ private dataQueue;
14
+ /**
15
+ * 检测当前浏览器是否支持 MediaRecorder webm/opus
16
+ */
17
+ static isSupported(): boolean;
18
+ /**
19
+ * 初始化:创建 16kHz AudioContext + 中转 Worklet + MediaRecorder
20
+ */
21
+ init(): Promise<void>;
22
+ /**
23
+ * 注入 PCM 数据并等待编码输出
24
+ * @param pcmData S16LE PCM ArrayBuffer (16kHz)
25
+ * @returns 编码后的 WebM 数据,或 null
26
+ */
27
+ feedPCM(pcmData: ArrayBuffer): Promise<ArrayBuffer | null>;
28
+ /**
29
+ * 重置(新 speak 段开始时调用)
30
+ */
31
+ reset(): void;
32
+ destroy(): void;
33
+ }
@@ -0,0 +1,13 @@
1
+ export declare class PcmWebMEncoder {
2
+ private readonly opusEncoder;
3
+ private readonly muxer;
4
+ private queue;
5
+ private generation;
6
+ private destroyed;
7
+ private pendingBlocks;
8
+ static isSupported(): Promise<boolean>;
9
+ init(): Promise<void>;
10
+ encode(pcm: Int16Array): Promise<ArrayBuffer>;
11
+ reset(): void;
12
+ destroy(): Promise<void>;
13
+ }
@@ -0,0 +1,41 @@
1
+ /**
2
+ * WebCodecs AudioEncoder Opus 编码封装
3
+ * 使用浏览器原生 WebCodecs API 将 PCM 音频编码为 Opus 帧
4
+ */
5
+ export interface OpusEncoderConfig {
6
+ sampleRate: number;
7
+ channels: number;
8
+ bitrate: number;
9
+ frameSize: number;
10
+ }
11
+ export interface EncodedOpusFrame {
12
+ data: Uint8Array;
13
+ durationMs: number;
14
+ }
15
+ export declare class WebCodecOpusEncoder {
16
+ private encoder;
17
+ private config;
18
+ private isInitialized;
19
+ private pendingEncode;
20
+ private timestamp;
21
+ constructor(config?: Partial<OpusEncoderConfig>);
22
+ /**
23
+ * 检测当前浏览器是否支持 WebCodecs Opus 编码
24
+ */
25
+ static isSupported(): Promise<boolean>;
26
+ init(): Promise<void>;
27
+ /**
28
+ * 异步编码 PCM 为 Opus 帧
29
+ * @param pcm S16LE PCM 数据 (Int16Array, 1600 samples = 100ms)
30
+ * @returns 保留 packet 边界和时长的 Opus 帧数组
31
+ */
32
+ encode(pcm: Int16Array): Promise<EncodedOpusFrame[]>;
33
+ /**
34
+ * 重置时间戳(新 speak 段开始时调用)
35
+ */
36
+ reset(): void;
37
+ destroy(): Promise<void>;
38
+ private createEncoder;
39
+ private handleOutput;
40
+ private failPending;
41
+ }
@@ -0,0 +1,90 @@
1
+ /**
2
+ * WebM EBML 封装器
3
+ * 将 Opus 帧封装为 WebM 容器格式,产出与 MSE 模式一致的 WebM/Opus 数据
4
+ *
5
+ * WebM 结构:
6
+ * EBML Header → Segment → SegmentInfo → Tracks → Cluster(s) → SimpleBlock(s)
7
+ */
8
+ export declare class WebMMuxer {
9
+ private chunks;
10
+ private hasHeader;
11
+ private clusterTimestamp;
12
+ private sampleRate;
13
+ private frameDuration;
14
+ constructor(sampleRate?: number);
15
+ /**
16
+ * 写入 WebM 文件头(EBML Header + Segment Info + Track)
17
+ */
18
+ writeHeader(): void;
19
+ /**
20
+ * 写入 Opus 帧
21
+ * @param opusFrame Opus 编码后的数据
22
+ * @param durationMs 帧时长 (默认 100ms)
23
+ */
24
+ feedOpusFrame(opusFrame: Uint8Array, durationMs?: number): void;
25
+ /**
26
+ * 获取新增的 WebM 数据(自上次 flush 以来的数据)
27
+ * 返回后清空已返回的数据,避免重复发送
28
+ */
29
+ flush(): ArrayBuffer;
30
+ /**
31
+ * 重置(新 speak 段开始时调用)
32
+ */
33
+ reset(): void;
34
+ /**
35
+ * 编码 VINT(Variable-length Integer)
36
+ */
37
+ private encodeVINT;
38
+ /**
39
+ * 编码 EBML Element ID
40
+ */
41
+ private encodeID;
42
+ /**
43
+ * 编码无符号整数
44
+ */
45
+ private encodeUint;
46
+ /**
47
+ * 编码字符串
48
+ */
49
+ private encodeString;
50
+ /**
51
+ * 编码浮点数(32-bit IEEE 754)
52
+ */
53
+ private encodeFloat32;
54
+ /**
55
+ * 编码 EBML Element = ID + Size + Data
56
+ */
57
+ private encodeElement;
58
+ /**
59
+ * 编码 unsigned integer Element
60
+ */
61
+ private encodeUintElement;
62
+ /**
63
+ * 编码 string Element
64
+ */
65
+ private encodeStringElement;
66
+ /**
67
+ * 编码 float32 Element
68
+ */
69
+ private encodeFloat32Element;
70
+ /**
71
+ * 合并多个 Uint8Array
72
+ */
73
+ private concatArrays;
74
+ /**
75
+ * 构建 EBML Header
76
+ */
77
+ private buildEBMLHeader;
78
+ /**
79
+ * 构建 SegmentInfo
80
+ */
81
+ private buildSegmentInfo;
82
+ /**
83
+ * 构建 Opus Audio Track
84
+ */
85
+ private buildOpusTracks;
86
+ /**
87
+ * 构建 Cluster + SimpleBlock
88
+ */
89
+ private buildCluster;
90
+ }