ソースを参照

1.修复音频生成bug2.新增检查分镜音频生成状态的定时任务

lh 2 ヶ月 前
コミット
5d08bc9a67

+ 15 - 12
app/Console/Anime/SegmentCheckAudioCommand.php

@@ -58,10 +58,10 @@ class SegmentCheckAudioCommand extends Command
                 dLog('command')->info('找到待重试的音频任务', ['count' => $pendingTasks->count()]);
                 
                 foreach ($pendingTasks as $task) {
-                    sleep(1);
                     try {
                         $dubTaskId = $task->id;
                         
+                        sleep(1);
                         // 请求远程服务器执行生成
                         $client = new Client(['timeout' => 300, 'verify' => false]);
                         $result = $client->get("http://122.9.129.83:5000/api/anime/genAudio?taskId={$dubTaskId}");
@@ -96,18 +96,18 @@ class SegmentCheckAudioCommand extends Command
             $segmentsNeedAudio = DB::table('mp_episode_segments')
                 ->whereNotNull('img_url')
                 ->where('img_url', '!=', '')
+                ->where('voice_type', '!=', '')
                 ->where(function($query) {
                     $query->whereNull('audio_url')
                           ->orWhere('audio_url', '');
                 })
-                ->limit(10) // 每次处理10个分镜
+                ->limit(10) // 每次处理2个分镜
                 ->get();
             
             if ($segmentsNeedAudio->isNotEmpty()) {
                 dLog('command')->info('找到需要生成音频的分镜', ['count' => $segmentsNeedAudio->count()]);
                 
                 foreach ($segmentsNeedAudio as $segment) {
-                    sleep(1);
                     try {
                         $segment_id = $segment->segment_id;
                         $dialogue = getProp($segment, 'dialogue');
@@ -144,7 +144,18 @@ class SegmentCheckAudioCommand extends Command
                                 continue;
                             }
                             
-                            // 请求远程服务器执行生成
+                            // 先更新分镜表,将audio_url设置为空字符串(标记正在生成)
+                            DB::table('mp_episode_segments')
+                                ->where('segment_id', $segment_id)
+                                ->update([
+                                    'audio_url' => '',
+                                    'updated_at' => $now
+                                ]);
+                            
+                            dLog('command')->info('开始请求远程服务器生成音频', ['task_id' => $dubTaskId, 'segment_id' => $segment_id]);
+                            
+                            sleep(1);
+                            // 请求远程服务器执行生成(远程服务器会更新audio_url字段)
                             $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();
@@ -156,14 +167,6 @@ class SegmentCheckAudioCommand extends Command
                                 logDB('command', 'error', '火山生成音频失败', ['error' => $error_msg, 'task_id' => $dubTaskId, 'segment_id' => $segment_id]);
                             } else {
                                 dLog('command')->info('音频任务创建成功', ['task_id' => $dubTaskId, 'segment_id' => $segment_id]);
-                                
-                                // 更新分镜表,标记音频正在生成
-                                DB::table('mp_episode_segments')
-                                    ->where('segment_id', $segment_id)
-                                    ->update([
-                                        'audio_url' => '',
-                                        'updated_at' => $now
-                                    ]);
                             }
                         } else {
                             // dialogue为空时,直接写入默认音频信息

+ 1 - 1
app/Console/Kernel.php

@@ -37,7 +37,7 @@ class Kernel extends ConsoleKernel
         $schedule->command('Anime:checkImgUrl')->everyMinute();
 
         // 检查分镜音频生成状态
-        // $schedule->command('Segment:checkAudio')->everyMinute();
+        $schedule->command('Segment:checkAudio')->everyMinute();
         
         // 处理图片生成任务队列
         $schedule->command('image-generation:process-queue')->everyMinute();

+ 69 - 47
app/Services/Anime/AnimeService.php

@@ -975,6 +975,8 @@ class AnimeService
         
         if (!$segment) Utils::throwError('20003:该分镜不存在');
 
+        $dubTaskId = 0;
+
         try {
             DB::beginTransaction();
             // 准备更新数据
@@ -1020,18 +1022,7 @@ class AnimeService
                     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为空时,直接写入默认音频信息
@@ -1083,6 +1074,22 @@ class AnimeService
             }
 
             DB::commit();
+
+            // 如果有创建音频生成任务则调用API
+            if ($dubTaskId) {
+                // 请求远程服务器执行生成
+                $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, 'segment_id'=>$segment_id]);
+                    logDB('anime', 'error', '火山生成音频失败', ['error' => $error_msg, 'task_id' => $dubTaskId, 'segment_id'=>$segment_id]);
+                    Utils::throwError('20003:火山生成音频失败');
+                }
+            }
+
             return true;
         } catch (\Exception $e) {
             DB::rollBack();
@@ -1193,6 +1200,7 @@ class AnimeService
             }
 
             try {
+                $dubTaskId = 0;
                 // 解析分镜内容,提取画面描述作为主要提示词
                 $prompt = $segment_content;
                 $ref_img_urls = [];
@@ -1260,7 +1268,6 @@ class AnimeService
                 // 如果有对话内容,创建视频配音合成任务
                 $dialogue = getProp($segment, 'dialogue');
                 if (!empty($dialogue)) {
-                    sleep(1);
                     $now = date('Y-m-d H:i:s');
                     $generate_json = [
                         'text' => $dialogue,
@@ -1287,19 +1294,11 @@ class AnimeService
                     ]);
                     
                     if (!$dubTaskId) {
-                        Utils::throwError('20003:创建配音任务失败!');
+                        dLog('anime')->error('火山生成音频失败', ['segment_id' => $segment_id, 'generate_json'=>$generate_json]);
+                        logDB('anime', 'error', '火山生成音频失败', ['segment_id' => $segment_id, 'generate_json'=>$generate_json]);
+                        // 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]);
-                        Utils::throwError('20003:火山生成音频失败');
-                    }
                 } else {
                     // dialogue为空时,直接写入默认音频信息到分镜表
                     $update_data['audio_url'] = 'https://zw-audiobook.tos-cn-beijing.volces.com/effects/ellipses_2s.mp3';
@@ -1332,6 +1331,20 @@ class AnimeService
                         'error' => '更新分镜任务状态失败'
                     ];
                 }
