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);
}
}