From 1972364a34dde64877b831588389312779547102 Mon Sep 17 00:00:00 2001 From: 康鲁杰 <60095866+KangLujie@users.noreply.github.com> Date: 星期一, 24 三月 2025 17:04:44 +0800 Subject: [PATCH] 试听 --- easegen-front/src/views/chooseTemplate/index.vue | 2 yudao-module-digitalcourse/yudao-module-digitalcourse-biz/src/main/java/cn/iocoder/yudao/module/digitalcourse/dal/dataobject/voices/AuditionDO.java | 33 -------- yudao-module-digitalcourse/yudao-module-digitalcourse-biz/src/main/java/cn/iocoder/yudao/module/digitalcourse/dal/dataobject/voices/AuditionVO.java | 14 +++ yudao-module-digitalcourse/yudao-module-digitalcourse-biz/src/main/java/cn/iocoder/yudao/module/digitalcourse/dal/dataobject/voices/InvokeVO.java | 56 ++++++++++++++ yudao-module-digitalcourse/yudao-module-digitalcourse-biz/src/main/java/cn/iocoder/yudao/module/digitalcourse/service/voices/VoicesServiceImpl.java | 114 ++++++++++----------------- yudao-module-digitalcourse/yudao-module-digitalcourse-biz/src/main/java/cn/iocoder/yudao/module/digitalcourse/service/voices/VoicesService.java | 7 - yudao-module-digitalcourse/yudao-module-digitalcourse-biz/src/main/java/cn/iocoder/yudao/module/digitalcourse/controller/admin/voices/VoicesController.java | 9 +- 7 files changed, 122 insertions(+), 113 deletions(-) diff --git a/easegen-front/src/views/chooseTemplate/index.vue b/easegen-front/src/views/chooseTemplate/index.vue index 470b021..5c2f5d0 100644 --- a/easegen-front/src/views/chooseTemplate/index.vue +++ b/easegen-front/src/views/chooseTemplate/index.vue @@ -1707,7 +1707,7 @@ const html = editorRef.value.getText(); const params = { text: html, - humans: humanId + humanId: humanId } showAudioPlay.value = true pptTemplateApi diff --git a/yudao-module-digitalcourse/yudao-module-digitalcourse-biz/src/main/java/cn/iocoder/yudao/module/digitalcourse/controller/admin/voices/VoicesController.java b/yudao-module-digitalcourse/yudao-module-digitalcourse-biz/src/main/java/cn/iocoder/yudao/module/digitalcourse/controller/admin/voices/VoicesController.java index f636e4d..e832bc4 100644 --- a/yudao-module-digitalcourse/yudao-module-digitalcourse-biz/src/main/java/cn/iocoder/yudao/module/digitalcourse/controller/admin/voices/VoicesController.java +++ b/yudao-module-digitalcourse/yudao-module-digitalcourse-biz/src/main/java/cn/iocoder/yudao/module/digitalcourse/controller/admin/voices/VoicesController.java @@ -9,6 +9,7 @@ import cn.iocoder.yudao.module.digitalcourse.controller.admin.voices.vo.VoicesRespVO; import cn.iocoder.yudao.module.digitalcourse.controller.admin.voices.vo.VoicesSaveReqVO; import cn.iocoder.yudao.module.digitalcourse.dal.dataobject.voices.AuditionDO; +import cn.iocoder.yudao.module.digitalcourse.dal.dataobject.voices.AuditionVO; import cn.iocoder.yudao.module.digitalcourse.dal.dataobject.voices.VoicesDO; import cn.iocoder.yudao.module.digitalcourse.service.voices.VoicesService; import cn.iocoder.yudao.module.infra.api.config.ConfigApi; @@ -112,12 +113,12 @@ @PostMapping("/audition") @Operation(summary = "璇曞惉") - public CommonResult<String> audition(@Valid @RequestBody AuditionDO auditionDO) { + public CommonResult<String> audition(@Valid @RequestBody AuditionVO auditionVO) { int limitWord = Integer.parseInt(configApi.getConfigValueByKey(Limit_AUDITIONWORD)); - if (limitWord<(auditionDO.getText().length())) { + if (limitWord<(auditionVO.getText().length())) { return CommonResult.error(BAD_REQUEST.getCode(), "璇曞惉鏂囧瓧瓒呭嚭瀛楁暟闄愬埗锛屾渶澶氥��"+limitWord+"銆戝瓧"); } - return success(voicesService.audition(auditionDO)); + return success(voicesService.audition(auditionVO)); } -} \ No newline at end of file +} diff --git a/yudao-module-digitalcourse/yudao-module-digitalcourse-biz/src/main/java/cn/iocoder/yudao/module/digitalcourse/dal/dataobject/voices/AuditionDO.java b/yudao-module-digitalcourse/yudao-module-digitalcourse-biz/src/main/java/cn/iocoder/yudao/module/digitalcourse/dal/dataobject/voices/AuditionDO.java index b64d914..738dda8 100644 --- a/yudao-module-digitalcourse/yudao-module-digitalcourse-biz/src/main/java/cn/iocoder/yudao/module/digitalcourse/dal/dataobject/voices/AuditionDO.java +++ b/yudao-module-digitalcourse/yudao-module-digitalcourse-biz/src/main/java/cn/iocoder/yudao/module/digitalcourse/dal/dataobject/voices/AuditionDO.java @@ -4,9 +4,6 @@ @Data @ToString(callSuper = true) -@Builder -@NoArgsConstructor -@AllArgsConstructor public class AuditionDO { /** @@ -15,38 +12,8 @@ private String text; /** - * 璇�� - */ - private Float speed; - - /** - * 闊抽珮 - */ - private Float pitch; - - /** - * 闊抽噺 - */ - private Float volume; - - /** - * 澹伴煶绫诲瀷 - */ - private Integer voiceType; - - /** - * 澹伴煶绫诲瀷Id - */ - private Integer voiceTypeId; - - /** * 澹伴煶Id */ private String voiceId; - - /** - * 鏅鸿兘璇�� - */ - private Integer smartSpeed; } diff --git a/yudao-module-digitalcourse/yudao-module-digitalcourse-biz/src/main/java/cn/iocoder/yudao/module/digitalcourse/dal/dataobject/voices/AuditionVO.java b/yudao-module-digitalcourse/yudao-module-digitalcourse-biz/src/main/java/cn/iocoder/yudao/module/digitalcourse/dal/dataobject/voices/AuditionVO.java new file mode 100644 index 0000000..80a89db --- /dev/null +++ b/yudao-module-digitalcourse/yudao-module-digitalcourse-biz/src/main/java/cn/iocoder/yudao/module/digitalcourse/dal/dataobject/voices/AuditionVO.java @@ -0,0 +1,14 @@ +package cn.iocoder.yudao.module.digitalcourse.dal.dataobject.voices; + +import lombok.Data; + +/** + * @author kanglujie + * @date 2025-03-24 15:50:10 + */ +@Data +public class AuditionVO { + private String text; + private String humanId; + +} diff --git a/yudao-module-digitalcourse/yudao-module-digitalcourse-biz/src/main/java/cn/iocoder/yudao/module/digitalcourse/dal/dataobject/voices/InvokeVO.java b/yudao-module-digitalcourse/yudao-module-digitalcourse-biz/src/main/java/cn/iocoder/yudao/module/digitalcourse/dal/dataobject/voices/InvokeVO.java new file mode 100644 index 0000000..b057ed9 --- /dev/null +++ b/yudao-module-digitalcourse/yudao-module-digitalcourse-biz/src/main/java/cn/iocoder/yudao/module/digitalcourse/dal/dataobject/voices/InvokeVO.java @@ -0,0 +1,56 @@ +package cn.iocoder.yudao.module.digitalcourse.dal.dataobject.voices; + +import com.fasterxml.jackson.annotation.JsonProperty; +import lombok.*; + +import java.util.UUID; + +@Data +@ToString(callSuper = true) +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class InvokeVO { + private String speaker; // UUID锛屼繚鎸佸敮涓� + private String text; // 闇�瑕佸悎鎴愮殑鏂囨湰鍐呭 + private String format = "wav"; // 鍥哄畾浼犲弬 "wav" + + @JsonProperty("topP") + private double topP = 0.7; // 鍥哄畾浼犲弬 0.7 + + @JsonProperty("max_new_tokens") + private int maxNewTokens = 1024; // 鍥哄畾浼犲弬 1024 + + @JsonProperty("chunk_length") + private int chunkLength = 100; // 鍥哄畾浼犲弬 100 + + @JsonProperty("repetition_penalty") + private double repetitionPenalty = 1.2; // 鍥哄畾浼犲弬 1.2 + + private double temperature = 0.7; // 鍥哄畾浼犲弬 0.7 + + @JsonProperty("need_asr") + private boolean needAsr = false; // 鍥哄畾浼犲弬 false + + private boolean streaming = false; // 鍥哄畾浼犲弬 false + + @JsonProperty("is_fixed_seed") + private int isFixedSeed = 0; // 鍥哄畾浼犲弬 0 + + @JsonProperty("is_norm") + private int isNorm = 0; // 鍥哄畾浼犲弬 0 + + @JsonProperty("reference_audio") + private String referenceAudio; // 涓婁竴姝モ�滄ā鐗硅缁冣�濈殑杩斿洖鍊� + + @JsonProperty("reference_text") + private String referenceText; // 涓婁竴姝モ�滄ā鐗硅缁冣�濈殑杩斿洖鍊� + + // 鐢熸垚榛樿 UUID 鏂逛究娴嬭瘯 + public static String generateUUID() { + return UUID.randomUUID().toString(); + } + + + +} diff --git a/yudao-module-digitalcourse/yudao-module-digitalcourse-biz/src/main/java/cn/iocoder/yudao/module/digitalcourse/service/voices/VoicesService.java b/yudao-module-digitalcourse/yudao-module-digitalcourse-biz/src/main/java/cn/iocoder/yudao/module/digitalcourse/service/voices/VoicesService.java index 875e4d5..5ea3f5d 100644 --- a/yudao-module-digitalcourse/yudao-module-digitalcourse-biz/src/main/java/cn/iocoder/yudao/module/digitalcourse/service/voices/VoicesService.java +++ b/yudao-module-digitalcourse/yudao-module-digitalcourse-biz/src/main/java/cn/iocoder/yudao/module/digitalcourse/service/voices/VoicesService.java @@ -1,7 +1,6 @@ package cn.iocoder.yudao.module.digitalcourse.service.voices; -import cn.iocoder.yudao.module.digitalcourse.dal.dataobject.voices.AuditionDO; -import cn.iocoder.yudao.module.digitalcourse.dal.dataobject.voices.TTSDTO; +import cn.iocoder.yudao.module.digitalcourse.dal.dataobject.voices.AuditionVO; import jakarta.validation.*; import cn.iocoder.yudao.module.digitalcourse.controller.admin.voices.vo.*; import cn.iocoder.yudao.module.digitalcourse.dal.dataobject.voices.VoicesDO; @@ -53,7 +52,7 @@ PageResult<VoicesDO> getVoicesPage(VoicesPageReqVO pageReqVO); PageResult<VoicesDO> getVoicesCommonPage(VoicesPageReqVO pageReqVO); - String audition(AuditionDO auditionDO); + String audition(AuditionVO auditionVO); Boolean auditing(); -} \ No newline at end of file +} diff --git a/yudao-module-digitalcourse/yudao-module-digitalcourse-biz/src/main/java/cn/iocoder/yudao/module/digitalcourse/service/voices/VoicesServiceImpl.java b/yudao-module-digitalcourse/yudao-module-digitalcourse-biz/src/main/java/cn/iocoder/yudao/module/digitalcourse/service/voices/VoicesServiceImpl.java index 8ed3c4e..60ff852 100644 --- a/yudao-module-digitalcourse/yudao-module-digitalcourse-biz/src/main/java/cn/iocoder/yudao/module/digitalcourse/service/voices/VoicesServiceImpl.java +++ b/yudao-module-digitalcourse/yudao-module-digitalcourse-biz/src/main/java/cn/iocoder/yudao/module/digitalcourse/service/voices/VoicesServiceImpl.java @@ -2,36 +2,25 @@ 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.security.core.util.SecurityFrameworkUtils; 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.voices.AuditionDO; -import cn.iocoder.yudao.module.digitalcourse.dal.dataobject.voices.TTSDTO; -import cn.iocoder.yudao.module.digitalcourse.dal.dataobject.voices.VoicesDO; +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.alibaba.fastjson.JSON; -import com.fasterxml.jackson.databind.JsonNode; +import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.ObjectMapper; import jakarta.annotation.Resource; -import org.apache.commons.codec.binary.Base64; -import org.apache.hc.client5.http.classic.methods.HttpPost; -import org.apache.hc.client5.http.impl.classic.CloseableHttpClient; -import org.apache.hc.client5.http.impl.classic.CloseableHttpResponse; -import org.apache.hc.client5.http.impl.classic.HttpClients; -import org.apache.hc.core5.http.ContentType; -import org.apache.hc.core5.http.ParseException; -import org.apache.hc.core5.http.io.entity.EntityUtils; -import org.apache.hc.core5.http.io.entity.StringEntity; import org.springframework.stereotype.Service; import org.springframework.validation.annotation.Validated; - -import java.io.IOException; import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; import static cn.iocoder.yudao.module.digitalcourse.enums.ErrorCodeConstants.VOICES_NOT_EXISTS; @@ -129,7 +118,7 @@ }else { pageReqVO.setVoiceType(0); } - + return voicesMapper.selectPage(pageReqVO); } @Override @@ -145,61 +134,44 @@ return (auditing == null || auditing == 0); } + @Resource + private DigitalHumansMapper digitalHumansMapper; + private static final String EASEGEN_URL = "easegen.url"; @Override - public String audition(AuditionDO auditionDO) { - VoicesDO voice = voicesMapper.selectById(auditionDO.getVoiceId()); - TTSDTO ttsdto = new TTSDTO(); - if (voice != null) { - ttsdto.setModel_code(voice.getCode()); - ttsdto.setSentence(auditionDO.getText()); - ttsdto.setRequest_id(StrUtil.uuid()); - ttsdto.setUser_id(String.valueOf(SecurityFrameworkUtils.getLoginUser().getId())); - ttsdto.setVoice_type(String.valueOf(voice.getVoiceType())); - ttsdto.setPitch(auditionDO.getPitch()); - ttsdto.setSpeed(auditionDO.getSpeed()); - ttsdto.setVolume(auditionDO.getVolume()); - } else { - throw exception(VOICES_NOT_EXISTS); + 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 apiUrl = configApi.getConfigValueByKey(EASEGEN_CORE_URL)+"/api/tts"; - String apiKey = configApi.getConfigValueByKey(EASEGEN_CORE_KEY); - // 鍒涘缓HTTP瀹㈡埛绔� - try (CloseableHttpClient httpClient = HttpClients.createDefault()) { - // 鍒涘缓POST璇锋眰 - HttpPost httpPost = new HttpPost(apiUrl); - httpPost.setHeader("Content-Type", "application/json"); - httpPost.setHeader("X-API-Key", apiKey); - httpPost.setEntity(new StringEntity(JSON.toJSONString(ttsdto), ContentType.APPLICATION_JSON)); - // 鎵ц璇锋眰 - try (CloseableHttpResponse response = httpClient.execute(httpPost)) { - int statusCode = response.getCode(); - String responseString = EntityUtils.toString(response.getEntity()); - if (statusCode == 200) { - // 瑙f瀽JSON鍝嶅簲 - ObjectMapper objectMapper = new ObjectMapper(); - JsonNode jsonResponse = objectMapper.readTree(responseString); - String audioBase64 = jsonResponse.get("audio").asText(); - // 瑙g爜Base64闊抽瀛楃涓� - byte[] audioBytes = Base64.decodeBase64(audioBase64); - // 淇濆瓨闊抽鏂囦欢 - // 鎸囧畾鏂囦欢璺緞锛堜綘鍙互鏍规嵁瀹為檯鎯呭喌璁剧疆锛� - String fileName = StrUtil.uuid() + ".wav"; - String filePath = "temp/wav/" + fileName; - return fileApi.createFile(fileName, filePath, audioBytes); -// try (FileOutputStream fos = new FileOutputStream("output.wav")) { -// fos.write(audioBytes); -// String path = fileApi.createFile("output.wav", null, audioBytes); -// return path; -// } - } else { - System.out.println("Error: " + responseString); - } - } - } catch (IOException | ParseException e) { - e.printStackTrace(); - } - return null; + String fileName = UUID.randomUUID().toString() + ".wav"; + + // 鑾峰彇闊抽鏂囦欢鐨勪簩杩涘埗鏁版嵁 + byte[] content = execute.bodyBytes(); + + // 浣跨敤 `createFile` 鏂规硶瀛樺偍鏂囦欢锛屽苟鑾峰彇 URL + String fileUrl = fileApi.createFile(fileName, null, content); + + return fileUrl; // 杩斿洖瀛樺偍鐨勬枃浠� URL + // 杩斿洖闊抽鏂囦欢璺緞 + + } -} \ No newline at end of file +} -- Gitblit v1.9.3