diff --git a/pom.xml b/pom.xml index 5b4fd1d..7bca64a 100644 --- a/pom.xml +++ b/pom.xml @@ -86,13 +86,6 @@ spring-boot-starter-freemarker - - org.apache.tika - tika-core - 1.24.1 - - - diff --git a/src/main/java/com/supervision/controller/RobotTalkController.java b/src/main/java/com/supervision/controller/RobotTalkController.java index cfee8e6..0a73758 100644 --- a/src/main/java/com/supervision/controller/RobotTalkController.java +++ b/src/main/java/com/supervision/controller/RobotTalkController.java @@ -57,20 +57,13 @@ public class RobotTalkController { robotTalkService.getAudio(response,audioId); } - /* @ApiOperation("下载嫌疑人归档数据") - @GetMapping("/downLoadArchives") - public void downLoadArchives(HttpServletResponse response, - ArchivesReqVo archivesReq) throws IOException { - robotTalkService.downLoadArchives(response,archivesReq); - }*/ - @ApiOperation("下载对话过程中的文件") @GetMapping("/downLoadFile") public void downLoadFile(HttpServletResponse response, String fileType, - String imageId) throws IOException { - robotTalkService.downLoadFile(response,fileType,imageId); + String fileId) throws IOException { + robotTalkService.downLoadFile(response,fileType,fileId); } diff --git a/src/main/java/com/supervision/dto/QueryProcessDTO.java b/src/main/java/com/supervision/dto/QueryProcessDTO.java index 62be806..1d8f6e0 100644 --- a/src/main/java/com/supervision/dto/QueryProcessDTO.java +++ b/src/main/java/com/supervision/dto/QueryProcessDTO.java @@ -1,14 +1,16 @@ package com.supervision.dto; +import cn.hutool.core.collection.CollUtil; import cn.hutool.core.util.StrUtil; import lombok.AllArgsConstructor; import lombok.Builder; import lombok.Data; import java.io.File; +import java.util.ArrayList; import java.util.List; -import java.util.Map; import java.util.Objects; +import java.util.stream.Collectors; @Data @Builder @@ -48,6 +50,14 @@ public class QueryProcessDTO { private List paramCheckList; + public String paramCheckToMessage(){ + if (CollUtil.isEmpty(paramCheckList)){ + return ""; + } + return paramCheckList.stream().map(ParamCheckDTO::toMessage).collect(Collectors.joining(",")); + } + + /** * 判断参数是否为空 为空则添加到参数校验列表中 @@ -59,6 +69,9 @@ public class QueryProcessDTO { public void notNullParam(String paramName, T value, String errorMsgTemplate){ if(Objects.isNull(value)){ this.state = 1; + if (null == paramCheckList){ + paramCheckList = new ArrayList<>(); + } this.paramCheckList.add(new ParamCheckDTO(paramName, errorMsgTemplate,1)); } @@ -90,5 +103,18 @@ public class QueryProcessDTO { * 错误类型 1:参数缺失 2:参数值错误 3:参数类型错误 */ private Integer errorType; + + public String toMessage(){ + if (Integer.valueOf(1).equals(errorType)){ + return String.format("参数%s缺失",paramName); + } + if (Integer.valueOf(2).equals(errorType)){ + return String.format("参数%s值错误",paramName); + } + if (Integer.valueOf(3).equals(errorType)){ + return String.format("参数%s类型错误",paramName); + } + return ""; + } } } diff --git a/src/main/java/com/supervision/service/VoiceService.java b/src/main/java/com/supervision/service/VoiceService.java index 91880b6..4f6b200 100644 --- a/src/main/java/com/supervision/service/VoiceService.java +++ b/src/main/java/com/supervision/service/VoiceService.java @@ -10,5 +10,8 @@ public interface VoiceService { String voiceToText(MultipartFile file, String sessionId) throws IOException; + + String voiceToText(byte[] bytes, String sessionId) throws IOException; + TtsResultDTO textToVoice(String text); } diff --git a/src/main/java/com/supervision/service/impl/QueryTemplateProcessorImpl.java b/src/main/java/com/supervision/service/impl/QueryTemplateProcessorImpl.java index 2555a63..a85da50 100644 --- a/src/main/java/com/supervision/service/impl/QueryTemplateProcessorImpl.java +++ b/src/main/java/com/supervision/service/impl/QueryTemplateProcessorImpl.java @@ -2,7 +2,6 @@ package com.supervision.service.impl; import cn.hutool.core.collection.CollUtil; import cn.hutool.core.io.FileUtil; -import cn.hutool.core.io.IoUtil; import cn.hutool.core.lang.Assert; import cn.hutool.core.map.MapUtil; import cn.hutool.core.util.StrUtil; @@ -18,7 +17,6 @@ import com.supervision.service.QueryTemplateProcessor; import com.supervision.util.ParamTypeConverter; import com.supervision.util.freemark.StringTemplateConfig; import com.supervision.util.mybatis.RowSqlMapper; -import com.supervision.vo.robot.ArchivesReqVo; import freemarker.template.TemplateException; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; @@ -46,7 +44,7 @@ public class QueryTemplateProcessorImpl implements QueryTemplateProcessor { private final RowSqlMapper rowSqlMapper; - @Value("${rootPath:F:\\tmp}") + @Value("${query.rootPath:/data/intro-robot}") private String rootPath; @Override //note:重新构建一个事务,与调用方事务隔离 @@ -77,10 +75,10 @@ public class QueryTemplateProcessorImpl implements QueryTemplateProcessor { // 校验知识查询sql必填参数 List sessionParams = null == sessionParamSupplier ? sessionParamService.lambdaQuery().eq(IrSessionParam::getSessionId, sessionId).list() : sessionParamSupplier.get(); - Set sessionParamsNames = sessionParams.stream().map(IrSessionParam::getParamName).collect(Collectors.toSet()); + Set sessionParamsNames = sessionParams.stream().filter(param->StrUtil.isNotEmpty(param.getParamValue())).map(IrSessionParam::getParamName).collect(Collectors.toSet()); paramsList.stream().filter(param -> Integer.valueOf(1).equals(param.getParamRequire())).forEach(param -> { queryProcessDTO.notNullParam(param.getParamName(), - sessionParamsNames.contains(param.getParamName()) ? true : null, "参数[" + param.getParamName() + "]未设置!"); + sessionParamsNames.contains(param.getParamName())? true : null, "参数[" + param.getParamName() + "]未设置!"); }); if (Integer.valueOf(1).equals(queryProcessDTO.getState())) { // 参数校验不通过,返回结果 diff --git a/src/main/java/com/supervision/service/impl/RobotTalkServiceImpl.java b/src/main/java/com/supervision/service/impl/RobotTalkServiceImpl.java index 72a9bfe..384c4b6 100644 --- a/src/main/java/com/supervision/service/impl/RobotTalkServiceImpl.java +++ b/src/main/java/com/supervision/service/impl/RobotTalkServiceImpl.java @@ -144,6 +144,7 @@ public class RobotTalkServiceImpl implements RobotTalkService { if (Objects.nonNull(irFile)) { robotTalkDTO.getAnswerInfo().setContentType(3); robotTalkDTO.getAnswerInfo().setByteId(irFile.getId()); + irSessionHistory.setAnswerFileId(irFile.getId()); } } // 写入对话日志 @@ -258,8 +259,11 @@ public class RobotTalkServiceImpl implements RobotTalkService { } } // 参数异常或查询结果异常 - if (Integer.valueOf(1).equals(process.getState()) - || Integer.valueOf(2).equals(process.getState())){ + if (Integer.valueOf(1).equals(process.getState())){ + return StrUtil.join(",",process.paramCheckToMessage()); + } + + if (Integer.valueOf(2).equals(process.getState())){ return config.getUnrecognizedOne(); } return null; @@ -294,7 +298,8 @@ public class RobotTalkServiceImpl implements RobotTalkService { AnswerInfo answerInfo = robotTalkDTO.getAnswerInfo(); sessionHistory.setAnswer(answerInfo.getMessage()); sessionHistory.setAnswerType(answerInfo.getContentType()); - sessionHistory.setUserQuestion(answerInfo.getMessage()); + + sessionHistory.setUserQuestion(robotTalkDTO.getAnswerInfo().getMessage()); sessionHistory.setCreateUserId(UserUtil.getUser().getId()); if (Objects.nonNull(matchQuestionAnswerDTO)){ sessionHistory.setMatchKnowledgeId(matchQuestionAnswerDTO.getMatchQuestionCode()); @@ -312,8 +317,10 @@ public class RobotTalkServiceImpl implements RobotTalkService { Assert.notEmpty(sessionId, "sessionId不能为空"); Assert.notNull(multipartFile, "multipartFile不能为空"); + byte[] bytes = null; try { - String message = voiceService.voiceToText(multipartFile, sessionId); + bytes = multipartFile.getBytes(); + String message = voiceService.voiceToText(bytes, sessionId); robotTalkReq.setMessage(message); } catch (IOException e) { log.error("语音转文字失败", e); @@ -321,6 +328,18 @@ public class RobotTalkServiceImpl implements RobotTalkService { // todo: 设置问题语音长度和 历史记录中的语音id RobotTalkDTO robotTalkDTO = this.textTalk2Robot(robotTalkReq); robotTalkDTO.getAskInfo().setContentType(2); + + if (Objects.nonNull(bytes)){ + IrVoice irVoice = new IrVoice(); + irVoice.setVoiceBase64(Base64.encode(bytes)); + irVoiceService.save(irVoice); + if (StrUtil.isNotEmpty(robotTalkDTO.getAskInfo().getAskId())){ + sessionService.lambdaUpdate() + .eq(IrSessionHistory::getId,robotTalkDTO.getAskInfo().getAskId()) + .set(IrSessionHistory::getAnswerVoiceId,irVoice.getId()).update(); + } + } + return robotTalkDTO; } @@ -328,16 +347,14 @@ public class RobotTalkServiceImpl implements RobotTalkService { public List talkList(String sessionId) { Assert.notEmpty(sessionId, "sessionId不能为空"); - List sessionHistoryList = sessionService.lambdaQuery().eq(IrSessionHistory::getSessionId, sessionId).orderBy(true, false,IrSessionHistory::getCreateTime).list(); + List sessionHistoryList = sessionService.lambdaQuery().eq(IrSessionHistory::getSessionId, sessionId).orderBy(true, true,IrSessionHistory::getCreateTime).list(); // 获取音频的长度 List voiceIds = sessionHistoryList.stream() .map(session -> CollUtil.toList(session.getAnswerVoiceId(), session.getUserQuestionVoiceId())) .flatMap(Collection::stream).filter(StrUtil::isNotEmpty).collect(Collectors.toList()); - Map voiceLengthMap = CollUtil.isEmpty(voiceIds) ? new HashMap<>() : - irVoiceService.listByIds(voiceIds).stream().collect(Collectors.toMap(IrVoice::getId, IrVoice::getLength)); - + irVoiceService.listByIds(voiceIds).stream().filter(i->Objects.nonNull(i.getLength())).collect(Collectors.toMap(IrVoice::getId, IrVoice::getLength)); return sessionHistoryList.stream().map(session->this.sessionHistory2RobotTalkDTO(session,voiceLengthMap)) .filter(Objects::nonNull).flatMap(Collection::stream).collect(Collectors.toList()); diff --git a/src/main/java/com/supervision/service/impl/VoiceServiceImpl.java b/src/main/java/com/supervision/service/impl/VoiceServiceImpl.java index 416ec4f..e2eca18 100644 --- a/src/main/java/com/supervision/service/impl/VoiceServiceImpl.java +++ b/src/main/java/com/supervision/service/impl/VoiceServiceImpl.java @@ -27,6 +27,15 @@ public class VoiceServiceImpl implements VoiceService { return transform; } + @Override + public String voiceToText(byte[] bytes, String sessionId) throws IOException { + log.info("语音转文字开始"); + TimeInterval timeInterval = DateUtil.timer(); + String transform = AsrUtil.asrTransformByBytes(bytes); + log.info("语音转文字结束,耗时:{}", timeInterval.interval()); + return transform; + } + @Override public TtsResultDTO textToVoice(String text) { diff --git a/src/main/resources/application.yml b/src/main/resources/application.yml index 35055c9..fa7e9d0 100644 --- a/src/main/resources/application.yml +++ b/src/main/resources/application.yml @@ -42,7 +42,7 @@ spring: slow-sql-millis: 5000 merge-sql: false matchTool: - url: http://192.168.10.29:8000 + url: http://192.168.10.137:9711 scoreThreshold: 0.4 paddle-speech: # https://github.com/PaddlePaddle/PaddleSpeech/wiki/PaddleSpeech-Server-RESTful-API @@ -51,4 +51,7 @@ paddle-speech: mybatis-plus: mapper-locations: classpath*:mapper/**/*.xml configuration: - log-impl: org.apache.ibatis.logging.stdout.StdOutImpl \ No newline at end of file + log-impl: org.apache.ibatis.logging.stdout.StdOutImpl + +query: + rootPath: /data/intro-robot \ No newline at end of file diff --git a/src/test/java/com/supervision/AskApplicationTests.java b/src/test/java/com/supervision/AskApplicationTests.java index 00cd29d..6d3bce2 100644 --- a/src/test/java/com/supervision/AskApplicationTests.java +++ b/src/test/java/com/supervision/AskApplicationTests.java @@ -170,27 +170,12 @@ class AskApplicationTests { InputStream inputStream = mockMultipartFile.getInputStream(); - try { - // 创建元数据对象 - Metadata metadata = new Metadata(); - - // 使用Apache Tika的自动检测解析器和内容处理器 - Parser parser = new AutoDetectParser(); - BodyContentHandler handler = new BodyContentHandler(); - - BufferedInputStream inputStream1 = FileUtil.getInputStream("F:\\tmp\\1\\心肺听诊-大湿罗音.mp3"); - // 解析音频文件,提取元数据 - parser.parse(inputStream1, handler, metadata, new ParseContext()); - - // 获取音频文件的长度(时长),以秒为单位 - String duration = metadata.get("xmpDM:duration"); - - System.out.println(duration); - if (duration != null) { - /*return (long) (Double.parseDouble(duration) / 1000); // 转换为毫秒*/ - } - } catch (Exception e) { - e.printStackTrace(); - } + + byte[] bytes = IoUtil.readBytes(inputStream); + + System.out.println(bytes.length); + byte[] bytes1 = IoUtil.readBytes(inputStream); + + System.out.println(bytes1.length); } }