From 9aba49a8179f75481b7c55b1e396230889c7794e Mon Sep 17 00:00:00 2001 From: spllzh <28668817@qq.com> Date: Tue, 21 Oct 2025 09:23:23 +0800 Subject: [PATCH] =?UTF-8?q?=E9=9F=B3=E9=A2=91=E6=A8=A1=E5=9E=8B=E8=B0=83?= =?UTF-8?q?=E6=95=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/com/rj/common/PasswordUtil.java | 2 + .../java/com/rj/common/ServiceManager.java | 2 + src/main/java/com/rj/config/AliyunConfig.java | 2 + .../controller/SiliconFlowTtsController.java | 2 +- .../controller/TtsRequestLogController.java | 33 +++- .../com/rj/controller/sys/MenuController.java | 2 + .../com/rj/controller/sys/RoleController.java | 2 + .../rj/controller/sys/UserRoleController.java | 2 + .../com/rj/dto/DifyWorkflowResponseDto.java | 2 + .../mapper/CustomerProfileAnalysisMapper.java | 2 + .../com/rj/service/ITtsRequestLogService.java | 17 ++ .../biz/ICustomerProfileAnalysisService.java | 2 + .../CustomerProfileAnalysisServiceImpl.java | 2 + .../impl/TtsRequestLogServiceImpl.java | 145 +++++++++++++++++- .../rj/service/sys/impl/MenuServiceImpl.java | 2 + .../rj/service/sys/impl/RoleServiceImpl.java | 2 + .../service/sys/impl/UserRoleServiceImpl.java | 2 + src/main/resources/application-audio.yml | 2 + src/main/resources/application.yml | 21 +++ .../AudioManagementStatisticsMapper.xml | 2 + src/main/resources/static/tts-demo.html | 2 + .../rj/service/FaceDetectImageCountTest.java | 2 + .../rj/service/TtsRequestLogShortUrlTest.java | 2 + .../rj/service/VideoSynthesisTempUrlTest.java | 2 + .../service/VideoSynthesisVideoNameTest.java | 2 + 25 files changed, 254 insertions(+), 4 deletions(-) diff --git a/src/main/java/com/rj/common/PasswordUtil.java b/src/main/java/com/rj/common/PasswordUtil.java index 2eab882..d28e849 100644 --- a/src/main/java/com/rj/common/PasswordUtil.java +++ b/src/main/java/com/rj/common/PasswordUtil.java @@ -180,6 +180,8 @@ public class PasswordUtil { + + diff --git a/src/main/java/com/rj/common/ServiceManager.java b/src/main/java/com/rj/common/ServiceManager.java index 89ddbbd..6496f00 100644 --- a/src/main/java/com/rj/common/ServiceManager.java +++ b/src/main/java/com/rj/common/ServiceManager.java @@ -164,6 +164,8 @@ public class ServiceManager { + + diff --git a/src/main/java/com/rj/config/AliyunConfig.java b/src/main/java/com/rj/config/AliyunConfig.java index 3919531..09045a5 100644 --- a/src/main/java/com/rj/config/AliyunConfig.java +++ b/src/main/java/com/rj/config/AliyunConfig.java @@ -141,6 +141,8 @@ public class AliyunConfig { + + diff --git a/src/main/java/com/rj/controller/SiliconFlowTtsController.java b/src/main/java/com/rj/controller/SiliconFlowTtsController.java index 3c064a6..3398ef4 100644 --- a/src/main/java/com/rj/controller/SiliconFlowTtsController.java +++ b/src/main/java/com/rj/controller/SiliconFlowTtsController.java @@ -419,7 +419,7 @@ public class SiliconFlowTtsController { String fileExtension = originalFilename != null && originalFilename.contains(".") ? originalFilename.substring(originalFilename.lastIndexOf(".")) : ".mp3"; - String uniqueFileName = "audio/" + UUID.randomUUID().toString() + fileExtension; + String uniqueFileName = "/" + UUID.randomUUID().toString() + fileExtension; // 上传文件到MinIO String minioUrl = minIOService.uploadFileWithName(file, uniqueFileName); diff --git a/src/main/java/com/rj/controller/TtsRequestLogController.java b/src/main/java/com/rj/controller/TtsRequestLogController.java index b926d0c..dd68ccf 100644 --- a/src/main/java/com/rj/controller/TtsRequestLogController.java +++ b/src/main/java/com/rj/controller/TtsRequestLogController.java @@ -5,6 +5,8 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.rj.entity.TtsRequestLog; import com.rj.mapper.TtsRequestLogMapper; import com.rj.service.ITtsRequestLogService; +import com.rj.dto.AsrRequest; +import com.rj.dto.AsrResponse; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.Parameter; import io.swagger.v3.oas.annotations.tags.Tag; @@ -13,7 +15,6 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.*; -import java.time.LocalDateTime; import java.util.HashMap; import java.util.Map; @@ -40,6 +41,7 @@ public class TtsRequestLogController { public ResponseEntity> getTtsRequestLogs( @Parameter(description = "页码") @RequestParam(defaultValue = "1") Integer pageNum, @Parameter(description = "每页大小") @RequestParam(defaultValue = "10") Integer pageSize, + @Parameter(description = "音乐名称") @RequestParam(required = false) String audioName, @Parameter(description = "状态") @RequestParam(required = false) String status, @Parameter(description = "模型") @RequestParam(required = false) String model, @Parameter(description = "创建人姓名") @RequestParam(required = false) String creatorName, @@ -48,12 +50,15 @@ public class TtsRequestLogController { @Parameter(description = "结束时间") @RequestParam(required = false) String endTime) { Map result = new HashMap<>(); - + try { Page page = new Page<>(pageNum, pageSize); QueryWrapper queryWrapper = new QueryWrapper<>(); // 添加查询条件 + if (audioName != null && !audioName.trim().isEmpty()) { + queryWrapper.like("audio_name", audioName); + } if (status != null && !status.trim().isEmpty()) { queryWrapper.eq("status", status); } @@ -149,4 +154,28 @@ public class TtsRequestLogController { return ResponseEntity.status(500).body(result); } } + + @PostMapping("/speech-to-text") + @Operation(summary = "语音转文本", description = "将语音文件转换为文本") + public ResponseEntity speechToText( + @Parameter(description = "语音转文本请求参数") @RequestBody AsrRequest request) { + + try { + if (!ttsRequestLogService.isAsrServiceAvailable()) { + return ResponseEntity.status(500).body(AsrResponse.error("ASR服务不可用,请检查配置")); + } + + AsrResponse response = ttsRequestLogService.speechToText(request); + + if (response.isSuccess()) { + return ResponseEntity.ok(response); + } else { + return ResponseEntity.status(500).body(response); + } + + } catch (Exception e) { + log.error("语音转文本失败: {}", e.getMessage(), e); + return ResponseEntity.status(500).body(AsrResponse.error("语音转文本失败: " + e.getMessage())); + } + } } diff --git a/src/main/java/com/rj/controller/sys/MenuController.java b/src/main/java/com/rj/controller/sys/MenuController.java index 47ce429..b8ced5c 100644 --- a/src/main/java/com/rj/controller/sys/MenuController.java +++ b/src/main/java/com/rj/controller/sys/MenuController.java @@ -402,6 +402,8 @@ public class MenuController { + + diff --git a/src/main/java/com/rj/controller/sys/RoleController.java b/src/main/java/com/rj/controller/sys/RoleController.java index 9da6b72..cbfd867 100644 --- a/src/main/java/com/rj/controller/sys/RoleController.java +++ b/src/main/java/com/rj/controller/sys/RoleController.java @@ -372,6 +372,8 @@ public class RoleController { + + diff --git a/src/main/java/com/rj/controller/sys/UserRoleController.java b/src/main/java/com/rj/controller/sys/UserRoleController.java index c9be3e0..14c7327 100644 --- a/src/main/java/com/rj/controller/sys/UserRoleController.java +++ b/src/main/java/com/rj/controller/sys/UserRoleController.java @@ -378,6 +378,8 @@ public class UserRoleController { + + diff --git a/src/main/java/com/rj/dto/DifyWorkflowResponseDto.java b/src/main/java/com/rj/dto/DifyWorkflowResponseDto.java index 7f0f766..a69202b 100644 --- a/src/main/java/com/rj/dto/DifyWorkflowResponseDto.java +++ b/src/main/java/com/rj/dto/DifyWorkflowResponseDto.java @@ -144,6 +144,8 @@ public class DifyWorkflowResponseDto { + + diff --git a/src/main/java/com/rj/mapper/CustomerProfileAnalysisMapper.java b/src/main/java/com/rj/mapper/CustomerProfileAnalysisMapper.java index e228612..8bf8516 100644 --- a/src/main/java/com/rj/mapper/CustomerProfileAnalysisMapper.java +++ b/src/main/java/com/rj/mapper/CustomerProfileAnalysisMapper.java @@ -87,6 +87,8 @@ public interface CustomerProfileAnalysisMapper extends BaseMapper 7 && textEnd > textStart) { + fullText = outputStr.substring(textStart, textEnd); + } + } + + // 提取时长信息 + if (result.getOutput().toString().contains("\"duration\"")) { + String outputStr = result.getOutput().toString(); + int durationStart = outputStr.indexOf("\"duration\":") + 11; + int durationEnd = outputStr.indexOf(",", durationStart); + if (durationEnd == -1) { + durationEnd = outputStr.indexOf("}", durationStart); + } + if (durationStart > 10 && durationEnd > durationStart) { + try { + duration = Double.parseDouble(outputStr.substring(durationStart, durationEnd).trim()); + } catch (NumberFormatException e) { + duration = 0.0; + } + } + } + } catch (Exception e) { + log.warn("解析ASR结果时出错: {}", e.getMessage()); + } + + List asrResults = new ArrayList<>(); + + // 创建简单的结果对象 + AsrResponse.AsrResult asrResult = new AsrResponse.AsrResult(); + asrResult.setText(fullText); + asrResult.setStartTime(0.0); + asrResult.setEndTime(duration); + asrResults.add(asrResult); + + log.info("语音识别完成 - 识别文本长度: {}, 处理时间: {}ms", fullText.length(), processingTime); + + return AsrResponse.success(fullText, asrResults, duration, processingTime, taskId, requestId); + } else { + log.warn("ASR识别结果为空 - TaskId: {}", taskId); + return AsrResponse.error("语音识别结果为空"); + } + + } catch (Exception e) { + log.error("语音识别失败: {}", e.getMessage(), e); + return AsrResponse.error("语音识别失败: " + e.getMessage()); + } + } + + @Override + public boolean isAsrServiceAvailable() { + return asrEnabled && apiKey != null && !apiKey.trim().isEmpty(); + } } diff --git a/src/main/java/com/rj/service/sys/impl/MenuServiceImpl.java b/src/main/java/com/rj/service/sys/impl/MenuServiceImpl.java index 78cb3aa..be56391 100644 --- a/src/main/java/com/rj/service/sys/impl/MenuServiceImpl.java +++ b/src/main/java/com/rj/service/sys/impl/MenuServiceImpl.java @@ -115,6 +115,8 @@ public class MenuServiceImpl extends ServiceImpl implements IM + + diff --git a/src/main/java/com/rj/service/sys/impl/RoleServiceImpl.java b/src/main/java/com/rj/service/sys/impl/RoleServiceImpl.java index 6af5324..43a240f 100644 --- a/src/main/java/com/rj/service/sys/impl/RoleServiceImpl.java +++ b/src/main/java/com/rj/service/sys/impl/RoleServiceImpl.java @@ -115,6 +115,8 @@ public class RoleServiceImpl extends ServiceImpl implements IR + + diff --git a/src/main/java/com/rj/service/sys/impl/UserRoleServiceImpl.java b/src/main/java/com/rj/service/sys/impl/UserRoleServiceImpl.java index e13549a..7fb38a6 100644 --- a/src/main/java/com/rj/service/sys/impl/UserRoleServiceImpl.java +++ b/src/main/java/com/rj/service/sys/impl/UserRoleServiceImpl.java @@ -115,6 +115,8 @@ public class UserRoleServiceImpl extends ServiceImpl i + + diff --git a/src/main/resources/application-audio.yml b/src/main/resources/application-audio.yml index c635704..16fc756 100644 --- a/src/main/resources/application-audio.yml +++ b/src/main/resources/application-audio.yml @@ -124,6 +124,8 @@ spring: + + diff --git a/src/main/resources/application.yml b/src/main/resources/application.yml index 21cac8d..879e844 100644 --- a/src/main/resources/application.yml +++ b/src/main/resources/application.yml @@ -125,6 +125,27 @@ aliyun: # 是否启用阿里云服务 enabled: true +# ASR语音识别配置 +asr: + # 是否启用ASR服务 + enabled: true + # 默认ASR模型 + default-model: paraformer-v2 + # 请求超时时间(毫秒) + timeout: 60000 + # 是否启用标点符号 + enable-punctuation: true + # 是否启用数字转换 + enable-number-conversion: true + # 是否启用说话人分离 + enable-speaker-diarization: false + # 默认说话人数量 + default-speaker-count: 1 + # 默认音频格式 + default-format: wav + # 默认采样率 + default-sample-rate: 16000 + springdoc: swagger-ui: diff --git a/src/main/resources/mapper/AudioManagementStatisticsMapper.xml b/src/main/resources/mapper/AudioManagementStatisticsMapper.xml index 01ad0c2..dc0ff25 100644 --- a/src/main/resources/mapper/AudioManagementStatisticsMapper.xml +++ b/src/main/resources/mapper/AudioManagementStatisticsMapper.xml @@ -101,6 +101,8 @@ + + diff --git a/src/main/resources/static/tts-demo.html b/src/main/resources/static/tts-demo.html index 7d0cf1a..a9de9d0 100644 --- a/src/main/resources/static/tts-demo.html +++ b/src/main/resources/static/tts-demo.html @@ -300,6 +300,8 @@ + + diff --git a/src/test/java/com/rj/service/FaceDetectImageCountTest.java b/src/test/java/com/rj/service/FaceDetectImageCountTest.java index d1edbda..c14fc09 100644 --- a/src/test/java/com/rj/service/FaceDetectImageCountTest.java +++ b/src/test/java/com/rj/service/FaceDetectImageCountTest.java @@ -238,6 +238,8 @@ public class FaceDetectImageCountTest { + + diff --git a/src/test/java/com/rj/service/TtsRequestLogShortUrlTest.java b/src/test/java/com/rj/service/TtsRequestLogShortUrlTest.java index 32f8218..7bd840c 100644 --- a/src/test/java/com/rj/service/TtsRequestLogShortUrlTest.java +++ b/src/test/java/com/rj/service/TtsRequestLogShortUrlTest.java @@ -179,6 +179,8 @@ public class TtsRequestLogShortUrlTest { + + diff --git a/src/test/java/com/rj/service/VideoSynthesisTempUrlTest.java b/src/test/java/com/rj/service/VideoSynthesisTempUrlTest.java index 703cccd..76de529 100644 --- a/src/test/java/com/rj/service/VideoSynthesisTempUrlTest.java +++ b/src/test/java/com/rj/service/VideoSynthesisTempUrlTest.java @@ -157,6 +157,8 @@ public class VideoSynthesisTempUrlTest { + + diff --git a/src/test/java/com/rj/service/VideoSynthesisVideoNameTest.java b/src/test/java/com/rj/service/VideoSynthesisVideoNameTest.java index 4a6e5e3..5b63cd1 100644 --- a/src/test/java/com/rj/service/VideoSynthesisVideoNameTest.java +++ b/src/test/java/com/rj/service/VideoSynthesisVideoNameTest.java @@ -132,6 +132,8 @@ public class VideoSynthesisVideoNameTest { + +