package cn.iocoder.yudao.module.digitalcourse.service.voices; import cn.hutool.core.lang.UUID; import cn.hutool.core.util.StrUtil; import cn.hutool.http.HttpRequest; import cn.hutool.http.HttpResponse; import cn.iocoder.yudao.framework.common.pojo.PageResult; import cn.iocoder.yudao.framework.common.util.object.BeanUtils; import cn.iocoder.yudao.framework.web.core.util.WebFrameworkUtils; import cn.iocoder.yudao.module.digitalcourse.controller.admin.voices.vo.VoicesPageReqVO; import cn.iocoder.yudao.module.digitalcourse.controller.admin.voices.vo.VoicesSaveReqVO; import cn.iocoder.yudao.module.digitalcourse.controller.admin.voices.vo.VoicesTrailVO; import cn.iocoder.yudao.module.digitalcourse.dal.dataobject.digitalhumans.DigitalHumansDO; import cn.iocoder.yudao.module.digitalcourse.dal.dataobject.voices.*; import cn.iocoder.yudao.module.digitalcourse.dal.mysql.digitalhumans.DigitalHumansMapper; import cn.iocoder.yudao.module.digitalcourse.dal.mysql.voices.VoicesMapper; import cn.iocoder.yudao.module.infra.api.config.ConfigApi; import cn.iocoder.yudao.module.infra.api.file.FileApi; import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.ObjectMapper; import jakarta.annotation.Resource; import org.springframework.stereotype.Service; import org.springframework.validation.annotation.Validated; import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; import static cn.iocoder.yudao.module.digitalcourse.enums.ErrorCodeConstants.VOICES_NOT_EXISTS; /** * 声音管理 Service 实现类 * * @author 芋道源码 */ @Service @Validated public class VoicesServiceImpl implements VoicesService { private static final String EASEGEN_CORE_URL = "easegen.core.url"; static final String EASEGEN_CORE_KEY = "easegen.core.key"; @Resource private VoicesMapper voicesMapper; @Resource private FileApi fileApi; @Resource private ConfigApi configApi; @Resource private VoicesServiceUtil voicesServiceUtil; @Override public Long createVoices(VoicesSaveReqVO createReqVO) { createReqVO.setCode(UUID.fastUUID().toString()); // 插入 VoicesDO voices = BeanUtils.toBean(createReqVO, VoicesDO.class); voicesMapper.insert(voices); // 判断如果是极速模式,自动开始训练 if(voices.getType()==1) { VoicesSaveReqVO reqVO = BeanUtils.toBean(voices, VoicesSaveReqVO.class); reqVO.setStatus(3); reqVO.setFixAuditionUrl(voices.getAuditionUrl()); updateVoices(reqVO); } // 返回 return voices.getId(); } @Override public void updateVoices(VoicesSaveReqVO updateReqVO) { // 校验存在 validateVoicesExists(updateReqVO.getId()); // 更新 VoicesDO updateObj = BeanUtils.toBean(updateReqVO, VoicesDO.class); voicesMapper.updateById(updateObj); if (updateReqVO.getStatus() == 3){ voicesServiceUtil.remoteTrain(transferVO(updateReqVO.getId())); } } private VoicesTrailVO transferVO(Long id) { VoicesDO voices = this.getVoices(id); VoicesTrailVO build = VoicesTrailVO.builder().build(); BeanUtils.copyProperties(voices, build); if (StrUtil.isBlank(voices.getFixAuditionUrl())) build.setFixAuditionUrl(voices.getAuditionUrl()); build.setAccountId(voices.getCreator()); return build; } @Override public void deleteVoices(Long id) { // 校验存在 validateVoicesExists(id); // 删除 voicesMapper.deleteById(id); } private void validateVoicesExists(Long id) { if (voicesMapper.selectById(id) == null) { throw exception(VOICES_NOT_EXISTS); } } @Override public VoicesDO getVoices(Long id) { return voicesMapper.selectById(id); } @Override public PageResult getVoicesPage(VoicesPageReqVO pageReqVO) { if(pageReqVO.getVoiceType()==1){ //查询非公共声音,只能查询自己的,公共声音,可以查询所有的 if (WebFrameworkUtils.getLoginUserId() != 1) { pageReqVO.setCreator(String.valueOf(WebFrameworkUtils.getLoginUserId())); pageReqVO.setVoiceType(1); } }else { pageReqVO.setVoiceType(0); } return voicesMapper.selectPage(pageReqVO); } @Override public PageResult getVoicesCommonPage(VoicesPageReqVO pageReqVO) { return voicesMapper.selectPage(pageReqVO); } @Override public Boolean auditing() { // 管理员直接返回true if (WebFrameworkUtils.getLoginUserId() == 1) return true; Integer auditing = voicesMapper.auditing(WebFrameworkUtils.getLoginUserId()); return (auditing == null || auditing == 0); } @Resource private DigitalHumansMapper digitalHumansMapper; private static final String EASEGEN_URL = "easegen.url"; @Override public String audition(AuditionVO auditionVO) { DigitalHumansDO digitalHumansDO = digitalHumansMapper.selectById(auditionVO.getHumanId()); InvokeVO invokeVO = new InvokeVO(); invokeVO.setSpeaker(InvokeVO.generateUUID()); invokeVO.setReferenceText(digitalHumansDO.getReferenceAudioText()); invokeVO.setReferenceAudio(digitalHumansDO.getAsrFormatAudioUrl()); invokeVO.setText(auditionVO.getText()); ObjectMapper objectMapper = new ObjectMapper(); String jsonString = null; try { jsonString = objectMapper.writeValueAsString(invokeVO); } catch (JsonProcessingException e) { throw new RuntimeException(e); } HttpResponse execute = HttpRequest.post("http://192.168.3.161:18180/v1/invoke") .body(jsonString) .execute(); if (execute.getStatus() != 200) { return null; } String fileName = UUID.randomUUID().toString() + ".wav"; // 获取音频文件的二进制数据 byte[] content = execute.bodyBytes(); // 使用 `createFile` 方法存储文件,并获取 URL String fileUrl = fileApi.createFile(fileName, null, content); return fileUrl; // 返回存储的文件 URL // 返回音频文件路径 } }