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.rasa.RasaReqDTO; import com.supervision.pojo.rasa.RasaResDTO; 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; import java.util.List; import java.util.UUID; import java.util.stream.Collectors; @Service @RequiredArgsConstructor public class AskServiceImpl implements AskService { @Value("${paddle-speech.tts}") private String tts; @Value("${paddle-speech.asr}") private String asr; @Value("${rasa.url}") private String rasa; 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(bytes); // 这里调用Python的接口,将文字转换为语音 String post = HttpUtil.post(asr, JSONUtil.toJsonStr(new AsrReqDTO(encode))); try { PaddleSpeechResDTO<AsrResultDTO> response = objectMapper.readValue(post, new TypeReference<PaddleSpeechResDTO<AsrResultDTO>>() {}); 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<TtsResultDTO> response = objectMapper.readValue(post, new TypeReference<PaddleSpeechResDTO<TtsResultDTO>>() { }); 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("语音转换文字失败"); } } @Override public List<String> conversation(String question) { RasaReqDTO rasaReqDTO = new RasaReqDTO(); rasaReqDTO.setSender("tester1"); rasaReqDTO.setMessage(question); String post = HttpUtil.post(rasa, JSONUtil.toJsonStr(rasaReqDTO)); List<RasaResDTO> list = JSONUtil.toList(post, RasaResDTO.class); return list.stream().map(RasaResDTO::getText).collect(Collectors.toList()); } }