오디오 AI의 공통 기반 기술 — Demucs, Mel-Band RoFormer, GPT-SoVITS가 공유하는 것들
STFT 스펙트로그램, Transformer 어텐션, 인코더-디코더, PyTorch — 오디오 AI의 공통 DNA
Demucs, Mel-Band RoFormer Karaoke, GPT-SoVITS — 이 세 모델을 분석하면서 공통 패턴이 보였다. 목적은 다르지만 뼈대가 같다.
공통점 1: STFT — 소리를 그림으로 바꾼다
STFT(Short-Time Fourier Transform)는 오디오 파형을 시간 × 주파수 2D 행렬로 변환한다. 이게 오디오 AI의 출발점이다.
파형(waveform)은 시간 축만 있다 — x축이 시간, y축이 진폭. 사람이 봐도 "어디가 드럼이고 어디가 보컬인지" 구분이 안 된다.
STFT를 걸면 스펙트로그램이 나온다 — x축이 시간, y축이 주파수, 값이 강도. 이러면 "440Hz 부근에 보컬이 있고, 100Hz 이하에 베이스가 있다"가 눈에 보인다.
import torch
import torchaudio
wav, sr = torchaudio.load("song.mp3")
# STFT: 파형 → 복소 스펙트로그램
spec = torch.stft(wav, n_fft=2048, hop_length=441, return_complex=True)
# spec.shape = [channels, freq_bins, time_frames]
# freq_bins = n_fft/2 + 1 = 1025 (0~22050Hz를 1025개 구간으로)
# time_frames = 오디오 길이 / hop_length
세 모델 전부 이 변환을 거친다:
| 모델 | n_fft | hop_length | 추가 변환 |
|---|---|---|---|
| Demucs | 4096 | — | + 시간 도메인 병렬 경로 |
| Mel-Band RoFormer | 2048 | 441 | + 멜 밴드 60개로 재분해 |
| GPT-SoVITS | — | — | 멜 스펙트로그램 (지각적 스케일) |
왜 다들 STFT를 쓰나? 주파수 분해 없이는 "이 소리가 어떤 악기/음성인지" 판단할 근거가 없다. CNN이 이미지의 엣지를 보듯, 오디오 모델은 주파수 패턴을 본다.
공통점 2: Transformer — 먼 거리의 관계를 잡는다
세 모델 전부 Transformer의 Self-Attention을 핵심에 둔다.
왜 CNN만으로는 안 되나? CNN의 수용 영역(receptive field)은 커널 크기에 제한된다. 3×3 커널이면 인접한 시간·주파수만 본다. 근데 오디오에서는:
드럼 어택이 3초 전 패턴과 연결된다 (리듬)
보컬의 하모닉스가 기본 주파수의 2배, 3배, 4배에 분포한다 (먼 주파수 간 관계)
코러스가 30초 후에 반복된다
Self-Attention은 시퀀스 내 모든 위치 간 관계를 직접 계산한다. 거리 제한이 없다.
각 모델의 Transformer 사용 방식:
Demucs htdemucs:
Cross-Domain Transformer — 시간 도메인 경로와 주파수 도메인 경로가 서로 정보를 교환
Self-Attention + Cross-Attention
Mel-Band RoFormer:
시간 축 Transformer → 주파수 축 Transformer 교대 실행 (6레이어)
RoPE(Rotary Position Embedding)로 위치 정보 인코딩
각 밴드 내 시간 관계 + 각 시간 프레임 내 밴드 간 관계를 별도로 처리
GPT-SoVITS:
GPT — 자기회귀 Transformer. 이전 토큰에서 다음 토큰을 예측
텍스트(음소) → 오디오 토큰 시퀀스 생성
공통점 3: 인코더-디코더 — 분해하고 복원한다
세 모델 전부 입력을 압축(인코딩)하고, 처리한 뒤, 원래 형태로 복원(디코딩)하는 구조다.
Demucs:
오디오 → [인코더] → 잠재 표현 → [Transformer] → [디코더] → 4개 스템
(시간 경로: 1D CNN) (Cross-Domain) (1D CNN)
(주파수 경로: 2D CNN) (2D CNN)
Mel-Band RoFormer:
STFT → [멜 밴드 분해 + 선형 레이어] → [시간/주파수 Transformer ×6] → [마스크 추정] → ISTFT
인코딩 처리 디코딩
GPT-SoVITS:
참조 음성 → [인코더] → 화자 임베딩
텍스트 → [GPT] → 오디오 토큰 → [VITS 디코더] → 합성 음성
패턴이 같다: 고차원 입력 → 저차원 잠재 공간으로 압축 → 의미 있는 처리 → 원래 차원으로 복원.
공통점 4: PyTorch + GPU 가속 + 사전 훈련 모델
셋 다:
PyTorch로 구현 (TensorFlow 아님)
CUDA/MPS GPU 가속 지원 (CPU 폴백 가능하지만 느림)
HuggingFace/GitHub에서 사전 훈련된 체크포인트를 다운로드해서 추론만 함
일반 사용자는 훈련 없이 바로 사용
이 구조 덕분에 pip install + 모델 다운로드 + 3줄 코드로 실행할 수 있다.
공통점 5: 오디오를 "분해"한다
방향은 다르지만 본질은 같다 — 복잡한 오디오 신호를 의미 있는 구성 요소로 분해한다.
| 모델 | 입력 | 분해 결과 |
|---|---|---|
| Demucs | 완성곡 | 보컬 / 드럼 / 베이스 / 기타 |
| Mel-Band RoFormer | 완성곡 | 리드 보컬 / 카라오케 반주 |
| GPT-SoVITS | 음성 | 음소 / 운율 / 화자 특성 → 재합성 |
Demucs와 RoFormer는 물리적 분해(소리 자체를 나눔), GPT-SoVITS는 의미적 분해(소리의 구성 요소를 이해하고 재조합).
공통점 6: 마스킹 vs 생성
분리 모델(Demucs, RoFormer)의 핵심 메커니즘은 마스킹이다:
원본 스펙트로그램 × 마스크 = 특정 소스의 스펙트로그램
모델이 학습하는 건 "어떤 주파수·시간 영역이 보컬인가"를 나타내는 마스크다. 소리를 새로 만드는 게 아니라, 원본에서 골라내는 것.
합성 모델(GPT-SoVITS)은 생성이다 — 텍스트에서 오디오 토큰을 하나씩 만들어낸다.
근데 둘 다 결국 "주파수 도메인에서 어떤 값을 출력하느냐"의 문제다. 마스크를 출력하든, 새 스펙트로그램을 출력하든, 작업 공간은 같다.
이 공통점을 알면 뭐가 좋은가
새로운 오디오 AI 모델이 나와도 구조를 바로 파악할 수 있다:
- 입력을 어떻게 표현하나? → STFT? 멜 스펙트로그램? raw waveform?
- 어텐션을 어디에 쓰나? → 시간 축? 주파수 축? 둘 다?
- 인코더-디코더 구조인가? → 뭘 압축하고 뭘 복원하나?
- 마스킹인가 생성인가? → 분리인가 합성인가?
이 4가지 질문으로 대부분의 오디오 AI 모델을 분류할 수 있다.
핵심 개념
STFT로 오디오 파형을 시간 × 주파수 스펙트로그램으로 변환 — 오디오 AI의 출발점
Transformer Self-Attention으로 장거리 시간·주파수 의존성 포착
인코더-디코더 구조로 고차원 입력을 잠재 공간으로 압축 → 처리 → 복원
분리 모델은 마스킹(원본×마스크), 합성 모델은 생성(새 토큰 출력)