From 59772a9b9ace2f8fdec89868300fa53bed184805 Mon Sep 17 00:00:00 2001 From: xueqingkun Date: Wed, 19 Feb 2025 20:16:40 +0800 Subject: [PATCH] =?UTF-8?q?=E6=B7=BB=E5=8A=A0paddle=20=E5=B7=A5=E5=85=B7?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pom.xml | 5 + .../supervision/contoller/ChatController.java | 22 ++- src/main/java/com/supervision/dto/R.java | 132 ++++++++++++++++++ .../com/supervision/dto/robot/AnswerInfo.java | 53 +++++++ .../com/supervision/dto/robot/AskInfo.java | 29 ++++ .../supervision/dto/robot/RobotTalkDTO.java | 29 ++++ .../com/supervision/service/IChatService.java | 8 +- .../service/impl/ChatServiceImpl.java | 39 ++++-- 8 files changed, 306 insertions(+), 11 deletions(-) create mode 100644 src/main/java/com/supervision/dto/R.java create mode 100644 src/main/java/com/supervision/dto/robot/AnswerInfo.java create mode 100644 src/main/java/com/supervision/dto/robot/AskInfo.java create mode 100644 src/main/java/com/supervision/dto/robot/RobotTalkDTO.java diff --git a/pom.xml b/pom.xml index aec6e8e..ec6cd2d 100644 --- a/pom.xml +++ b/pom.xml @@ -59,6 +59,11 @@ hutool-all 5.8.26 + + org.mortbay.jetty + servlet-api + 9.0.83 + diff --git a/src/main/java/com/supervision/contoller/ChatController.java b/src/main/java/com/supervision/contoller/ChatController.java index b0dce0d..e40c65a 100644 --- a/src/main/java/com/supervision/contoller/ChatController.java +++ b/src/main/java/com/supervision/contoller/ChatController.java @@ -1,11 +1,17 @@ package com.supervision.contoller; +import com.supervision.dto.R; +import com.supervision.dto.robot.RobotTalkDTO; import com.supervision.service.IChatService; +import jakarta.servlet.http.HttpServletResponse; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.web.bind.annotation.*; import org.springframework.web.multipart.MultipartFile; +import java.io.IOException; +import java.util.ArrayList; +import java.util.List; @Slf4j @RestController @RequestMapping("/chat") @@ -15,7 +21,19 @@ public class ChatController { private final IChatService chatService; @PostMapping("/talk") - public String talk(@RequestParam("file") MultipartFile multipartFile) { - return chatService.talk(multipartFile); + public R talk(@RequestParam("file") MultipartFile multipartFile) { + RobotTalkDTO talk = chatService.talk(multipartFile); + return R.ok(talk); + } + + @GetMapping("/talkList") + public List talkList(String sessionId) { + return new ArrayList(); + } + + @GetMapping("/getAudio") + public void getAudio(HttpServletResponse response, + @RequestParam("audioId")String audioId) throws IOException { + chatService.getAudio(response,audioId); } } diff --git a/src/main/java/com/supervision/dto/R.java b/src/main/java/com/supervision/dto/R.java new file mode 100644 index 0000000..cfc1f9c --- /dev/null +++ b/src/main/java/com/supervision/dto/R.java @@ -0,0 +1,132 @@ +package com.supervision.dto; + + +import lombok.Data; + +import java.io.Serializable; +import java.util.*; + +/** + * 响应信息主体 + * + * @author qimaoyu + */ +@Data +public class R implements Serializable { + + private static final long serialVersionUID = 1L; + + public static final String TOTAL_COUNT = "total"; + public static final String RESULT_LIST = "result"; + + /** + * 成功 + */ + public static final int SUCCESS = 200; + + /** + * 失败 + */ + public static final int FAIL = 500; + + private int code; + + private String msg; + + private T data; + + public static R ok() { + return restResult(null, SUCCESS, null); + } + + public static R judgeResult(Boolean bo, String successMessage, String failMessage) { + if (bo) { + return restResult(null, SUCCESS, successMessage); + } else { + return restResult(null, FAIL, failMessage); + } + } + + public static R okMsg(String msg) { + return restResult(null, SUCCESS, msg); + } + + public static R ok(T data) { + return restResult(data, SUCCESS, null); + } + + public static R ok(T data, String msg) { + return restResult(data, SUCCESS, msg); + } + + public static R fail() { + return restResult(null, FAIL, null); + } + + public static R fail(String msg) { + return restResult(null, FAIL, msg); + } + + public static R fail(T data) { + return restResult(data, FAIL, null); + } + + public static R fail(int code, String msg) { + return restResult(null, code, msg); + } + + + + private static R restResult(T data, int code, String msg) { + R apiResult = new R<>(); + apiResult.setCode(code); + apiResult.setData(data); + apiResult.setMsg(msg); + return apiResult; + } + + + public static Map buildDataMap(List list) { + Map dataMap = new HashMap<>(); + if (list == null) { + dataMap.put(TOTAL_COUNT, 0); + dataMap.put(RESULT_LIST, new ArrayList<>()); + } else { + dataMap.put(TOTAL_COUNT, list.size()); + dataMap.put(RESULT_LIST, list); + } + return dataMap; + } + + public static Map buildDataMap(List list, Long total) { + Map dataMap = new HashMap<>(); + dataMap.put(TOTAL_COUNT, total); + dataMap.put(RESULT_LIST, list); + return dataMap; + } + + public static Map buildDataMap(Set list) { + Map dataMap = new HashMap<>(); + if (list == null) { + dataMap.put(TOTAL_COUNT, 0); + dataMap.put(RESULT_LIST, new ArrayList<>()); + } else { + dataMap.put(TOTAL_COUNT, list.size()); + dataMap.put(RESULT_LIST, list); + } + return dataMap; + } + + public static Map buildDataMap(Object object) { + if (object == null) { + return null; + } + List resultList = new ArrayList<>(); + resultList.add(object); + Map dataMap = new HashMap<>(); + dataMap.put(TOTAL_COUNT, resultList.size()); + dataMap.put(RESULT_LIST, resultList); + return dataMap; + } + +} diff --git a/src/main/java/com/supervision/dto/robot/AnswerInfo.java b/src/main/java/com/supervision/dto/robot/AnswerInfo.java new file mode 100644 index 0000000..15b8c84 --- /dev/null +++ b/src/main/java/com/supervision/dto/robot/AnswerInfo.java @@ -0,0 +1,53 @@ +package com.supervision.dto.robot; + +import lombok.Builder; +import lombok.Data; + +import java.io.File; + +@Data +@Builder +public class AnswerInfo { + + + /** + * 问题回答类型:1-文本,2-音频,3-文件,4-图片,5-视频 6-确认弹框 7-档案文件 + */ + private Integer contentType; + + /** + * 回答内容 + */ + private String message; + + /** + * 语音长度 + */ + private Integer audioLength; + + /** + * 回答音频id + */ + private String voiceBaseId; + + /** + * 回答音频base64 + */ + private String voiceBase64; + + + /** + * 回答文件id + */ + private String byteId; + + /** + * 回答文件字节数组 + */ + private transient byte[] answerByte; + + private transient File answerFile; + + + +} diff --git a/src/main/java/com/supervision/dto/robot/AskInfo.java b/src/main/java/com/supervision/dto/robot/AskInfo.java new file mode 100644 index 0000000..cfec221 --- /dev/null +++ b/src/main/java/com/supervision/dto/robot/AskInfo.java @@ -0,0 +1,29 @@ +package com.supervision.dto.robot; + +import lombok.Builder; +import lombok.Data; + +@Data +@Builder +public class AskInfo { + + private String askId; + + /** + * 问题内容类型:1-文本,2-音频,3-文件,4-图片,5-视频 + */ + private Integer contentType; + + + /** + * 问题内容 + */ + private String message; + + + /** + * 语音长度 + */ + private Long audioLength; + +} diff --git a/src/main/java/com/supervision/dto/robot/RobotTalkDTO.java b/src/main/java/com/supervision/dto/robot/RobotTalkDTO.java new file mode 100644 index 0000000..20d66d6 --- /dev/null +++ b/src/main/java/com/supervision/dto/robot/RobotTalkDTO.java @@ -0,0 +1,29 @@ +package com.supervision.dto.robot; + +import lombok.Builder; +import lombok.Data; + +/** + * 机器人对话DTO + */ +@Data +@Builder +public class RobotTalkDTO { + + /** + * 会话id + */ + private String sessionId; + + private AskInfo askInfo; + + private AnswerInfo answerInfo; + + + /** + * 是否继续补充:true-继续,false-不继续 + */ + private transient boolean doNext = true; + + +} diff --git a/src/main/java/com/supervision/service/IChatService.java b/src/main/java/com/supervision/service/IChatService.java index 562737d..1e8e4ff 100644 --- a/src/main/java/com/supervision/service/IChatService.java +++ b/src/main/java/com/supervision/service/IChatService.java @@ -1,8 +1,14 @@ package com.supervision.service; +import com.supervision.dto.robot.RobotTalkDTO; +import jakarta.servlet.http.HttpServletResponse; import org.springframework.stereotype.Service; import org.springframework.web.multipart.MultipartFile; +import java.io.IOException; + public interface IChatService { - String talk(MultipartFile file); + RobotTalkDTO talk(MultipartFile file); + + void getAudio(HttpServletResponse response, String audioId) throws IOException; } diff --git a/src/main/java/com/supervision/service/impl/ChatServiceImpl.java b/src/main/java/com/supervision/service/impl/ChatServiceImpl.java index 40d95c2..71da4f5 100644 --- a/src/main/java/com/supervision/service/impl/ChatServiceImpl.java +++ b/src/main/java/com/supervision/service/impl/ChatServiceImpl.java @@ -1,23 +1,27 @@ package com.supervision.service.impl; +import cn.hutool.core.codec.Base64; import com.alibaba.fastjson.JSON; -import com.alibaba.fastjson.JSONObject; -import com.alibaba.fastjson.parser.Feature; import com.supervision.dto.paddlespeech.res.TtsResultDTO; +import com.supervision.dto.robot.AnswerInfo; +import com.supervision.dto.robot.AskInfo; +import com.supervision.dto.robot.RobotTalkDTO; import com.supervision.model.dify.DIFYChatReqInputVO; import com.supervision.model.dify.DifyChatReqVO; -import com.supervision.model.dify.DifyChatResVO; import com.supervision.service.IChatService; import com.supervision.util.AsrUtil; import com.supervision.util.DifyApiUtil; import com.supervision.util.TtsUtil; import jakarta.annotation.Resource; -import lombok.RequiredArgsConstructor; +import jakarta.servlet.http.HttpServletResponse; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; import org.springframework.web.multipart.MultipartFile; import java.io.IOException; +import java.util.HashMap; +import java.util.Map; +import java.util.UUID; @Slf4j @Service @@ -26,23 +30,42 @@ public class ChatServiceImpl implements IChatService { @Resource private DifyApiUtil difyApiUtil; + Map voiceCache = new HashMap<>(); + + + @Override - public String talk(MultipartFile file) { + public RobotTalkDTO talk(MultipartFile file) { String talkResult = ""; + RobotTalkDTO.RobotTalkDTOBuilder builder = RobotTalkDTO.builder().sessionId("111"); try { + byte[] bytes = file.getBytes(); DifyChatReqVO difyChatReqVO = new DifyChatReqVO(); difyChatReqVO.setUser("admin"); DIFYChatReqInputVO inputs = new DIFYChatReqInputVO(); - inputs.setQuery(AsrUtil.asrTransformByBytes(file.getBytes())); + inputs.setQuery(AsrUtil.asrTransformByBytes(bytes)); + String askUUid = UUID.randomUUID().toString(); + builder.askInfo(AskInfo.builder().contentType(2).message(inputs.getQuery()).audioLength(100L).askId(askUUid).build()); + voiceCache.put(askUUid,Base64.encode(bytes)); difyChatReqVO.setInputs(inputs); String response = difyApiUtil.chat(difyChatReqVO); log.info("response:{}", response); + TtsResultDTO ttsResultDTO = TtsUtil.ttsTransform(response); - talkResult = JSON.toJSONString(ttsResultDTO); log.info("ttsResultDTO:{}", JSON.toJSONString(ttsResultDTO)); + String voiceBaseId = UUID.randomUUID().toString(); + builder.answerInfo(AnswerInfo.builder().contentType(2).message(response).voiceBaseId(voiceBaseId).voiceBase64(ttsResultDTO.getAudio()).build()); + voiceCache.put(voiceBaseId,ttsResultDTO.getAudio()); } catch (IOException e) { throw new RuntimeException(e); } - return talkResult; + return builder.build(); + } + + @Override + public void getAudio(HttpServletResponse response, String audioId) throws IOException { + + log.info("audioId:{}",audioId); + Base64.decodeToStream(voiceCache.get(audioId), response.getOutputStream(),false); } }