#
# Лицензия Apache License, Version 2.0 («Лицензия»);
# вы можете использовать этот файл только в соответствии с Лицензией.
# Вы можете получить копию Лицензии по адресу
#
#     http://www.apache.org/licenses/LICENSE-2.0
#
# Если это не требуется применимым законодательством или не оговорено письменно, программное
# распространяется по Лицензии на условиях «КАК ЕСТЬ»,
# БЕЗ КАКИХ-ЛИБО ГАРАНТИЙ ИЛИ УСЛОВИЙ, прямо указанных или подразумеваемых.
# См. Лицензию для получения конкретных условий, регулирующих разрешения и
# ограничениями Лицензии. -->

# Эхо

[Echo](https://github.com/jd-opensource/JoyAI-Echo) — это модель генерации длинных видео. Она поддерживает необязательный чистый первый кадр, упорядоченные слоты памяти для изображений и аудио, а также стохастический сэмплер с малым числом шагов на основе дистилляции соответствия распределений (Distribution Matching Distillation, DMD). Пайплайн генерирует синхронизированные видео и аудио.

Echo реализован как [ModularPipeline](/docs/diffusers/v0.43.0/ru/api/modular_diffusers/pipeline#diffusers.ModularPipeline), поэтому блоки кодирования текста, обусловливания памятью, стохастического DMD-денуазинга и декодирования можно запускать как единый рабочий процесс или использовать независимо.

## Вывод

Загрузите официальный чекпоинт [jdopensource/JoyAI-Echo](https://huggingface.co/jdopensource/JoyAI-Echo) напрямую. Он использует текстовый энкодер и токенизатор из [google/gemma-3-12b-it](https://huggingface.co/google/gemma-3-12b-it). Репозиторий Gemma имеет ограничения на доступ, поэтому примите его лицензию и выполните аутентификацию в Hugging Face перед загрузкой пайплайна.

Опубликованная модель использует 241 кадр в своём примере с длинным видео. Координаты видео RoPE остаются на уровне 24 к/с, установленном при обучении, независимо от частоты выходного контейнера.

```py
import torch
import torchaudio
from PIL import Image

from diffusers import ComponentsManager, ModularPipeline
from diffusers.utils import encode_video

manager = ComponentsManager()
pipe = ModularPipeline.from_pretrained("jdopensource/JoyAI-Echo", components_manager=manager)
pipe.load_components(dtype={"default": torch.bfloat16, "audio_vae": torch.float32})
manager.enable_auto_cpu_offload(device="cuda")
pipe.vae.enable_tiling()

first_frame = Image.open("first_frame.png").convert("RGB")
memory_images = [Image.open(path).convert("RGB") for path in ["memory_0.png", "memory_1.png"]]
memory_audio_with_rates = [torchaudio.load(path) for path in ["memory_0.wav", "memory_1.wav"]]
memory_audio = [waveform for waveform, _ in memory_audio_with_rates]
memory_audio_rates = [sample_rate for _, sample_rate in memory_audio_with_rates]

output = pipe(
    prompt="A cinematic dialogue scene in a quiet cafe.",
    image=first_frame,
    memory_images=memory_images,
    memory_audio_waveforms=memory_audio,
    memory_audio_sample_rates=memory_audio_rates,
    width=1280,
    height=736,
    num_frames=241,
    frame_rate=25.0,
    model_frame_rate=24.0,
    generator=torch.Generator(device="cuda").manual_seed(42),
    output_type="np",
    output=["videos", "audio"],
)

encode_video(
    output["videos"][0],
    fps=25,
    audio=output["audio"][0].float().cpu(),
    audio_sample_rate=pipe.vocoder.config.output_sampling_rate,
    output_path="echo.mp4",
)
```

По умолчанию используется восьмиступенчатый график сигм DMD, опубликованный в релизе. На каждом шаге предсказывается `x0`, а затем выполняется повторное добавление шума с использованием нового гауссова шума на следующей сигме, поэтому инициализированный `torch.Generator` управляет как начальным шумом, так и всеми промежуточными операциями повторного добавления шума.

Сырое кодирование аудио в память требует `torchaudio`. Для соответствия эталонной реализации держите `audio_vae` в FP32, как показано выше. Модульные рабочие процессы могут кэшировать нормализованные, распакованные тензоры кодировщика VAE. Латенты видео имеют форму `(batch, channels, frames, height, width)`, а латенты аудио — форму `(batch, channels, time, mel_bins)`. Базовый блок `denoise` упаковывает эти тензоры, расширяет условия для `num_videos_per_prompt` и распаковывает результаты денойзинга обратно в ту же форму VAE. Передавайте начальные `latents` и `audio_latents` тоже в этой распакованной форме. Декодеры принимают нормализованные тензоры VAE и денормализуют их непосредственно перед декодированием. `output=["latents", "audio_latents"]` возвращает нормализованные тензоры VAE. При `output_type="latent"` и `output=["videos", "audio"]` вы получаете денормализованные тензоры VAE без декодирования.

## EchoModularPipeline[[diffusers.EchoModularPipeline]]

#### diffusers.EchoModularPipeline[[diffusers.EchoModularPipeline]]

```python
diffusers.EchoModularPipeline(blocks: diffusers.modular_pipelines.modular_pipeline.ModularPipelineBlocks | None = None, pretrained_model_name_or_path: str | os.PathLike | None = None, components_manager: diffusers.modular_pipelines.components_manager.ComponentsManager | None = None, collection: str | None = None, workflow: str | None = None, modular_config_dict: dict[str, typing.Any] | None = None, config_dict: dict[str, typing.Any] | None = None, **kwargs)
```

[Источник](https://github.com/huggingface/diffusers/blob/v0.43.0/src/diffusers/modular_pipelines/echo/modular_pipeline.py#L27)

ModularPipeline для контрольной точки DMD длинных видео Echo.

## EchoBlocks[[diffusers.EchoBlocks]]

#### diffusers.EchoBlocks[[diffusers.EchoBlocks]]

```python
diffusers.EchoBlocks()
```

[Источник](https://github.com/huggingface/diffusers/blob/v0.43.0/src/diffusers/modular_pipelines/echo/modular_blocks_echo.py#L220)

Генерация видео по эталонному образцу с чистым условием первого кадра, упорядоченными слотами памяти для изображений и аудио, а также стохастическим шумоподавлением DMD.

Компоненты: text_encoder (`PreTrainedModel`) tokenizer (`PreTrainedTokenizerBase`) connectors (`LTX2TextConnectors`) vae (`AutoencoderKLLTX2Video`) audio_vae (`AutoencoderKLLTX2Audio`) transformer (`LTX2VideoTransformer3DModel`) video_processor (`VideoProcessor`) vocoder (`LTX2Vocoder`)

Входные данные: prompt (`str`): Промпт или промпты для управления генерацией изображения. max_sequence_length (`int`, *необязательный*, по умолчанию 1024): Максимальная длина последовательности для кодирования промпта. image (`Image | Tensor`, *необязательный*): Необязательный первый кадр, используемый как чистое опорное условие. memory_images (`list`, *необязательный*): Упорядоченные опорные изображения, по одному на каждый слот памяти Echo. memory_audio_waveforms (`list`, *необязательный*): Упорядоченные звуковые волны памяти в виде тензоров `(channels, samples)`. Входы длиннее 9,62 секунд обрезаются до окна с максимальным откликом. Используйте `None` для тихого слота. memory_audio_sample_rates (`int | list`, *необязательный*): Частота дискретизации, общая для всех звуковых волн памяти, или одна частота на слот. height (`int`, *необязательный*, по умолчанию 512): Высота генерируемого изображения в пикселях. width (`int`, *необязательный*, по умолчанию 704): Ширина генерируемого изображения в пикселях. model_frame_rate (`float`, *необязательный*, по умолчанию 24.0): Частота кадров, используемая на этапе обучения для координат RoPE видео Echo. memory_position_offset (`float`, *необязательный*, по умолчанию 500.0): Временной центр, назначаемый первому слоту памяти. memory_position_slot_stride (`float`, *необязательный*, по умолчанию 50.0): Временное расстояние между центрами последовательных слотов памяти. num_videos_per_prompt (`int`, *необязательный*, по умолчанию 1): Количество видео на один промпт. num_frames (`int`, *необязательный*, по умолчанию 241): Количество генерируемых пиксельных кадров; должно быть `1 + k * vae_temporal_compression_ratio`. frame_rate (`float`, *необязательный*, по умолчанию 25.0): Частота кадров генерируемого видео. latents (`Tensor`, *необязательный*): Необязательный начальный шум видео в форме VAE (B, C, F, H, W). audio_latents (`Tensor`, *необязательный*): Необязательный начальный шум аудио в форме VAE (B, C, L, M). generator (`Generator`, *необязательный*): Генератор Torch для детерминированной генерации. sigmas (`list | tuple`): Расписание сигм DMD, включая конечный ноль. attention_kwargs (`dict`, *необязательный*): Дополнительные аргументы для процессоров внимания. output_type (`str`, *необязательный*, по умолчанию pil): Формат вывода: 'pil', 'np', 'pt'. decode_timestep (`None`, *необязательный*, по умолчанию 0.0): Шаг времени, используемый для декодирования финальных латентов. decode_noise_scale (`None`, *необязательный*): Коэффициент интерполяции шума, применяемый на шаге декодирования.

Выводы: videos (`list`): сгенерированные видео. audio (`Tensor`): сгенерированная звуковая волна.

