Bladeren bron

1.前端改版2.生成主体图片使用人物提示词而不是主体描述

lh 2 maanden geleden
bovenliggende
commit
50752bd376

+ 17 - 5
app/Console/Anime/AnimeCheckImgUrlCommand.php

@@ -219,6 +219,7 @@ class AnimeCheckImgUrlCommand extends Command
             foreach ($episode_roles as &$episode_role) {
                 $episode_role_name = getProp($episode_role, 'role');
                 $episode_description = getProp($episode_role, 'description');
+                $episode_pic_prompt = getProp($episode_role, 'pic_prompt');
                 $episode_url = getProp($episode_role, 'url');
                 $episode_task_id = getProp($episode_role, 'task_id');
 
@@ -233,13 +234,15 @@ class AnimeCheckImgUrlCommand extends Command
                 foreach ($roles as $role) {
                     $role_name = getProp($role, 'role');
                     $role_description = getProp($role, 'description');
+                    $role_pic_prompt = getProp($role, 'pic_prompt');
                     $role_url = getProp($role, 'url');
                     $role_task_id = getProp($role, 'task_id');
                     $role_task_status = getProp($role, 'task_status');
 
-                    // 满足三个条件:1.角色名相同 2.描述相同 3.剧集中URL为空且方法中URL不为空
+                    // 满足条件:1.角色名相同 2.描述相同 3.pic_prompt相同 4.剧集中URL为空且方法中URL不为空
                     if ($episode_role_name == $role_name 
                         && $episode_description == $role_description 
+                        && $episode_pic_prompt == $role_pic_prompt
                         && empty($episode_url) 
                         && !empty($role_url)) {
                         // 只继承 task_id、task_status 和 url,不继承其他创建图片的参数
@@ -258,9 +261,12 @@ class AnimeCheckImgUrlCommand extends Command
                     try {
                         // 获取剧集的美术风格
                         $art_style = getProp($episode, 'art_style');
-                        $description = $episode_description;
+                        
+                        // 优先使用 pic_prompt,如果没有则使用 description
+                        $description = !empty($episode_pic_prompt) ? trim((string)$episode_pic_prompt) : $episode_description;
+                        
                         if ($art_style) {
-                            $description = "美术风格:\n{$art_style}\n主体描述:{$description}\n图片要求:图片侧重点在于主体人物信息,需要突出人物形象,不显示场景或背景信息";
+                            $description = "美术风格:\n{$art_style}\n主体描述:{$description}\n图片要求:图片侧重点是人物,不要出现场景或背景,并且只能生成一个人物";
                         }
 
                         $params = [
@@ -287,6 +293,7 @@ class AnimeCheckImgUrlCommand extends Command
             foreach ($episode_scenes as &$episode_scene) {
                 $episode_scene_name = getProp($episode_scene, 'scene');
                 $episode_description = getProp($episode_scene, 'description');
+                $episode_pic_prompt = getProp($episode_scene, 'pic_prompt');
                 $episode_url = getProp($episode_scene, 'url');
                 $episode_task_id = getProp($episode_scene, 'task_id');
 
@@ -301,13 +308,15 @@ class AnimeCheckImgUrlCommand extends Command
                 foreach ($scenes as $scene) {
                     $scene_name = getProp($scene, 'scene');
                     $scene_description = getProp($scene, 'description');
+                    $scene_pic_prompt = getProp($scene, 'pic_prompt');
                     $scene_url = getProp($scene, 'url');
                     $scene_task_id = getProp($scene, 'task_id');
                     $scene_task_status = getProp($scene, 'task_status');
 
-                    // 满足三个条件:1.场景名相同 2.描述相同 3.剧集中URL为空且方法中URL不为空
+                    // 满足条件:1.场景名相同 2.描述相同 3.pic_prompt相同 4.剧集中URL为空且方法中URL不为空
                     if ($episode_scene_name == $scene_name 
                         && $episode_description == $scene_description 
+                        && $episode_pic_prompt == $scene_pic_prompt
                         && empty($episode_url) 
                         && !empty($scene_url)) {
                         // 只继承 task_id、task_status 和 url,不继承其他创建图片的参数
@@ -326,7 +335,10 @@ class AnimeCheckImgUrlCommand extends Command
                     try {
                         // 获取剧集的美术风格
                         $art_style = getProp($episode, 'art_style');
-                        $description = $episode_description;
+                        
+                        // 优先使用 pic_prompt,如果没有则使用 description
+                        $description = !empty($episode_pic_prompt) ? trim((string)$episode_pic_prompt) : $episode_description;
+                        
                         if ($art_style) {
                             $description = "美术风格:\n{$art_style}\n场景描述:{$description}\n图片要求: 图片侧重点是场景,生成的是场景环境图片,不要出现人物(此为第一优先要求)";
                         }

+ 28 - 8
app/Services/Anime/AnimeService.php

@@ -245,8 +245,12 @@ class AnimeService
         foreach ($roles as &$role) {
             $role_name = getProp($role, 'role');
             if ($role_name == '旁白') continue;
-            $description = getProp($role, 'description');
-            if ($art_style) $description = "美术风格:\n{$art_style}\n主体描述:{$description}\n图片要求:图片侧重点在于主体人物信息,需要突出人物形象,不显示场景或背景信息";
+            
+            // 优先使用 pic_prompt,如果没有则使用 description
+            $pic_prompt = getProp($role, 'pic_prompt');
+            $description = !empty($pic_prompt) ? trim((string)$pic_prompt) : getProp($role, 'description');
+            
+            if ($art_style) $description = "美术风格:\n{$art_style}\n主体描述:{$description}\n图片要求:图片侧重点是人物,不要出现场景或背景,并且只能生成一个人物";
             // 参考图地址
             $ref_img_url = getProp($role, 'url');
             if ($ref_img_url) continue;     // 已有图片则跳过
@@ -299,7 +303,11 @@ class AnimeService
         foreach ($scenes as &$scene) {
             $scene_name = getProp($scene, 'scene');
             if ($scene_name != $target_scene) continue;
-            $description = getProp($scene, 'description');
+            
+            // 优先使用 pic_prompt,如果没有则使用 description
+            $pic_prompt = getProp($scene, 'pic_prompt');
+            $description = !empty($pic_prompt) ? trim((string)$pic_prompt) : getProp($scene, 'description');
+            
             if ($art_style) $description = "美术风格:\n{$art_style}\n\n场景描述:{$description}\n图片要求: 图片侧重点是场景,生成的是场景环境图片,不要出现人物(此为第一优先要求)";
             // 参考图地址
             $ref_img_url = getProp($scene, 'url');
@@ -3918,6 +3926,7 @@ class AnimeService
         foreach ($roles as &$role) {
             $role_name = getProp($role, 'role');
             $role_description = getProp($role, 'description');
+            $role_pic_prompt = getProp($role, 'pic_prompt');
             $role_url = getProp($role, 'url');
             $role_task_id = getProp($role, 'task_id');
             
@@ -3932,13 +3941,15 @@ class AnimeService
             foreach ($global_roles as $global_role) {
                 $global_role_name = getProp($global_role, 'role');
                 $global_role_description = getProp($global_role, 'description');
+                $global_role_pic_prompt = getProp($global_role, 'pic_prompt');
                 $global_role_url = getProp($global_role, 'url');
                 $global_role_task_id = getProp($global_role, 'task_id');
                 $global_role_task_status = getProp($global_role, 'task_status');
                 
-                // 满足条件:角色名相同、描述相同、全局有URL
+                // 满足条件:角色名相同、描述相同、pic_prompt相同、全局有URL
                 if ($role_name === $global_role_name 
                     && $role_description === $global_role_description 
+                    && $role_pic_prompt === $global_role_pic_prompt
                     && !empty($global_role_url)) {
                     // 继承 task_id、task_status 和 url
                     $role['task_id'] = $global_role_task_id;
@@ -3955,9 +3966,12 @@ class AnimeService
             if (!$url_inherited && empty($role_task_id)) {
                 try {
                     $art_style = getProp($episode, 'art_style');
-                    $description = $role_description;
+                    
+                    // 优先使用 pic_prompt,如果没有则使用 description
+                    $description = !empty($role_pic_prompt) ? trim((string)$role_pic_prompt) : $role_description;
+                    
                     if ($art_style) {
-                        $description = "美术风格:\n{$art_style}\n主体描述:{$description}\n图片要求:图片侧重点在于主体人物信息,需要突出人物形象,不显示场景或背景信息";
+                        $description = "美术风格:\n{$art_style}\n主体描述:{$description}\n图片要求:图片侧重点是人物,不要出现场景或背景,并且只能生成一个人物";
                     }
                     
                     $params = [
@@ -3984,6 +3998,7 @@ class AnimeService
         foreach ($scenes as &$scene) {
             $scene_name = getProp($scene, 'scene');
             $scene_description = getProp($scene, 'description');
+            $scene_pic_prompt = getProp($scene, 'pic_prompt');
             $scene_url = getProp($scene, 'url');
             $scene_task_id = getProp($scene, 'task_id');
             
@@ -3998,13 +4013,15 @@ class AnimeService
             foreach ($global_scenes as $global_scene) {
                 $global_scene_name = getProp($global_scene, 'scene');
                 $global_scene_description = getProp($global_scene, 'description');
+                $global_scene_pic_prompt = getProp($global_scene, 'pic_prompt');
                 $global_scene_url = getProp($global_scene, 'url');
                 $global_scene_task_id = getProp($global_scene, 'task_id');
                 $global_scene_task_status = getProp($global_scene, 'task_status');
                 
-                // 满足条件:场景名相同、描述相同、全局有URL
+                // 满足条件:场景名相同、描述相同、pic_prompt相同、全局有URL
                 if ($scene_name === $global_scene_name 
                     && $scene_description === $global_scene_description 
+                    && $scene_pic_prompt === $global_scene_pic_prompt
                     && !empty($global_scene_url)) {
                     // 继承 task_id、task_status 和 url
                     $scene['task_id'] = $global_scene_task_id;
@@ -4021,7 +4038,10 @@ class AnimeService
             if (!$url_inherited && empty($scene_task_id)) {
                 try {
                     $art_style = getProp($episode, 'art_style');
-                    $description = $scene_description;
+                    
+                    // 优先使用 pic_prompt,如果没有则使用 description
+                    $description = !empty($scene_pic_prompt) ? trim((string)$scene_pic_prompt) : $scene_description;
+                    
                     if ($art_style) {
                         $description = "美术风格:\n{$art_style}\n场景描述:{$description}\n图片要求: 图片侧重点是场景,生成的是场景环境图片,不要出现人物(此为第一优先要求)";
                     }

+ 53 - 13
app/Services/DeepSeek/DeepSeekService.php

@@ -4678,7 +4678,7 @@ Q版卡通风格,头大身小,造型圆润可爱,线条简单,色彩明
         }
         
         DB::commit();
-
+        dd('end');
         if ($is_global_generate_pics) {
             // 批量生成全局角色图片
             $this->batchSetGlobalRoleImg([
@@ -5152,6 +5152,12 @@ Q版卡通风格,头大身小,造型圆润可爱,线条简单,色彩明
                         'description' => trim((string)getProp($item, 'description')),
                     ];
                     
+                    // 如果有 pic_prompt,添加到合并项中
+                    $picPrompt = getProp($item, 'pic_prompt');
+                    if (!empty($picPrompt)) {
+                        $mergedItem['pic_prompt'] = trim((string)$picPrompt);
+                    }
+                    
                     // 继承现有项的 URL
                     $existingUrl = getProp($existingMap[$itemKey], 'url');
                     if (!empty($existingUrl)) {
@@ -5194,6 +5200,12 @@ Q版卡通风格,头大身小,造型圆润可爱,线条简单,色彩明
                         'description' => trim((string)getProp($item, 'description')),
                     ];
                     
+                    // 如果有 pic_prompt,添加到合并项中
+                    $picPrompt = getProp($item, 'pic_prompt');
+                    if (!empty($picPrompt)) {
+                        $mergedItem['pic_prompt'] = trim((string)$picPrompt);
+                    }
+                    
                     // 保留生成项的音色字段
                     $voiceName = getProp($item, 'voice_name');
                     if (!empty($voiceName)) {
@@ -5215,7 +5227,7 @@ Q版卡通风格,头大身小,造型圆润可爱,线条简单,色彩明
                 }
             } else {
                 // 新增项,保留生成项的所有字段
-                $merged[] = $this->resetEpisodeResourceItem($item, $nameKey, ['url', 'task_id', 'task_status', 'voice_name', 'voice_type', 'voice_audio_url']);
+                $merged[] = $this->resetEpisodeResourceItem($item, $nameKey, ['url', 'task_id', 'task_status', 'voice_name', 'voice_type', 'voice_audio_url', 'pic_prompt']);
             }
         }
 
@@ -5248,7 +5260,13 @@ Q版卡通风格,头大身小,造型圆润可爱,线条简单,色彩明
             return true;
         }
 
-        return trim((string)getProp($existingItem, 'description')) !== trim((string)getProp($generatedItem, 'description'));
+        // 比较 description 是否变化
+        if (trim((string)getProp($existingItem, 'description')) !== trim((string)getProp($generatedItem, 'description'))) {
+            return true;
+        }
+
+        // 比较 pic_prompt 是否变化
+        return trim((string)getProp($existingItem, 'pic_prompt')) !== trim((string)getProp($generatedItem, 'pic_prompt'));
     }
 
     private function normalizeEpisodeResourceKey($value): string
@@ -5273,8 +5291,12 @@ Q版卡通风格,头大身小,造型圆润可爱,线条简单,色彩明
         foreach ($roles as &$role) {
             $role_name = getProp($role, 'role');
             if ($role_name == '旁白') continue;
-            $description = getProp($role, 'description');
-            if ($art_style) $description = "美术风格:\n{$art_style}\n主体描述:{$description}\n图片要求:图片侧重点在于主体人物信息,需要突出人物形象,不显示场景或背景信息";
+            
+            // 优先使用 pic_prompt,如果没有则使用 description
+            $pic_prompt = getProp($role, 'pic_prompt');
+            $description = !empty($pic_prompt) ? trim((string)$pic_prompt) : getProp($role, 'description');
+            
+            if ($art_style) $description = "美术风格:\n{$art_style}\n主体描述:{$description}\n图片要求:图片侧重点是人物,不要出现场景或背景,并且只能生成一个人物";
             // 参考图地址
             $ref_img_url = getProp($role, 'url');
             if (!$is_force && $ref_img_url) continue;
@@ -5328,7 +5350,11 @@ Q版卡通风格,头大身小,造型圆润可爱,线条简单,色彩明
         $update_flag = false;
         foreach ($scenes as &$scene) {
             $scene_name = getProp($scene, 'scene');
-            $description = getProp($scene, 'description');
+            
+            // 优先使用 pic_prompt,如果没有则使用 description
+            $pic_prompt = getProp($scene, 'pic_prompt');
+            $description = !empty($pic_prompt) ? trim((string)$pic_prompt) : getProp($scene, 'description');
+            
             if ($art_style) $description = "美术风格:\n{$art_style}\n\n场景描述:{$description}\n图片要求: 图片侧重点是场景,生成的是场景环境图片,不要出现人物(此为第一优先要求)";
             // 参考图地址
             $ref_img_url = getProp($scene, 'url');
@@ -5408,6 +5434,7 @@ Q版卡通风格,头大身小,造型圆润可爱,线条简单,色彩明
         foreach ($episode_roles as &$episode_role) {
             $episode_role_name = getProp($episode_role, 'role');
             $episode_description = getProp($episode_role, 'description');
+            $episode_pic_prompt = getProp($episode_role, 'pic_prompt');
             $episode_url = getProp($episode_role, 'url');
             
             // 跳过旁白角色
@@ -5424,12 +5451,15 @@ Q版卡通风格,头大身小,造型圆润可爱,线条简单,色彩明
             foreach ($global_roles as $global_role) {
                 $global_role_name = getProp($global_role, 'role');
                 $global_description = getProp($global_role, 'description');
+                $global_pic_prompt = getProp($global_role, 'pic_prompt');
                 $global_url = getProp($global_role, 'url');
                 $global_task_id = getProp($global_role, 'task_id');
                 $global_task_status = getProp($global_role, 'task_status');
                 
-                // 满足条件:1.角色名相同 2.描述相同 3.剧集中URL为空
-                if ($episode_role_name == $global_role_name && $episode_description == $global_description) {
+                // 满足条件:1.角色名相同 2.描述相同 3.pic_prompt相同 4.剧集中URL为空
+                if ($episode_role_name == $global_role_name 
+                    && $episode_description == $global_description 
+                    && $episode_pic_prompt == $global_pic_prompt) {
                     // 继承 task_id、task_status 和 url
                     if (!empty($global_task_id)) {
                         $episode_role['task_id'] = $global_task_id;
@@ -5462,6 +5492,7 @@ Q版卡通风格,头大身小,造型圆润可爱,线条简单,色彩明
         foreach ($episode_scenes as &$episode_scene) {
             $episode_scene_name = getProp($episode_scene, 'scene');
             $episode_description = getProp($episode_scene, 'description');
+            $episode_pic_prompt = getProp($episode_scene, 'pic_prompt');
             $episode_url = getProp($episode_scene, 'url');
             
             // 如果剧集中已有URL,跳过
@@ -5473,12 +5504,15 @@ Q版卡通风格,头大身小,造型圆润可爱,线条简单,色彩明
             foreach ($global_scenes as $global_scene) {
                 $global_scene_name = getProp($global_scene, 'scene');
                 $global_description = getProp($global_scene, 'description');
+                $global_pic_prompt = getProp($global_scene, 'pic_prompt');
                 $global_url = getProp($global_scene, 'url');
                 $global_task_id = getProp($global_scene, 'task_id');
                 $global_task_status = getProp($global_scene, 'task_status');
                 
-                // 满足条件:1.场景名相同 2.描述相同 3.剧集中URL为空
-                if ($episode_scene_name == $global_scene_name && $episode_description == $global_description) {
+                // 满足条件:1.场景名相同 2.描述相同 3.pic_prompt相同 4.剧集中URL为空
+                if ($episode_scene_name == $global_scene_name 
+                    && $episode_description == $global_description 
+                    && $episode_pic_prompt == $global_pic_prompt) {
                     // 继承 task_id、task_status 和 url
                     if (!empty($global_task_id)) {
                         $episode_scene['task_id'] = $global_task_id;
@@ -6390,11 +6424,15 @@ Q版卡通风格,头大身小,造型圆润可爱,线条简单,色彩明
             if (!isset($global_map[$itemKey])) {
                 $need_create_task = true;
             } else {
-                // 条件2:名称匹配但描述不一致
+                // 条件2:名称匹配但描述或 pic_prompt 不一致
                 $global_description = trim((string)getProp($global_map[$itemKey], 'description'));
                 $current_description = trim((string)$item_description);
                 
-                if ($global_description !== $current_description) {
+                $global_pic_prompt = trim((string)getProp($global_map[$itemKey], 'pic_prompt'));
+                $current_pic_prompt = trim((string)getProp($item, 'pic_prompt'));
+                
+                // 如果 description 或 pic_prompt 有变化,需要重新生成
+                if ($global_description !== $current_description || $global_pic_prompt !== $current_pic_prompt) {
                     $need_create_task = true;
                 }
             }
@@ -6402,7 +6440,9 @@ Q版卡通风格,头大身小,造型圆润可爱,线条简单,色彩明
             // 如果需要创建任务,调用图片生成服务
             if ($need_create_task) {
                 try {
-                    $description = $item_description;
+                    // 优先使用 pic_prompt,如果没有则使用 description
+                    $pic_prompt = getProp($item, 'pic_prompt');
+                    $description = !empty($pic_prompt) ? trim((string)$pic_prompt) : $item_description;
                     
                     // 添加美术风格前缀
                     if ($art_style) {

File diff suppressed because it is too large
+ 1 - 1
resources/views/index.blade.php