Bladeren bron

优化问答数字人豆包tts多线程并发情况数据不影响

liyanbo 2 weken geleden
bovenliggende
commit
34a71916ee

+ 48 - 47
byzs-module-ai/src/main/java/cn/iocoder/byzs/module/ai/service/chat/AiChatMessageServiceImpl.java

@@ -122,12 +122,6 @@ public class AiChatMessageServiceImpl implements AiChatMessageService {
     @Resource
     private AiTtsMapper ttsMapper;
 
-    // 豆包TTS的sink引用,用于发送音频数据
-    private AtomicReference<FluxSink<CommonResult<AiChatMessageSendRespVO>>> douBaoSinkRef;
-    
-    // 标记是否是首次发送豆包TTS音频数据
-    private final AtomicBoolean isFirstDouBaoAudio = new AtomicBoolean(true);
-
     @Transactional(rollbackFor = Exception.class)
     public AiChatMessageSendRespVO sendMessage(AiChatMessageSendReqVO sendReqVO, Long userId) {
         // 1.1 校验对话存在
@@ -236,6 +230,12 @@ public class AiChatMessageServiceImpl implements AiChatMessageService {
         StringBuffer contentTTSBuffer;
         Pattern sentencePattern;
         Flux<CommonResult<AiChatMessageSendRespVO>> audioStream = Flux.empty();
+        // 豆包TTS的sink引用,用于发送音频数据
+        AtomicReference<FluxSink<CommonResult<AiChatMessageSendRespVO>>> douBaoSinkRef = new AtomicReference<>();
+        // 标记是否是首次发送豆包TTS音频数据
+        AtomicBoolean isFirstDouBaoAudio = new AtomicBoolean(true);
+        // 豆包TTS任务计数器
+        AtomicInteger douBaoTtsTaskCount = new AtomicInteger(0);
 
         if (finalUseTts) {
             // 判断是否为豆包TTS
@@ -251,13 +251,9 @@ public class AiChatMessageServiceImpl implements AiChatMessageService {
                 // 豆包TTS服务 - 同步合成,模拟流式处理
                 log.info("使用豆包TTS服务");
                 // 为豆包TTS创建音频流,用于发送同步合成的音频数据
-                // 重置豆包TTS的sink引用
-                this.douBaoSinkRef = new AtomicReference<>();
-                // 重置首次音频标志
-                this.isFirstDouBaoAudio.set(true);
                 
                 audioStream = Flux.create(sink2 -> {
-                    this.douBaoSinkRef.set(sink2);
+                    douBaoSinkRef.set(sink2);
                 });
                 
                 // 启动豆包TTS服务
@@ -333,28 +329,28 @@ public class AiChatMessageServiceImpl implements AiChatMessageService {
                 log.debug("TTS新内容: {}", newContent);
 
                 // 发送新内容到TTS服务进行语音合成
-                if (ttsTask.get() != null) {
-                    ttsTask.get().cancel(false); // 取消之前的延迟任务
-                }
-                // 延迟200ms执行,合并短时间内到达的文本片段
-                ttsTask.set(scheduler.schedule(() -> {
-                    Matcher matcher = sentencePattern.matcher(contentTTSBuffer);
-                    boolean isDouBaoTts = finalAiTtsDO != null && "DouBao".equals(finalAiTtsDO.getPlatform());
-                    
-                    if (matcher.find()) {
-                        if (isDouBaoTts) {
-                            processCompleteSentence(finalAiTtsDO, contentTTSBuffer, matcher);
-                        } else {
-                            processCompleteSentence(streamingAliyunTtsService, contentTTSBuffer, matcher);
-                        }
-                    } else if (contentTTSBuffer.length() > 50) { // 最长50字未结束也处理
-                        if (isDouBaoTts) {
-                            processCompleteSentence(finalAiTtsDO, contentTTSBuffer, contentTTSBuffer.length());
-                        } else {
-                            processCompleteSentence(streamingAliyunTtsService, contentTTSBuffer, contentTTSBuffer.length());
-                        }
+            if (ttsTask.get() != null) {
+                ttsTask.get().cancel(false); // 取消之前的延迟任务
+            }
+            // 延迟200ms执行,合并短时间内到达的文本片段
+            ttsTask.set(scheduler.schedule(() -> {
+                Matcher matcher = sentencePattern.matcher(contentTTSBuffer);
+                boolean isDouBaoTts = finalAiTtsDO != null && "DouBao".equals(finalAiTtsDO.getPlatform());
+                
+                if (matcher.find()) {
+                    if (isDouBaoTts) {
+                        processCompleteSentence(finalAiTtsDO, contentTTSBuffer, matcher, douBaoSinkRef, isFirstDouBaoAudio, douBaoTtsTaskCount);
+                    } else {
+                        processCompleteSentence(streamingAliyunTtsService, contentTTSBuffer, matcher);
                     }
-                }, 500, TimeUnit.MILLISECONDS));
+                } else if (contentTTSBuffer.length() > 50) { // 最长50字未结束也处理
+                    if (isDouBaoTts) {
+                        processCompleteSentence(finalAiTtsDO, contentTTSBuffer, contentTTSBuffer.length(), douBaoSinkRef, isFirstDouBaoAudio, douBaoTtsTaskCount);
+                    } else {
+                        processCompleteSentence(streamingAliyunTtsService, contentTTSBuffer, contentTTSBuffer.length());
+                    }
+                }
+            }, 500, TimeUnit.MILLISECONDS));
             }
 
             CommonResult<AiChatMessageSendRespVO> result = success(new AiChatMessageSendRespVO()
@@ -371,7 +367,7 @@ public class AiChatMessageServiceImpl implements AiChatMessageService {
                 
                 if (isDouBaoTts) {
                     // 处理豆包TTS剩余文本
-                    processRemainingText(finalAiTtsDO, contentTTSBuffer);
+                    processRemainingText(finalAiTtsDO, contentTTSBuffer, douBaoSinkRef, isFirstDouBaoAudio, douBaoTtsTaskCount);
                     
                     // 等待一段时间,确保所有TTS任务都已完成
                     try {
@@ -382,8 +378,8 @@ public class AiChatMessageServiceImpl implements AiChatMessageService {
                         // 再等待一段时间,确保所有音频数据都已发送
                         Thread.sleep(500);
                         // 关闭豆包TTS音频流
-                        if (this.douBaoSinkRef != null && this.douBaoSinkRef.get() != null) {
-                            this.douBaoSinkRef.get().complete();
+                        if (douBaoSinkRef != null && douBaoSinkRef.get() != null) {
+                            douBaoSinkRef.get().complete();
                             log.info("豆包TTS音频流已关闭");
                             // 停止豆包TTS服务
                             streamingDouBaoTtsService.stopTts();
@@ -496,14 +492,16 @@ public class AiChatMessageServiceImpl implements AiChatMessageService {
     }
 
     // 处理完整句子 - 豆包TTS
-    private void processCompleteSentence(AiTtsDO aiTtsDO, StringBuffer buffer, Matcher matcher) {
+    private void processCompleteSentence(AiTtsDO aiTtsDO, StringBuffer buffer, Matcher matcher, 
+                                         AtomicReference<FluxSink<CommonResult<AiChatMessageSendRespVO>>> douBaoSinkRef, 
+                                         AtomicBoolean isFirstDouBaoAudio, AtomicInteger douBaoTtsTaskCount) {
         if (buffer == null || matcher == null) {
             return;
         }
 
         String sentence = buffer.substring(0, matcher.end());
         log.debug("[处理完整句子][buffer: {}", sentence);
-        processDouBaoTts(aiTtsDO, sentence);
+        processDouBaoTts(aiTtsDO, sentence, douBaoSinkRef, isFirstDouBaoAudio, douBaoTtsTaskCount);
         buffer.delete(0, matcher.end());
         log.info("豆包TTS合成完整句: {}", sentence);
     }
@@ -522,14 +520,16 @@ public class AiChatMessageServiceImpl implements AiChatMessageService {
     }
 
     // 处理指定长度文本 - 豆包TTS
-    private void processCompleteSentence(AiTtsDO aiTtsDO, StringBuffer buffer, int length) {
+    private void processCompleteSentence(AiTtsDO aiTtsDO, StringBuffer buffer, int length, 
+                                         AtomicReference<FluxSink<CommonResult<AiChatMessageSendRespVO>>> douBaoSinkRef, 
+                                         AtomicBoolean isFirstDouBaoAudio, AtomicInteger douBaoTtsTaskCount) {
         if (buffer == null || length <= 0) {
             return;
         }
 
         String sentence = buffer.substring(0, length);
         log.debug("[处理指定长度文本][buffer: {}", sentence);
-        processDouBaoTts(aiTtsDO, sentence);
+        processDouBaoTts(aiTtsDO, sentence, douBaoSinkRef, isFirstDouBaoAudio, douBaoTtsTaskCount);
         buffer.delete(0, length);
         log.info("豆包TTS合成长文本: {}", sentence);
     }
@@ -545,11 +545,10 @@ public class AiChatMessageServiceImpl implements AiChatMessageService {
         buffer.setLength(0);
     }
 
-    // 豆包TTS任务计数器
-    private final AtomicInteger douBaoTtsTaskCount = new AtomicInteger(0);
-
     // 处理豆包TTS合成
-    private void processDouBaoTts(AiTtsDO aiTtsDO, String text) {
+    private void processDouBaoTts(AiTtsDO aiTtsDO, String text, 
+                                  AtomicReference<FluxSink<CommonResult<AiChatMessageSendRespVO>>> douBaoSinkRef, 
+                                  AtomicBoolean isFirstDouBaoAudio, AtomicInteger douBaoTtsTaskCount) {
         if (text == null || text.trim().isEmpty()) {
             return;
         }
@@ -588,9 +587,9 @@ public class AiChatMessageServiceImpl implements AiChatMessageService {
                         log.info("豆包TTS合成成功,准备发送音频数据");
 
                         // 将音频数据发送到前端
-                        if (this.douBaoSinkRef != null && this.douBaoSinkRef.get() != null) {
+                        if (douBaoSinkRef != null && douBaoSinkRef.get() != null) {
                             try {
-                                this.douBaoSinkRef.get().next(success(audioResp));
+                                douBaoSinkRef.get().next(success(audioResp));
                                 log.info("豆包TTS音频数据发送成功");
                             } catch (Exception e) {
                                 log.error("发送豆包TTS音频数据失败", e);
@@ -612,13 +611,15 @@ public class AiChatMessageServiceImpl implements AiChatMessageService {
     }
 
     // 处理剩余文本 - 豆包TTS
-    private void processRemainingText(AiTtsDO aiTtsDO, StringBuffer buffer) {
+    private void processRemainingText(AiTtsDO aiTtsDO, StringBuffer buffer, 
+                                     AtomicReference<FluxSink<CommonResult<AiChatMessageSendRespVO>>> douBaoSinkRef, 
+                                     AtomicBoolean isFirstDouBaoAudio, AtomicInteger douBaoTtsTaskCount) {
         if (buffer == null || buffer.isEmpty()) {
             return;
         }
 
         log.info("豆包TTS合成剩余文本: {}", buffer);
-        processDouBaoTts(aiTtsDO, buffer.toString());
+        processDouBaoTts(aiTtsDO, buffer.toString(), douBaoSinkRef, isFirstDouBaoAudio, douBaoTtsTaskCount);
         buffer.setLength(0);
     }
 

+ 44 - 38
byzs-web/src/main/java/cn/iocoder/byzs/module/web/service/ai/WebAiServiceImpl.java

@@ -68,15 +68,6 @@ public class WebAiServiceImpl {
     @Resource
     private StreamingDouBaoTtsService streamingDouBaoTtsService;
 
-    // 豆包TTS的sink引用,用于发送音频数据
-    private AtomicReference<FluxSink<CommonResult<AiChatMessageSendRespVO>>> douBaoSinkRef;
-    
-    // 标记是否是首次发送豆包TTS音频数据
-    private final AtomicBoolean isFirstDouBaoAudio = new AtomicBoolean(true);
-    
-    // 豆包TTS任务计数器
-    private final AtomicInteger douBaoTtsTaskCount = new AtomicInteger(0);
-
     /**
      * 发送指定回答的SSE流式响应
      * 确保TEXT类型文本数据优先且可靠地发送到前端,同时提供AUDIO音频流
@@ -110,10 +101,6 @@ public class WebAiServiceImpl {
             if (isDouBaoTts) {
                 // 初始化豆包TTS服务
                 streamingDouBaoTtsService.startTts(aiTtsDO);
-                // 重置豆包TTS的sink引用
-                this.douBaoSinkRef = new AtomicReference<>();
-                // 重置豆包TTS的首次音频标记
-                isFirstDouBaoAudio.set(true);
             } else {
                 // 初始化阿里云TTS服务
                 streamingAliyunTtsService.startTts(aiTtsDO);
@@ -164,6 +151,12 @@ public class WebAiServiceImpl {
                     StringBuilder contentTTSBuffer = new StringBuilder(contentAnswer);
                     AtomicBoolean ttsStopped = new AtomicBoolean(false);
                     AtomicBoolean allTextProcessed = new AtomicBoolean(false);
+                    // 豆包TTS的sink引用,用于发送音频数据
+                    AtomicReference<FluxSink<CommonResult<AiChatMessageSendRespVO>>> douBaoSinkRef = new AtomicReference<>();
+                    // 标记是否是首次发送豆包TTS音频数据
+                    AtomicBoolean isFirstDouBaoAudio = new AtomicBoolean(true);
+                    // 豆包TTS任务计数器
+                    AtomicInteger douBaoTtsTaskCount = new AtomicInteger(0);
 
                     try {
                         // 发送文本数据(带type)
@@ -172,7 +165,7 @@ public class WebAiServiceImpl {
                         // 处理音频流
                         if (isDouBaoTts) {
                             // 为豆包TTS设置sink
-                            this.douBaoSinkRef.set(sink);
+                            douBaoSinkRef.set(sink);
                         } else {
                             // 为阿里云TTS设置音频数据回调
                             AtomicBoolean isFirstChunk = new AtomicBoolean(true); // 首包标志位
@@ -202,7 +195,7 @@ public class WebAiServiceImpl {
                         Pattern sentencePattern = Pattern.compile("[。!?;\n\r]");
                         if (isDouBaoTts) {
                             processTextSegmentsForDouBao(aiTtsDO, contentTTSBuffer, sentencePattern,
-                                    scheduler, ttsTask, ttsStopped, allTextProcessed, sink);
+                                    scheduler, ttsTask, ttsStopped, allTextProcessed, sink, douBaoSinkRef, isFirstDouBaoAudio, douBaoTtsTaskCount);
                         } else {
                             processTextSegments(streamingAliyunTtsService, contentTTSBuffer, sentencePattern,
                                     scheduler, ttsTask, ttsStopped, allTextProcessed, sink);
@@ -522,10 +515,11 @@ public class WebAiServiceImpl {
     private void createAndSubscribeToDouBaoAudioStream(FluxSink<CommonResult<AiChatMessageSendRespVO>> mainSink,
                                                       ScheduledExecutorService scheduler,
                                                       AtomicReference<ScheduledFuture<?>> ttsTask,
-                                                      AtomicBoolean ttsStopped, AiTtsDO aiTtsDO) {
+                                                      AtomicBoolean ttsStopped, AiTtsDO aiTtsDO,
+                                                      AtomicReference<FluxSink<CommonResult<AiChatMessageSendRespVO>>> douBaoSinkRef) {
         Flux.<CommonResult<AiChatMessageSendRespVO>>create(audioSink -> {
             // 保存豆包TTS的sink引用
-            this.douBaoSinkRef.set(audioSink);
+            douBaoSinkRef.set(audioSink);
         }).subscribe(
                 chunk -> {
                     if (!mainSink.isCancelled()) {
@@ -565,31 +559,33 @@ public class WebAiServiceImpl {
     private void processTextSegmentsForDouBao(AiTtsDO aiTtsDO, StringBuilder buffer,
                                              Pattern sentencePattern, ScheduledExecutorService scheduler,
                                              AtomicReference<ScheduledFuture<?>> ttsTask, AtomicBoolean ttsStopped,
-                                             AtomicBoolean allTextProcessed, FluxSink<CommonResult<AiChatMessageSendRespVO>> sink) {
+                                             AtomicBoolean allTextProcessed, FluxSink<CommonResult<AiChatMessageSendRespVO>> sink,
+                                             AtomicReference<FluxSink<CommonResult<AiChatMessageSendRespVO>>> douBaoSinkRef,
+                                             AtomicBoolean isFirstDouBaoAudio, AtomicInteger douBaoTtsTaskCount) {
         if (buffer.isEmpty()) {
             log.info("文本为空,无需处理");
-            handleDouBaoTextComplete(aiTtsDO, scheduler, ttsStopped, allTextProcessed, sink);
+            handleDouBaoTextComplete(aiTtsDO, scheduler, ttsStopped, allTextProcessed, sink, douBaoSinkRef, douBaoTtsTaskCount);
             return;
         }
 
         // 立即处理文本
         Matcher matcher = sentencePattern.matcher(buffer);
         if (matcher.find()) {
-            processDouBaoCompleteSentence(aiTtsDO, buffer, matcher);
+            processDouBaoCompleteSentence(aiTtsDO, buffer, matcher, douBaoSinkRef, isFirstDouBaoAudio, douBaoTtsTaskCount);
             // 继续调度处理剩余文本
             scheduleDouBaoNextProcessing(aiTtsDO, buffer, sentencePattern, scheduler,
-                    ttsTask, ttsStopped, allTextProcessed, sink);
+                    ttsTask, ttsStopped, allTextProcessed, sink, douBaoSinkRef, isFirstDouBaoAudio, douBaoTtsTaskCount);
         } else if (buffer.length() > 50) { // 最长50字未结束也处理
-            processDouBaoCompleteSentence(aiTtsDO, buffer, buffer.length());
+            processDouBaoCompleteSentence(aiTtsDO, buffer, buffer.length(), douBaoSinkRef, isFirstDouBaoAudio, douBaoTtsTaskCount);
             // 继续调度处理剩余文本
             scheduleDouBaoNextProcessing(aiTtsDO, buffer, sentencePattern, scheduler,
-                    ttsTask, ttsStopped, allTextProcessed, sink);
+                    ttsTask, ttsStopped, allTextProcessed, sink, douBaoSinkRef, isFirstDouBaoAudio, douBaoTtsTaskCount);
         } else {
             // 文本较短且未结束,直接处理全部
             log.info("豆包TTS合成短文本: {}", buffer.toString());
-            processDouBaoTts(aiTtsDO, buffer.toString());
+            processDouBaoTts(aiTtsDO, buffer.toString(), douBaoSinkRef, isFirstDouBaoAudio, douBaoTtsTaskCount);
             buffer.setLength(0);
-            handleDouBaoTextComplete(aiTtsDO, scheduler, ttsStopped, allTextProcessed, sink);
+            handleDouBaoTextComplete(aiTtsDO, scheduler, ttsStopped, allTextProcessed, sink, douBaoSinkRef, douBaoTtsTaskCount);
         }
     }
 
@@ -599,7 +595,9 @@ public class WebAiServiceImpl {
     private void scheduleDouBaoNextProcessing(AiTtsDO aiTtsDO, StringBuilder buffer,
                                              Pattern sentencePattern, ScheduledExecutorService scheduler,
                                              AtomicReference<ScheduledFuture<?>> ttsTask, AtomicBoolean ttsStopped,
-                                             AtomicBoolean allTextProcessed, FluxSink<CommonResult<AiChatMessageSendRespVO>> sink) {
+                                             AtomicBoolean allTextProcessed, FluxSink<CommonResult<AiChatMessageSendRespVO>> sink,
+                                             AtomicReference<FluxSink<CommonResult<AiChatMessageSendRespVO>>> douBaoSinkRef,
+                                             AtomicBoolean isFirstDouBaoAudio, AtomicInteger douBaoTtsTaskCount) {
         if (!buffer.isEmpty()) {
             // 延迟200ms执行,合并短时间内处理的文本片段
             if (ttsTask.get() != null) {
@@ -607,11 +605,11 @@ public class WebAiServiceImpl {
             }
             ttsTask.set(scheduler.schedule(() -> {
                 processTextSegmentsForDouBao(aiTtsDO, buffer, sentencePattern, scheduler,
-                        ttsTask, ttsStopped, allTextProcessed, sink);
+                        ttsTask, ttsStopped, allTextProcessed, sink, douBaoSinkRef, isFirstDouBaoAudio, douBaoTtsTaskCount);
             }, 200, TimeUnit.MILLISECONDS));
         } else {
             // 所有文本处理完毕
-            handleDouBaoTextComplete(aiTtsDO, scheduler, ttsStopped, allTextProcessed, sink);
+            handleDouBaoTextComplete(aiTtsDO, scheduler, ttsStopped, allTextProcessed, sink, douBaoSinkRef, douBaoTtsTaskCount);
         }
     }
 
@@ -620,7 +618,9 @@ public class WebAiServiceImpl {
      */
     private void handleDouBaoTextComplete(AiTtsDO aiTtsDO, ScheduledExecutorService scheduler, 
                                          AtomicBoolean ttsStopped, AtomicBoolean allTextProcessed, 
-                                         FluxSink<CommonResult<AiChatMessageSendRespVO>> sink) {
+                                         FluxSink<CommonResult<AiChatMessageSendRespVO>> sink,
+                                         AtomicReference<FluxSink<CommonResult<AiChatMessageSendRespVO>>> douBaoSinkRef,
+                                         AtomicInteger douBaoTtsTaskCount) {
         allTextProcessed.set(true);
         log.info("所有文本处理完毕,准备通知TTS服务文本已发送完毕");
 
@@ -634,8 +634,8 @@ public class WebAiServiceImpl {
                 // 再等待一段时间,确保所有音频数据都已发送
                 Thread.sleep(500);
                 // 关闭豆包TTS音频流
-                if (this.douBaoSinkRef != null && this.douBaoSinkRef.get() != null) {
-                    this.douBaoSinkRef.get().complete();
+                if (douBaoSinkRef != null && douBaoSinkRef.get() != null) {
+                    douBaoSinkRef.get().complete();
                     log.info("豆包TTS音频流已关闭");
                     // 停止豆包TTS服务
                     streamingDouBaoTtsService.stopTts();
@@ -680,9 +680,11 @@ public class WebAiServiceImpl {
     /**
      * 处理豆包TTS完整句子
      */
-    private void processDouBaoCompleteSentence(AiTtsDO aiTtsDO, StringBuilder buffer, Matcher matcher) {
+    private void processDouBaoCompleteSentence(AiTtsDO aiTtsDO, StringBuilder buffer, Matcher matcher,
+                                              AtomicReference<FluxSink<CommonResult<AiChatMessageSendRespVO>>> douBaoSinkRef,
+                                              AtomicBoolean isFirstDouBaoAudio, AtomicInteger douBaoTtsTaskCount) {
         String sentence = buffer.substring(0, matcher.end());
-        processDouBaoTts(aiTtsDO, sentence);
+        processDouBaoTts(aiTtsDO, sentence, douBaoSinkRef, isFirstDouBaoAudio, douBaoTtsTaskCount);
         buffer.delete(0, matcher.end());
         log.info("豆包TTS合成完整句: {}", sentence);
     }
@@ -690,9 +692,11 @@ public class WebAiServiceImpl {
     /**
      * 处理豆包TTS指定长度文本
      */
-    private void processDouBaoCompleteSentence(AiTtsDO aiTtsDO, StringBuilder buffer, int length) {
+    private void processDouBaoCompleteSentence(AiTtsDO aiTtsDO, StringBuilder buffer, int length,
+                                              AtomicReference<FluxSink<CommonResult<AiChatMessageSendRespVO>>> douBaoSinkRef,
+                                              AtomicBoolean isFirstDouBaoAudio, AtomicInteger douBaoTtsTaskCount) {
         String sentence = buffer.substring(0, length);
-        processDouBaoTts(aiTtsDO, sentence);
+        processDouBaoTts(aiTtsDO, sentence, douBaoSinkRef, isFirstDouBaoAudio, douBaoTtsTaskCount);
         buffer.delete(0, length);
         log.info("豆包TTS合成长文本: {}", sentence);
     }
@@ -700,7 +704,9 @@ public class WebAiServiceImpl {
     /**
      * 处理豆包TTS合成
      */
-    private void processDouBaoTts(AiTtsDO aiTtsDO, String text) {
+    private void processDouBaoTts(AiTtsDO aiTtsDO, String text,
+                                 AtomicReference<FluxSink<CommonResult<AiChatMessageSendRespVO>>> douBaoSinkRef,
+                                 AtomicBoolean isFirstDouBaoAudio, AtomicInteger douBaoTtsTaskCount) {
         if (text == null || text.trim().isEmpty()) {
             return;
         }
@@ -739,9 +745,9 @@ public class WebAiServiceImpl {
                         log.info("豆包TTS合成成功,准备发送音频数据");
 
                         // 将音频数据发送到前端
-                        if (this.douBaoSinkRef != null && this.douBaoSinkRef.get() != null) {
+                        if (douBaoSinkRef != null && douBaoSinkRef.get() != null) {
                             try {
-                                this.douBaoSinkRef.get().next(success(audioResp));
+                                douBaoSinkRef.get().next(success(audioResp));
                                 log.info("豆包TTS音频数据发送成功");
                             } catch (Exception e) {
                                 log.error("发送豆包TTS音频数据失败", e);