Sfoglia il codice sorgente

Dev media ttv timbre

tsurumure 4 mesi fa
parent
commit
7dff2a244d

+ 1 - 1
db/ai_media_ttv.sql

@@ -19,4 +19,4 @@ CREATE TABLE `ai_media_ttv` (
     `object_key` TEXT COMMENT 'Object_key',
     `create_time` DATETIME DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
     `update_time` DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间'
-) ENGINE=INNODB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4 COMMENT='AI生成图文语音视频表 (百度)';
+) ENGINE=INNODB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4 COMMENT='AI图文语音生成视频表 (百度)';

+ 41 - 0
db/ai_media_ttv_timbre.sql

@@ -0,0 +1,41 @@
+/**
+Source Server Version: 8.0.31
+Source Database: backendsys
+Date: 2025/04/23 10:21:01
+*/
+
+DROP TABLE IF EXISTS `ai_media_ttv_timbre`;
+CREATE TABLE `ai_media_ttv_timbre` (
+    PRIMARY KEY (`id`),
+    `id` BIGINT AUTO_INCREMENT COMMENT 'ID',
+    `timbre_key` VARCHAR(255) NOT NULL COMMENT 'key',
+    `name` VARCHAR(255) NOT NULL COMMENT '名称',
+    `category_id` VARCHAR(255) COMMENT '分类 (1男声, 2女声, 3童男声, 4童女声)',
+    `tag` VARCHAR(255) NOT NULL COMMENT '标识',
+    `avatar` VARCHAR(1000) NOT NULL COMMENT '头像',
+    `description` VARCHAR(255) NOT NULL COMMENT '描述',
+    `audio_url` VARCHAR(1000) NOT NULL COMMENT '音源'
+) ENGINE=INNODB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4 COMMENT='AI图文语音音色表 (百度)';
+
+
+INSERT INTO ai_media_ttv_timbre(timbre_key, category_id, name, tag, description, avatar, audio_url) VALUES
+    ('0', '2', '小美-女', '成熟女声', '可使用于金融、零售、广告场景', 'http://cos.daoguyujia.com/materials/baidu/ai-generate-video/avatar/female-1.png', 'http://cos.daoguyujia.com/materials/baidu/ai-generate-video/audio/0:小美-女.mp3'),
+    ('1', '1', '小宇-男', '温润男声', '可使用于小说、故事场景', 'http://cos.daoguyujia.com/materials/baidu/ai-generate-video/avatar/male-1.png', 'http://cos.daoguyujia.com/materials/baidu/ai-generate-video/audio/1:小宇-男.mp3'),
+    ('3', '1', '小云-男', '磁性男声', '可使用于通用场景', 'http://cos.daoguyujia.com/materials/baidu/ai-generate-video/avatar/male-1.png', 'http://cos.daoguyujia.com/materials/baidu/ai-generate-video/audio/3:小云-男.mp3'),
+    ('4', '4', '小丫-女童', '乖巧童声', '可使用于小说、故事场景', 'http://cos.daoguyujia.com/materials/baidu/ai-generate-video/avatar/female-child-1.png', 'http://cos.daoguyujia.com/materials/baidu/ai-generate-video/audio/4:小丫-女童.mp3'),
+    ('5', '2', '小娇-女', '情感女声', '可使用于小说、故事场景', 'http://cos.daoguyujia.com/materials/baidu/ai-generate-video/avatar/female-1.png', 'http://cos.daoguyujia.com/materials/baidu/ai-generate-video/audio/5:小娇-女.mp3'),
+    ('103', '4', '小朵-女童', '可爱童声', '可使用于通用场景', 'http://cos.daoguyujia.com/materials/baidu/ai-generate-video/avatar/female-child-1.png', 'http://cos.daoguyujia.com/materials/baidu/ai-generate-video/audio/103:小朵-女童.mp3'),
+    ('106', '1', '小博-男', '成熟男声', '可使用于新闻、金融、零售场景', 'http://cos.daoguyujia.com/materials/baidu/ai-generate-video/avatar/male-1.png', 'http://cos.daoguyujia.com/materials/baidu/ai-generate-video/audio/106:小博-男.mp3'),
+    ('110', '3', '小童-男童', '活泼童声', '可使用于通用场景', 'http://cos.daoguyujia.com/materials/baidu/ai-generate-video/avatar/male-child-1.png', 'http://cos.daoguyujia.com/materials/baidu/ai-generate-video/audio/110:小童-男童.mp3'),
+    ('111', '2', '小萌-女', '萝莉女声', '可使用于社交、游戏场景', 'http://cos.daoguyujia.com/materials/baidu/ai-generate-video/avatar/female-child-1.png', 'http://cos.daoguyujia.com/materials/baidu/ai-generate-video/audio/111:小萌-女.mp3'),
+    ('4003', '1', '小耀-男', '磁性男声', '可使用于金融、零售、广告场景', 'http://cos.daoguyujia.com/materials/baidu/ai-generate-video/avatar/male-1.png', 'http://cos.daoguyujia.com/materials/baidu/ai-generate-video/audio/4003:小耀-男.mp3'),
+    ('4100', '2', '小雯-女', '成熟女声', '可使用于新闻、金融、零售场景', 'http://cos.daoguyujia.com/materials/baidu/ai-generate-video/avatar/female-1.png', 'http://cos.daoguyujia.com/materials/baidu/ai-generate-video/audio/4100:小雯-女.mp3'),
+    ('4103', '3', '小米-男童', '可爱童声', '可使用于通用场景', 'http://cos.daoguyujia.com/materials/baidu/ai-generate-video/avatar/male-child-1.png', 'http://cos.daoguyujia.com/materials/baidu/ai-generate-video/audio/4103:小米-男童.mp3'),
+    ('4105', '2', '小灵-女', '清澈女声', '可使用于通用场景', 'http://cos.daoguyujia.com/materials/baidu/ai-generate-video/avatar/female-1.png', 'http://cos.daoguyujia.com/materials/baidu/ai-generate-video/audio/4105:小灵-女.mp3'),
+    ('4106', '1', '小文-男', '情感男声', '可使用于社交、游戏场景', 'http://cos.daoguyujia.com/materials/baidu/ai-generate-video/avatar/male-1.png', 'http://cos.daoguyujia.com/materials/baidu/ai-generate-video/audio/4106:小文-男.mp3'),
+    ('4115', '1', '小贤-男', '情感男声', '可使用于社交、故事场景', 'http://cos.daoguyujia.com/materials/baidu/ai-generate-video/avatar/male-1.png', 'http://cos.daoguyujia.com/materials/baidu/ai-generate-video/audio/4115:小贤-男.mp3'),
+    ('4117', '2', '小乔-女', '情感女声', '可使用于社交、故事场景', 'http://cos.daoguyujia.com/materials/baidu/ai-generate-video/avatar/female-1.png', 'http://cos.daoguyujia.com/materials/baidu/ai-generate-video/audio/4117:小乔-女.mp3'),
+    ('4119', '2', '小鹿-女', '甜美女声', '可使用于社交、游戏场景', 'http://cos.daoguyujia.com/materials/baidu/ai-generate-video/avatar/female-1.png', 'http://cos.daoguyujia.com/materials/baidu/ai-generate-video/audio/4119:小鹿-女.mp3'),
+    ('5003', '1', '小遥-男', '甜美男声', '可使用于社交、故事场景', 'http://cos.daoguyujia.com/materials/baidu/ai-generate-video/avatar/male-1.png', 'http://cos.daoguyujia.com/materials/baidu/ai-generate-video/audio/5003:小遥-男.mp3'),
+    ('5118', '2', '小婷-女', '甜美女声', '可使用于社交、游戏场景', 'http://cos.daoguyujia.com/materials/baidu/ai-generate-video/avatar/female-1.png', 'http://cos.daoguyujia.com/materials/baidu/ai-generate-video/audio/5118:小婷-女.mp3')
+;