+
+                if ($dubTaskId) {
+                    sleep(1);
+                    // 请求远程服务器执行生成
+                    $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, 'segment_id' => $segment_id]);
+                        logDB('anime', 'error', '火山生成音频失败', ['error' => $error_msg, 'task_id' => $dubTaskId, 'segment_id' => $segment_id]);
+                    }
+                }
                 
             } catch (\Exception $e) {
                 $failed_segments[] = [
@@ -1434,6 +1447,7 @@ class AnimeService
         }
 
         try {
+            $dubTaskId = 0;
             // 分镜剧本数组
             $update_data = [
                 'segment_content' => $final_segment_content,
@@ -1539,17 +1553,6 @@ class AnimeService
                         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为空时,直接写入默认音频信息
@@ -1567,6 +1570,20 @@ class AnimeService
             if ($boolen && (int)getProp($segment, 'episode_number') === 1 && (int)getProp($segment, 'segment_number') === 1) {
                 Redis::sadd('anime_first_frame_urls', $segment_id);
             }
+
+            if ($dubTaskId) {
+                // 请求远程服务器执行生成
+                $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:火山生成音频失败');
+                }
+            }
             
         } catch (\Exception $e) {
             $failed_segments[] = [
@@ -1742,6 +1759,7 @@ class AnimeService
         }
 
         try {
+            $dubTaskId = 0;
             DB::beginTransaction();
 
             $new_segment_number = $segment_number + 1;
@@ -1796,17 +1814,8 @@ class AnimeService
                 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]);
-                    Utils::throwError('20003:火山生成音频失败');
-                }
+
+                $insert_data['audio_url'] = '';
             } else {
                 // dialogue为空时,直接写入默认音频信息
                 $insert_data['audio_url'] = 'https://zw-audiobook.tos-cn-beijing.volces.com/effects/ellipses_2s.mp3';
@@ -1893,6 +1902,19 @@ class AnimeService
                 Redis::sadd('anime_first_frame_urls', $segment_id);
             }
             
+            if ($dubTaskId) {
+                // 请求远程服务器执行生成
+                $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]);
+                    Utils::throwError('20003:火山生成音频失败');
+                }
+            }
+
         } catch (\Exception $e) {
             DB::rollBack();
             Utils::throwError('20003:'.$e->getMessage());
@@ -2376,7 +2398,6 @@ class AnimeService
                         continue;
                     }
 
-                    sleep(1);
                     $generate_json = [
                         'text' => $dialogue,
                         'role' => getProp($updated_segment, 'voice_actor'),
@@ -2408,6 +2429,7 @@ class AnimeService
                     
                     // 请求远程服务器执行生成
                     try {
+                        sleep(1);
                         $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();