CrtGenerateServiceImpl.java 6.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156
  1. package com.backendsys.modules.crt.service.impl;
  2. import cn.hutool.core.convert.Convert;
  3. import cn.hutool.json.JSONObject;
  4. import cn.hutool.json.JSONUtil;
  5. import com.backendsys.exception.CustException;
  6. import com.backendsys.modules.common.utils.Result;
  7. import com.backendsys.modules.crt.dao.CrtDramaProjectStoryboardDao;
  8. import com.backendsys.modules.crt.entity.CrtDramaProjectStoryboard;
  9. import com.backendsys.modules.crt.service.CrtGenerateService;
  10. import com.backendsys.modules.sdk.comfyui.entity.CFPromptResponse;
  11. import com.backendsys.modules.sdk.comfyui.entity.CFQueue;
  12. import com.backendsys.modules.sdk.comfyui.service.ComfyUIService;
  13. import com.backendsys.modules.sdk.comfyui.service.ComfyUISocketService;
  14. import org.springframework.beans.factory.annotation.Autowired;
  15. import org.springframework.beans.factory.annotation.Value;
  16. import org.springframework.stereotype.Service;
  17. import reactor.core.publisher.Mono;
  18. import java.util.LinkedHashMap;
  19. import java.util.Map;
  20. import java.util.UUID;
  21. @Service
  22. public class CrtGenerateServiceImpl implements CrtGenerateService {
  23. @Autowired
  24. private ComfyUIService comfyUIService;
  25. @Autowired
  26. private ComfyUISocketService comfyUISocketService;
  27. @Autowired
  28. private CrtDramaProjectStoryboardDao crtDramaProjectStoryboardDao;
  29. /**
  30. * [ComfyUI] 查询任务队列
  31. */
  32. @Override
  33. public Map<String, Object> getQueue() {
  34. // [ComfyUI] 执行任务
  35. Mono<CFQueue> cfQueueMono = comfyUIService.getQueue();
  36. CFQueue response = cfQueueMono.block();
  37. System.out.println("结果: " + response);
  38. Map<String, Object> resp = new LinkedHashMap<>();
  39. resp.put("response", response);
  40. return resp;
  41. }
  42. /**
  43. * 短剧创作-生成图片
  44. */
  45. @Override
  46. public Map<String, Object> generateImage(CrtDramaProjectStoryboard crtDramaProjectStoryboard) {
  47. Long drama_project_storyboard_id = crtDramaProjectStoryboard.getDrama_project_storyboard_id();
  48. CrtDramaProjectStoryboard detail = crtDramaProjectStoryboardDao.selectById(drama_project_storyboard_id);
  49. if (detail == null) throw new CustException("分镜不存在");
  50. // -- 前端生成的UUID ---------------------------------------------
  51. String client_id = Convert.toStr(UUID.randomUUID());
  52. // -- [ComfyUI] 创建 WebSocket 监听连接 ---------------------------
  53. comfyUISocketService.connectToSse(client_id, 8001).subscribe();
  54. // -- [ComfyUI] 执行任务 -----------------------------------------
  55. // [Demo-基础生图]
  56. String prompt = "{" +
  57. "\"3\": {" +
  58. "\"inputs\": {" +
  59. "\"seed\": 449753344472378," +
  60. "\"steps\": 20," +
  61. "\"cfg\": 8," +
  62. "\"sampler_name\": \"euler\"," +
  63. "\"scheduler\": \"normal\"," +
  64. "\"denoise\": 1," +
  65. "\"model\": [\"4\", 0]," +
  66. "\"positive\": [\"6\", 0]," +
  67. "\"negative\": [\"7\", 0]," +
  68. "\"latent_image\": [\"5\", 0]" +
  69. "}," +
  70. "\"class_type\": \"KSampler\"," +
  71. "\"_meta\": { \"title\": \"K采样器\" }" +
  72. "}," +
  73. "\"4\": {" +
  74. "\"inputs\": {" +
  75. "\"ckpt_name\": \"v1-5-pruned-emaonly-fp16.safetensors\"" +
  76. "}," +
  77. "\"class_type\": \"CheckpointLoaderSimple\"," +
  78. "\"_meta\": { \"title\": \"Checkpoint加载器(简易)\" }" +
  79. "}," +
  80. "\"5\": {" +
  81. "\"inputs\": {" +
  82. "\"width\": 512, \"height\": 512, \"batch_size\": 1" +
  83. "}," +
  84. "\"class_type\": \"EmptyLatentImage\"," +
  85. "\"_meta\": { \"title\": \"空Latent图像\" }" +
  86. "}," +
  87. "\"6\": {" +
  88. "\"inputs\": {" +
  89. "\"text\": \"beautiful scenery nature glass bottle landscape, , purple galaxy bottle,\"," +
  90. "\"speak_and_recognation\": {" +
  91. "\"__value__\": [false, true]" +
  92. "}," +
  93. "\"clip\": [\"4\", 1]" +
  94. "}," +
  95. "\"class_type\": \"CLIPTextEncode\"," +
  96. "\"_meta\": { \"title\": \"CLIP文本编码\" }" +
  97. "}," +
  98. "\"7\": {" +
  99. "\"inputs\": {" +
  100. "\"text\": \"text, watermark\"," +
  101. "\"speak_and_recognation\": {" +
  102. "\"__value__\": [false, true]" +
  103. "}," +
  104. "\"clip\": [\"4\", 1]" +
  105. "}," +
  106. "\"class_type\": \"CLIPTextEncode\"," +
  107. "\"_meta\": { \"title\": \"CLIP文本编码\" }" +
  108. "}," +
  109. "\"8\": {" +
  110. "\"inputs\": {" +
  111. "\"samples\": [\"3\", 0]," +
  112. "\"vae\": [\"4\", 2]," +
  113. "}," +
  114. "\"class_type\": \"VAEDecode\"," +
  115. "\"_meta\": { \"title\": \"VAE解码\" }" +
  116. "}," +
  117. "\"9\": {" +
  118. "\"inputs\": {" +
  119. "\"filename_prefix\": \"ComfyUI\"," +
  120. "\"images\": [\"8\", 0]" +
  121. "}," +
  122. "\"class_type\": \"SaveImage\"," +
  123. "\"_meta\": { \"title\": \"保存图像\" }" +
  124. "}," +
  125. "}";
  126. JSONObject prompt_object = JSONUtil.parseObj(prompt);
  127. System.out.println("prompt_object: " + prompt_object);
  128. // [ComfyUI] 执行任务
  129. Mono<CFPromptResponse> cfPromptResponseMono = comfyUIService.prompt(client_id, prompt_object);
  130. CFPromptResponse response = cfPromptResponseMono.block();
  131. response.setClient_id(client_id);
  132. System.out.println("结果: " + response);
  133. Map<String, Object> resp = new LinkedHashMap<>();
  134. resp.put("drama_project_storyboard_id", drama_project_storyboard_id);
  135. resp.put("response", response);
  136. return resp;
  137. }
  138. }