diff --git a/crates/api_clients/artcraft/artcraft_router/src/generate/generate_video/cost/artcraft/estimate_video_cost_artcraft_seedance2p0.rs b/crates/api_clients/artcraft/artcraft_router/src/generate/generate_video/cost/artcraft/estimate_video_cost_artcraft_seedance2p0.rs index b9a7b0476e..d890b1caa0 100644 --- a/crates/api_clients/artcraft/artcraft_router/src/generate/generate_video/cost/artcraft/estimate_video_cost_artcraft_seedance2p0.rs +++ b/crates/api_clients/artcraft/artcraft_router/src/generate/generate_video/cost/artcraft/estimate_video_cost_artcraft_seedance2p0.rs @@ -32,6 +32,7 @@ pub (crate) fn estimate_video_cost_artcraft_seedance2p0( end_frame_url: None, reference_image_urls: None, reference_video_urls: None, + reference_audio_urls: None, use_face_blur_hack: None, }; diff --git a/crates/api_clients/seedance2pro/src/requests/generate_video/generate_video.rs b/crates/api_clients/seedance2pro/src/requests/generate_video/generate_video.rs index 20c28a643b..582efc4005 100644 --- a/crates/api_clients/seedance2pro/src/requests/generate_video/generate_video.rs +++ b/crates/api_clients/seedance2pro/src/requests/generate_video/generate_video.rs @@ -41,6 +41,11 @@ pub struct GenerateVideoArgs<'a> { /// When present, takes priority over start/end frames. pub reference_video_urls: Option>, + /// Optional reference audio URLs (reference mode). + /// Audio is referenced in prompts as @audio1, @audio2, etc. + /// Sent in a separate `audioUrls` field (not in `uploadedUrls`). + pub reference_audio_urls: Option>, + /// Controls the `faceBlurMode` field: true sends "on", false sends "off", None omits it. pub use_face_blur_hack: Option, } @@ -138,7 +143,9 @@ pub struct GenerateVideoResponse { pub async fn generate_video(args: GenerateVideoArgs<'_>) -> Result { let has_reference_images = args.reference_image_urls.as_ref().is_some_and(|urls| !urls.is_empty()); let has_reference_videos = args.reference_video_urls.as_ref().is_some_and(|urls| !urls.is_empty()); - let is_reference_mode = has_reference_images || has_reference_videos; + let has_reference_audio = args.reference_audio_urls.as_ref().is_some_and(|urls| !urls.is_empty()); + + let is_reference_mode = has_reference_images || has_reference_videos || has_reference_audio; let video_input_mode = if is_reference_mode { "reference" } else { "keyframe" }; @@ -162,6 +169,12 @@ pub async fn generate_video(args: GenerateVideoArgs<'_>) -> Result> = if has_reference_audio { + args.reference_audio_urls + } else { + None + }; + let face_blur_mode = match args.use_face_blur_hack { Some(true) => Some("on"), Some(false) => Some("off"), @@ -191,6 +204,7 @@ pub async fn generate_video(args: GenerateVideoArgs<'_>) -> Result, #[serde(rename = "uploadedUrls", skip_serializing_if = "Option::is_none")] pub uploaded_urls: Option>, + #[serde(rename = "audioUrls", skip_serializing_if = "Option::is_none")] + pub audio_urls: Option>, #[serde(rename = "batchCount", skip_serializing_if = "Option::is_none")] pub batch_count: Option, } diff --git a/crates/service/web/storyteller_web/src/http_server/endpoints/generate/video/multi_function/seedance_2p0_multi_function_video_gen_handler.rs b/crates/service/web/storyteller_web/src/http_server/endpoints/generate/video/multi_function/seedance_2p0_multi_function_video_gen_handler.rs index 16b679ef83..82713b91fa 100644 --- a/crates/service/web/storyteller_web/src/http_server/endpoints/generate/video/multi_function/seedance_2p0_multi_function_video_gen_handler.rs +++ b/crates/service/web/storyteller_web/src/http_server/endpoints/generate/video/multi_function/seedance_2p0_multi_function_video_gen_handler.rs @@ -195,6 +195,7 @@ pub async fn seedance_2p0_multi_function_video_gen_handler( end_frame_url, reference_image_urls, reference_video_urls: None, // TODO: Wire up video references from request + reference_audio_urls: None, use_face_blur_hack: None, };