|
|
@@ -4795,8 +4795,24 @@ class AnimeService
|
|
|
$task = $this->aiVideoGenerationService->createUnifiedApiTask($unifiedParams);
|
|
|
} else {
|
|
|
// Seedance模型(默认)
|
|
|
+ // 快快AI Seedance 2.0/2.5:配音音频需先上传为素材,走聚合网关 /v1/video/generations
|
|
|
+ if ($this->isKuaikuaiSeedanceModel($model)) {
|
|
|
+ $videoParams['gateway_base_url'] = env('KUAIKUAI_AI_BASE_URL', 'https://ai-api.kkidc.com');
|
|
|
+
|
|
|
+ if ($canUseAudio && $audioUrl) {
|
|
|
+ // 上传配音音频为素材(上传失败时同步清理提示词中的<音频N>标记,不阻断任务)
|
|
|
+ $reference_audio_assets = $this->aiVideoGenerationService->processReferenceAudiosToKuaikuaiAssets([$audioUrl], $fullPrompt);
|
|
|
+ $videoParams['reference_audio_assets'] = $reference_audio_assets;
|
|
|
+
|
|
|
+ // 优化提示词,增加音频相关描述
|
|
|
+ $audioPrompt = "全程使用音频1作为视频配音。" . $fullPrompt;
|
|
|
+ $videoParams['prompt'] = $audioPrompt;
|
|
|
+ } elseif ($audioDuration) { // 有音频时长则需将视频时长设置为比音频时长更长的整数
|
|
|
+ $videoParams['video_duration'] = max(4, min(12, ceil($audioDuration)));
|
|
|
+ }
|
|
|
+ $task = $this->aiVideoGenerationService->createKuaikuaiVideoTask($videoParams);
|
|
|
+ } elseif ($canUseAudio && in_array($model, ['doubao-seedance-2-0-260128', 'doubao-seedance-2-0-fast-260128'])) {
|
|
|
// 检查是否为 Seedance 2.0 模型,如果是则需要处理配音音频
|
|
|
- if ($canUseAudio && in_array($model, ['doubao-seedance-2-0-260128', 'doubao-seedance-2-0-fast-260128'])) {
|
|
|
// 添加配音音频到content中
|
|
|
$videoParams['content'][] = [
|
|
|
'type' => 'audio_url',
|
|
|
@@ -4810,10 +4826,12 @@ class AnimeService
|
|
|
$audioPrompt = "全程使用音频1作为视频配音。" . $fullPrompt;
|
|
|
$videoParams['prompt'] = $audioPrompt;
|
|
|
$videoParams['content'][0]['text'] = $audioPrompt;
|
|
|
- } else if ($audioDuration) { // 有音频时长则需将视频时长设置为比音频时长更长的整数
|
|
|
- $videoParams['video_duration'] = max(4, min(12, ceil($audioDuration))); // seedance支持2-12s
|
|
|
+ } else {
|
|
|
+ if ($audioDuration) { // 有音频时长则需将视频时长设置为比音频时长更长的整数
|
|
|
+ $videoParams['video_duration'] = max(4, min(12, ceil($audioDuration))); // seedance支持2-12s
|
|
|
+ }
|
|
|
+ $task = $this->aiVideoGenerationService->createSeedanceTask($videoParams);
|
|
|
}
|
|
|
- $task = $this->aiVideoGenerationService->createSeedanceTask($videoParams);
|
|
|
}
|
|
|
|
|
|
// 更新分镜表的视频任务信息
|
|
|
@@ -4832,6 +4850,18 @@ class AnimeService
|
|
|
];
|
|
|
}
|
|
|
|
|
|
+ /**
|
|
|
+ * 是否为快快AI Seedance 2.0/2.5 系列模型
|
|
|
+ * 快快AI平台模型ID:seed-2-fast / seed-2-mini / seed-2.5 / seed-2
|
|
|
+ *
|
|
|
+ * @param string $model
|
|
|
+ * @return bool
|
|
|
+ */
|
|
|
+ private function isKuaikuaiSeedanceModel(string $model): bool
|
|
|
+ {
|
|
|
+ return in_array($model, ['seed-2-fast', 'seed-2-mini', 'seed-2.5', 'seed-2'], true);
|
|
|
+ }
|
|
|
+
|
|
|
public function createActVideoTask($data) {
|
|
|
$act_id = getProp($data, 'act_id');
|
|
|
$first_frame_url = getProp($data, 'first_frame_url');
|
|
|
@@ -5112,8 +5142,9 @@ class AnimeService
|
|
|
|
|
|
// 调用统一API创建任务
|
|
|
$task = $this->aiVideoGenerationService->createUnifiedApiTask($unifiedParams);
|
|
|
- } elseif (strpos($model, 'doubao-seedance-2.0') !== false) {
|
|
|
- // 豆包Seedance 2.0(百度AI网关):图片需要先上传为素材
|
|
|
+ } elseif (strpos($model, 'doubao-seedance-2.0') !== false || $this->isKuaikuaiSeedanceModel($model)) {
|
|
|
+ // 豆包Seedance 2.0(百度AI网关)/ 快快AI Seedance 2.0/2.5:图片需要先上传为素材
|
|
|
+ $isKuaikuai = $this->isKuaikuaiSeedanceModel($model);
|
|
|
// 保存原始参考图用于任务记录
|
|
|
$videoParams['reference_images'] = $reference_images;
|
|
|
|
|
|
@@ -5121,8 +5152,10 @@ class AnimeService
|
|
|
// 限制只传入9张参考图
|
|
|
$reference_images = array_slice($reference_images, 0, 9);
|
|
|
|
|
|
- // 参考图上传为百度网关素材,上传失败时同步清理提示词中的<图片N>标记
|
|
|
- $reference_image_assets = $this->aiVideoGenerationService->processReferenceImagesToSeedance20Assets($reference_images, $fullPrompt);
|
|
|
+ // 参考图上传为素材(百度网关/快快AI),上传失败时同步清理提示词中的<图片N>标记
|
|
|
+ $reference_image_assets = $isKuaikuai
|
|
|
+ ? $this->aiVideoGenerationService->processReferenceImagesToKuaikuaiAssets($reference_images, $fullPrompt)
|
|
|
+ : $this->aiVideoGenerationService->processReferenceImagesToSeedance20Assets($reference_images, $fullPrompt);
|
|
|
|
|
|
// 素材上传失败后提示词可能被清理,同步更新视频参数中的提示词
|
|
|
$videoParams['prompt'] = trim($fullPrompt);
|
|
|
@@ -5130,7 +5163,13 @@ class AnimeService
|
|
|
$videoParams['reference_image_assets'] = $reference_image_assets;
|
|
|
}
|
|
|
|
|
|
- $task = $this->aiVideoGenerationService->createSeedance20Task($videoParams);
|
|
|
+ // 快快AI走聚合网关 /v1/video/generations(火山豆包格式)
|
|
|
+ if ($isKuaikuai) {
|
|
|
+ $videoParams['gateway_base_url'] = env('KUAIKUAI_AI_BASE_URL', 'https://ai-api.kkidc.com');
|
|
|
+ $task = $this->aiVideoGenerationService->createKuaikuaiVideoTask($videoParams);
|
|
|
+ } else {
|
|
|
+ $task = $this->aiVideoGenerationService->createSeedance20Task($videoParams);
|
|
|
+ }
|
|
|
} else {
|
|
|
$task = $this->aiVideoGenerationService->createSeedanceTask($videoParams);
|
|
|
}
|
|
|
@@ -5315,8 +5354,9 @@ class AnimeService
|
|
|
|
|
|
// 调用统一API创建任务
|
|
|
$task = $this->aiVideoGenerationService->createUnifiedApiTask($unifiedParams);
|
|
|
- } elseif (strpos($model, 'doubao-seedance-2.0') !== false) {
|
|
|
- // 豆包Seedance 2.0(百度AI网关):图片/视频/音频需要先上传为素材
|
|
|
+ } elseif (strpos($model, 'doubao-seedance-2.0') !== false || $this->isKuaikuaiSeedanceModel($model)) {
|
|
|
+ // 豆包Seedance 2.0(百度AI网关)/ 快快AI Seedance 2.0/2.5:图片/视频/音频需要先上传为素材
|
|
|
+ $isKuaikuai = $this->isKuaikuaiSeedanceModel($model);
|
|
|
$videoParams['reference_images'] = $reference_images;
|
|
|
|
|
|
// 维护ref_image_url字段(参考图+参考视频+参考音频URL,JSON数组)
|
|
|
@@ -5326,20 +5366,26 @@ class AnimeService
|
|
|
}
|
|
|
|
|
|
if ($reference_images) {
|
|
|
- // 参考图上传为百度网关素材
|
|
|
- $reference_image_assets = $this->aiVideoGenerationService->processReferenceImagesToSeedance20Assets($reference_images, $videoParams['prompt']);
|
|
|
+ // 参考图上传为素材(百度网关/快快AI)
|
|
|
+ $reference_image_assets = $isKuaikuai
|
|
|
+ ? $this->aiVideoGenerationService->processReferenceImagesToKuaikuaiAssets($reference_images, $videoParams['prompt'])
|
|
|
+ : $this->aiVideoGenerationService->processReferenceImagesToSeedance20Assets($reference_images, $videoParams['prompt']);
|
|
|
$videoParams['reference_image_assets'] = $reference_image_assets;
|
|
|
}
|
|
|
|
|
|
- // 参考视频上传为百度网关素材
|
|
|
+ // 参考视频上传为素材(百度网关/快快AI)
|
|
|
if ($reference_videos) {
|
|
|
- $reference_video_assets = $this->aiVideoGenerationService->processReferenceVideosToSeedance20Assets($reference_videos, $videoParams['prompt']);
|
|
|
+ $reference_video_assets = $isKuaikuai
|
|
|
+ ? $this->aiVideoGenerationService->processReferenceVideosToKuaikuaiAssets($reference_videos, $videoParams['prompt'])
|
|
|
+ : $this->aiVideoGenerationService->processReferenceVideosToSeedance20Assets($reference_videos, $videoParams['prompt']);
|
|
|
$videoParams['reference_video_assets'] = $reference_video_assets;
|
|
|
}
|
|
|
|
|
|
- // 参考音频上传为百度网关素材
|
|
|
+ // 参考音频上传为素材(百度网关/快快AI)
|
|
|
if ($reference_audios) {
|
|
|
- $reference_audio_assets = $this->aiVideoGenerationService->processReferenceAudiosToSeedance20Assets($reference_audios, $videoParams['prompt']);
|
|
|
+ $reference_audio_assets = $isKuaikuai
|
|
|
+ ? $this->aiVideoGenerationService->processReferenceAudiosToKuaikuaiAssets($reference_audios, $videoParams['prompt'])
|
|
|
+ : $this->aiVideoGenerationService->processReferenceAudiosToSeedance20Assets($reference_audios, $videoParams['prompt']);
|
|
|
$videoParams['reference_audio_assets'] = $reference_audio_assets;
|
|
|
}
|
|
|
|
|
|
@@ -5348,7 +5394,13 @@ class AnimeService
|
|
|
$videoParams['content'][0]['text'] = $videoParams['prompt'];
|
|
|
}
|
|
|
|
|
|
- $task = $this->aiVideoGenerationService->createSeedance20Task($videoParams);
|
|
|
+ // 快快AI走聚合网关 /v1/video/generations(火山豆包格式)
|
|
|
+ if ($isKuaikuai) {
|
|
|
+ $videoParams['gateway_base_url'] = env('KUAIKUAI_AI_BASE_URL', 'https://ai-api.kkidc.com');
|
|
|
+ $task = $this->aiVideoGenerationService->createKuaikuaiVideoTask($videoParams);
|
|
|
+ } else {
|
|
|
+ $task = $this->aiVideoGenerationService->createSeedance20Task($videoParams);
|
|
|
+ }
|
|
|
} else {
|
|
|
// 官方Seedance模型:兼容参考视频和参考音频(content直接透传公网URL)
|
|
|
|