lh 3 месяцев назад
Родитель
Сommit
000b1a20fe
1 измененных файлов с 93 добавлено и 8 удалено
  1. 93 8
      app/Services/Anime/AnimeService.php

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

@@ -285,7 +285,28 @@ class AnimeService
         $episode['scenes'] = json_decode($episode['scenes'], true);
         
         // 获取分镜信息
-        $segments = DB::table('mp_episode_segments')->where('anime_id', $anime_id)->where('episode_id', getProp($episode, 'episode_id'))->orderBy('segment_number')->select('act_number', 'act_title', 'segment_id', 'segment_number', 'segment_content')->get()->map(function ($value) {
+        $segments = DB::table('mp_episode_segments')->where('anime_id', $anime_id)->where('episode_id', getProp($episode, 'episode_id'))->orderBy('segment_number')->select(
+            'act_number',
+            'act_title',
+            'segment_id',
+            'segment_number',
+            'segment_content',
+            'description',
+            'composition',
+            'camera_movement',
+            'voice_actor',
+            'dialogue',
+            'frame_type',
+            'scene',
+            'characters',
+            'tail_frame',
+            'emotion',
+            'gender',
+            'speed_ratio',
+            'loudness_ratio',
+            'emotion_scale',
+            'pitch'
+        )->get()->map(function ($value) {
             return (array)$value;
         })->toArray();
         
@@ -293,9 +314,24 @@ class AnimeService
         foreach($segments as $segment) {
             if (isset($acts[getProp($segment, 'act_number')])) {
                 $acts[getProp($segment, 'act_number')]['segments'][] = [
-                    'segment_id'    => getProp($segment, 'segment_id'),
-                    'segment_number'    => getProp($segment, 'segment_number'),
-                    'segment_content'    => getProp($segment, 'segment_content'),
+                    'segment_id' => getProp($segment, 'segment_id'),
+                    'segment_number' => getProp($segment, 'segment_number'),
+                    'segment_content' => getProp($segment, 'segment_content'),
+                    'description' => getProp($segment, 'description'),
+                    'composition' => getProp($segment, 'composition'),
+                    'camera_movement' => getProp($segment, 'camera_movement'),
+                    'voice_actor' => getProp($segment, 'voice_actor'),
+                    'dialogue' => getProp($segment, 'dialogue'),
+                    'frame_type' => getProp($segment, 'frame_type'),
+                    'scene' => getProp($segment, 'scene'),
+                    'characters' => getProp($segment, 'characters'),
+                    'tail_frame' => getProp($segment, 'tail_frame'),
+                    'emotion' => getProp($segment, 'emotion'),
+                    'gender' => getProp($segment, 'gender'),
+                    'speed_ratio' => getProp($segment, 'speed_ratio'),
+                    'loudness_ratio' => getProp($segment, 'loudness_ratio'),
+                    'emotion_scale' => getProp($segment, 'emotion_scale'),
+                    'pitch' => getProp($segment, 'pitch'),
                 ];
             }else {
                 $acts[getProp($segment, 'act_number')]= [
@@ -303,9 +339,24 @@ class AnimeService
                     'act_title' => getProp($segment, 'act_title'),
                     'segments' => [
                         [
-                            'segment_id'    => getProp($segment, 'segment_id'),
-                            'segment_number'    => getProp($segment, 'segment_number'),
-                            'segment_content'    => getProp($segment, 'segment_content'),
+                            'segment_id' => getProp($segment, 'segment_id'),
+                            'segment_number' => getProp($segment, 'segment_number'),
+                            'segment_content' => getProp($segment, 'segment_content'),
+                            'description' => getProp($segment, 'description'),
+                            'composition' => getProp($segment, 'composition'),
+                            'camera_movement' => getProp($segment, 'camera_movement'),
+                            'voice_actor' => getProp($segment, 'voice_actor'),
+                            'dialogue' => getProp($segment, 'dialogue'),
+                            'frame_type' => getProp($segment, 'frame_type'),
+                            'scene' => getProp($segment, 'scene'),
+                            'characters' => getProp($segment, 'characters'),
+                            'tail_frame' => getProp($segment, 'tail_frame'),
+                            'emotion' => getProp($segment, 'emotion'),
+                            'gender' => getProp($segment, 'gender'),
+                            'speed_ratio' => getProp($segment, 'speed_ratio'),
+                            'loudness_ratio' => getProp($segment, 'loudness_ratio'),
+                            'emotion_scale' => getProp($segment, 'emotion_scale'),
+                            'pitch' => getProp($segment, 'pitch'),
                         ]
                     ]
                 ];
@@ -436,11 +487,45 @@ class AnimeService
             $prompt = getProp($segment, 'segment_content');
         }
 
+        $ratio = getProp($data, 'ratio');
+        if (!in_array($ratio, ['1:1', '4:3', '3:2', '16:9', '21:9'])) {
+            Utils::throwError('1002:画面比例选择不正确,只支持1:1、4:3、3:2、16:9、21:9');
+        }
+
+        // 根据画面比例给宽高赋值
+        switch ($ratio) {
+            case '1:1':
+                $width = 2048;
+                $height = 2048;
+                break;
+            case '4:3':
+                $width = 2304;
+                $height = 1728;
+                break;
+            case '3:2':
+                $width = 2496;
+                $height = 1664;
+                break;
+            case '16:9':
+                $width = 2560;
+                $height = 1440;
+                break;
+            case '21:9':
+                $width = 3024;
+                $height = 1296;
+                break;
+            default:
+                $width = 2048;
+                $height = 2048;
+        }
+
         try {
             $params = [
                 'alias_segment_id' => $segment_id,
                 'prompt' => $prompt,
-                'ref_img_urls' => !empty($ref_img_url) ? [$ref_img_url] : []
+                'ref_img_urls' => !empty($ref_img_url) ? [$ref_img_url] : [],
+                'width' => $width,
+                'height' => $height
             ];
             
             $task = $this->aiImageGenerationService->createImageGenerationTask($params);