+ 2 - 0
src/main/java/com/backendsys/modules/ai/chat/controller/ChatController.java

@@ -5,6 +5,7 @@ import com.backendsys.modules.ai.chat.service.ChatService;
 import com.backendsys.modules.common.config.security.utils.SecurityUtil;
 import com.backendsys.modules.common.utils.Result;
 import io.swagger.v3.oas.annotations.Operation;
+import io.swagger.v3.oas.annotations.tags.Tag;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.security.access.prepost.PreAuthorize;
 import org.springframework.validation.annotation.Validated;
@@ -12,6 +13,7 @@ import org.springframework.web.bind.annotation.*;
 
 @Validated
 @RestController
+@Tag(name = "AI对话")
 public class ChatController {
 
     @Autowired

+ 2 - 0
src/main/java/com/backendsys/modules/ai/chat/controller/ChatHistoryController.java

@@ -6,6 +6,7 @@ import com.backendsys.modules.ai.chat.service.ChatHistoryService;
 import com.backendsys.modules.common.config.security.utils.SecurityUtil;
 import com.backendsys.modules.common.utils.Result;
 import io.swagger.v3.oas.annotations.Operation;
+import io.swagger.v3.oas.annotations.tags.Tag;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.security.access.prepost.PreAuthorize;
 import org.springframework.validation.annotation.Validated;
@@ -16,6 +17,7 @@ import org.springframework.web.bind.annotation.RestController;
 
 @Validated
 @RestController
+@Tag(name = "AI对话历史")
 public class ChatHistoryController {
 
     @Autowired

+ 2 - 0
src/main/java/com/backendsys/modules/ai/chat/controller/ChatModelController.java

@@ -6,6 +6,7 @@ import com.backendsys.modules.ai.chat.service.ChatModelService;
 import com.backendsys.modules.common.config.security.utils.SecurityUtil;
 import com.backendsys.modules.common.utils.Result;
 import io.swagger.v3.oas.annotations.Operation;
+import io.swagger.v3.oas.annotations.tags.Tag;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.security.access.prepost.PreAuthorize;
 import org.springframework.validation.annotation.Validated;
@@ -16,6 +17,7 @@ import org.springframework.web.bind.annotation.RestController;
 
 @Validated
 @RestController
+@Tag(name = "AI对话-模型")
 public class ChatModelController {
 
     @Autowired

+ 7 - 6
src/main/java/com/backendsys/modules/ai/media/controller/MediaController.java → src/main/java/com/backendsys/modules/ai/media/controller/MediaTtvController.java

@@ -1,11 +1,11 @@
 package com.backendsys.modules.ai.media.controller;
 
 import com.backendsys.modules.ai.media.entity.MediaTtv;
-import com.backendsys.modules.ai.media.service.MediaService;
+import com.backendsys.modules.ai.media.service.MediaTtvService;
 import com.backendsys.modules.common.config.security.utils.SecurityUtil;
 import com.backendsys.modules.common.utils.Result;
-import com.fasterxml.jackson.core.JsonProcessingException;
 import io.swagger.v3.oas.annotations.Operation;
+import io.swagger.v3.oas.annotations.tags.Tag;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.security.access.prepost.PreAuthorize;
 import org.springframework.validation.annotation.Validated;
@@ -16,24 +16,25 @@ import org.springframework.web.bind.annotation.RestController;
 
 @Validated
 @RestController
-public class MediaController {
+@Tag(name = "AI成片")
+public class MediaTtvController {
 
     @Autowired
-    private MediaService mediaService;
+    private MediaTtvService mediaTtvService;
 
     @Operation(summary = "生成图文语音视频")
     @PreAuthorize("@sr.hasPermission('34')")
     @PostMapping("/api/ai/media/ttv/generate")
     public Result generateMediaTtv(@Validated(MediaTtv.Generate.class) @RequestBody MediaTtv mediaTtv) {
         mediaTtv.setUser_id(SecurityUtil.getUserId());
-        return Result.success().put("data", mediaService.generateMediaTtv(mediaTtv));
+        return Result.success().put("data", mediaTtvService.generateMediaTtv(mediaTtv));
     }
 
     @Operation(summary = "查询图文语音视频")
     @PreAuthorize("@sr.hasPermission('34')")
     @GetMapping("/api/ai/media/ttv/query")
     public Result queryMediaTtv(@Validated(MediaTtv.Query.class) MediaTtv mediaTtv) {
-        return Result.success().put("data", mediaService.queryMediaTtv(mediaTtv));
+        return Result.success().put("data", mediaTtvService.queryMediaTtv(mediaTtv));
     }
 
 }

+ 40 - 0
src/main/java/com/backendsys/modules/ai/media/controller/MediaTtvTimbreController.java

@@ -0,0 +1,40 @@
+package com.backendsys.modules.ai.media.controller;
+
+import com.backendsys.modules.ai.media.entity.MediaTtv;
+import com.backendsys.modules.ai.media.service.MediaTtvService;
+import com.backendsys.modules.common.config.security.utils.SecurityUtil;
+import com.backendsys.modules.common.utils.Result;
+import io.swagger.v3.oas.annotations.Operation;
+import io.swagger.v3.oas.annotations.tags.Tag;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.validation.annotation.Validated;
+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;
+
+@Validated
+@RestController
+@Tag(name = "AI成片-音色")
+public class MediaTtvTimbreController {
+
+//    @Autowired
+//    private MediaTtvService mediaTtvService;
+//
+//    @Operation(summary = "生成图文语音视频")
+//    @PreAuthorize("@sr.hasPermission('34')")
+//    @PostMapping("/api/ai/media/ttv/generate")
+//    public Result generateMediaTtv(@Validated(MediaTtv.Generate.class) @RequestBody MediaTtv mediaTtv) {
+//        mediaTtv.setUser_id(SecurityUtil.getUserId());
+//        return Result.success().put("data", mediaTtvService.generateMediaTtv(mediaTtv));
+//    }
+//
+//    @Operation(summary = "查询图文语音视频")
+//    @PreAuthorize("@sr.hasPermission('34')")
+//    @GetMapping("/api/ai/media/ttv/query")
+//    public Result queryMediaTtv(@Validated(MediaTtv.Query.class) MediaTtv mediaTtv) {
+//        return Result.success().put("data", mediaTtvService.queryMediaTtv(mediaTtv));
+//    }
+
+}

+ 0 - 66
src/main/java/com/backendsys/modules/ai/media/entity/AiGenerateVideoDTO.java

@@ -1,66 +0,0 @@
-package com.backendsys.modules.ai.media.entity;
-
-import com.backendsys.entity.validator.RangeStringArray;
-import jakarta.validation.constraints.NotNull;
-import jakarta.validation.constraints.Size;
-import lombok.Data;
-import lombok.ToString;
-
-@Data
-@ToString
-public class AiGenerateVideoDTO {
-    public static interface Detail{}
-    public static interface Create{}
-    public static interface Update{}
-    public static interface Delete{}
-
-    private Long id;
-
-    private Long user_id;
-
-    @NotNull(message = "任务ID不能为空", groups = { Update.class, Delete.class, Detail.class })
-    private Long job_id;
-
-    @NotNull(message = "标题不能为空", groups = { Create.class })
-    @Size(max = 50, message = "标题长度不超过 {max} 字符", groups = { Create.class })
-    private String title;
-
-    @NotNull(message = "内容不能为空", groups = { Create.class })
-    private String source;
-
-    @NotNull(message = "分辨率不能为空", groups = { Create.class })
-    private Integer[] resolution;
-    private String resolutionString;
-
-
-    @NotNull(message = "视频输出类型不能为空", groups = { Create.class })
-    @RangeStringArray(message="视频输出类型有误,范围应是(video:mp4视频, timeline:json时间轴信息)", value = {"video", "timeline"})
-    private String product_type;
-
-    private Integer tts_per;
-    private String bg_music_url;
-    private String video_begin_url;
-    private String video_end_url;
-
-    private String caption_margin_bottom;
-    private String caption_font_color;
-    private String caption_font_alpha;
-    private String caption_bg_color;
-    private String caption_bg_alpha;
-
-    private String video_logo_url;
-    private String video_logo_location;
-    private Integer video_logo_margin;
-
-    @RangeStringArray(message="任务状态取值有误,范围应是 (0任务排队中,1任务完成,3任务执行中)", value = {"0", "1", "3"}, groups = { Create.class, Update.class })
-    private String job_status;
-
-    private String result_video_url;
-    private String result_points;
-    private String result_basic_duration;
-    private String result_fail_reason;
-
-    private String create_time;
-    private String update_time;
-
-}

+ 0 - 68
src/main/java/com/backendsys/modules/ai/media/entity/MediaParams/__bak_MediaParams.java

@@ -1,68 +0,0 @@
-package com.backendsys.modules.ai.media.entity.MediaParams;
-
-import com.backendsys.entity.validator.RangeStringArray;
-import com.backendsys.modules.ai.media.entity.AiGenerateVideoDTO;
-import jakarta.validation.constraints.NotNull;
-import jakarta.validation.constraints.Size;
-import lombok.Data;
-import lombok.ToString;
-
-@Data
-@ToString
-public class __bak_MediaParams {
-
-    public static interface Detail{}
-    public static interface Create{}
-    public static interface Update{}
-    public static interface Delete{}
-
-    private Long id;
-
-    private Long user_id;
-
-    @NotNull(message = "任务ID不能为空", groups = { AiGenerateVideoDTO.Update.class, AiGenerateVideoDTO.Delete.class, AiGenerateVideoDTO.Detail.class })
-    private Long job_id;
-
-    @NotNull(message = "标题不能为空", groups = { AiGenerateVideoDTO.Create.class })
-    @Size(max = 50, message = "标题长度不超过 {max} 字符", groups = { AiGenerateVideoDTO.Create.class })
-    private String title;
-
-    @NotNull(message = "内容不能为空", groups = { AiGenerateVideoDTO.Create.class })
-    private String source;
-
-    @NotNull(message = "分辨率不能为空", groups = { AiGenerateVideoDTO.Create.class })
-    private Integer[] resolution;
-    private String resolutionString;
-
-
-    @NotNull(message = "视频输出类型不能为空", groups = { AiGenerateVideoDTO.Create.class })
-    @RangeStringArray(message="视频输出类型有误,范围应是(video:mp4视频, timeline:json时间轴信息)", value = {"video", "timeline"})
-    private String product_type;
-
-    private Integer tts_per;
-    private String bg_music_url;
-    private String video_begin_url;
-    private String video_end_url;
-
-    private String caption_margin_bottom;
-    private String caption_font_color;
-    private String caption_font_alpha;
-    private String caption_bg_color;
-    private String caption_bg_alpha;
-
-    private String video_logo_url;
-    private String video_logo_location;
-    private Integer video_logo_margin;
-
-    @RangeStringArray(message="任务状态取值有误,范围应是 (0任务排队中,1任务完成,3任务执行中)", value = {"0", "1", "3"}, groups = { AiGenerateVideoDTO.Create.class, AiGenerateVideoDTO.Update.class })
-    private String job_status;
-
-    private String result_video_url;
-    private String result_points;
-    private String result_basic_duration;
-    private String result_fail_reason;
-
-    private String create_time;
-    private String update_time;
-
-}

+ 2 - 0
src/main/java/com/backendsys/modules/ai/media/entity/MediaTtv.java

@@ -6,6 +6,7 @@ import com.baomidou.mybatisplus.annotation.TableId;
 import com.baomidou.mybatisplus.annotation.TableName;
 import jakarta.validation.constraints.NotEmpty;
 import jakarta.validation.constraints.NotNull;
+import jakarta.validation.constraints.Size;
 import lombok.Data;
 
 import java.util.List;
@@ -21,6 +22,7 @@ public class MediaTtv {
     private Long id;
     private Long user_id;
     @NotEmpty(message = "标题不能为空", groups = { Generate.class })
+    @Size(max = 50, message = "标题长度不超过 {max} 字符", groups = { Generate.class })
     private String title;
     @NotEmpty(message = "job_id 不能为空", groups = { Query.class })
     private String job_id;

+ 1 - 5
src/main/java/com/backendsys/modules/ai/media/service/MediaService.java → src/main/java/com/backendsys/modules/ai/media/service/MediaTtvService.java

@@ -3,12 +3,8 @@ package com.backendsys.modules.ai.media.service;
 
 import com.backendsys.modules.ai.media.entity.MediaTtv;
 import com.backendsys.modules.sdk.baidu.bce.entity.BaiduBceMediaJob;
-import com.backendsys.modules.sdk.baidu.bce.entity.BaiduBceMediaJobResult;
-import com.fasterxml.jackson.core.JsonProcessingException;
 
-import java.util.Map;
-
-public interface MediaService {
+public interface MediaTtvService {
 
     // 生成图文语音视频
     BaiduBceMediaJob generateMediaTtv(MediaTtv mediaTtv);

+ 2 - 4
src/main/java/com/backendsys/modules/ai/media/service/impl/MediaServiceImpl.java → src/main/java/com/backendsys/modules/ai/media/service/impl/MediaTtvServiceImpl.java

@@ -10,7 +10,7 @@ import com.backendsys.modules.ai.media.dao.MediaTtvDao;
 import com.backendsys.modules.ai.media.entity.MediaTtv;
 import com.backendsys.modules.ai.media.entity.MediaTtvConfig;
 import com.backendsys.modules.ai.media.entity.MediaTtvSource;
-import com.backendsys.modules.ai.media.service.MediaService;
+import com.backendsys.modules.ai.media.service.MediaTtvService;
 import com.backendsys.modules.sdk.baidu.bce.entity.BaiduBceMediaJob;
 import com.backendsys.modules.sdk.baidu.bce.entity.BaiduBceMediaJobResult;
 import com.backendsys.modules.sdk.baidu.bce.service.BaiduBceMediaService;
@@ -24,10 +24,9 @@ import org.springframework.stereotype.Service;
 
 import java.util.ArrayList;
 import java.util.List;
-import java.util.Map;
 
 @Service
-public class MediaServiceImpl implements MediaService {
+public class MediaTtvServiceImpl implements MediaTtvService {
 
     @Autowired
     private MediaTtvDao mediaTtvDao;
@@ -82,7 +81,6 @@ public class MediaServiceImpl implements MediaService {
         JSONObject request_params_source = JSONUtil.parseObj(request_params.get("source"));
         JSONArray request_params_source_structs = JSONUtil.parseArray(request_params_source.get("structs"));
         for(Object obj : request_params_source_structs) {
-            System.out.println("obj = " + obj);
             JSONObject jsonObject = JSONUtil.parseObj(obj);
             String type = Convert.toStr(jsonObject.get("type"));
             String content = "";