From d419a2abed1cd7c8c8cc34db0d7ff4cc894eb5d5 Mon Sep 17 00:00:00 2001
From: 康鲁杰 <60095866+KangLujie@users.noreply.github.com>
Date: 星期一, 14 四月 2025 16:01:11 +0800
Subject: [PATCH] 声音模型

---
 yudao-module-digitalcourse/yudao-module-digitalcourse-biz/src/main/java/cn/iocoder/yudao/module/digitalcourse/service/voices/VoicesServiceUtil.java |   81 ++++++++++++++++++++++++++++++++--------
 yudao-module-digitalcourse/yudao-module-digitalcourse-biz/src/main/java/cn/iocoder/yudao/module/digitalcourse/util/PPTUtil.java                     |    3 +
 yudao-module-digitalcourse/yudao-module-digitalcourse-biz/src/main/java/cn/iocoder/yudao/module/digitalcourse/dal/dataobject/voices/VoicesDO.java   |    6 ++-
 yudao-module-digitalcourse/yudao-module-digitalcourse-biz/src/main/java/cn/iocoder/yudao/module/digitalcourse/service/voices/VoicesServiceImpl.java |    9 +---
 4 files changed, 73 insertions(+), 26 deletions(-)

diff --git a/yudao-module-digitalcourse/yudao-module-digitalcourse-biz/src/main/java/cn/iocoder/yudao/module/digitalcourse/dal/dataobject/voices/VoicesDO.java b/yudao-module-digitalcourse/yudao-module-digitalcourse-biz/src/main/java/cn/iocoder/yudao/module/digitalcourse/dal/dataobject/voices/VoicesDO.java
index 91e0f89..3f492b5 100644
--- a/yudao-module-digitalcourse/yudao-module-digitalcourse-biz/src/main/java/cn/iocoder/yudao/module/digitalcourse/dal/dataobject/voices/VoicesDO.java
+++ b/yudao-module-digitalcourse/yudao-module-digitalcourse-biz/src/main/java/cn/iocoder/yudao/module/digitalcourse/dal/dataobject/voices/VoicesDO.java
@@ -64,7 +64,7 @@
      */
     private Integer quality;
     /**
-     * 澹伴煶绫诲瀷 
+     * 澹伴煶绫诲瀷
      *
      * 鏋氫妇 {@link TODO digitalcourse_voices_type 瀵瑰簲鐨勭被}
      */
@@ -84,5 +84,7 @@
      * 鍏嬮殕绫诲瀷锛�1锛氭櫘閫氾紝2锛氶珮绾э級
      */
     private Integer type;
+    private String referenceAudioText;
+    private String asrFormatAudioUrl;
 
-}
\ 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 7268984..3f5604f 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
@@ -55,14 +55,11 @@
         createReqVO.setCode(UUID.fastUUID().toString());
         // 鎻掑叆
         VoicesDO voices = BeanUtils.toBean(createReqVO, VoicesDO.class);
+        voices.setStatus(3);
+        voices.setFixAuditionUrl(voices.getAuditionUrl());
         voicesMapper.insert(voices);
         // 鍒ゆ柇濡傛灉鏄瀬閫熸ā寮忥紝鑷姩寮�濮嬭缁�
-        if(voices.getType()==1) {
-            VoicesSaveReqVO reqVO = BeanUtils.toBean(voices, VoicesSaveReqVO.class);
-            reqVO.setStatus(3);
-            reqVO.setFixAuditionUrl(voices.getAuditionUrl());
-            updateVoices(reqVO);
-        }
+        voicesServiceUtil.remoteTrain(transferVO(voices.getId()));
         // 杩斿洖
         return voices.getId();
     }
