|
|
@@ -2511,7 +2511,10 @@ class AnimeService
|
|
|
];
|
|
|
|
|
|
// 如果分镜有图片,作为首帧
|
|
|
- if (getProp($segment, 'img_url')) {
|
|
|
+ $hasImage = !empty(getProp($segment, 'img_url'));
|
|
|
+ $hasVideo = !empty(getProp($segment, 'video_url'));
|
|
|
+
|
|
|
+ if ($hasImage) {
|
|
|
$videoParams['first_frame_url'] = getProp($segment, 'img_url');
|
|
|
}
|
|
|
|
|
|
@@ -2524,19 +2527,32 @@ class AnimeService
|
|
|
];
|
|
|
|
|
|
// 如果有首帧图片,添加到content中
|
|
|
- if (isset($videoParams['first_frame_url'])) {
|
|
|
- $videoParams['content'][] = [
|
|
|
- 'type' => 'image_url',
|
|
|
- 'image_url' => [
|
|
|
- 'url' => $videoParams['first_frame_url'],
|
|
|
- ],
|
|
|
- 'role' => 'first_frame',
|
|
|
- ];
|
|
|
+ if ($hasImage) {
|
|
|
+ if (in_array($model, ['doubao-seedance-2-0-260128', 'doubao-seedance-2-0-fast-260128'])) {
|
|
|
+ $videoParams['content'][] = [
|
|
|
+ 'type' => 'image_url',
|
|
|
+ 'image_url' => [
|
|
|
+ 'url' => $videoParams['first_frame_url'],
|
|
|
+ ],
|
|
|
+ 'role' => 'reference_image',
|
|
|
+ ];
|
|
|
+ }else {
|
|
|
+ $videoParams['content'][] = [
|
|
|
+ 'type' => 'image_url',
|
|
|
+ 'image_url' => [
|
|
|
+ 'url' => $videoParams['first_frame_url'],
|
|
|
+ ],
|
|
|
+ 'role' => 'first_frame',
|
|
|
+ ];
|
|
|
+ }
|
|
|
}
|
|
|
|
|
|
// 获取配音音频URL
|
|
|
$audioUrl = getProp($segment, 'audio_url');
|
|
|
$audioDuration = getProp($segment, 'audio_duration');
|
|
|
+
|
|
|
+ // 音频传入的前提:必须有至少一张图片或一个视频
|
|
|
+ $canUseAudio = ($hasImage || $hasVideo) && !empty($audioUrl);
|
|
|
|
|
|
// dd($videoParams);
|
|
|
|
|
|
@@ -2555,24 +2571,22 @@ class AnimeService
|
|
|
$task = $this->aiVideoGenerationService->createKelingOmniTask($videoParams);
|
|
|
} else {
|
|
|
// 检查是否为 Seedance 2.0 模型,如果是则需要处理配音音频
|
|
|
- if ($audioUrl) {
|
|
|
- if (in_array($model, ['doubao-seedance-2-0-260128', 'doubao-seedance-2-0-fast-260128'])) {
|
|
|
- // 添加配音音频到content中
|
|
|
- $videoParams['content'][] = [
|
|
|
- 'type' => 'audio_url',
|
|
|
- 'audio_url' => [
|
|
|
- 'url' => $audioUrl,
|
|
|
- ],
|
|
|
- 'role' => 'reference_audio',
|
|
|
- ];
|
|
|
-
|
|
|
- // 优化提示词,增加音频相关描述
|
|
|
- $audioPrompt = "全程使用音频1作为视频配音。" . $fullPrompt;
|
|
|
- $videoParams['prompt'] = $audioPrompt;
|
|
|
- $videoParams['content'][0]['text'] = $audioPrompt;
|
|
|
- }else if ($audioDuration) { // 有音频时长则需将视频时长设置为比音频时长更长的整数
|
|
|
- $videoParams['video_duration'] = max(2, min(12, ceil($audioDuration))); // seedance支持2-12s
|
|
|
- }
|
|
|
+ if ($canUseAudio && in_array($model, ['doubao-seedance-2-0-260128', 'doubao-seedance-2-0-fast-260128'])) {
|
|
|
+ // 添加配音音频到content中
|
|
|
+ $videoParams['content'][] = [
|
|
|
+ 'type' => 'audio_url',
|
|
|
+ 'audio_url' => [
|
|
|
+ 'url' => $audioUrl,
|
|
|
+ ],
|
|
|
+ 'role' => 'reference_audio',
|
|
|
+ ];
|
|
|
+
|
|
|
+ // 优化提示词,增加音频相关描述
|
|
|
+ $audioPrompt = "全程使用音频1作为视频配音。" . $fullPrompt;
|
|
|
+ $videoParams['prompt'] = $audioPrompt;
|
|
|
+ $videoParams['content'][0]['text'] = $audioPrompt;
|
|
|
+ } else if ($audioDuration) { // 有音频时长则需将视频时长设置为比音频时长更长的整数
|
|
|
+ $videoParams['video_duration'] = max(2, min(12, ceil($audioDuration))); // seedance支持2-12s
|
|
|
}
|
|
|
// Seedance模型(默认)
|
|
|
$task = $this->aiVideoGenerationService->createSeedanceTask($videoParams);
|