From 77ba20f82775ca35d74f370de9dc19083bc78ff4 Mon Sep 17 00:00:00 2001 From: liu Date: Tue, 24 Oct 2023 15:53:38 +0800 Subject: [PATCH] =?UTF-8?q?=E5=88=9D=E5=A7=8B=E5=8C=96=E6=96=87=E5=AD=97?= =?UTF-8?q?=E8=AF=AD=E9=9F=B3=E8=BD=AC=E6=8D=A2=E7=9A=84=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../VirtualPatientApplication.java | 1 + .../supervision/controller/AskController.java | 7 ++ .../pojo/paddlespeech/req/AsrReqDTO.java | 21 ++++++ .../pojo/paddlespeech/req/TtsReqDTO.java | 26 +++++++ .../pojo/paddlespeech/res/AsrResultDTO.java | 10 +++ .../paddlespeech/res/PaddleSpeechResDTO.java | 15 ++++ .../pojo/paddlespeech/res/TtsResultDTO.java | 23 +++++++ .../supervision/pojo/vo/ReplyVoiceResVO.java | 11 +++ .../com/supervision/service/AskService.java | 6 ++ .../service/impl/AskServiceImpl.java | 69 ++++++++++++++++++- .../src/main/resources/application.yml | 7 +- 11 files changed, 192 insertions(+), 4 deletions(-) create mode 100644 virtual-patient-web/src/main/java/com/supervision/pojo/paddlespeech/req/AsrReqDTO.java create mode 100644 virtual-patient-web/src/main/java/com/supervision/pojo/paddlespeech/req/TtsReqDTO.java create mode 100644 virtual-patient-web/src/main/java/com/supervision/pojo/paddlespeech/res/AsrResultDTO.java create mode 100644 virtual-patient-web/src/main/java/com/supervision/pojo/paddlespeech/res/PaddleSpeechResDTO.java create mode 100644 virtual-patient-web/src/main/java/com/supervision/pojo/paddlespeech/res/TtsResultDTO.java create mode 100644 virtual-patient-web/src/main/java/com/supervision/pojo/vo/ReplyVoiceResVO.java diff --git a/virtual-patient-web/src/main/java/com/supervision/VirtualPatientApplication.java b/virtual-patient-web/src/main/java/com/supervision/VirtualPatientApplication.java index 6c0297a8..45091892 100644 --- a/virtual-patient-web/src/main/java/com/supervision/VirtualPatientApplication.java +++ b/virtual-patient-web/src/main/java/com/supervision/VirtualPatientApplication.java @@ -4,6 +4,7 @@ import org.mybatis.spring.annotation.MapperScan; import org.mybatis.spring.annotation.MapperScans; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.boot.context.properties.EnableConfigurationProperties; import org.springframework.web.socket.config.annotation.EnableWebSocket; @EnableWebSocket 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 64cdd426..26bfb095 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.ReplyVoiceResVO; import com.supervision.service.AskService; import com.supervision.websocket.cache.WebSocketUserCache; import io.swagger.annotations.Api; @@ -35,6 +36,12 @@ public class AskController { return askService.receiveVoiceFile(file); } + @ApiOperation("回复语音及文字消息") + @GetMapping("replyVoice") + public ReplyVoiceResVO replyVoice(){ + return askService.replyVoice(); + } + @ApiOperation("查询对话历史") public void queryAskHistory(String processId){ diff --git a/virtual-patient-web/src/main/java/com/supervision/pojo/paddlespeech/req/AsrReqDTO.java b/virtual-patient-web/src/main/java/com/supervision/pojo/paddlespeech/req/AsrReqDTO.java new file mode 100644 index 00000000..a5d49703 --- /dev/null +++ b/virtual-patient-web/src/main/java/com/supervision/pojo/paddlespeech/req/AsrReqDTO.java @@ -0,0 +1,21 @@ +package com.supervision.pojo.paddlespeech.req; + +import lombok.Data; + +@Data +public class AsrReqDTO { + + private final String audio; + + private final String audio_format = "wav"; + + private final Integer sample_rate = 16000; + + private final String lang = "zh_cn"; + + private final Integer punc = 0; + + public AsrReqDTO(String audio) { + this.audio = audio; + } +} diff --git a/virtual-patient-web/src/main/java/com/supervision/pojo/paddlespeech/req/TtsReqDTO.java b/virtual-patient-web/src/main/java/com/supervision/pojo/paddlespeech/req/TtsReqDTO.java new file mode 100644 index 00000000..aac30cc4 --- /dev/null +++ b/virtual-patient-web/src/main/java/com/supervision/pojo/paddlespeech/req/TtsReqDTO.java @@ -0,0 +1,26 @@ +package com.supervision.pojo.paddlespeech.req; + +import lombok.Data; + +import java.util.HashMap; +import java.util.Map; + +@Data +public class TtsReqDTO { + + private final String text; + + private final Integer spk_id = 0; + + private final Double speed = 1.0; + + private final Double volume = 1.0; + + private final Integer sample_rate = 16000; + + private final String save_path = "./tts.wav"; + + public TtsReqDTO(String text) { + this.text = text; + } +} diff --git a/virtual-patient-web/src/main/java/com/supervision/pojo/paddlespeech/res/AsrResultDTO.java b/virtual-patient-web/src/main/java/com/supervision/pojo/paddlespeech/res/AsrResultDTO.java new file mode 100644 index 00000000..d1803872 --- /dev/null +++ b/virtual-patient-web/src/main/java/com/supervision/pojo/paddlespeech/res/AsrResultDTO.java @@ -0,0 +1,10 @@ +package com.supervision.pojo.paddlespeech.res; + +import lombok.Data; + +@Data +public class AsrResultDTO { + + private String transcription; + +} diff --git a/virtual-patient-web/src/main/java/com/supervision/pojo/paddlespeech/res/PaddleSpeechResDTO.java b/virtual-patient-web/src/main/java/com/supervision/pojo/paddlespeech/res/PaddleSpeechResDTO.java new file mode 100644 index 00000000..8b17ffb8 --- /dev/null +++ b/virtual-patient-web/src/main/java/com/supervision/pojo/paddlespeech/res/PaddleSpeechResDTO.java @@ -0,0 +1,15 @@ +package com.supervision.pojo.paddlespeech.res; + +import lombok.Data; + +@Data +public class PaddleSpeechResDTO { + + private Boolean success; + + private Integer code; + + private String message; + + private T result; +} diff --git a/virtual-patient-web/src/main/java/com/supervision/pojo/paddlespeech/res/TtsResultDTO.java b/virtual-patient-web/src/main/java/com/supervision/pojo/paddlespeech/res/TtsResultDTO.java new file mode 100644 index 00000000..07d75b0a --- /dev/null +++ b/virtual-patient-web/src/main/java/com/supervision/pojo/paddlespeech/res/TtsResultDTO.java @@ -0,0 +1,23 @@ +package com.supervision.pojo.paddlespeech.res; + +import lombok.Data; + +@Data +public class TtsResultDTO { + + private String lang; + + private String spk_id; + + private String speed; + + private String volume; + + private String sample_rate; + + private String duration; + + private String save_path; + + private String audio; +} diff --git a/virtual-patient-web/src/main/java/com/supervision/pojo/vo/ReplyVoiceResVO.java b/virtual-patient-web/src/main/java/com/supervision/pojo/vo/ReplyVoiceResVO.java new file mode 100644 index 00000000..3459e2bf --- /dev/null +++ b/virtual-patient-web/src/main/java/com/supervision/pojo/vo/ReplyVoiceResVO.java @@ -0,0 +1,11 @@ +package com.supervision.pojo.vo; + +import lombok.Data; + +@Data +public class ReplyVoiceResVO { + + private String voice; + + private String text; +} 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 cef2b0e4..8ec5ccb3 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,5 +1,7 @@ package com.supervision.service; +import com.fasterxml.jackson.core.JsonProcessingException; +import com.supervision.pojo.vo.ReplyVoiceResVO; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.multipart.MultipartFile; @@ -8,4 +10,8 @@ import java.io.IOException; public interface AskService { String receiveVoiceFile(MultipartFile file) throws IOException; + + ReplyVoiceResVO 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 24728c0a..e6d9ec84 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 @@ -1,22 +1,85 @@ package com.supervision.service.impl; import cn.hutool.core.codec.Base64; +import cn.hutool.core.util.ObjectUtil; +import cn.hutool.http.HttpUtil; +import cn.hutool.json.JSONUtil; +import com.fasterxml.jackson.core.JsonProcessingException; +import com.fasterxml.jackson.core.type.TypeReference; +import com.fasterxml.jackson.databind.ObjectMapper; +import com.supervision.exception.BusinessException; +import com.supervision.pojo.paddlespeech.req.AsrReqDTO; +import com.supervision.pojo.paddlespeech.req.TtsReqDTO; +import com.supervision.pojo.paddlespeech.res.AsrResultDTO; +import com.supervision.pojo.paddlespeech.res.PaddleSpeechResDTO; +import com.supervision.pojo.paddlespeech.res.TtsResultDTO; +import com.supervision.pojo.vo.ReplyVoiceResVO; import com.supervision.service.AskService; +import lombok.RequiredArgsConstructor; +import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Service; import org.springframework.web.multipart.MultipartFile; import java.io.IOException; @Service +@RequiredArgsConstructor public class AskServiceImpl implements AskService { + + @Value("${paddle-speech.tts}") + private String tts; + + @Value("${paddle-speech.asr}") + private String asr; + + private final ObjectMapper objectMapper = new ObjectMapper(); + @Override public String receiveVoiceFile(MultipartFile file) throws IOException { + return asrTransform(file.getBytes()); + } + + + @Override + public ReplyVoiceResVO replyVoice() { + String text = "测试:这是文字转语音的测试,测试是否OK"; + return ttsTransform(text); + } + + private String asrTransform(byte[] bytes) { // 首先编码为base64编码 - String encode = Base64.encode(file.getBytes()); - // TODO 这里调用Python的接口,将文字转换为语音 - return encode; + String encode = Base64.encode(bytes); + // 这里调用Python的接口,将文字转换为语音 + String post = HttpUtil.post(asr, JSONUtil.toJsonStr(new AsrReqDTO(encode))); + try { + PaddleSpeechResDTO response = objectMapper.readValue(post, new TypeReference>() {}); + if (!response.getSuccess() || ObjectUtil.isEmpty(response.getResult())) { + throw new BusinessException("语音转换文字失败"); + } + return response.getResult().getTranscription(); + + }catch (Exception e){ + throw new BusinessException("语音转换文字失败"); + } + } + private ReplyVoiceResVO ttsTransform(String str) { + // 构建 + String post = HttpUtil.post(tts, JSONUtil.toJsonStr(new TtsReqDTO(str))); + try { + PaddleSpeechResDTO response = objectMapper.readValue(post, new TypeReference>() { + }); + if (!response.getSuccess() || ObjectUtil.isEmpty(response.getResult())) { + throw new BusinessException("文字转换语音失败"); + } + ReplyVoiceResVO resVO = new ReplyVoiceResVO(); + resVO.setVoice(response.getResult().getAudio()); + resVO.setText(str); + return resVO; + }catch (Exception e){ + throw new BusinessException("语音转换文字失败"); + } } } diff --git a/virtual-patient-web/src/main/resources/application.yml b/virtual-patient-web/src/main/resources/application.yml index e1cb6466..68737445 100644 --- a/virtual-patient-web/src/main/resources/application.yml +++ b/virtual-patient-web/src/main/resources/application.yml @@ -55,4 +55,9 @@ spring: 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 + +paddle-speech: + # https://github.com/PaddlePaddle/PaddleSpeech/wiki/PaddleSpeech-Server-RESTful-API + tts: http://192.168.10.137:8090/paddlespeech/tts + asr: http://192.168.10.137:8090/paddlespeech/asr \ No newline at end of file