package com.supervision.service.impl; import cn.hutool.core.collection.CollUtil; 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; import com.supervision.service.ProcessService; import com.supervision.util.*; import com.supervision.service.AskService; import com.supervision.pojo.vo.ActionDTO; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import org.springframework.web.multipart.MultipartFile; import java.io.IOException; import java.util.List; import java.util.Optional; import java.util.Random; @Slf4j @Service @RequiredArgsConstructor public class AskServiceImpl implements AskService { private final ProcessService processService; private final AskDiseaseQuestionAnswerService askDiseaseQuestionAnswerService; 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 talk(TalkReqVO talkReqVO) throws IOException { // 根据processId找到对应的病人 Process process = Optional.ofNullable(processService.getById(talkReqVO.getProcessId())).orElseThrow(() -> new BusinessException("未找到诊疗进程")); // 调用rasa获取文字内容 String rasaResult = RasaUtil.talkRasa(talkReqVO.getText(), UserUtil.getUser().getId(), process.getPatientId()); TalkResultResVO talkResultResVO = new TalkResultResVO(); // 这里校验,rasa回复的结果是不是action // 这里设置的模板,对于action的动作全部是用ancillary_ | tool_进行标记,详情看生成rasa的yml的代码:RasaServiceImpl.generateDomain // ancillary_ | tool_ if (rasaResult.startsWith("ancillary_") || rasaResult.startsWith("tool_")) { List actionList = StrUtil.split(rasaResult, '_'); if (actionList.size() > 1) { ActionDTO actionDTO = new ActionDTO(); actionDTO.setActionType(actionList.get(0)); actionDTO.setActionId(actionList.get(1)); // 在这里给socket回复,设置为动作 talkResultResVO.setAction(actionDTO); talkResultResVO.setType(2); return talkResultResVO; } } else { // 语音消息,这时调用京东的接口进行播放操作 // 这里调用京东数字人接口首先根据token获取房间号 String roomId = HumanUtil.queryRoomId(talkReqVO.getRoomKey(), talkReqVO.getRoomToken()); // 区分 List answerIdList = StrUtil.split(rasaResult, '_'); String qaId = null; String qaType = "miss"; String answer = "您好,我没有听懂您说什么"; if (answerIdList.size() > 1) { if (rasaResult.startsWith("default_")) { qaType = "default"; List answerList = Optional.ofNullable(askDefaultQuestionAnswerService.getById(answerIdList.get(1)).getAnswer()) .orElse(CollUtil.newArrayList("您好,我没有听懂您说什么")); answer = answerList.get(new Random().nextInt(answerList.size())); qaId = answerIdList.get(1); } else if (rasaResult.startsWith("disease_")) { qaType = "disease"; List answerList = Optional.ofNullable(askDiseaseQuestionAnswerService.getById(answerIdList.get(1)).getAnswer()) .orElse(CollUtil.newArrayList("您好,我没有听懂您说什么")); answer = answerList.get(new Random().nextInt(answerList.size())); qaId = answerIdList.get(1); } } // 然后这里进行播放 // 这里应该从对话中取结果 HumanUtil.textDriven(rasaResult, roomId); // 保存记录 DiagnosisQaRecord record = new DiagnosisQaRecord(); record.setProcessId(talkReqVO.getProcessId()); record.setQuestionAnswerType(qaType); record.setQuestionAnswerId(qaId); record.setQuestion(talkReqVO.getText()); record.setAnswer(answer); record.setCreateUserId(UserUtil.getUser().getId()); record.insert(); } talkResultResVO.setType(1); return talkResultResVO; } @Override public String replyVoice() { String text = "测试:这是文字转语音的测试,测试是否OK"; return TtsUtil.ttsTransform(text); } }