|
|
|
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());
|
|
|
|
}
|
|
|
|
}
|