Explorar o código

Debug 视频人脸融合

tsurumure hai 2 meses
pai
achega
d7292583fb

+ 0 - 1
src/main/java/com/backendsys/config/Mybatis/handler/timezone/LocalDateTimeAdapter.java

@@ -1,7 +1,6 @@
 package com.backendsys.config.Mybatis.handler.timezone;
 
 import com.google.gson.*;
-
 import java.lang.reflect.Type;
 import java.time.LocalDateTime;
 import java.time.format.DateTimeFormatter;

+ 1 - 2
src/main/java/com/backendsys/modules/common/interceptor/TimezoneInterceptor.java → src/main/java/com/backendsys/config/Mybatis/handler/timezone/TimezoneInterceptor.java

@@ -1,6 +1,5 @@
-package com.backendsys.modules.common.interceptor;
+package com.backendsys.config.Mybatis.handler.timezone;
 
-import com.backendsys.config.Mybatis.handler.timezone.TimezoneContextHolder;
 import org.springframework.beans.factory.annotation.Value;
 import org.springframework.stereotype.Component;
 import org.springframework.web.servlet.HandlerInterceptor;

+ 2 - 2
src/main/java/com/backendsys/modules/common/config/WebConfig.java → src/main/java/com/backendsys/config/WebConfig.java

@@ -1,7 +1,7 @@
-package com.backendsys.modules.common.config;
+package com.backendsys.config;
 
 import com.backendsys.modules.common.interceptor.ApiLogInterceptor;
-import com.backendsys.modules.common.interceptor.TimezoneInterceptor;
+import com.backendsys.config.Mybatis.handler.timezone.TimezoneInterceptor;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.beans.factory.annotation.Value;
 import org.springframework.context.annotation.Configuration;

+ 0 - 11
src/main/java/com/backendsys/modules/TestController.java

