소스 검색

1.优化生成分镜剧本的提示词和解析方法针对空台词的情况2.空台词不生成配音任务

lh 4 달 전
부모
커밋
1b384cb8c8
3개의 변경된 파일101개의 추가작업 그리고 133개의 파일을 삭제
  1. 1 74
      app/Libs/Helpers.php
  2. 94 54
      app/Services/Anime/AnimeService.php
  3. 6 5
      app/Services/DeepSeek/DeepSeekService.php

파일 크기가 너무 크기때문에 변경 상태를 표시하지 않습니다.
+ 1 - 74
app/Libs/Helpers.php


+ 94 - 54
app/Services/Anime/AnimeService.php

@@ -1045,10 +1045,11 @@ class AnimeService
                 $this->handleSegmentContent($update_data);
                 
                 // 如果有对话内容,创建视频配音合成任务
-                if (getProp($update_data, 'dialogue')) {
+                $dialogue = getProp($update_data, 'dialogue');
+                if (!empty($dialogue)) {
                     $now = date('Y-m-d H:i:s');
                     $generate_json = [
-                        'text' => getProp($update_data, 'dialogue'),
+                        'text' => $dialogue,
                         'role' => getProp($update_data, 'voice_actor'),
                         'voice_type' => getProp($update_data, 'voice_type'),
                         'voice_name' => getProp($update_data, 'voice_name'),
@@ -1087,6 +1088,11 @@ class AnimeService
                         Utils::throwError('20003:火山生成音频失败');
                     }
                     $update_data['audio_url'] = '';
+                } else {
+                    // dialogue为空时,直接写入默认音频信息
+                    $update_data['audio_url'] = 'https://zw-audiobook.tos-cn-beijing.volces.com/effects/ellipses_2s.mp3';
+                    $update_data['audio_duration'] = 2.0;
+                    $update_data['subtitle_info'] = json_encode(['duration' => 2.0, 'words' => []], 256);
                 }
             }
 
@@ -1300,11 +1306,18 @@ class AnimeService
                     continue;
                 }
 
+                $update_data = [
+                    'pic_task_id' => $task_id,
+                    'pic_task_status' => '生成中',
+                    'audio_url' => '',
+                    'updated_at' => date('Y-m-d H:i:s')
+                ];
                 // 如果有对话内容,创建视频配音合成任务
