diff --git a/CHANGELOG.md b/CHANGELOG.md index 0c0bca81e..f529ff418 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -49,6 +49,7 @@ Plus inevitable bug-fixes... can significantly improve lora quality when using multiple loras at once - per-block strength - native support for **MiniMax** + see [MiniMax Turbo LoRA collection](https://huggingface.co/vladmandic/MiniMax-H3-Turbo-LoRA) for LoRAs and examples - **DLSS** - add DLSS support for: *NeuralRender, SuperSample and FrameGen* dlls 5 caused quite a stir, but combined with generative ai it becomes a nice tool @@ -107,6 +108,7 @@ Plus inevitable bug-fixes... *note*: this may break compatibility with some legacy packages, so report any finidings - **Other** - video preview: TAESD support for **MiniMax** + - **minimax** video and audio shift are now dependent on steps instead of static - support `xai grok` for prompt enhance workflows *note*: requires grok api key - remove `/redocs` as `/docs` are primary api docs diff --git a/modules/minimax/minimax_ui.py b/modules/minimax/minimax_ui.py index d452c7f75..04c425bc6 100644 --- a/modules/minimax/minimax_ui.py +++ b/modules/minimax/minimax_ui.py @@ -29,8 +29,8 @@ def create_ui(prompt, _negative, styles, overrides, script_inputs, mp4_fps, mp4_ steps = gr.Slider(minimum=2, maximum=100, step=1, label="MiniMax steps", elem_id='minimax_steps', value=30) frames = gr.Slider(label='MiniMax frames', minimum=22, maximum=362, step=17, value=124, elem_id='minimax_frames') with gr.Row(): - video_shift = gr.Slider(minimum=8.0, maximum=16.0, step=0.1, label="MiniMax video shift", elem_id='minimax_video_shift', value=12) - audio_shift = gr.Slider(minimum=1.5, maximum=6.0, step=0.1, label="MiniMax audio shift", elem_id='minimax_audio_shift', value=3) + video_shift = gr.Slider(minimum=0.05, maximum=0.95, step=0.05, value=0.40, label="MiniMax video shift", elem_id='minimax_video_shift') + audio_shift = gr.Slider(minimum=0.05, maximum=0.95, step=0.05, value=0.15, label="MiniMax audio shift", elem_id='minimax_audio_shift') with gr.Row(): seed = gr.Number(label='Seed', value=-1, elem_id='minimax_seed', container=True) random_seed = ToolButton(ui_symbols.random, elem_id='minimax_seed_random') diff --git a/modules/minimax/minimax_video.py b/modules/minimax/minimax_video.py index 2e29bd031..5631a0b3f 100644 --- a/modules/minimax/minimax_video.py +++ b/modules/minimax/minimax_video.py @@ -145,8 +145,8 @@ def generate(task_id, _ui_state, ops=['video'], ) video_minimax.apply_overrides(p, shared.sd_model, still=False, audio=enable_audio, preview=enable_preview) - video_minimax.set_sampler_shift(shared.sd_model, video_shift=video_shift, audio_shift=audio_shift) - log.debug(f'Video: engine="{engine}" model="{model}" workflow={workflow} cls={shared.sd_model.__class__.__name__} audio={enable_audio} preview={enable_preview} shift={video_shift}:{audio_shift} kwargs={p.task_args}') + video_minimax.set_sampler_shift(shared.sd_model, steps=steps, video_shift=video_shift, audio_shift=audio_shift) + log.debug(f'Video: engine="{engine}" model="{model}" workflow={workflow} cls={shared.sd_model.__class__.__name__} audio={enable_audio} preview={enable_preview} kwargs={p.task_args}') processing.fix_seed(p) p.ops.append('video') p.scripts = scripts_manager.scripts_video diff --git a/modules/video_models/video_minimax.py b/modules/video_models/video_minimax.py index f52697689..29a43e2d2 100644 --- a/modules/video_models/video_minimax.py +++ b/modules/video_models/video_minimax.py @@ -91,8 +91,25 @@ def set_audio(pipe, enabled: bool): log.debug(f'Pipeline: cls={pipe.__class__.__name__} audio=disabled') -def set_sampler_shift(pipe, video_shift: float = 12.0, audio_shift: float = 3.0): - if getattr(pipe, 'scheduler', None) is not None and getattr(pipe.scheduler, 'config', None) is not None: - pipe.scheduler.config.shift = video_shift - if getattr(pipe, 'audio_scheduler', None) is not None and getattr(pipe.audio_scheduler, 'config', None) is not None: - pipe.audio_scheduler.config.shift = audio_shift +def calculate_video_shift(steps: int, value: float = 0.40, max_shift: float = 16.0) -> int: + value = max(0.05, min(0.95, value)) + return min(max_shift, round((value * steps) + 0.5)) + + +def calculate_audio_shift(steps: int, value: float = 0.15, max_shift: float = 6.0) -> int: + value = max(0.05, min(0.95, value)) + return min(max_shift, round((value * steps) + 0.5)) + + +def set_sampler_shift(pipe, steps: int, video_shift: float = 12.0, audio_shift: float = 3.0): + import diffusers + if getattr(pipe, 'scheduler', None) is None or getattr(pipe.scheduler, 'config', None) is None: + log.warning(f'Pipeline: cls={pipe.__class__.__name__} scheduler is missing') + return + video_calc_shift = calculate_video_shift(steps=steps, value=video_shift) + audio_calc_shift = calculate_audio_shift(steps=steps, value=audio_shift) + dct_video = { 'shift': video_shift, 'steps': video_calc_shift } + dct_audio = { 'shift': audio_shift, 'steps': audio_calc_shift } + pipe.scheduler = diffusers.MiniMaxH3Scheduler(shift=video_calc_shift) + pipe.audio_scheduler.config.shift = diffusers.MiniMaxH3Scheduler(shift=audio_calc_shift) + log.debug(f'Pipeline: scheduler={pipe.scheduler.__class__.__name__} video={dct_video} audio={dct_audio} ') diff --git a/wiki b/wiki index 5e3c67042..3e33a90f2 160000 --- a/wiki +++ b/wiki @@ -1 +1 @@ -Subproject commit 5e3c6704294346e7dc4e86802049d63646547437 +Subproject commit 3e33a90f279e1eb31a89dec28e268ba57a6c3374