Преглед изворни кода

优化剧本大纲的对话功能

lh пре 4 месеци
родитељ
комит
7e36f6d7bb
1 измењених фајлова са 89 додато и 1 уклоњено
  1. 89 1
      app/Services/DeepSeek/DeepSeekService.php

+ 89 - 1
app/Services/DeepSeek/DeepSeekService.php

@@ -338,6 +338,77 @@ class DeepSeekService
 EOD;
     }
 
+    private function getArtStylePromptMappings(): array
+    {
+        return [
+            '厚涂古风' => [
+                'aliases' => ['厚涂古风', '古风厚涂', '国风厚涂', '古风'],
+                'prompt' => "基础画风风格词:厚涂古风\n整体采用精致细腻的厚涂古风,色彩浓郁而富有层次感,注重光影对比,营造出古典而富有戏剧张力的氛围。色调以深沉的蓝绿、灰调为主,可辅以温暖的金色、琥珀色光晕强化画面情绪。人物造型飘逸,服饰细节考究,背景虚实结合,既有古韵,又不失奇幻色彩。"
+            ],
+            '现代都市情感' => [
+                'aliases' => ['现代都市', '都市情感', '现代情感', '都市写实', '现代写实'],
+                'prompt' => "基础画风风格词:写实细腻的现代都市情感风格,带有轻微悬疑色彩。\n整体采用电影质感的写实风格,色彩随情绪和剧情变化。日常场景偏自然光感与生活化细节,压抑或冲突场景可适度加强蓝灰、暗绿色调,营造情感张力与轻悬疑氛围。人物造型追求真实可信,环境道具需体现都市生活气息。"
+            ],
+            '现实主义超现实' => [
+                'aliases' => ['现实主义', '超现实', '现实主义超现实', '现实主义奇幻', '现代奇幻写实'],
+                'prompt' => "基础画风风格词:现实主义的细腻光影与超现实元素结合\n整体以现实主义基调塑造人物与场景,色彩饱和度适中偏低,通过细腻光影与局部超现实视觉元素制造情绪冲击。画面在真实生活质感之上融入象征性表达,让现实压迫感与奇异氛围并存。"
+            ],
+            '韩漫二次元' => [
+                'aliases' => ['韩漫', '韩漫二次元', '二次元', '漫画风', '韩系漫画'],
+                'prompt' => "基础画风风格词:韩漫二次元\n整体采用精致清晰的韩漫二次元风格,人物五官立体、轮廓干净,画面注重高颜值塑造与情绪表达。色彩通透,光影偏柔和,兼顾浪漫氛围与剧情张力,适合强化角色关系和戏剧冲突。"
+            ],
+        ];
+    }
+
+    private function getArtStylePromptByInput($inputArtStyle): string
+    {
+        $normalizedInput = $this->normalizeArtStyleInput($inputArtStyle);
+        if ($normalizedInput === '') {
+            return '';
+        }
+
+        foreach ($this->getArtStylePromptMappings() as $mapping) {
+            foreach ($mapping['aliases'] as $alias) {
+                $normalizedAlias = $this->normalizeArtStyleInput($alias);
+                if ($normalizedAlias === '') {
+                    continue;
+                }
+
+                if (strpos($normalizedInput, $normalizedAlias) !== false || strpos($normalizedAlias, $normalizedInput) !== false) {
+                    return $mapping['prompt'];
+                }
+            }
+        }
+
+        return '';
+    }
+
+    private function normalizeArtStyleInput($value): string
+    {
+        $value = trim((string)$value);
+        if ($value === '') {
+            return '';
+        }
+
+        $value = str_replace(["\r", "\n", "\t", ' ', ' ', '-', '_', ':', ':', ',', ',', '。', '.'], '', $value);
+
+        return mb_strtolower($value, 'UTF-8');
+    }
+
+    private function replaceArtStyleSection(string $content, string $artStyle): string
+    {
+        if ($content === '' || $artStyle === '') {
+            return $content;
+        }
+
+        $pattern = '/###美术风格\s*\R(.*?)(?=\R###|$)/su';
+        if (!preg_match($pattern, $content)) {
+            return $content;
+        }
+
+        return preg_replace($pattern, "###美术风格\n" . trim($artStyle), $content, 1);
+    }
+
     // 与推理模型对话
     public function chatWithReasoner($data) {
         $content = getProp($data, 'content');
@@ -1942,7 +2013,7 @@ EOD;
         }
 
         // 美术风格
-        $input_art_style = getProp($data, 'input_art_style');
+        $input_art_style = getProp($data, 'art_style');
 
         // 构建消息
         $messages = [
@@ -2171,6 +2242,13 @@ EOD;
             $script_arr = handleScriptContent($fullContent);
         }
 
+        // 替换美术风格
+        $mappedArtStyle = $this->getArtStylePromptByInput($input_art_style);
+        if ($mappedArtStyle !== '') {
+            $script_arr['art_style'] = $mappedArtStyle;
+            $fullContent = $this->replaceArtStyleSection($fullContent, $mappedArtStyle);
+        }
+
         // 新建动漫
         $anime_name = getProp($script_arr, 'script_name');
         if (!$anime_name) {
@@ -2308,6 +2386,9 @@ EOD;
         } else {
             $content = filterContent(getProp($anime, 'content'));
         }
+
+        // 美术风格
+        $input_art_style = getProp($data, 'art_style');
         
         $system_message = [
                     'role'    => 'system',
@@ -2567,6 +2648,13 @@ EOD;
             $script_arr = handleScriptContent($fullContent);
         }
 
+        // 替换美术风格
+        $mappedArtStyle = $this->getArtStylePromptByInput($input_art_style);
+        if ($mappedArtStyle !== '') {
+            $script_arr['art_style'] = $mappedArtStyle;
+            $fullContent = $this->replaceArtStyleSection($fullContent, $mappedArtStyle);
+        }
+
         // // 新建动漫
         // $anime_name = getProp($script_arr, 'script_name');
         // if (!$anime_name) {