diff --git a/modules/video_models/video_run.py b/modules/video_models/video_run.py index 6444607eb..91e683e91 100644 --- a/modules/video_models/video_run.py +++ b/modules/video_models/video_run.py @@ -326,7 +326,7 @@ def run(selected: models_def.Model, *, p=p, pixels=pixels, audio=waveform, - aac_sample_rate=getattr(p, 'audio_sampling_rate', None) or 24000, + aac_sample_rate=video_save.get_audio_rate(p), binary=processed.bytes, mp4_fps=save_fps, mp4_codec=mp4_codec, diff --git a/modules/video_models/video_save.py b/modules/video_models/video_save.py index b14274ee6..323b67403 100644 --- a/modules/video_models/video_save.py +++ b/modules/video_models/video_save.py @@ -11,6 +11,16 @@ from modules.logger import log from modules.video_models.video_utils import check_av +def get_audio_rate(p=None, default: int = 24000) -> int: + # pipeline output wins when it reports a rate, else the loaded vocoder: LTX-2.0 runs at 24k, + # 2.3 and 2.5 at 48k, and muxing at the wrong rate shifts the pitch + rate = getattr(p, 'audio_sampling_rate', None) if p is not None else None + if not rate: + vocoder = getattr(shared.sd_model, 'vocoder', None) + rate = getattr(getattr(vocoder, 'config', None), 'output_sampling_rate', None) + return int(rate) if rate else default + + def get_video_filename(p:processing.StableDiffusionProcessingVideo): from modules.image.namegen import FilenameGenerator from modules.paths import resolve_output_path