From 1b29bbd9bce97dc007a05727d4f7fe1f4a1230ee Mon Sep 17 00:00:00 2001 From: liu Date: Thu, 2 Nov 2023 13:18:14 +0800 Subject: [PATCH] =?UTF-8?q?=E8=AF=8A=E6=96=AD=E6=B5=81=E7=A8=8B=E6=8F=90?= =?UTF-8?q?=E4=BA=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../supervision/controller/AskController.java | 14 ++++---- .../com/supervision/pojo/vo/TalkReqVO.java | 21 ++++++++++++ .../supervision/pojo/vo/TalkResultResVO.java | 4 +-- .../com/supervision/service/AskService.java | 6 +++- .../service/impl/AskServiceImpl.java | 34 ++++++++++++++----- 5 files changed, 62 insertions(+), 17 deletions(-) create mode 100644 virtual-patient-web/src/main/java/com/supervision/pojo/vo/TalkReqVO.java diff --git a/virtual-patient-web/src/main/java/com/supervision/controller/AskController.java b/virtual-patient-web/src/main/java/com/supervision/controller/AskController.java index 10d122f3..7fd54c21 100644 --- a/virtual-patient-web/src/main/java/com/supervision/controller/AskController.java +++ b/virtual-patient-web/src/main/java/com/supervision/controller/AskController.java @@ -1,5 +1,6 @@ package com.supervision.controller; +import com.supervision.pojo.vo.TalkReqVO; import com.supervision.pojo.vo.TalkResultResVO; import com.supervision.service.AskService; import io.swagger.annotations.Api; @@ -19,15 +20,16 @@ public class AskController { @Autowired private AskService askService; - + @ApiOperation("接收页面的语音消息(这个接口使用京东数字人接口来做)") + @PostMapping("/receiveVoiceFile") + public String receiveVoiceFile(@RequestParam("file") MultipartFile file) { + return askService.receiveVoiceFile(file); + } @ApiOperation("接收页面的语音消息(这个接口使用京东数字人接口来做)") @PostMapping("/receiveVoiceFile") - public TalkResultResVO receiveVoiceFile(@RequestParam("file") MultipartFile file, - @ApiParam("流程ID") String processId, - @ApiParam("数字人房间的数字人ID") String roomKey, - @ApiParam("数字人的TOKEN") String roomToken) throws IOException { - return askService.receiveVoiceFile(file, processId, roomKey, roomToken); + public TalkResultResVO talk(TalkReqVO talkReqVO) throws IOException { + return askService.talk(talkReqVO); } @ApiOperation("回复语音及文字消息") diff --git a/virtual-patient-web/src/main/java/com/supervision/pojo/vo/TalkReqVO.java b/virtual-patient-web/src/main/java/com/supervision/pojo/vo/TalkReqVO.java new file mode 100644 index 00000000..358903d3 --- /dev/null +++ b/virtual-patient-web/src/main/java/com/supervision/pojo/vo/TalkReqVO.java @@ -0,0 +1,21 @@ +package com.supervision.pojo.vo; + +import io.swagger.annotations.ApiModelProperty; +import io.swagger.annotations.ApiParam; +import lombok.Data; +import org.springframework.web.bind.annotation.RequestParam; + +@Data +public class TalkReqVO { + + @ApiModelProperty("对话内容") + private String text; + + @ApiModelProperty("流程ID") + private String processId; + + @ApiModelProperty("数字人房间的数字人ID") + private String roomKey; + @ApiModelProperty("数字人的TOKEN") + private String roomToken; +} diff --git a/virtual-patient-web/src/main/java/com/supervision/pojo/vo/TalkResultResVO.java b/virtual-patient-web/src/main/java/com/supervision/pojo/vo/TalkResultResVO.java index 57a57a79..e3f57549 100644 --- a/virtual-patient-web/src/main/java/com/supervision/pojo/vo/TalkResultResVO.java +++ b/virtual-patient-web/src/main/java/com/supervision/pojo/vo/TalkResultResVO.java @@ -10,9 +10,9 @@ public class TalkResultResVO { private ActionDTO action; /** - * 后端返回给前端时使用,表示该是消息还是action动作,1消息,2动作 + * 后端返回给前端时使用,表示该是语音回复还是action动作,1语音回复,2动作 */ - @ApiModelProperty("后端返回给前端时使用,表示该是消息还是action动作,1消息,2动作") + @ApiModelProperty("后端返回给前端时使用,表示该是语音回复还是action动作,1语音回复,2动作") private Integer type; } diff --git a/virtual-patient-web/src/main/java/com/supervision/service/AskService.java b/virtual-patient-web/src/main/java/com/supervision/service/AskService.java index a09ad61a..cfafcad8 100644 --- a/virtual-patient-web/src/main/java/com/supervision/service/AskService.java +++ b/virtual-patient-web/src/main/java/com/supervision/service/AskService.java @@ -1,13 +1,17 @@ package com.supervision.service; +import com.supervision.pojo.vo.TalkReqVO; import com.supervision.pojo.vo.TalkResultResVO; +import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.multipart.MultipartFile; import java.io.IOException; public interface AskService { - TalkResultResVO receiveVoiceFile(MultipartFile file, String processId, String roomKey, String roomToken) throws IOException; + String receiveVoiceFile(MultipartFile file); + + TalkResultResVO talk(TalkReqVO talkReqVO) throws IOException; String replyVoice(); diff --git a/virtual-patient-web/src/main/java/com/supervision/service/impl/AskServiceImpl.java b/virtual-patient-web/src/main/java/com/supervision/service/impl/AskServiceImpl.java index e62ace82..506eef7e 100644 --- a/virtual-patient-web/src/main/java/com/supervision/service/impl/AskServiceImpl.java +++ b/virtual-patient-web/src/main/java/com/supervision/service/impl/AskServiceImpl.java @@ -5,6 +5,7 @@ import cn.hutool.core.util.StrUtil; import com.supervision.exception.BusinessException; import com.supervision.model.DiagnosisQaRecord; import com.supervision.model.Process; +import com.supervision.pojo.vo.TalkReqVO; import com.supervision.pojo.vo.TalkResultResVO; import com.supervision.service.AskDefaultQuestionAnswerService; import com.supervision.service.AskDiseaseQuestionAnswerService; @@ -34,15 +35,32 @@ public class AskServiceImpl implements AskService { private final AskDefaultQuestionAnswerService askDefaultQuestionAnswerService; + + @Override + public String receiveVoiceFile(MultipartFile file) { + if (file.getSize() <= 0) { + throw new BusinessException("语音内容为空"); + } + // 获取音频对应的文字 + String text = null; + try { + text = AsrUtil.asrTransformByBytes(file.getBytes()); + } catch (Exception e) { + throw new BusinessException("获取语音失败"); + } + if (StrUtil.isEmpty(text)) { + throw new BusinessException("语音内容为空"); + } + return text; + } + @Override @Transactional(rollbackFor = Exception.class) - public TalkResultResVO receiveVoiceFile(MultipartFile file, String processId, String roomKey, String roomToken) throws IOException { + public TalkResultResVO talk(TalkReqVO talkReqVO) throws IOException { // 根据processId找到对应的病人 - Process process = Optional.ofNullable(processService.getById(processId)).orElseThrow(() -> new BusinessException("未找到诊疗进程")); - // 获取音频对应的文字 - String askQuestion = AsrUtil.asrTransformByBytes(file.getBytes()); + Process process = Optional.ofNullable(processService.getById(talkReqVO.getProcessId())).orElseThrow(() -> new BusinessException("未找到诊疗进程")); // 调用rasa获取文字内容 - String rasaResult = RasaUtil.talkRasa(askQuestion, UserUtil.getUser().getId(), process.getPatientId()); + String rasaResult = RasaUtil.talkRasa(talkReqVO.getText(), UserUtil.getUser().getId(), process.getPatientId()); TalkResultResVO talkResultResVO = new TalkResultResVO(); // 这里校验,rasa回复的结果是不是action // 这里设置的模板,对于action的动作全部是用ancillary_ | tool_进行标记,详情看生成rasa的yml的代码:RasaServiceImpl.generateDomain @@ -61,7 +79,7 @@ public class AskServiceImpl implements AskService { } else { // 语音消息,这时调用京东的接口进行播放操作 // 这里调用京东数字人接口首先根据token获取房间号 - String roomId = HumanUtil.queryRoomId(roomKey, roomToken); + String roomId = HumanUtil.queryRoomId(talkReqVO.getRoomKey(), talkReqVO.getRoomToken()); // 区分 List answerIdList = StrUtil.split(rasaResult, '_'); String qaId = null; @@ -88,10 +106,10 @@ public class AskServiceImpl implements AskService { HumanUtil.textDriven(rasaResult, roomId); // 保存记录 DiagnosisQaRecord record = new DiagnosisQaRecord(); - record.setProcessId(processId); + record.setProcessId(talkReqVO.getProcessId()); record.setQuestionAnswerType(qaType); record.setQuestionAnswerId(qaId); - record.setQuestion(askQuestion); + record.setQuestion(talkReqVO.getText()); record.setAnswer(answer); record.setCreateUserId(UserUtil.getUser().getId()); record.insert();