# AutoencoderSAME

Автоэнкодер **SAME** (Semantically-Aligned Music Encoder) используется в [Stable Audio 3](https://stability.ai/news-updates/meet-stable-audio-3-the-model-family-built-for-artistic-experimentation-with-open-weight-models) для сжатия стереоаудио-волновых форм в компактную латентную последовательность и их последующей реконструкции.

Кодировщик складывает модули `SAMETransformerResamplingBlock`, каждый из которых группирует фиксированное количество кадров аудиопатчей и формирует один обучаемый выходной токен с помощью дифференциального трансформера. Декодировщик обращает этот процесс, расширяя каждый латентный токен обратно в патч аудиоканов.

Мягкое нормализующее узкое место (`SoftNormBottleneck`) нормализует латенты до и после диффузионной модели, обеспечивая стабильную динамику обучения.

## AutoencoderSAME[[diffusers.AutoencoderSAME]]

#### diffusers.AutoencoderSAME[[diffusers.AutoencoderSAME]]

```python
diffusers.AutoencoderSAME(audio_channels: int = 2, patch_size: int = 256, encoder_channels: int = 128, encoder_c_mults: typing.List[int] = (6,), encoder_strides: typing.List[int] = (16,), encoder_transformer_depths: typing.List[int] = (6,), latent_dim: int = 256, use_differential_attention: bool = True, dim_heads: int = 64, ff_mult: int = 3, sliding_window: int = 1, encoder_sinusoidal_blocks: typing.List[int] = (0,), decoder_sinusoidal_blocks: typing.List[int] = (0,), sampling_rate: int = 44100)
```

[Источник](https://github.com/huggingface/diffusers/blob/v0.43.0/src/diffusers/models/autoencoders/autoencoder_same.py#L608)

**Параметры:**

audio_channels : Количество аудиоканалов (2 для стерео).

patch_size : Размер неперекрывающихся патчей, применяемый перед TRB-кодером (и обратный после TRB-декодера). Вносит вклад `patch_size ×` в общее соотношение даунсемплинга. Значение для продакшена: 256.

encoder_channels : Базовое количество каналов для TRB. 128 для SAME-S, 256 для SAME-L.

encoder_c_mults : Множитель каналов для каждого уровня TRB (одна запись на TRB). Оба SAME-S и SAME-L используют `(6,)` — один TRB, размерность скрытого слоя которого равна `encoder_channels × 6`.

encoder_strides : Шаг даун-/ап-сэмплинга для каждого уровня TRB. Оба SAME-S и SAME-L используют `(16,)` — один TRB с шагом 16.

encoder_transformer_depths : Количество слоёв Transformer на уровень TRB. 6 для SAME-S, 12 для SAME-L.

latent_dim : Размерность латентного пространства. 256 для обоих вариантов.

use_differential_attention : Если `True`, использовать дифференциальное внимание внутри каждого блока трансформера TRB (по умолчанию включено для SAME-S/L).

dim_heads : Размер измерения головы внимания. 64 для SAME-S/L в продакшене.

ff_mult : коэффициент расширения SwiGLU для полносвязного слоя.

sliding_window : Полуполоса (в латентах) для внимания с полосным маскированием. В производственных системах SAME-S/L используется значение 1.

encoder_sinusoidal_blocks : Количество последовательных трансформерных слоёв в кодере, использующих `sin` FFN-гейтинг на каждый TRB (SAME-L: `(0,)`).

decoder_sinusoidal_blocks : Количество последовательных трансформерных слоёв в декодере, использующих `sin` FFN-гейтинг, для каждого TRB (SAME-L: `(8,)`).

sampling_rate : Частота дискретизации аудио в Гц (например, 44100).

Автоэнкодер Semantically-Aligned Music Encoder (SAME) из *Stable Audio 3* ([arXiv 2605.17991](https://arxiv.org/abs/2605.17991)).

Модель состоит из:

- **Встраивание патчей** — преобразует стереоаудио в неперекрывающиеся патчи, жертвуя временным разрешением ради каналов (`patch_size ×` даунсемплинг, без обучаемых параметров).
- **Стек TRB энкодера** — блоки `SAMETransformerResamplingBlock`, которые дополнительно уменьшают размерность в `∏(encoder_strides)` раз.
- **Soft-norm bottleneck** — обучаемая аффинная нормализация с текущим стандартным отклонением.
- **Стек декодера TRB** — зеркальное отражение энкодера в обратном порядке.
- **Unpatch** — возвращает каналы обратно в размерность времени.

Общее отношение даунсемплинга: `patch_size × ∏(encoder_strides)`.

Гиперпараметры по умолчанию соответствуют чекпоинту **SAME-S** (`stabilityai/SAME-S`). Чтобы загрузить **SAME-L** (`stabilityai/SAME-L`, используется в SA3 Medium), передайте `encoder_channels=256, encoder_transformer_depths=(12,)`.

```python
# SAME-S (108 M params, used by SA3 small models) model = AutoencoderSAME() # default values

# SAME-L (852 M params, used by SA3 Medium) model = AutoencoderSAME(encoder_channels=256,
encoder_transformer_depths=(12,))
```

#### encode[[diffusers.AutoencoderSAME.encode]]

```python
encode(sample: Tensor, return_dict: bool = True)
```

[Источник](https://github.com/huggingface/diffusers/blob/v0.43.0/src/diffusers/models/autoencoders/autoencoder_same.py#L733)

**Параметры:**

sample : тензор волновой формы `(B, audio_channels, T)`.

return_dict : Если `True`, возвращает `AutoencoderSAMEOutput`.

**Возвращает:**

Латентный тензор формы `(B, latent_dim, T // downsampling_ratio)` (обёрнут в `AutoencoderSAMEOutput`, если *return_dict* равно `True`).

Кодирование стереозвука в латенты.

#### decode[[diffusers.AutoencoderSAME.decode]]

```python
decode(latents: Tensor, return_dict: bool = True)
```

[Источник](https://github.com/huggingface/diffusers/blob/v0.43.0/src/diffusers/models/autoencoders/autoencoder_same.py#L758)

**Параметры:**

latents : тензор латентных представлений `(B, latent_dim, T_latent)`.

return_dict : Если `True`, возвращает `AutoencoderSAMEDecoderOutput`.

**Возвращает:**

Тензор формы `(B, audio_channels, T_latent × downsampling_ratio)` (обёрнут в `AutoencoderSAMEDecoderOutput`, если *return_dict* равно `True`).

Декодировать латенты обратно в стереоаудио.

#### forward[[diffusers.AutoencoderSAME.forward]]

```python
forward(sample: Tensor, return_dict: bool = True)
```

[Источник](https://github.com/huggingface/diffusers/blob/v0.43.0/src/diffusers/models/autoencoders/autoencoder_same.py#L783)

**Параметры:**

sample : тензор волновой формы `(B, audio_channels, T)`.

return_dict : Если `True`, возвращает `AutoencoderSAMEDecoderOutput`.

**Возвращает:**

Восстановленная волна (та же форма, что и у *sample*, возможно, длиннее из-за дополнения), обернутая в `AutoencoderSAMEDecoderOutput`, если *return_dict* равно `True`.

Кодируйте и сразу декодируйте *sample* (восстановление).

## SAMETransformerResamplingBlock[[diffusers.models.autoencoders.autoencoder_same.SAMETransformerResamplingBlock]]

#### diffusers.models.autoencoders.autoencoder_same.SAMETransformerResamplingBlock[[diffusers.models.autoencoders.autoencoder_same.SAMETransformerResamplingBlock]]

```python
diffusers.models.autoencoders.autoencoder_same.SAMETransformerResamplingBlock(in_channels: int, out_channels: int, stride: int, mode: str = 'encoder', transformer_depth: int = 3, dim_heads: int = 128, use_differential: bool = True, ff_mult: int = 3, sliding_window: int = 1, sinusoidal_blocks: int = 0)
```

[Источник](https://github.com/huggingface/diffusers/blob/v0.43.0/src/diffusers/models/autoencoders/autoencoder_same.py#L294)

**Параметры:**

in_channels : Количество входных каналов.

out_channels : Количество выходных каналов.

stride : Коэффициент уменьшения/увеличения размера.

mode : `"encoder"` или `"decoder"`.

transformer_depth : Количество слоёв `TransformerBlock`.

dim_heads : размерность головы внимания.

use_differential : Использовать ли дифференциальное внимание.

ff_mult : Коэффициент расширения feed-forward.

sliding_window : Полуполоса скользящего окна в латентах (полуполоса полосы составляет `sliding_window * (stride + 1)`).

sinusoidal_blocks : Количество конечных трансформерных слоёв, использующих `sin` FFN-гейтинг вместо SiLU.

Базовый строительный блок SAME.

**Режим кодировщика** (шаг S): группирует S последовательных входных кадров в один сегмент, добавляет единственное обучаемое выходное вложение, затем прогоняет D трансформерных слоёв по всей развёрнутой последовательности сегмента и сохраняет только выходное вложение → уменьшение размера в S раз.

**Режим декодера** (шаг S): объединяет 1 входной кадр с S обучаемыми выходными эмбеддингами, прогоняет D слои трансформера по всей развёрнутой последовательности, затем сохраняет S выходных эмбеддингов → апсемплинг с коэффициентом S.

Attention использует перекрывающуюся *скользящую оконную* маску по сглаженной последовательности сегментов: каждый токен обращается к `sliding_window * (stride + 1)` соседям с каждой стороны. RoPE вычисляется по полной длине последовательности. Это точно соответствует эталонной реализации (один неперекарывающийся чанк совпадал бы только для одного сегмента).

## AutoencoderSAMEOutput[[diffusers.models.autoencoders.autoencoder_same.AutoencoderSAMEOutput]]

#### diffusers.models.autoencoders.autoencoder_same.AutoencoderSAMEOutput[[diffusers.models.autoencoders.autoencoder_same.AutoencoderSAMEOutput]]

```python
diffusers.models.autoencoders.autoencoder_same.AutoencoderSAMEOutput(latents: Tensor)
```

[Источник](https://github.com/huggingface/diffusers/blob/v0.43.0/src/diffusers/models/autoencoders/autoencoder_same.py#L52)

Результат работы [AutoencoderSAME.encode()](/docs/diffusers/v0.43.0/ru/api/models/autoencoder_same#diffusers.AutoencoderSAME.encode).

## AutoencoderSAMEDecoderOutput[[diffusers.models.autoencoders.autoencoder_same.AutoencoderSAMEDecoderOutput]]

#### diffusers.models.autoencoders.autoencoder_same.AutoencoderSAMEDecoderOutput[[diffusers.models.autoencoders.autoencoder_same.AutoencoderSAMEDecoderOutput]]

```python
diffusers.models.autoencoders.autoencoder_same.AutoencoderSAMEDecoderOutput(sample: Tensor)
```

[Источник](https://github.com/huggingface/diffusers/blob/v0.43.0/src/diffusers/models/autoencoders/autoencoder_same.py#L59)

Результат работы [AutoencoderSAME.decode()](/docs/diffusers/v0.43.0/ru/api/models/autoencoder_same#diffusers.AutoencoderSAME.decode).

