#pragma once #include "engine/models/vibevoice/assets.h" #include #include namespace engine::models::vibevoice { struct VibeVoiceSchedulerStepResult { std::vector prev_sample; }; class VibeVoiceDPMSolverScheduler final { public: explicit VibeVoiceDPMSolverScheduler(const VibeVoiceDiffusionHeadConfig & config); void set_timesteps(int64_t inference_steps); void reset_step_state(); const std::vector & timesteps() const noexcept; VibeVoiceSchedulerStepResult step( const std::vector & model_output, int64_t timestep, const std::vector & sample); private: void validate_supported_config() const; void init_step_index(int64_t timestep); int64_t index_for_timestep(int64_t timestep) const; std::vector convert_model_output( const std::vector & model_output, const std::vector & sample) const; std::vector first_order_update( const std::vector & model_output, const std::vector & sample) const; std::vector second_order_update(const std::vector & sample) const; VibeVoiceDiffusionHeadConfig config_; std::vector alphas_cumprod_; std::vector sigmas_; std::vector timesteps_; std::vector> model_outputs_; int64_t num_inference_steps_ = 0; int64_t step_index_ = -1; int64_t lower_order_nums_ = 0; }; } // namespace engine::models::vibevoice