diff --git a/yudao-module-digitalcourse/yudao-module-digitalcourse-biz/src/main/java/cn/iocoder/yudao/module/digitalcourse/service/voices/VoicesServiceUtil.java b/yudao-module-digitalcourse/yudao-module-digitalcourse-biz/src/main/java/cn/iocoder/yudao/module/digitalcourse/service/voices/VoicesServiceUtil.java
index b2bad44..0ababbb 100644
--- a/yudao-module-digitalcourse/yudao-module-digitalcourse-biz/src/main/java/cn/iocoder/yudao/module/digitalcourse/service/voices/VoicesServiceUtil.java
+++ b/yudao-module-digitalcourse/yudao-module-digitalcourse-biz/src/main/java/cn/iocoder/yudao/module/digitalcourse/service/voices/VoicesServiceUtil.java
@@ -3,6 +3,7 @@
 import cn.hutool.http.HttpRequest;
 import cn.hutool.http.HttpResponse;
 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.VoicesDO;
 import cn.iocoder.yudao.module.digitalcourse.dal.mysql.voices.VoicesMapper;
 import cn.iocoder.yudao.module.infra.api.config.ConfigApi;
@@ -19,6 +20,12 @@
 import org.springframework.stereotype.Component;
 import org.springframework.validation.annotation.Validated;
 
+import java.io.IOException;
+import java.nio.file.Files;
+import java.nio.file.Path;
+import java.nio.file.Paths;
+import java.nio.file.StandardCopyOption;
+import java.text.SimpleDateFormat;
 import java.util.Calendar;
 import java.util.Date;
 import java.util.List;
@@ -44,20 +51,53 @@
     private ConfigApi configApi;
     @Resource
     private VoicesMapper voicesMapper;
+    private static final String HEYGEM_VOICE_DATA = "heygem.voice.data";
 
