@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 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
@@ -16,7 +16,7 @@
16
16
  "lint:all-fix": "npm run lint:fix && npm run lint:css-fix"
17
17
  },
18
18
  "dependencies": {
19
- "@zeewain/3d-avatar-sdk": "^2.1.4",
19
+ "@zeewain/3d-avatar-sdk": "^2.2.1",
20
20
  "core-js": "^3.8.3",
21
21
  "element-ui": "^2.15.13",
22
22
  "vue": "^2.6.14"
@@ -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.4",
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
- await sdk.value.startBroadcast(broadcastParams, isAppend);
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
- * @description 处理播报过程中的错误
724
+ * @returns SDKError 错误对象
725
+ * @description 根据错误码创建对应的 SDKError 对象
725
726
  * @private
726
727
  */
727
- private handleBroadcastError;
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.4";
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 };