@xmov/avatar 2.1.0 → 2.1.2

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 (41) hide show
  1. package/dist/agent/avatar.cjs +1 -2
  2. package/dist/agent/avatar.modern.js +1 -2
  3. package/dist/agent/avatar.module.js +1 -2
  4. package/dist/agent/avatar.umd.js +1 -2
  5. package/dist/agent/index.cjs +1 -4
  6. package/dist/agent/index.d.ts +12 -5
  7. package/dist/agent/index.umd.js +3 -5
  8. package/dist/agent/types.d.ts +5 -43
  9. package/dist/control/RenderScheduler.d.ts +0 -7
  10. package/dist/index.cjs +1 -1
  11. package/dist/index.cjs.map +1 -1
  12. package/dist/index.modern.js +1 -1
  13. package/dist/index.modern.js.map +1 -1
  14. package/dist/index.module.js +1 -1
  15. package/dist/index.module.js.map +1 -1
  16. package/dist/index.umd.js +1 -1
  17. package/dist/index.umd.js.map +1 -1
  18. package/package.json +21 -4
  19. package/src/control/RenderScheduler.ts +1 -12
  20. package/src/encoding/webcodec-opus-encoder.ts +1 -1
  21. package/src/index.ts +5 -14
  22. package/dist/agent/__tests__/agent.test.d.ts +0 -1
  23. package/dist/agent/audio-debug.d.ts +0 -3
  24. package/dist/agent/audio-uplink.d.ts +0 -62
  25. package/dist/agent/avatar.cjs.map +0 -1
  26. package/dist/agent/avatar.modern.js.map +0 -1
  27. package/dist/agent/avatar.module.js.map +0 -1
  28. package/dist/agent/avatar.umd.js.map +0 -1
  29. package/dist/agent/cdn-entry.d.ts +0 -1
  30. package/dist/agent/e2e-client.d.ts +0 -32
  31. package/dist/agent/fixed-audio-track.d.ts +0 -48
  32. package/dist/agent/microphone.d.ts +0 -49
  33. package/src/agent/__tests__/agent.test.ts +0 -3787
  34. package/src/agent/audio-debug.ts +0 -36
  35. package/src/agent/audio-uplink.ts +0 -392
  36. package/src/agent/cdn-entry.ts +0 -15
  37. package/src/agent/e2e-client.ts +0 -215
  38. package/src/agent/fixed-audio-track.ts +0 -547
  39. package/src/agent/index.ts +0 -1393
  40. package/src/agent/microphone.ts +0 -534
  41. package/src/agent/types.ts +0 -197
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@xmov/avatar",
3
- "version": "2.1.0",
3
+ "version": "2.1.2",
4
4
  "description": "魔珐数字人 JS-SDK",
5
5
  "type": "module",
6
6
  "source": "src/index.ts",
@@ -10,12 +10,19 @@
10
10
  "default": "./dist/index.modern.js"
11
11
  },
12
12
  "./agent": {
13
- "types": "./src/agent/index.ts",
13
+ "types": "./dist/agent/index.d.ts",
14
14
  "require": "./dist/agent/index.cjs",
15
15
  "default": "./dist/agent/avatar.modern.js"
16
16
  },
17
17
  "./agent/umd": "./dist/agent/index.umd.js"
18
18
  },
19
+ "typesVersions": {
20
+ "*": {
21
+ "agent": [
22
+ "dist/agent/index.d.ts"
23
+ ]
24
+ }
25
+ },
19
26
  "amdName": "XmovAvatar",
20
27
  "main": "./dist/index.cjs",
21
28
  "types": "./dist/index.d.ts",
@@ -23,12 +30,22 @@
23
30
  "unpkg": "./dist/index.umd.js",
24
31
  "files": [
25
32
  "dist/",
26
- "src/"
33
+ "src/",
34
+ "!src/agent/",
35
+ "!dist/agent/**/*.map",
36
+ "!dist/agent/__tests__/",
37
+ "!dist/agent/audio-debug.d.ts",
38
+ "!dist/agent/audio-uplink.d.ts",
39
+ "!dist/agent/cdn-entry.d.ts",
40
+ "!dist/agent/e2e-client.d.ts",
41
+ "!dist/agent/fixed-audio-track.d.ts",
42
+ "!dist/agent/internal-types.d.ts",
43
+ "!dist/agent/microphone.d.ts"
27
44
  ],
