# 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` 모듈을 적층하며, 각 모듈은 고정된 수의 오디오 패치 프레임을 그룹화하여 차등 변환기(differential transformer)를 통해 하나의 학습 가능한 출력 토큰을 생성합니다. 디코더는 이 과정을 역으로 수행하여 각 잠재 토큰을 오디오 프레임 패치로 다시 확장합니다.

소프트 노름 병목(`SoftNormBottleneck`)은 diffusion 모델의 전후로 latents를 정규화하여 안정적인 학습 동역학을 제공합니다.

## 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/main/src/diffusers/models/autoencoders/autoencoder_same.py#L608)

**매개변수:**

audio_channels : 오디오 채널 수(스테레오의 경우 2).

patch_size : TRB 인코더 적용 전(그리고 TRB 디코더 적용 후 역순으로) 적용되는 겹치지 않는 패치 크기. 전체 다운샘플링 비율에 `patch_size ×`만큼 기여합니다. 프로덕션 값: 256.

encoder_channels : TRB의 기본 채널 수. SAME-S의 경우 128, SAME-L의 경우 256입니다.

encoder_c_mults : 각 TRB 레벨에 대한 채널 배율(TRB당 하나의 항목). SAME-S와 SAME-L 모두 `(6,)`를 사용합니다. 이는 숨겨진 차원이 `encoder_channels × 6`인 단일 TRB입니다.

encoder_strides : 각 TRB 레벨에 대한 다운/업 샘플링 스트라이드. SAME-S와 SAME-L 모두 `(16,)`를 사용합니다 — 스트라이드 16인 TRB 하나.

encoder_transformer_depths : TRB 레벨당 Transformer 레이어 수. SAME-S의 경우 6, SAME-L의 경우 12입니다.

latent_dim : 잠재 공간의 차원. 두 변형 모두 256입니다.

use_differential_attention : `True`인 경우, 각 TRB transformer 블록 내에서 differential attention을 사용합니다(SAME-S/L의 경우 기본값으로 활성화되어 있습니다).

dim_heads : Attention head 차원. 프로덕션 SAME-S/L의 경우 64입니다.

ff_mult : SwiGLU 피드포워드 확장 계수.

sliding_window : band-mask attention의 sliding-window 반폭(latents 단위). 프로덕션 SAME-S/L은 1을 사용합니다.

encoder_sinusoidal_blocks : 인코더에서 `sin` FFN 게이팅을 사용하는 후행 트랜스포머 레이어의 TRB별 개수 (SAME-L: `(0,)`).

decoder_sinusoidal_blocks : 디코더에서 `sin` FFN 게이팅을 사용하는 후행 트랜스포머 레이어의 TRB별 개수 (SAME-L: `(8,)`).

sampling_rate : Hz 단위의 오디오 샘플링 주파수 (예: 44100).

*Stable Audio 3*의 Semantically-Aligned Music Encoder(SAME) 오토인코더([arXiv 2605.17991](https://arxiv.org/abs/2605.17991)).

모델은 다음으로 구성됩니다:

- **패치 임베딩** — 스테레오 오디오를 겹치지 않는 패치로 재구성하여 채널을 시간으로 교환합니다(`patch_size ×` 다운샘플링, 학습 가능한 매개변수 없음).
- **Encoder TRB 스택** — `∏(encoder_strides)` 배율로 추가 다운샘플링을 수행하는 `SAMETransformerResamplingBlock` 블록들.
- **Soft-norm bottleneck** — running std를 사용하는 학습 가능한 affine 정규화
- **Decoder 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/main/src/diffusers/models/autoencoders/autoencoder_same.py#L733)

**매개변수:**

sample : `(B, audio_channels, T)` 웨이브폼 텐서.

return_dict : `True`인 경우 `AutoencoderSAMEOutput`을 반환합니다.

**반환값:**

`(B, latent_dim, T // downsampling_ratio)` 형태의 잠재 텐서(*return_dict*가 `True`인 경우 `AutoencoderSAMEOutput`에 래핑됨).

스테레오 오디오를 latents로 인코딩합니다.

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

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

[소스](https://github.com/huggingface/diffusers/blob/main/src/diffusers/models/autoencoders/autoencoder_same.py#L758)

**매개변수:**

latents : `(B, latent_dim, T_latent)` latent 텐서.

return_dict : `True`인 경우 `AutoencoderSAMEDecoderOutput`를 반환합니다.

**반환값:**

`(B, audio_channels, T_latent × downsampling_ratio)` 형태의 웨이브폼 텐서(*return_dict*가 `True`인 경우 `AutoencoderSAMEDecoderOutput`에 래핑됨).

latents를 스테레오 오디오로 디코딩합니다.

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

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

[소스](https://github.com/huggingface/diffusers/blob/main/src/diffusers/models/autoencoders/autoencoder_same.py#L783)

**매개변수:**

sample : `(B, audio_channels, T)` 웨이브폼 텐서.

return_dict : `True`인 경우 `AutoencoderSAMEDecoderOutput`를 반환합니다.

**반환값:**

재구성된 웨이브폼(*sample*과 동일한 형태이며, 패딩으로 인해 더 길 수 있음). *return_dict*가 `True`인 경우 `AutoencoderSAMEDecoderOutput`에 래핑됩니다.

*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/main/src/diffusers/models/autoencoders/autoencoder_same.py#L294)

**매개변수:**

in_channels : 입력 채널 수.

out_channels : 출력 채널 수.

stride : 다운/업 샘플링 계수.

mode : `"encoder"` 또는 `"decoder"`.

transformer_depth : `TransformerBlock` 레이어의 수.

dim_heads : Attention 헤드 차원.

use_differential : 차등 주의(differential attention)를 사용할지 여부.

ff_mult : 피드포워드 확장 계수.

sliding_window : latents의 슬라이딩 윈도우 반폭(밴드 반폭은 `sliding_window * (stride + 1)`입니다).

sinusoidal_blocks : SiLU 대신 `sin` FFN 게이팅을 사용하는 후행 transformer 레이어의 수.

SAME의 핵심 구성 요소

**인코더 모드**(스트라이드 S): S개의 연속된 입력 프레임을 하나의 세그먼트로 묶고, 학습 가능한 출력 임베딩 하나를 추가한 뒤, 전체적으로 평탄화된 세그먼트 시퀀스에 대해 D개의 트랜스포머 레이어를 실행하며 출력 임베딩만 유지합니다 → S배 다운샘플링.

**디코더 모드**(스트라이드 S): 1개의 입력 프레임과 S개의 학습 가능한 출력 임베딩을 그룹화하고, 전체 평탄화 시퀀스에 대해 D개의 트랜스포머 레이어를 실행한 후 S개의 출력 임베딩만 유지하여 S배 업샘플링을 수행합니다.

Attention은 평탄화된 세그먼트 시퀀스에 겹치는 *슬라이딩 윈도우* 밴드 마스크를 사용합니다. 각 토큰은 양쪽에서 `sliding_window * (stride + 1)`개의 이웃 토큰에 대해 attention을 수행합니다. 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/main/src/diffusers/models/autoencoders/autoencoder_same.py#L52)

[AutoencoderSAME.encode()](/docs/diffusers/main/ko/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/main/src/diffusers/models/autoencoders/autoencoder_same.py#L59)

[AutoencoderSAME.decode()](/docs/diffusers/main/ko/api/models/autoencoder_same#diffusers.AutoencoderSAME.decode)의 출력입니다.

