Browse Source

语音识别接口,同一次识别累计追加,获取结果给全部数据

liyanbo 1 tháng trước cách đây
mục cha
commit
eb67ec4b5f

+ 28 - 6
byzs-module-ai/src/main/java/cn/iocoder/byzs/module/ai/controller/admin/speech/SpeechRecognitionController.java

@@ -12,6 +12,7 @@ import io.swagger.v3.oas.annotations.Operation;
 import io.swagger.v3.oas.annotations.Parameter;
 import io.swagger.v3.oas.annotations.tags.Tag;
 import lombok.extern.slf4j.Slf4j;
+import org.springdoc.core.models.GroupedOpenApi;
 import org.springframework.web.bind.annotation.*;
 
 import java.util.concurrent.ConcurrentHashMap;
@@ -31,6 +32,8 @@ public class SpeechRecognitionController {
     private final ConcurrentHashMap<String, NlsClient> clientMap = new ConcurrentHashMap<>();
     // 存储每个会话的识别结果
     private final ConcurrentHashMap<String, String> resultMap = new ConcurrentHashMap<>();
+    // 存储累积识别结果的映射,键为sessionId,值为累积的识别结果
+    private final ConcurrentHashMap<String, String> accumulatedResultMap = new ConcurrentHashMap<>();
 
     // 配置参数
     private final String appKey = "4SUOF4LfaU7FekyW";
@@ -38,6 +41,9 @@ public class SpeechRecognitionController {
     private final String accessKeySecret = "HCXpFYjl4swk0qwfIKa9s2bXx0AWcG";
     private final String url = System.getenv().getOrDefault("NLS_GATEWAY_URL", "wss://nls-gateway-cn-shanghai.aliyuncs.com/ws/v1");
 
+    public SpeechRecognitionController(GroupedOpenApi systemGroupedOpenApi) {
+    }
+
     @PostMapping("/start")
     @Operation(summary = "开始语音识别")
     @Parameter(name = "sessionId", description = "会话ID", required = true)
@@ -124,11 +130,20 @@ public class SpeechRecognitionController {
     @Parameter(name = "sessionId", description = "会话ID", required = true)
     public CommonResult<RecognitionResult> getRecognitionResult(@RequestParam("sessionId") String sessionId) {
         try {
-            String result = resultMap.get(sessionId);
-            if (result == null) {
-                result = "";
+            // 先获取累积的识别结果
+            String accumulatedResult = accumulatedResultMap.get(sessionId);
+            if (accumulatedResult == null) {
+                accumulatedResult = "";
+            }
+            // 获取最新的中间结果
+            String latestResult = resultMap.get(sessionId);
+            if (latestResult == null) {
+                latestResult = "";
             }
-            return success(new RecognitionResult(result));
+            // 如果累积结果为空,使用最新结果;否则确保最新结果已包含在累积结果中
+            String finalResult = accumulatedResult.isEmpty() ? latestResult : accumulatedResult;
+            System.out.println("【获取识别结果】 " + sessionId + "-----" + finalResult);
+            return success(new RecognitionResult(finalResult));
         } catch (Exception e) {
             log.error("Error getting recognition result", e);
             return CommonResult.error(INTERNAL_SERVER_ERROR.getCode(), "Failed to get recognition result");
@@ -158,7 +173,7 @@ public class SpeechRecognitionController {
             public void onTranscriptionResultChange(SpeechTranscriberResponse response) {
                 String result = response.getTransSentenceText();
                 log.info("Session {} - Intermediate result: {}", sessionId, result);
-                // 更新识别结果
+                // 更新最新结果
                 resultMap.put(sessionId, result);
             }
 
@@ -167,6 +182,7 @@ public class SpeechRecognitionController {
                 log.info("Session {} - Recognition started: {}", sessionId, response.getTaskId());
                 // 初始化识别结果
                 resultMap.put(sessionId, "");
+                accumulatedResultMap.put(sessionId, "");
             }
 
             @Override
@@ -178,8 +194,14 @@ public class SpeechRecognitionController {
             public void onSentenceEnd(SpeechTranscriberResponse response) {
                 String result = response.getTransSentenceText();
                 log.info("Session {} - Sentence ended: {}", sessionId, result);
-                // 更新识别结果
+                // 保持最终结果
                 resultMap.put(sessionId, result);
+                // 将新句子追加到累积结果中,保留历史句子
+                String oldResult = accumulatedResultMap.get(sessionId);
+                if (oldResult == null) {
+                    oldResult = "";
+                }
+                accumulatedResultMap.put(sessionId, oldResult + result);
             }
 
             @Override