diff --git a/crates/service/web/storyteller_web/src/configs/plans/plan.rs b/crates/service/web/storyteller_web/src/configs/plans/plan.rs index 38d6a2b42b..67dd178cc1 100644 --- a/crates/service/web/storyteller_web/src/configs/plans/plan.rs +++ b/crates/service/web/storyteller_web/src/configs/plans/plan.rs @@ -47,6 +47,8 @@ pub struct Plan { lipsync_requires_frontend_keepalive: bool, + can_remove_visual_watermarks: bool, + // ========== Features for TTS ========== tts_base_priority_level: u8, @@ -89,6 +91,7 @@ impl Plan { is_development_plan: builder.is_development_plan, is_synthetic_plan: builder.is_synthetic_plan, lipsync_requires_frontend_keepalive: builder.lipsync_requires_frontend_keepalive, + can_remove_visual_watermarks: builder.can_remove_visual_watermarks, tts_base_priority_level: builder.tts_base_priority_level, tts_max_duration: builder.tts_max_duration, tts_max_character_length: builder.tts_max_character_length, @@ -143,6 +146,10 @@ impl Plan { self.lipsync_requires_frontend_keepalive } + pub fn can_remove_visual_watermarks(&self) -> bool { + self.can_remove_visual_watermarks + } + pub fn tts_base_priority_level(&self) -> u8 { self.tts_base_priority_level } @@ -183,6 +190,8 @@ pub struct PlanBuilder { lipsync_requires_frontend_keepalive: bool, + can_remove_visual_watermarks: bool, + // ========== Features for TTS ========== tts_base_priority_level: u8, @@ -228,6 +237,7 @@ impl PlanBuilder { // Lipsync (SadTalker, not Wav2Lip) lipsync_requires_frontend_keepalive: true, + can_remove_visual_watermarks: false, // TTS tts_base_priority_level : TTS_DEFAULT_PRIORITY_LEVEL, @@ -294,6 +304,11 @@ impl PlanBuilder { self } + pub fn can_remove_visual_watermarks(mut self, value: bool) -> Self { + self.can_remove_visual_watermarks = value; + self + } + pub fn tts_base_priority_level(mut self, value: u8) -> Self { self.tts_base_priority_level = value; self diff --git a/crates/service/web/storyteller_web/src/configs/plans/plan_list.rs b/crates/service/web/storyteller_web/src/configs/plans/plan_list.rs index ccd5a0c90a..40a345c0cd 100644 --- a/crates/service/web/storyteller_web/src/configs/plans/plan_list.rs +++ b/crates/service/web/storyteller_web/src/configs/plans/plan_list.rs @@ -146,6 +146,7 @@ pub static PRODUCTION_PREMIUM_PLANS: Lazy> = Lazy::new(|| { .web_vc_base_priority_level(30) .web_vc_requires_frontend_keepalive(false) .lipsync_requires_frontend_keepalive(false) + .can_remove_visual_watermarks(true) .build()); plans.insert(PlanBuilder::new("fakeyou_elite") @@ -159,6 +160,7 @@ pub static PRODUCTION_PREMIUM_PLANS: Lazy> = Lazy::new(|| { .web_vc_base_priority_level(40) .web_vc_requires_frontend_keepalive(false) .lipsync_requires_frontend_keepalive(false) + .can_remove_visual_watermarks(true) .build()); // ========== Spanish plans ========== diff --git a/crates/service/web/storyteller_web/src/http_server/endpoints/animation/enqueue_lipsync_animation.rs b/crates/service/web/storyteller_web/src/http_server/endpoints/animation/enqueue_lipsync_animation.rs index 26d3ac3d28..e636d8605c 100644 --- a/crates/service/web/storyteller_web/src/http_server/endpoints/animation/enqueue_lipsync_animation.rs +++ b/crates/service/web/storyteller_web/src/http_server/endpoints/animation/enqueue_lipsync_animation.rs @@ -45,20 +45,20 @@ pub struct EnqueueLipsyncAnimationRequest { creator_set_visibility: Option, - ///// SadTalker: cropping - //crop: Option, + /// Width/height of the video to generate (presets) + dimensions: Option, /// SadTalker: parameter to make the animation more still. make_still: Option, - /// SadTalker: parameter to enhance the face using gfpgan. - high_quality: Option, + /// SadTalker: we use gfpgan face enhancement by default; this disables it. + disable_face_enhancement: Option, - /// Remove the watermark + /// Remove the watermark (premium only) remove_watermark: Option, - /// Size of the video to generate - dimensions: Option, + ///// SadTalker: cropping + //crop: Option, } //#[derive(Deserialize, Copy, Clone)] @@ -165,8 +165,6 @@ pub async fn enqueue_lipsync_animation_handler( server_state: web::Data>) -> Result { let mut maybe_user_token : Option = None; - let priority_level ; - let disable_rate_limiter = false; // NB: Careful! let mut mysql_connection = server_state.mysql_pool .acquire() @@ -197,7 +195,7 @@ pub async fn enqueue_lipsync_animation_handler( maybe_user_session.as_ref()); // TODO: Separate priority for animation. - priority_level = plan.web_vc_base_priority_level(); + let priority_level = plan.web_vc_base_priority_level(); // ==================== DEBUG MODE + ROUTING TAG ==================== // @@ -211,20 +209,18 @@ pub async fn enqueue_lipsync_animation_handler( // ==================== RATE LIMIT ==================== // - if !disable_rate_limiter { - let rate_limiter = match maybe_user_session { - None => &server_state.redis_rate_limiters.logged_out, - Some(ref user) => { - if user.role.is_banned { - return Err(EnqueueLipsyncAnimationError::NotAuthorized); - } - &server_state.redis_rate_limiters.logged_in - }, - }; + let rate_limiter = match maybe_user_session { + None => &server_state.redis_rate_limiters.logged_out, + Some(ref user) => { + if user.role.is_banned { + return Err(EnqueueLipsyncAnimationError::NotAuthorized); + } + &server_state.redis_rate_limiters.logged_in + }, + }; - if let Err(_err) = rate_limiter.rate_limit_request(&http_request) { - return Err(EnqueueLipsyncAnimationError::RateLimited); - } + if let Err(_err) = rate_limiter.rate_limit_request(&http_request) { + return Err(EnqueueLipsyncAnimationError::RateLimited); } // ==================== LOOK UP MODEL INFO ==================== // @@ -277,7 +273,9 @@ pub async fn enqueue_lipsync_animation_handler( maybe_resize_height: None, }; - if request.high_quality.unwrap_or(false) { + let enable_face_enhancement = !request.disable_face_enhancement.unwrap_or(false); + + if enable_face_enhancement { inference_args.maybe_face_enhancer = Some(FaceEnhancer::G); // "--enhancer gfpgan" }