|
|
@@ -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'),
|