@zeewain/3d-avatar-sdk 2.1.4 → 2.2.1
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 +133 -0
- package/dist/assets/Build/webgl.data.unityweb +0 -0
- package/dist/assets/Build/webgl.framework.js.unityweb +0 -0
- package/dist/assets/Build/webgl.wasm.unityweb +0 -0
- package/dist/examples/test-vue2/package.json +1 -1
- package/dist/examples/test-vue3/package.json +1 -1
- package/dist/examples/test-vue3/src/App.vue +6 -1
- package/dist/examples/test-vue3/src/components/BroadcastAPI.vue +11 -0
- package/dist/index.d.ts +14 -5
- package/dist/index.es5.js +1 -14826
- package/dist/index.es5.umd.js +1 -14827
- package/dist/index.esm.js +1 -2775
- package/dist/index.umd.cjs +1 -2790
- package/package.json +2 -1
package/README.md
CHANGED
|
@@ -770,6 +770,139 @@ await sdk.startBroadcast({
|
|
|
770
770
|
}, true); // isAppend = true
|
|
771
771
|
```
|
|
772
772
|
|
|
773
|
+
##### startStreamBroadcast()
|
|
774
|
+
|
|
775
|
+
```typescript
|
|
776
|
+
async startStreamBroadcast(params: IBroadcastParams, forceRestart?: boolean): Promise<void>
|
|
777
|
+
```
|
|
778
|
+
|
|
779
|
+
流式播报方法,**专为 ChatGPT 等大模型对话场景设计**。SDK 内部自动维护播报状态,开发者无需手动判断和传递 `isAppend` 参数。
|
|
780
|
+
|
|
781
|
+
**参数:**
|
|
782
|
+
- `params`: 播报参数(与 `startBroadcast` 相同)
|
|
783
|
+
- `forceRestart`: 是否强制重新开始,默认 `false`
|
|
784
|
+
- `false`:SDK 自动判断,空闲时开始新播报,播报中自动追加
|
|
785
|
+
- `true`:强制停止当前播报并开始新的(用于用户发起新一轮对话)
|
|
786
|
+
|
|
787
|
+
**🆚 与 startBroadcast 的区别:**
|
|
788
|
+
|
|
789
|
+
| 特性 | startBroadcast | startStreamBroadcast |
|
|
790
|
+
|:-----|:---------------|:---------------------|
|
|
791
|
+
| **适用场景** | 通用播报场景 | ChatGPT 流式对话场景 |
|
|
792
|
+
| **状态管理** | 开发者手动管理 `isAppend` | SDK 自动管理 |
|
|
793
|
+
| **首次调用** | 需传 `isAppend=false` | 自动判断 |
|
|
794
|
+
| **后续调用** | 需传 `isAppend=true` | 自动追加 |
|
|
795
|
+
| **新对话开始** | 需先停止再开始 | 传 `forceRestart=true` |
|
|
796
|
+
|
|
797
|
+
**💡 使用场景:ChatGPT 流式响应**
|
|
798
|
+
|
|
799
|
+
当接入大模型(如 ChatGPT、文心一言等)流式响应时,文本会分段返回。使用 `startStreamBroadcast` 可以大幅简化代码:
|
|
800
|
+
|
|
801
|
+
```javascript
|
|
802
|
+
// (不推荐) 使用 startBroadcast 的复杂写法(需要手动维护状态)
|
|
803
|
+
let isFirstSegment = true;
|
|
804
|
+
|
|
805
|
+
async function onGPTResponse(text) {
|
|
806
|
+
await sdk.startBroadcast({
|
|
807
|
+
type: BroadcastType.TEXT,
|
|
808
|
+
humanCode: 'avatar001',
|
|
809
|
+
text: text,
|
|
810
|
+
voiceCode: 'VOICE001',
|
|
811
|
+
volume: 1.0,
|
|
812
|
+
isSubtitle: false
|
|
813
|
+
}, !isFirstSegment); // 需要手动判断是否是第一段
|
|
814
|
+
|
|
815
|
+
isFirstSegment = false;
|
|
816
|
+
}
|
|
817
|
+
|
|
818
|
+
// 用户发起新对话时需要重置状态
|
|
819
|
+
function onNewConversation() {
|
|
820
|
+
isFirstSegment = true;
|
|
821
|
+
sdk.stopBroadcast();
|
|
822
|
+
}
|
|
823
|
+
```
|
|
824
|
+
|
|
825
|
+
```javascript
|
|
826
|
+
// ✅ 使用 startStreamBroadcast 的简洁写法(SDK 自动管理状态)
|
|
827
|
+
async function onGPTResponse(text) {
|
|
828
|
+
// 直接调用,SDK 自动判断是否追加
|
|
829
|
+
await sdk.startStreamBroadcast({
|
|
830
|
+
type: BroadcastType.TEXT,
|
|
831
|
+
humanCode: 'avatar001',
|
|
832
|
+
text: text,
|
|
833
|
+
voiceCode: 'VOICE001',
|
|
834
|
+
volume: 1.0,
|
|
835
|
+
isSubtitle: false
|
|
836
|
+
});
|
|
837
|
+
}
|
|
838
|
+
|
|
839
|
+
// 用户发起新对话时
|
|
840
|
+
async function onNewConversation(firstText) {
|
|
841
|
+
// forceRestart=true 会停止当前播报并开始新的
|
|
842
|
+
await sdk.startStreamBroadcast({
|
|
843
|
+
type: BroadcastType.TEXT,
|
|
844
|
+
humanCode: 'avatar001',
|
|
845
|
+
text: firstText,
|
|
846
|
+
voiceCode: 'VOICE001',
|
|
847
|
+
volume: 1.0,
|
|
848
|
+
isSubtitle: false
|
|
849
|
+
}, true); // forceRestart = true
|
|
850
|
+
}
|
|
851
|
+
```
|
|
852
|
+
|
|
853
|
+
**完整示例:ChatGPT 流式对话集成**
|
|
854
|
+
|
|
855
|
+
```javascript
|
|
856
|
+
class ChatGPTAvatar {
|
|
857
|
+
constructor(sdk) {
|
|
858
|
+
this.sdk = sdk;
|
|
859
|
+
}
|
|
860
|
+
|
|
861
|
+
// 处理 GPT 流式响应的每个文本片段
|
|
862
|
+
async handleStreamChunk(text) {
|
|
863
|
+
await this.sdk.startStreamBroadcast({
|
|
864
|
+
type: BroadcastType.TEXT,
|
|
865
|
+
humanCode: 'avatar001',
|
|
866
|
+
text: text,
|
|
867
|
+
voiceCode: 'VOICE001',
|
|
868
|
+
volume: 1.0,
|
|
869
|
+
isSubtitle: false
|
|
870
|
+
});
|
|
871
|
+
}
|
|
872
|
+
|
|
873
|
+
// 用户发送新消息,开始新一轮对话
|
|
874
|
+
async startNewConversation(firstResponse) {
|
|
875
|
+
await this.sdk.startStreamBroadcast({
|
|
876
|
+
type: BroadcastType.TEXT,
|
|
877
|
+
humanCode: 'avatar001',
|
|
878
|
+
text: firstResponse,
|
|
879
|
+
voiceCode: 'VOICE001',
|
|
880
|
+
volume: 1.0,
|
|
881
|
+
isSubtitle: false
|
|
882
|
+
}, true); // 强制重新开始
|
|
883
|
+
}
|
|
884
|
+
}
|
|
885
|
+
|
|
886
|
+
// 使用示例
|
|
887
|
+
const chatAvatar = new ChatGPTAvatar(sdk);
|
|
888
|
+
|
|
889
|
+
// 模拟 GPT 流式响应
|
|
890
|
+
const gptResponses = [
|
|
891
|
+
'您好!',
|
|
892
|
+
'我是您的 AI 助手,',
|
|
893
|
+
'很高兴为您服务。',
|
|
894
|
+
'请问有什么可以帮助您的吗?'
|
|
895
|
+
];
|
|
896
|
+
|
|
897
|
+
// 依次播报每个片段,SDK 自动管理队列
|
|
898
|
+
for (const text of gptResponses) {
|
|
899
|
+
await new Promise(resolve => setTimeout(resolve, 200)); // 间隔200毫秒模拟响应
|
|
900
|
+
await chatAvatar.handleStreamChunk(text);
|
|
901
|
+
}
|
|
902
|
+
```
|
|
903
|
+
|
|
904
|
+
> **推荐**:对于 ChatGPT 等流式对话场景,**优先使用 `startStreamBroadcast`**,可减少状态管理代码,降低出错概率。
|
|
905
|
+
|
|
773
906
|
##### pauseBroadcast()
|
|
774
907
|
|
|
775
908
|
```typescript
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
@@ -24,7 +24,7 @@
|
|
|
24
24
|
"@element-plus/icons-vue": "^2.3.1",
|
|
25
25
|
"@vueuse/core": "^13.5.0",
|
|
26
26
|
"@vueuse/integrations": "^13.5.0",
|
|
27
|
-
"@zeewain/3d-avatar-sdk": "^2.1
|
|
27
|
+
"@zeewain/3d-avatar-sdk": "^2.2.1",
|
|
28
28
|
"dayjs": "^1.11.13",
|
|
29
29
|
"element-plus": "^2.10.4",
|
|
30
30
|
"vite-plugin-html": "^3.2.2",
|
|
@@ -333,6 +333,7 @@ function initializeSDKConfig(): ZEEAvatarSDK | null {
|
|
|
333
333
|
},
|
|
334
334
|
onError: (error:any) => {
|
|
335
335
|
sdkStatus.isStartBroadcast = false;
|
|
336
|
+
broadcastAPI.value?.reset();
|
|
336
337
|
addLog(`播报失败: ${error.message}`, 'error');
|
|
337
338
|
},
|
|
338
339
|
onPause: () => {
|
|
@@ -487,7 +488,11 @@ async function handleTextBroadcast(params: {
|
|
|
487
488
|
|
|
488
489
|
console.warn('handleTextBroadcast: ', broadcastParams, isAppend);
|
|
489
490
|
addLog(`${isAppend ? '追加播报' : '开始播报'}:${JSON.stringify({'isAppend': isAppend})}`, 'success');
|
|
490
|
-
|
|
491
|
+
// 方案一:使用普通播报接口,搭配`isAppend`参数控制播报模式
|
|
492
|
+
// await sdk.value.startBroadcast(broadcastParams, isAppend);
|
|
493
|
+
|
|
494
|
+
// 方案二:直接使用流式播报接口,内部自动维护播报状态(支持多次调用,自动追加到播报队列)
|
|
495
|
+
await sdk.value.startStreamBroadcast(broadcastParams);
|
|
491
496
|
// ElMessage.success('文本播报已开始');
|
|
492
497
|
} catch (error) {
|
|
493
498
|
const message = error instanceof Error ? error.message : String(error);
|
|
@@ -632,6 +632,7 @@ async function handleQueueBroadcast() {
|
|
|
632
632
|
|
|
633
633
|
// 如果不是最后一个,等待配置的间隔时间再发送下一个
|
|
634
634
|
if (i < textLines.length - 1) {
|
|
635
|
+
if(queueProgress.total !== 0)
|
|
635
636
|
await new Promise(resolve => setTimeout(resolve, interval));
|
|
636
637
|
}
|
|
637
638
|
}
|
|
@@ -641,6 +642,8 @@ async function handleQueueBroadcast() {
|
|
|
641
642
|
// 延迟重置状态,让用户看到完成提示
|
|
642
643
|
setTimeout(() => {
|
|
643
644
|
isQueueBroadcasting.value = false;
|
|
645
|
+
queueProgress.current = 0;
|
|
646
|
+
queueProgress.total = 0;
|
|
644
647
|
}, 1000);
|
|
645
648
|
|
|
646
649
|
} catch (error: any) {
|
|
@@ -732,6 +735,14 @@ function clearResult() {
|
|
|
732
735
|
result.value = '等待播报操作...\n\n新版SDK特性:\n- 支持流式播报,实时响应\n- 内置事件回调机制\n- token统一管理,无需重复传递\n- 支持音量和语速控制\n- 实时播报控制(暂停/恢复/停止)\n\n💾 表单数据已启用自动缓存功能';
|
|
733
736
|
}
|
|
734
737
|
|
|
738
|
+
function reset() {
|
|
739
|
+
queueProgress.current = 0;
|
|
740
|
+
queueProgress.total = 0;
|
|
741
|
+
}
|
|
742
|
+
|
|
743
|
+
defineExpose({
|
|
744
|
+
reset
|
|
745
|
+
});
|
|
735
746
|
</script>
|
|
736
747
|
|
|
737
748
|
<style lang="scss" scoped>
|
package/dist/index.d.ts
CHANGED
|
@@ -718,13 +718,14 @@ declare class BroadcastService extends UnityBaseService<BroadcastOperationType>
|
|
|
718
718
|
*/
|
|
719
719
|
private handleError;
|
|
720
720
|
/**
|
|
721
|
-
*
|
|
721
|
+
* 创建播报请求错误对象
|
|
722
722
|
* @param errorCode - 错误码
|
|
723
723
|
* @param errorMessage - 错误消息
|
|
724
|
-
* @
|
|
724
|
+
* @returns SDKError 错误对象
|
|
725
|
+
* @description 根据错误码创建对应的 SDKError 对象
|
|
725
726
|
* @private
|
|
726
727
|
*/
|
|
727
|
-
private
|
|
728
|
+
private createBroadcastError;
|
|
728
729
|
/**
|
|
729
730
|
* 启动下一个待处理任务的请求
|
|
730
731
|
* @description 在当前任务请求完成或失败后,检查并启动下一个待处理任务
|
|
@@ -1347,12 +1348,20 @@ declare class ZEEAvatarSDK {
|
|
|
1347
1348
|
*/
|
|
1348
1349
|
setCamera(cameraType: AvatarCameraType): Promise<IAvatarCallbackResponse>;
|
|
1349
1350
|
/**
|
|
1350
|
-
*
|
|
1351
|
+
* 开始播报(适用于普通播报场景)
|
|
1351
1352
|
* @param params 播报参数
|
|
1352
1353
|
* @param isAppend 是否追加播报
|
|
1353
1354
|
* @returns Promise<void> 播报操作的Promise
|
|
1354
1355
|
*/
|
|
1355
1356
|
startBroadcast(params: IBroadcastParams, isAppend?: boolean): Promise<void>;
|
|
1357
|
+
/**
|
|
1358
|
+
* 开始流式播报(适用于ChatGPT等对话场景)
|
|
1359
|
+
* @param params 播报参数
|
|
1360
|
+
* @param forceRestart 是否强制重新开始(停止当前播报并开始新的)
|
|
1361
|
+
* @returns Promise<void> 播报操作的Promise
|
|
1362
|
+
* @description SDK内部自动维护播报状态,首次调用或空闲时使用 isAppend=false,后续调用自动使用 isAppend=true
|
|
1363
|
+
*/
|
|
1364
|
+
startStreamBroadcast(params: IBroadcastParams, forceRestart?: boolean): Promise<void>;
|
|
1356
1365
|
/**
|
|
1357
1366
|
* 暂停播报
|
|
1358
1367
|
* @param resetIdle 是否重置空闲状态
|
|
@@ -1432,7 +1441,7 @@ declare class ZEEAvatarSDK {
|
|
|
1432
1441
|
* SDK 版本号
|
|
1433
1442
|
* @const {string} SDK_VERSION
|
|
1434
1443
|
*/
|
|
1435
|
-
declare const SDK_VERSION = "2.1
|
|
1444
|
+
declare const SDK_VERSION = "2.2.1";
|
|
1436
1445
|
|
|
1437
1446
|
export { AvatarCameraType, AvatarOperationType, AvatarService, BroadcastOperationType, BroadcastService, BroadcastType, ConfigErrorCode, ERROR_CODE_MAP, ErrorCategory, NetworkErrorCode, OperationErrorCode, ResourceErrorCode, SDKError, SDK_VERSION, SystemErrorCode, UnityOperationStatus, ZEEAvatarLoader, ZEEAvatarSDK, getErrorInfo };
|
|
1438
1447
|
export type { IAvatarAPI, IAvatarCallbackResponse, IAvatarSDKConfig, IBroadcastAPI, IBroadcastCallbacks, IBroadcastParams, IBroadcastResponse, IBroadcastServiceConfig, IUnityCallbackManager, IUnityCallbackResponse, IUnityInstance, IUnityMessageSender, IUnityServiceConfig, SDKErrorCode, TOperationType };
|