@@ -110,17 +110,6 @@ public class TestController {
 //        return deepSeekClient.chatFluxCompletion(request);
 //    }
 
-    @Autowired
-    private VolcengineService volcengineService;
-
-    @PostMapping("/FaceSwapV2")
-    public Result FaceSwapV2(@RequestBody VisualFaceSwapV2 visualFaceSwapV2) {
-        System.out.println(visualFaceSwapV2);
-        return Result.success().put("data", volcengineService.FaceSwapV2(visualFaceSwapV2));
-    }
-
-
-
     @Autowired
     private ServletContext servletContext;
 

+ 45 - 0
src/main/java/com/backendsys/modules/sdk/volcengine/controller/VolcengineDemoController.java

@@ -0,0 +1,45 @@
+package com.backendsys.modules.sdk.volcengine.controller;
+
+import com.backendsys.modules.common.config.security.annotations.Anonymous;
+import com.backendsys.modules.common.utils.Result;
+import com.backendsys.modules.sdk.volcengine.entity.VisualFaceFusionMovie;
+import com.backendsys.modules.sdk.volcengine.entity.VisualFaceSwapV2;
+import com.backendsys.modules.sdk.volcengine.service.VolcengineService;
+import io.swagger.v3.oas.annotations.Operation;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RestController;
+
+@RestController
+public class VolcengineDemoController {
+
+    @Autowired
+    private VolcengineService volcengineService;
+
+    @Anonymous
+    @Operation(summary = "人像融合3.6(最新版)(图像)")
+    @PostMapping("/api/volcegine/faceSwapV2")
+    public Result FaceSwapV2(@RequestBody VisualFaceSwapV2 visualFaceSwapV2) {
+        System.out.println(visualFaceSwapV2);
+        return Result.success().put("data", volcengineService.faceSwapV2(visualFaceSwapV2));
+    }
+
+    @Anonymous
+    @Operation(summary = "人脸融合(视频)")
+    @PostMapping("/api/volcegine/faceFusionMovieSync")
+    public Result faceFusionMovieSync(@RequestBody VisualFaceFusionMovie visualFaceFusionMovie) {
+        System.out.println(visualFaceFusionMovie);
+        return Result.success().put("data", volcengineService.faceFusionMovie(visualFaceFusionMovie));
+    }
+
+    @Anonymous
+    @Operation(summary = "人脸融合(视频)-查询结果")
+    @GetMapping("/api/volcegine/faceFusionMovieGetResult")
+    public Result faceFusionMovieGetResult(String task_id) {
+        return Result.success().put("data", volcengineService.faceFusionMovieGetResult(task_id));
+    }
+    //
+
+}

+ 24 - 0
src/main/java/com/backendsys/modules/sdk/volcengine/entity/VisualFaceFusionMovie.java

@@ -0,0 +1,24 @@
+package com.backendsys.modules.sdk.volcengine.entity;
+
+import lombok.Data;
+
+import java.util.List;
+
+@Data
+public class VisualFaceFusionMovie {
+
+    // 待处理的视频链接
+    private String video_url;
+
+    // 换脸的图片链接,支持2个人脸图链接,多个链接之间使用逗号分隔
+    private List<String> image_urls;
+
+    /*
+        指定视频中待融合人脸的图像URL地址。当视频中有多个人脸时,通过该参数提供的人脸清晰正面照,
+        可以指定要融合人脸的人物,该参数填写待融合人脸的图像URL地址。
+        当视频中仅有一人,或需要融合不特定某人的人脸时,该参数可填写空字符串。
+        多个人脸时用逗号分隔,顺序与image_url一致。
+     */
+    private List<String> ref_img_urls;
+
+}

+ 17 - 2
src/main/java/com/backendsys/modules/sdk/volcengine/service/VolcengineService.java

@@ -1,11 +1,26 @@
 package com.backendsys.modules.sdk.volcengine.service;
 
+import com.backendsys.modules.sdk.volcengine.entity.VisualFaceFusionMovie;
 import com.backendsys.modules.sdk.volcengine.entity.VisualFaceSwapV2;
+import com.volcengine.service.visual.model.request.VisualFaceFusionMovieGetResultRequest;
+import com.volcengine.service.visual.model.response.VisualFaceFusionMovieGetResultResponse;
+import com.volcengine.service.visual.model.response.VisualFaceFusionMovieSubmitTaskResponse;
+import com.volcengine.service.visual.model.response.VisualFaceFusionMovieSyncResponse;
 import com.volcengine.service.visual.model.response.VisualFaceSwapV2Response;
 
 public interface VolcengineService {
 
-    // 人像融合3.6(最新版)
-    VisualFaceSwapV2Response FaceSwapV2(VisualFaceSwapV2 visualFaceSwapV2);
+    // 图像-人像融合3.6(最新版)
+    VisualFaceSwapV2Response faceSwapV2(VisualFaceSwapV2 visualFaceSwapV2);
+
+    // 视频-人脸融合-同步
+    VisualFaceFusionMovieSyncResponse faceFusionMovieSync(VisualFaceFusionMovie visualFaceFusionMovie);
+
+    // 视频-人脸融合-异步
+    VisualFaceFusionMovieSubmitTaskResponse faceFusionMovie(VisualFaceFusionMovie visualFaceFusionMovie);
+
+    // 视频-人脸融合-异步-查询
+    VisualFaceFusionMovieGetResultResponse faceFusionMovieGetResult(String task_id);
+
 
 }

+ 176 - 6
src/main/java/com/backendsys/modules/sdk/volcengine/service/impl/VolcengineServiceImpl.java

@@ -1,12 +1,20 @@
 package com.backendsys.modules.sdk.volcengine.service.impl;
 
+import cn.hutool.core.util.StrUtil;
 import com.alibaba.fastjson.JSON;
 import com.backendsys.exception.CustException;
+import com.backendsys.modules.sdk.volcengine.entity.VisualFaceFusionMovie;
 import com.backendsys.modules.sdk.volcengine.entity.VisualFaceSwapV2;
 import com.backendsys.modules.sdk.volcengine.service.VolcengineService;
 import com.volcengine.service.visual.IVisualService;
 import com.volcengine.service.visual.impl.VisualServiceImpl;
+import com.volcengine.service.visual.model.request.VisualFaceFusionMovieGetResultRequest;
+import com.volcengine.service.visual.model.request.VisualFaceFusionMovieSubmitTaskRequest;
+import com.volcengine.service.visual.model.request.VisualFaceFusionMovieSyncRequest;
 import com.volcengine.service.visual.model.request.VisualFaceSwapV2Request;
+import com.volcengine.service.visual.model.response.VisualFaceFusionMovieGetResultResponse;
+import com.volcengine.service.visual.model.response.VisualFaceFusionMovieSubmitTaskResponse;
+import com.volcengine.service.visual.model.response.VisualFaceFusionMovieSyncResponse;
 import com.volcengine.service.visual.model.response.VisualFaceSwapV2Response;
 import org.springframework.stereotype.Service;
 
@@ -19,17 +27,21 @@ import java.util.ArrayList;
 @Service
 public class VolcengineServiceImpl implements VolcengineService {
 
+    private String ACCESS_KEY = "AKLTNzVlZWQwNzYxYTc2NDNmY2JlYzRiMzU5NDkzOGE0ZmQ";
+    private String SECRET_KEY = "TVdJMU5XWTRNV1ZpWTJFMk5ETmtNV0pqTWpGaU5Ua3hOelF6TWpjNU0yVQ==";
+
+
     /**
      * 人像融合3.6(最新版)
-     * https://www.volcengine.com/docs/6791/1337909
-     * https://github.com/volcengine/volc-sdk-java/blob/main/example/src/main/java/com/volcengine/example/visual/FaceSwapV2Demo.java
+     * 文档:https://www.volcengine.com/docs/6791/1337909
+     * 代码:https://github.com/volcengine/volc-sdk-java/blob/main/example/src/main/java/com/volcengine/example/visual/FaceSwapV2Demo.java
      */
     @Override
-    public VisualFaceSwapV2Response FaceSwapV2(VisualFaceSwapV2 visualFaceSwapV2) {
-        IVisualService visualService = VisualServiceImpl.getInstance();
+    public VisualFaceSwapV2Response faceSwapV2(VisualFaceSwapV2 visualFaceSwapV2) {
 
-        visualService.setAccessKey("AKLTNzVlZWQwNzYxYTc2NDNmY2JlYzRiMzU5NDkzOGE0ZmQ");
-        visualService.setSecretKey("TVdJMU5XWTRNV1ZpWTJFMk5ETmtNV0pqTWpGaU5Ua3hOelF6TWpjNU0yVQ==");
+        IVisualService visualService = VisualServiceImpl.getInstance();
+        visualService.setAccessKey(ACCESS_KEY);
+        visualService.setSecretKey(SECRET_KEY);
 
         VisualFaceSwapV2Request req = new VisualFaceSwapV2Request();
 
@@ -56,4 +68,162 @@ public class VolcengineServiceImpl implements VolcengineService {
         }
     }
 
+
+    /**
+     * 视频-人脸融合-同步
+     * 文档:https://www.volcengine.com/docs/6792/145429
+     * 代码:https://github.com/volcengine/volc-sdk-java/blob/main/example/src/main/java/com/volcengine/example/visual/FaceFusionMovieSyncDemo.java
+     */
+    @Override
+    public VisualFaceFusionMovieSyncResponse faceFusionMovieSync(VisualFaceFusionMovie visualFaceFusionMovie) {
+
+        IVisualService visualService = VisualServiceImpl.getInstance();
+        visualService.setAccessKey(ACCESS_KEY);
+        visualService.setSecretKey(SECRET_KEY);
+
+        // 视频人脸融合同步接口
+        VisualFaceFusionMovieSyncRequest req = new VisualFaceFusionMovieSyncRequest();
+
+        /*
+            按量计费-标准版 facefusionmovie_usage
+            按量计费-高级版 3.4版本取固定值 facefusionmovie_standard_v2_usage
+            按量计费-高级版 3.6版本取固定值 facefusionmovie_standard_v3_usage
+            QPS计费-高级版 3.4版本取固定值 facefusionmovie_standard_v2
+            QPS计费-高级版 3.6版本取固定值 facefusionmovie_standard_v3
+            QPS计费2.X facefusionmovie_standard
+         */
+        req.setReqKey("facefusionmovie_usage");
+
+        // -- 入参 -------------------------------------------------------------------
+        req.setVideo_url(visualFaceFusionMovie.getVideo_url());
+        System.out.println("video_url = " + visualFaceFusionMovie.getVideo_url());
+
+        String image_urls = StrUtil.join(",", visualFaceFusionMovie.getImage_urls());
+        System.out.println("image_urls = " + image_urls);
+        req.setImage_url(image_urls);
+
+        if (visualFaceFusionMovie.getRef_img_urls() != null && !visualFaceFusionMovie.getRef_img_urls().isEmpty()) {
+            String ref_img_urls = StrUtil.join(",", visualFaceFusionMovie.getRef_img_urls());
+            System.out.println("ref_img_urls = " + ref_img_urls);
+            req.setRefImgUrl(ref_img_urls);
+        }
+        // --------------------------------------------------------------------------
+
+        req.setEnableFaceBeautify(true);
+
+        try {
+            VisualFaceFusionMovieSyncResponse response = visualService.faceFusionMovieSync(req);
+            System.out.println(JSON.toJSONString(response));
+
+            return response;
+        } catch (Exception e) {
+            e.printStackTrace();
+            System.out.println(e.getMessage());
+            throw new CustException(e.getMessage());
+        }
+    };
+
+    /**
+     * 视频-人脸融合-异步
+     * 代码:https://github.com/volcengine/volc-sdk-java/blob/main/example/src/main/java/com/volcengine/example/visual/FaceFusionMovieDemo.java
+     */
+    @Override
+    public VisualFaceFusionMovieSubmitTaskResponse faceFusionMovie(VisualFaceFusionMovie visualFaceFusionMovie) {
+
+        IVisualService visualService = VisualServiceImpl.getInstance();
+        visualService.setAccessKey(ACCESS_KEY);
+        visualService.setSecretKey(SECRET_KEY);
+
+        //提交任务
+        VisualFaceFusionMovieSubmitTaskRequest req = new VisualFaceFusionMovieSubmitTaskRequest();
+
+        /*
+            按量计费-标准版 facefusionmovie_usage
+            按量计费-高级版 3.4版本取固定值 facefusionmovie_standard_v2_usage
+            按量计费-高级版 3.6版本取固定值 facefusionmovie_standard_v3_usage
+            QPS计费-高级版 3.4版本取固定值 facefusionmovie_standard_v2
+            QPS计费-高级版 3.6版本取固定值 facefusionmovie_standard_v3
+            QPS计费2.X facefusionmovie_standard
+         */
+//        req.setReqKey("facefusionmovie_usage");
+        req.setReqKey("facefusionmovie_standard_v3_usage");
+
+        // -- 入参 -------------------------------------------------------------------
+        req.setVideoUrl(visualFaceFusionMovie.getVideo_url());
+        System.out.println("video_url = " + visualFaceFusionMovie.getVideo_url());
+
+        String image_urls = StrUtil.join(",", visualFaceFusionMovie.getImage_urls());
+        System.out.println("image_urls = " + image_urls);
+        req.setImageUrl(image_urls);
+
+        if (visualFaceFusionMovie.getRef_img_urls() != null && !visualFaceFusionMovie.getRef_img_urls().isEmpty()) {
+            String ref_img_urls = StrUtil.join(",", visualFaceFusionMovie.getRef_img_urls());
+            System.out.println("ref_img_urls = " + ref_img_urls);
+            req.setRefImgUrl(ref_img_urls);
+        }
+        // --------------------------------------------------------------------------
+
+//        req.setSourceSimilarity("");
+
+        //水印信息
+//        VisualFaceFusionMovieSubmitTaskRequest.LogoInfo  logoInfo= new VisualFaceFusionMovieSubmitTaskRequest.LogoInfo();
+//        logoInfo.setAddlogo(true);
+//        logoInfo.setPosition(2);
+//        logoInfo.setLanguage(0);
+//        logoInfo.setOpacity(0.9);
+//        req.setLogoInfo(logoInfo);
+        //3.x版本参数
+//        req.setEnableFaceBeautify(false);
+//        req.setSharpening(0);
+//        req.setWhitening(0);
+//        req.setDermabrasion(0);
+//        req.setGpen(1);
+
+        try {
+            VisualFaceFusionMovieSubmitTaskResponse response = visualService.faceFusionMovieSubmitTask(req);
+            System.out.println(JSON.toJSONString(response));
+            return response;
+        } catch (Exception e) {
+            e.printStackTrace();
+            System.out.println(e.getMessage());
+            throw new CustException(e.getMessage());
+        }
+
+
+    }
+
+    // 视频-人脸融合-异步-查询
+    @Override
+    public VisualFaceFusionMovieGetResultResponse faceFusionMovieGetResult(String task_id) {
+
+        IVisualService visualService = VisualServiceImpl.getInstance();
+        visualService.setAccessKey(ACCESS_KEY);
+        visualService.setSecretKey(SECRET_KEY);
+
+        // 查询任务
+        VisualFaceFusionMovieGetResultRequest req = new VisualFaceFusionMovieGetResultRequest();
+
+        /*
+            按量计费-标准版 facefusionmovie_usage
+            按量计费-高级版 3.4版本取固定值 facefusionmovie_standard_v2_usage
+            按量计费-高级版 3.6版本取固定值 facefusionmovie_standard_v3_usage
+            QPS计费-高级版 3.4版本取固定值 facefusionmovie_standard_v2
+            QPS计费-高级版 3.6版本取固定值 facefusionmovie_standard_v3
+            QPS计费2.X facefusionmovie_standard
+         */
+        req.setReqKey("facefusionmovie_usage");
+
+        req.setTaskId(task_id);
+
+        try {
+            VisualFaceFusionMovieGetResultResponse response = visualService.faceFusionMovieGetResult(req);
+            System.out.println(JSON.toJSONString(response));
+            return response;
+        } catch (Exception e) {
+            e.printStackTrace();
+            System.out.println(e.getMessage());
+            throw new CustException(e.getMessage());
+        }
+    }
+
 }