28
45
  "scripts": {
29
46
  "build": "pnpm run build:core && pnpm run build:agent && pnpm run build:e2e:cdn && pnpm run test:e2e:cdn && node upload-sdk.js build",
30
47
  "build:core": "microbundle --workers --define ENV=production,VERSION=$npm_package_version --external none --tsconfig tsconfig.json",
31
- "build:agent": "microbundle --entry src/agent/index.ts --output dist/agent --format modern,esm,cjs,umd --external @xmov/avatar --alias ../index=@xmov/avatar --globals @xmov/avatar=XmovAvatar --name XingyunAvatarAgentModule --tsconfig tsconfig.agent.json && node scripts/build-agent-entry.mjs",
48
+ "build:agent": "microbundle --entry src/agent/index.ts --output dist/agent --format modern,esm,cjs,umd --external @xmov/avatar --alias ../index=@xmov/avatar --globals @xmov/avatar=XmovAvatar --name XingyunAvatarAgentModule --tsconfig tsconfig.agent.json --no-sourcemap && node scripts/build-agent-entry.mjs",
32
49
  "build:e2e:cdn": "microbundle --entry src/agent/cdn-entry.ts --output cdn-dist/xmovAvatar_e2e.js --format iife --external none --workers --define ENV=production,VERSION=$npm_package_version --tsconfig tsconfig.agent.json --no-pkg-main --no-sourcemap",
33
50
  "sdk": "pnpm --filter @xmov/avatar run --parallel --no-bail \"/^sdk:.+$/\"",
34
51
  "sdk:core": "microbundle watch --workers --define ENV=development,VERSION=$npm_package_version --external none --tsconfig tsconfig.json",
@@ -636,7 +636,6 @@ export default class RenderScheduler {
636
636
 
637
637
  // 1. 暂停动画帧循环(保留当前帧索引)
638
638
  this.frameAnimationController?.pause();
639
- this.decoder.abort();
640
639
 
641
640
  // 2. 停止并清空音频播放(丢弃所有剩余的音频数据)
642
641
  this.audioRenderer.stop(-1); // 传入 -1 清空所有音频数据
@@ -674,7 +673,7 @@ export default class RenderScheduler {
674
673
  // 4. 恢复后立即进入渲染中状态
675
674
  this.renderState = RenderState.resumed;
676
675
  this.onRenderChange(this.renderState);
677
- (window as any).avatarSDKLogger?.log(this.TAG, ' 渲染已恢复,状态: this.currentSpeechId===');
676
+ (window as any).avatarSDKLogger?.log(this.TAG, ' 渲染已恢复,状态: this.currentSpeechId===' + this.currentSpeechId);
678
677
  }
679
678
 
680
679
  /**
@@ -897,16 +896,6 @@ export default class RenderScheduler {
897
896
  this.audioRenderer.resume();
898
897
  }
899
898
 
900
- /**
901
- * app 切后台时暂停音频并清空对齐状态(复用断网离线时的 pause())
902
- * 不能保留缓存续播:Android 后台视频帧号持续递增而音频停留在暂停位置,
903
- * 恢复后音画基准脱节;且后台期间可能下发新 speak 数据,旧缓存与新 sf 冲突。
904
- * 恢复后依赖新下发音频的 sf 作为 firstFrameIndex 重新对齐
905
- */
906
- pauseForBackground() {
907
- this.audioRenderer.pause();
908
- }
909
-
910
899
  /**
911
900
  * 设置数字人canvas的显隐状态
912
901
  * @param visible 是否可见
@@ -25,7 +25,7 @@ interface PendingEncode {
25
25
  chunks: EncodedAudioChunk[];
26
26
  resolve(frames: EncodedOpusFrame[]): void;
27
27
  reject(error: Error): void;
28
- timeoutId: number;
28
+ timeoutId: any;
29
29
  }
30
30
 
31
31
  function buildAudioEncoderConfig(config: OpusEncoderConfig) {
package/src/index.ts CHANGED
@@ -1051,28 +1051,19 @@ export default class XmovAvatar {
1051
1051
 
1052
1052
  visibilitychange() {
1053
1053
  if (document.hidden) {
1054
- // 进入后台:暂停渲染循环和解码器(省电)、清空音频与表情数据
1055
- // 仅渲染中暂停(resumeRender 要求 paused 状态才能恢复),
1056
- // 其他状态(init/stopped/隐身 paused)只停止音频,避免强制暂停后无法恢复
1057
- const rs = this.renderScheduler?.getRenderState();
1058
- if (rs === RenderState.rendering || rs === RenderState.resumed) {
1059
- this.renderScheduler?.pauseRender();
1060
- } else {
1061
- this.renderScheduler?.pauseForBackground();
1062
- }
1054
+ this.setVolume(0);
1063
1055
  } else {
1064
- // 回到前台:若处于暂停态则恢复渲染(内部已 forceSyncDecoder 对齐最新帧)
1065
- if (this.renderScheduler?.getRenderState() === RenderState.paused) {
1066
- this.renderScheduler?.resumeRender();
1067
- } else if (this.ttsa?.getStatus()) {
1068
- // 未暂停但连接正常:兜底同步解帧队列
1056
+ if (this.ttsa?.getStatus()) {
1057
+ // 连接正常:兜底同步解帧队列
1069
1058
  this.renderScheduler?.forceSyncDecoder();
1059
+ this.setVolume(1);
1070
1060
  }
1071
1061
  // WebSocket 在后台断开且已进入离线模式,网络可用则主动触发重连,
1072
1062
  // 否则用户切回前台续播时无响应且无任何报错
1073
1063
  if (!this.ttsa?.getStatus() && this.status === AvatarStatus.offline && NetworkMonitor.ONLINE) {
1074
1064
  (window as any).avatarSDKLogger.warn(this.TAG, "切回前台发现连接已断开,主动触发重连");
1075
1065
  this.onlineMode();
1066
+ this.setVolume(1);
1076
1067
  }
1077
1068
  // tab 切换回来时,恢复音频捕获的 AudioContext
1078
1069
  if (this.captureAudioCtx && this.captureAudioCtx.state === 'suspended') {
@@ -1 +0,0 @@
1
- export {};
@@ -1,3 +0,0 @@
1
- type AudioChunkDebugMetadata = Record<string, unknown>;
2
- export declare function logAudioChunkContent(label: string, chunk: Blob | ArrayBuffer | ArrayBufferView, metadata?: AudioChunkDebugMetadata, previewBytes?: number): Promise<void>;
3
- export {};
@@ -1,62 +0,0 @@
1
- export declare const AU_STREAM_NEAREND: 1;
2
- export declare const AU_STREAM_FAREND: 2;
3
- export type AuStreamId = typeof AU_STREAM_NEAREND | typeof AU_STREAM_FAREND;
4
- export type AuPayload = Blob | ArrayBuffer | ArrayBufferView;
5
- export interface AgentAudioBlock {
6
- data: AuPayload;
7
- /** Epoch timestamp for the beginning of this 100 ms media block. */
8
- timestamp: number;
9
- /** Whether this block starts a new WebM container stream. */
10
- isFirstChunk?: boolean;
11
- }
12
- interface AgentAudioUplinkOptions {
13
- sendBinary(frame: ArrayBuffer): void;
14
- onError?(error: Error): void;
15
- }
16
- export declare function packAuAudioFrame(streamId: AuStreamId, tsMs: number, payload: ArrayBuffer | ArrayBufferView): ArrayBuffer;
17
- /**
18
- * Owns the connection-level AU timeline and serializes nearend/farend writes.
19
- * Nearend/farend are matched by 100 ms bucket. When independent capture clocks
20
- * straddle a bucket boundary, an aged nearend may consume farend from
21
- * the immediately preceding bucket. This keeps farend-before-nearend wire
22
- * order without uploading farend-only buckets or dropping WebM continuations.
23
- */
24
- export declare class AgentAudioUplink {
25
- private readonly options;
26
- private connectionStartedAt;
27
- private connectionGeneration;
28
- private sendChain;
29
- private failed;
30
- private readonly pendingFarend;
31
- private readonly pendingNearend;
32
- private readonly closedNearendBuckets;
33
- private readonly lastTimestampByStream;
34
- private readonly lastSentTimestampByStream;
35
- private readonly pendingWebmPrefixByStream;
36
- private farendStreamState;
37
- constructor(options: AgentAudioUplinkOptions);
38
- reset(connectionStartedAt?: number | null): void;
39
- startInput(): void;
40
- clearFarend(): void;
41
- offerFarend(block: AgentAudioBlock): void;
42
- offerNearend(block: AgentAudioBlock): void;
43
- drain(): Promise<void>;
44
- private normalizeBlock;
45
- private enqueue;
46
- /**
47
- * Chromium may emit the first WebM byte (0x1a) as its own MediaRecorder
48
- * Blob and put the remaining EBML magic in the next Blob. A one-byte AU
49
- * payload is not a valid timed audio block, so keep an incomplete WebM
50
- * magic prefix and prepend it to the next block from the same stream.
51
- */
52
- private coalesceSplitWebmMagic;
53
- private flushOlderNearend;
54
- private flushExpiredNearend;
55
- private flushBucket;
56
- private takeNearend;
57
- private takeFarendThrough;
58
- private abandonFarendStream;
59
- private prune;
60
- }
61
- export declare const AU_AUDIO_BLOCK_MS = 100;
62
- export {};