-                if (getProp($segment, 'dialogue')) {
+                $dialogue = getProp($segment, 'dialogue');
+                if (!empty($dialogue)) {
                     $now = date('Y-m-d H:i:s');
                     $generate_json = [
-                        'text' => getProp($segment, 'dialogue'),
+                        'text' => $dialogue,
                         'role' => getProp($segment, 'voice_actor'),
                         'voice_type' => getProp($segment, 'voice_type'),
                         'voice_name' => getProp($segment, 'voice_name'),
@@ -1341,17 +1354,17 @@ class AnimeService
                         dLog('anime')->error('火山生成音频失败', ['error' => $error_msg, 'task_id' => $dubTaskId]);
                         Utils::throwError('20003:火山生成音频失败');
                     }
+                } else {
+                    // dialogue为空时,直接写入默认音频信息到分镜表
+                    $update_data['audio_url'] = 'https://zw-audiobook.tos-cn-beijing.volces.com/effects/ellipses_2s.mp3';
+                    $update_data['audio_duration'] = 2.0;
+                    $update_data['subtitle_info'] = json_encode(['duration' => 2.0, 'words' => []], 256);
                 }
                 
                 // 更新分镜的任务信息
                 $update_result = DB::table('mp_episode_segments')
                     ->where('segment_id', $segment_id)
-                    ->update([
-                        'pic_task_id' => $task_id,
-                        'pic_task_status' => '生成中',
-                        'audio_url' => '',
-                        'updated_at' => date('Y-m-d H:i:s')
-                    ]);
+                    ->update($update_data);
 
                 // 如果是第一集的首帧图片,则存入待更新数组
                 if ($update_result && (int)getProp($segment, 'episode_number') === 1 && (int)getProp($segment, 'segment_number') === 1) {
@@ -1548,48 +1561,56 @@ class AnimeService
             $this->handleSegmentContent($update_data);
 
             // 如果有对话内容,创建视频配音合成任务(有更改分镜内容时创建)
-            if ($segment_content && getProp($update_data, 'dialogue')) {
-                $now = date('Y-m-d H:i:s');
-                $generate_json = [
-                    'text' => getProp($update_data, 'dialogue'),
-                    'role' => getProp($update_data, 'voice_actor'),
-                    'voice_type' => getProp($update_data, 'voice_type'),
-                    'voice_name' => getProp($update_data, 'voice_name'),
-                    'emotion' => getProp($update_data, 'emotion'),
-                    'emotion_type' => getProp($update_data, 'emotion_type'),
-                    'gender' => getProp($update_data, 'gender'),
-                    'speed_ratio' => getProp($update_data, 'speed_ratio', 0),
-                    'loudness_ratio' => getProp($update_data, 'loudness_ratio', 0),
-                    'emotion_scale' => getProp($update_data, 'emotion_scale', 0),
-                    'pitch' => getProp($update_data, 'pitch', 0),
-                ];
-                
-                // 插入视频配音合成任务
-                $dubTaskId = DB::table('mp_dub_video_tasks')->insertGetId([
-                    'alias_segment_id' => $segment_id,
-                    'generate_status' => '执行中',
-                    'audio_url' => '',
-                    'generate_json' => json_encode($generate_json, 256),
-                    'created_at' => date('Y-m-d H:i:s'),
-                    'updated_at' => date('Y-m-d H:i:s'),
-                ]);
-                
-                if (!$dubTaskId) {
-                    Utils::throwError('20003:创建配音任务失败!');
-                }
-                
-                // 请求远程服务器执行生成
-                $client = new Client(['timeout' => 300, 'verify' => false]);
-                $result = $client->get("http://122.9.129.83:5000/api/anime/genAudio?taskId={$dubTaskId}");
-                $response = $result->getBody()->getContents();
-                $response_arr = json_decode($response, true);
-                if (!isset($response_arr['code']) || (int)$response_arr['code'] !== 0) {
-                    $error_msg = isset($response_arr['msg']) ? $response_arr['msg'] : '未知错误';
-                    dLog('anime')->error('火山生成音频失败', ['error' => $error_msg, 'task_id' => $dubTaskId]);
-                    logDB('anime', 'error', '火山生成音频失败', ['error' => $error_msg, 'task_id' => $dubTaskId]);
-                    Utils::throwError('20003:火山生成音频失败');
+            if ($segment_content) {
+                $dialogue = getProp($update_data, 'dialogue');
+                if (!empty($dialogue)) {
+                    $now = date('Y-m-d H:i:s');
+                    $generate_json = [
+                        'text' => $dialogue,
+                        'role' => getProp($update_data, 'voice_actor'),
+                        'voice_type' => getProp($update_data, 'voice_type'),
+                        'voice_name' => getProp($update_data, 'voice_name'),
+                        'emotion' => getProp($update_data, 'emotion'),
+                        'emotion_type' => getProp($update_data, 'emotion_type'),
+                        'gender' => getProp($update_data, 'gender'),
+                        'speed_ratio' => getProp($update_data, 'speed_ratio', 0),
+                        'loudness_ratio' => getProp($update_data, 'loudness_ratio', 0),
+                        'emotion_scale' => getProp($update_data, 'emotion_scale', 0),
+                        'pitch' => getProp($update_data, 'pitch', 0),
+                    ];
+                    
+                    // 插入视频配音合成任务
+                    $dubTaskId = DB::table('mp_dub_video_tasks')->insertGetId([
+                        'alias_segment_id' => $segment_id,
+                        'generate_status' => '执行中',
+                        'audio_url' => '',
+                        'generate_json' => json_encode($generate_json, 256),
+                        'created_at' => date('Y-m-d H:i:s'),
+                        'updated_at' => date('Y-m-d H:i:s'),
+                    ]);
+                    
+                    if (!$dubTaskId) {
+                        Utils::throwError('20003:创建配音任务失败!');
+                    }
+                    
+                    // 请求远程服务器执行生成
+                    $client = new Client(['timeout' => 300, 'verify' => false]);
+                    $result = $client->get("http://122.9.129.83:5000/api/anime/genAudio?taskId={$dubTaskId}");
+                    $response = $result->getBody()->getContents();
+                    $response_arr = json_decode($response, true);
+                    if (!isset($response_arr['code']) || (int)$response_arr['code'] !== 0) {
+                        $error_msg = isset($response_arr['msg']) ? $response_arr['msg'] : '未知错误';
+                        dLog('anime')->error('火山生成音频失败', ['error' => $error_msg, 'task_id' => $dubTaskId]);
+                        logDB('anime', 'error', '火山生成音频失败', ['error' => $error_msg, 'task_id' => $dubTaskId]);
+                        Utils::throwError('20003:火山生成音频失败');
+                    }
+                    $update_data['audio_url'] = '';
+                } else {
+                    // dialogue为空时,直接写入默认音频信息
+                    $update_data['audio_url'] = 'https://zw-audiobook.tos-cn-beijing.volces.com/effects/ellipses_2s.mp3';
+                    $update_data['audio_duration'] = 2.0;
+                    $update_data['subtitle_info'] = json_encode(['duration' => 2.0, 'words' => []], 256);
                 }
-                $update_data['audio_url'] = '';
             }
 
             $boolen = DB::table('mp_episode_segments')
@@ -1799,10 +1820,11 @@ class AnimeService
             $this->handleSegmentContent($insert_data);
 
             // 如果有对话内容,创建视频配音合成任务
-            if (getProp($insert_data, 'dialogue')) {
+            $dialogue = getProp($insert_data, 'dialogue');
+            if (!empty($dialogue)) {
                 $now = date('Y-m-d H:i:s');
                 $generate_json = [
-                    'text' => getProp($insert_data, 'dialogue'),
+                    'text' => $dialogue,
                     'role' => getProp($insert_data, 'voice_actor'),
                     'voice_type' => getProp($insert_data, 'voice_type'),
                     'voice_name' => getProp($insert_data, 'voice_name'),
@@ -1839,6 +1861,11 @@ class AnimeService
                     dLog('anime')->error('火山生成音频失败', ['error' => $error_msg, 'task_id' => $dubTaskId]);
                     Utils::throwError('20003:火山生成音频失败');
                 }
+            } else {
+                // dialogue为空时,直接写入默认音频信息
+                $insert_data['audio_url'] = 'https://zw-audiobook.tos-cn-beijing.volces.com/effects/ellipses_2s.mp3';
+                $insert_data['audio_duration'] = 2.0;
+                $insert_data['subtitle_info'] = json_encode(['duration' => 2.0, 'words' => []], 256);
             }
 
             // 如果没有上传图片则使用当前描述进行生成
@@ -2392,8 +2419,21 @@ class AnimeService
                     
                     $updated_segment = (array)$updated_segment;
                     
+                    // 检查dialogue是否为空
+                    $dialogue = getProp($updated_segment, 'dialogue');
+                    if (empty($dialogue)) {
+                        // dialogue为空时,直接写入默认音频信息
+                        DB::table('mp_episode_segments')->where('segment_id', $sid)->update([
+                            'audio_url' => 'https://zw-audiobook.tos-cn-beijing.volces.com/effects/ellipses_2s.mp3',
+                            'audio_duration' => 2.0,
+                            'subtitle_info' => json_encode(['duration' => 2.0, 'words' => []], 256),
+                            'updated_at' => $now
+                        ]);
+                        continue;
+                    }
+                    
                     $generate_json = [
-                        'text' => getProp($updated_segment, 'dialogue'),
+                        'text' => $dialogue,
                         'role' => getProp($updated_segment, 'voice_actor'),
                         'voice_type' => getProp($updated_segment, 'voice_type'),
                         'voice_name' => getProp($updated_segment, 'voice_name'),

파일 크기가 너무 크기때문에 변경 상태를 표시하지 않습니다.
+ 6 - 5
app/Services/DeepSeek/DeepSeekService.php