|
@@ -1,21 +1,29 @@
|
|
|
package com.backendsys.modules.crt.service.impl;
|
|
|
|
|
|
import cn.hutool.core.convert.Convert;
|
|
|
+import cn.hutool.core.date.DateUtil;
|
|
|
import cn.hutool.json.JSONObject;
|
|
|
import cn.hutool.json.JSONUtil;
|
|
|
import com.backendsys.exception.CustException;
|
|
|
+import com.backendsys.modules.crt.dao.CrtDramaProjectSettingsDao;
|
|
|
import com.backendsys.modules.crt.dao.CrtDramaProjectStoryboardDao;
|
|
|
+import com.backendsys.modules.crt.dao.CrtModelDao;
|
|
|
+import com.backendsys.modules.crt.entity.CrtDramaProjectSettings;
|
|
|
import com.backendsys.modules.crt.entity.CrtDramaProjectStoryboard;
|
|
|
+import com.backendsys.modules.crt.entity.CrtModel;
|
|
|
+import com.backendsys.modules.crt.enums.SamplerEnums;
|
|
|
import com.backendsys.modules.crt.service.CrtGenerateService;
|
|
|
import com.backendsys.modules.sdk.comfyui.entity.CFPromptResponse;
|
|
|
import com.backendsys.modules.sdk.comfyui.entity.CFQueue;
|
|
|
import com.backendsys.modules.sdk.comfyui.service.ComfyUIService;
|
|
|
import com.backendsys.modules.sdk.comfyui.service.ComfyUISocketService;
|
|
|
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
|
|
|
import org.springframework.beans.factory.annotation.Autowired;
|
|
|
import org.springframework.stereotype.Service;
|
|
|
import reactor.core.publisher.Mono;
|
|
|
|
|
|
import java.util.LinkedHashMap;
|
|
|
+import java.util.List;
|
|
|
import java.util.Map;
|
|
|
import java.util.UUID;
|
|
|
|
|
@@ -26,6 +34,11 @@ public class CrtGenerateServiceImpl implements CrtGenerateService {
|
|
|
private ComfyUIService comfyUIService;
|
|
|
@Autowired
|
|
|
private ComfyUISocketService comfyUISocketService;
|
|
|
+
|
|
|
+ @Autowired
|
|
|
+ private CrtModelDao crtModelDao;
|
|
|
+ @Autowired
|
|
|
+ private CrtDramaProjectSettingsDao crtDramaProjectSettingsDao;
|
|
|
@Autowired
|
|
|
private CrtDramaProjectStoryboardDao crtDramaProjectStoryboardDao;
|
|
|
|
|
@@ -50,13 +63,59 @@ public class CrtGenerateServiceImpl implements CrtGenerateService {
|
|
|
@Override
|
|
|
public Map<String, Object> generateImage(CrtDramaProjectStoryboard crtDramaProjectStoryboard) {
|
|
|
|
|
|
- String text_to_image_prompt = crtDramaProjectStoryboard.getText_to_image_prompt();
|
|
|
+ // 分镜ID
|
|
|
Long drama_project_storyboard_id = crtDramaProjectStoryboard.getDrama_project_storyboard_id();
|
|
|
|
|
|
- System.out.println("(文生图提示词) text_to_image_prompt = " + text_to_image_prompt);
|
|
|
+ CrtDramaProjectStoryboard storyboardDetail = crtDramaProjectStoryboardDao.selectById(drama_project_storyboard_id);
|
|
|
+ if (storyboardDetail == null) throw new CustException("分镜不存在");
|
|
|
+ System.out.println("分镜详情: " + JSONUtil.toJsonStr(storyboardDetail));
|
|
|
+
|
|
|
+ Long drama_project_id = storyboardDetail.getDrama_project_id();
|
|
|
+ LambdaQueryWrapper<CrtDramaProjectSettings> wrapperSettings = new LambdaQueryWrapper<>();
|
|
|
+ wrapperSettings.eq(CrtDramaProjectSettings::getDrama_project_id, drama_project_id);
|
|
|
+ List<CrtDramaProjectSettings> settingsDetail = crtDramaProjectSettingsDao.selectList(wrapperSettings);
|
|
|
+ if (settingsDetail == null) throw new CustException("项目配置不存在");
|
|
|
+ System.out.println("项目配置: " + JSONUtil.toJsonStr(settingsDetail));
|
|
|
+
|
|
|
+ // 项目配置类型 (1:生图配置, 2:生视频配置)
|
|
|
+ CrtDramaProjectSettings settings_image = settingsDetail.stream().filter(item -> item.getDrama_project_setting_type() == 1).findFirst().orElse(null);
|
|
|
+ CrtDramaProjectSettings settings_video = settingsDetail.stream().filter(item -> item.getDrama_project_setting_type() == 2).findFirst().orElse(null);
|
|
|
+ System.out.println("- 生图配置: " + JSONUtil.toJsonStr(settings_image));
|
|
|
+ System.out.println("- 生视频配置: " + JSONUtil.toJsonStr(settings_video));
|
|
|
+
|
|
|
+
|
|
|
+ // 文生图提示词
|
|
|
+ String text_to_image_prompt = crtDramaProjectStoryboard.getText_to_image_prompt();
|
|
|
+
|
|
|
+ // == 从 storboard detail 获取参数 =============================================================================
|
|
|
+ Integer param_batch_size = storyboardDetail.getParam_batch_size(); // 生成图片数量
|
|
|
+ Float param_prompt_flux_guidance = storyboardDetail.getParam_prompt_flux_guidance(); // 提示词引导系数
|
|
|
+ String param_sampler = SamplerEnums.getValueByKey(storyboardDetail.getParam_sampler()); // 采样器
|
|
|
+
|
|
|
+ // 随机种子 (默认值:1,范围:(1:随机, 2:自定义))
|
|
|
+ Integer param_seed = storyboardDetail.getParam_seed();
|
|
|
+ String param_seed_custom = storyboardDetail.getParam_seed_custom();
|
|
|
+ if (param_seed == 1) {
|
|
|
+ param_seed_custom = Convert.toStr(DateUtil.current()); // 生成一个随机值 (毫秒时间戳)
|
|
|
+
|
|
|
+ // 【随机值,要保存到数据库】
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ // [db] 获取基础模型 (从项目配置)
|
|
|
+ Long model_id = settings_image.getModel_id();
|
|
|
+ CrtModel modelDetail = crtModelDao.selectById(model_id);
|
|
|
+ String model_name = modelDetail.getModel_name();
|
|
|
+
|
|
|
+
|
|
|
+ // 风格 Lora?
|
|
|
+ // 风格 Lora (阙值)?
|
|
|
+
|
|
|
+
|
|
|
+ // ===========================================================================================================
|
|
|
+
|
|
|
+
|
|
|
|
|
|
- CrtDramaProjectStoryboard detail = crtDramaProjectStoryboardDao.selectById(drama_project_storyboard_id);
|
|
|
- if (detail == null) throw new CustException("分镜不存在");
|
|
|
|
|
|
// -- 前端生成的UUID ---------------------------------------------
|
|
|
String client_id = Convert.toStr(UUID.randomUUID());
|
|
@@ -163,7 +222,7 @@ public class CrtGenerateServiceImpl implements CrtGenerateService {
|
|
|
" },"+
|
|
|
" \"13\": {"+
|
|
|
" \"inputs\": {"+
|
|
|
- " \"guidance\": 3.5,"+
|
|
|
+ " \"guidance\": " + param_prompt_flux_guidance + ","+
|
|
|
" \"conditioning\": ["+
|
|
|
" \"3\","+
|
|
|
" 0"+
|
|
@@ -236,7 +295,7 @@ public class CrtGenerateServiceImpl implements CrtGenerateService {
|
|
|
" },"+
|
|
|
" \"37\": {"+
|
|
|
" \"inputs\": {"+
|
|
|
- " \"noise_seed\": 229229841277714"+
|
|
|
+ " \"noise_seed\": " + param_seed_custom +
|
|
|
" },"+
|
|
|
" \"class_type\": \"RandomNoise\","+
|
|
|
" \"_meta\": {"+
|
|
@@ -275,7 +334,7 @@ public class CrtGenerateServiceImpl implements CrtGenerateService {
|
|
|
" },"+
|
|
|
" \"84\": {"+
|
|
|
" \"inputs\": {"+
|
|
|
- " \"sampler_name\": \"euler\""+
|
|
|
+ " \"sampler_name\": \"" + param_sampler + "\""+
|
|
|
" },"+
|
|
|
" \"class_type\": \"KSamplerSelect\","+
|
|
|
" \"_meta\": {"+
|
|
@@ -292,7 +351,7 @@ public class CrtGenerateServiceImpl implements CrtGenerateService {
|
|
|
" \"122\","+
|
|
|
" 0"+
|
|
|
" ],"+
|
|
|
- " \"batch_size\": 1"+
|
|
|
+ " \"batch_size\": " + param_batch_size +
|
|
|
" },"+
|
|
|
" \"class_type\": \"EmptySD3LatentImage\","+
|
|
|
" \"_meta\": {"+
|
|
@@ -406,7 +465,7 @@ public class CrtGenerateServiceImpl implements CrtGenerateService {
|
|
|
" },"+
|
|
|
" \"151\": {"+
|
|
|
" \"inputs\": {"+
|
|
|
- " \"ckpt_name\": \"FLUX1/flux1-dev-fp8.safetensors\""+
|
|
|
+ " \"ckpt_name\": \"" + model_name + "\""+
|
|
|
" },"+
|
|
|
" \"class_type\": \"CheckpointLoaderSimple\","+
|
|
|
" \"_meta\": {"+
|