@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.
- package/dist/agent/avatar.cjs +1 -2
- package/dist/agent/avatar.modern.js +1 -2
- package/dist/agent/avatar.module.js +1 -2
- package/dist/agent/avatar.umd.js +1 -2
- package/dist/agent/index.cjs +1 -4
- package/dist/agent/index.d.ts +12 -5
- package/dist/agent/index.umd.js +3 -5
- package/dist/agent/types.d.ts +5 -43
- package/dist/control/RenderScheduler.d.ts +0 -7
- 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/package.json +21 -4
- package/src/control/RenderScheduler.ts +1 -12
- package/src/encoding/webcodec-opus-encoder.ts +1 -1
- package/src/index.ts +5 -14
- package/dist/agent/__tests__/agent.test.d.ts +0 -1
- package/dist/agent/audio-debug.d.ts +0 -3
- package/dist/agent/audio-uplink.d.ts +0 -62
- package/dist/agent/avatar.cjs.map +0 -1
- package/dist/agent/avatar.modern.js.map +0 -1
- package/dist/agent/avatar.module.js.map +0 -1
- package/dist/agent/avatar.umd.js.map +0 -1
- package/dist/agent/cdn-entry.d.ts +0 -1
- package/dist/agent/e2e-client.d.ts +0 -32
- package/dist/agent/fixed-audio-track.d.ts +0 -48
- package/dist/agent/microphone.d.ts +0 -49
- package/src/agent/__tests__/agent.test.ts +0 -3787
- package/src/agent/audio-debug.ts +0 -36
- package/src/agent/audio-uplink.ts +0 -392
- package/src/agent/cdn-entry.ts +0 -15
- package/src/agent/e2e-client.ts +0 -215
- package/src/agent/fixed-audio-track.ts +0 -547
- package/src/agent/index.ts +0 -1393
- package/src/agent/microphone.ts +0 -534
- 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.
|
|
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": "./
|
|
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 是否可见
|
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
|
-
|
|
1065
|
-
|
|
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,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 {};
|