+    private static final String HEYGEM_FACE2FACE = "heygem.face2face";
+
+    private static final String EASEGEN_URL = "easegen.url";
+
+    private static final String HEYGEM_CORE_URL = "heygem.core.url";
+    @Async
     public void remoteTrain(VoicesTrailVO trailVO){
+        String origin_audio = configApi.getConfigValueByKey(HEYGEM_VOICE_DATA) + "/origin_audio";
+        //璁粌鍓嶆牎楠�
+        try {
+            Files.createDirectories(Path.of(origin_audio));
+        } catch (IOException e) {
+            throw new RuntimeException(e);
+        }
+        String extname = trailVO.getFixAuditionUrl().substring(trailVO.getFixAuditionUrl().lastIndexOf("."));
+        String modelFileName = new SimpleDateFormat("yyyyMMddHHmmssSSS").format(new Date()) + extname;
+        String modelFilePath = Paths.get(origin_audio, modelFileName).toString();
+
+        String substring = configApi.getConfigValueByKey(EASEGEN_URL)+trailVO.getFixAuditionUrl().substring(trailVO.getFixAuditionUrl().lastIndexOf("/"));
+
+        try {
+            Files.copy(Path.of(substring), Path.of(modelFilePath), StandardCopyOption.REPLACE_EXISTING);
+        } catch (IOException e) {
+            throw new RuntimeException(e);
+        }
+
+        String configValueByKey = configApi.getConfigValueByKey(HEYGEM_VOICE_DATA);
+        // 璁$畻鐩稿璺緞
+        Path relativeAudioPath = Path.of(configValueByKey).relativize(Path.of(modelFilePath));
+        Map<String, Object> map = Map.of(
+                "format", "wav",
+                "reference_audio", relativeAudioPath.toString().replace("\\", "/"),
+                "lang", "zh"
+        );
+        // 灏嗚矾寰勪腑鐨刓鏇挎崲涓�/  relativeAudioPath.toString()
+
         int maxRetries = 3; // 鏈�澶ч噸璇曟鏁�
         int retryCount = 0;  // 褰撳墠閲嶈瘯娆℃暟
         boolean success = false;
-        ObjectMapper mapper = new ObjectMapper();
-        mapper.setPropertyNamingStrategy(PropertyNamingStrategy.SNAKE_CASE);
 
         while (retryCount < maxRetries && !success) {
             try {
                 // 鍙戦�丳OST璇锋眰
-                HttpResponse execute = HttpRequest.post(configApi.getConfigValueByKey(EASEGEN_CORE_URL) + "/api/clone_voice")
-                        .header("X-API-Key", configApi.getConfigValueByKey(EASEGEN_CORE_KEY))
-                        .body(mapper.writeValueAsString(trailVO))
+                HttpResponse execute = HttpRequest.post(configApi.getConfigValueByKey(HEYGEM_CORE_URL) + "/v1/preprocess_and_tran")
+                        .body(JSON.toJSONString(map))
                         .execute();
                 String body = execute.body();
 
@@ -72,20 +112,27 @@
                     }
                     continue; // 閲嶆柊灏濊瘯
                 }
-
+                retryCount++;
+                if (retryCount >= maxRetries) {
+                    voicesMapper.update(new UpdateWrapper<VoicesDO>().lambda().eq(VoicesDO::getCode, trailVO.getCode()).set(VoicesDO::getStatus, ERROR_STATUS));
+                    log.error("璁粌澶辫触锛�->>>>>>>>>");
+                    return;
+                }
                 // 瑙f瀽鍝嶅簲锛屾鏌ユ槸鍚︽湁閿欒淇℃伅
                 JSONObject responseJson = JSON.parseObject(body);
-                if (!responseJson.getBoolean("success")) {
-                    // 澶勭悊涓氬姟閫昏緫閿欒锛屾洿鏂扮姸鎬佸拰閿欒淇℃伅
-                    String errorDetail = responseJson.getString("detail");
-                    retryCount++;
-                    if (retryCount >= maxRetries) {
-                        voicesMapper.update(new UpdateWrapper<VoicesDO>().lambda().eq(VoicesDO::getCode, trailVO.getCode()).set(VoicesDO::getStatus, ERROR_STATUS));
-                        log.error("璁粌澶辫触锛�->>>>>>>>>", errorDetail);
-                        return;
-                    }
-                    continue; // 閲嶆柊灏濊瘯
-                }
+                // 澶勭悊涓氬姟閫昏緫閿欒锛屾洿鏂扮姸鎬佸拰閿欒淇℃伅
+                String referenceAudioText = responseJson.getString("reference_audio_text");
+                String asrFormatAudioUrl = responseJson.getString("asr_format_audio_url");
+
+
+                voicesMapper.update(
+                        new UpdateWrapper<VoicesDO>()
+                                .lambda()
+                                .eq(VoicesDO::getCode, trailVO.getCode())  // 鏉′欢锛歝ode 绛変簬浼犲叆鐨勫��
+                                .set(VoicesDO::getStatus, 0)  // 鏇存柊瀛楁 status 涓� 0
+                                .set(VoicesDO::getAsrFormatAudioUrl,asrFormatAudioUrl)
+                                .set(VoicesDO::getReferenceAudioText,referenceAudioText)
+                );
                 success = true;
             }catch (Exception e){
                 retryCount++;
diff --git a/yudao-module-digitalcourse/yudao-module-digitalcourse-biz/src/main/java/cn/iocoder/yudao/module/digitalcourse/util/PPTUtil.java b/yudao-module-digitalcourse/yudao-module-digitalcourse-biz/src/main/java/cn/iocoder/yudao/module/digitalcourse/util/PPTUtil.java
index ec3723b..f917600 100644
--- a/yudao-module-digitalcourse/yudao-module-digitalcourse-biz/src/main/java/cn/iocoder/yudao/module/digitalcourse/util/PPTUtil.java
+++ b/yudao-module-digitalcourse/yudao-module-digitalcourse-biz/src/main/java/cn/iocoder/yudao/module/digitalcourse/util/PPTUtil.java
@@ -115,7 +115,7 @@
         try {
             // 鏇存柊杩涘害涓哄紑濮�
             redisCache.opsForValue().set(ANALYSIS_PPT_KEY + pptId, "0", 1, TimeUnit.DAYS);
-            
+
             // 涓嬭浇鏂囦欢
             log.info("[analysisPptLocal][寮�濮嬩笅杞絔 pptId:{}, url:{}", pptId, fileUrl);
             downloadedFile = downloadFile(fileUrl);
@@ -168,6 +168,7 @@
     }
 
     private File downloadFile(String fileUrl) throws IOException {
+        fileUrl = "http://127.0.0.1:48080" + fileUrl;
         log.info("[downloadFile][寮�濮媇 url:{}", fileUrl);
         URL url = new URL(fileUrl);
         String tempFileName = UUID.randomUUID().toString();

--
Gitblit v1.9.3