Kaynağa Gözat

优化诗词朗读评价接口

liyanbo 1 ay önce
ebeveyn
işleme
21ed9aff4e

+ 1 - 1
byzs-web/src/main/java/cn/iocoder/byzs/module/web/controller/admin/ai/WebAiController.java

@@ -336,7 +336,7 @@ public class WebAiController {
                                     .role(ResponsesConstants.MESSAGE_ROLE_USER)
                                     .content(MessageContent.builder()
                                             .addListItem(InputContentItemAudio.builder().audioUrl(base64Audio).build())
-                                            .addListItem(InputContentItemText.builder().text("请评价这段朗读").build())
+                                            .addListItem(InputContentItemText.builder().text(visionThinkReqVO.getPrompt() == null ? "请评价这段朗读" : visionThinkReqVO.getPrompt()).build())
                                             .build())
                                     .build())
                             .build())

+ 32 - 9
byzs-web/src/main/java/cn/iocoder/byzs/module/web/service/ai/WebAiServiceImpl.java

@@ -929,26 +929,49 @@ public class WebAiServiceImpl {
         // 1. 获取TTS配置
         AiTtsDO aiTtsDO = getTtsConfig(roleId);
 
-        byte[] audioData;
-        // 2. 根据平台选择不同的TTS服务
+        // 使用 ByteArrayOutputStream 收集流式音频数据
+        java.io.ByteArrayOutputStream audioOutputStream = new java.io.ByteArrayOutputStream();
+
+        // 2. 根据平台选择不同的TTS服务(使用流式接口获取PCM格式)
         if ("DouBao".equals(aiTtsDO.getPlatform())) {
-            // 使用豆包TTS服务
+            // 使用豆包TTS流式服务获取PCM数据
             try {
-                audioData = douBaoTtsService.convertTextToSpeech(aiTtsDO, content, command);
-            } catch (Exception e) {
+                douBaoTtsService.streamTextToSpeech(aiTtsDO, content, command, bytes -> {
+                    try {
+                        audioOutputStream.write(bytes);
+                    } catch (java.io.IOException e) {
+                        throw new RuntimeException("写入音频数据失败", e);
+                    }
+                });
+            } catch (java.io.IOException e) {
                 throw new RuntimeException("豆包文本转语音失败", e);
             }
         } else {
-            // 使用阿里云TTS服务
+            // 使用阿里云TTS流式服务获取PCM数据
+            StreamingAliyunTtsService streamingAliyunTtsService = streamTtsServiceProvider.getObject();
             try {
-                audioData = aliyunTtsService.convertTextToSpeech(aiTtsDO, content);
+                streamingAliyunTtsService.setAudioDataCallback(bytes -> {
+                    try {
+                        audioOutputStream.write(bytes);
+                    } catch (java.io.IOException e) {
+                        throw new RuntimeException("写入音频数据失败", e);
+                    }
+                });
+                streamingAliyunTtsService.startTts(aiTtsDO, com.alibaba.nls.client.protocol.OutputFormatEnum.PCM);
+                streamingAliyunTtsService.sendText(content);
+                streamingAliyunTtsService.stopTts();
             } catch (Exception e) {
                 throw new RuntimeException("阿里云文本转语音失败", e);
+            } finally {
+                if (streamingAliyunTtsService != null) {
+                    streamingAliyunTtsService.stopTts();
+                }
             }
         }
 
-        // 3. 添加WAV头并转换为Base64(纯Base64,无前缀,与流式接口格式一致)
-        byte[] wavData = WavHeader.addWavHeader(audioData, SampleRateEnum.SAMPLE_RATE_16K.value, 16, 1);
+        // 3. 获取PCM音频数据并添加WAV头
+        byte[] pcmData = audioOutputStream.toByteArray();
+        byte[] wavData = WavHeader.addWavHeader(pcmData, SampleRateEnum.SAMPLE_RATE_16K.value, 16, 1);
         return java.util.Base64.getEncoder().encodeToString(wavData);
     }
 }