|
|
@@ -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
|