Stable Audio 3는 Stability AI가 만든 음악·사운드 이펙트 전용 디퓨전 모델이다. 이미지로 치면 Stable Diffusion의 오디오 버전이라 생각하면 빠르다.
다만 두 가지가 특별하다 — (1) 변수 길이 생성으로 30초도 380초도 동일하게 효율적이고, (2) 인페인팅을 지원해 기존 곡의 특정 구간만 다시 만들거나 곡을 이어붙일 수 있다. CPU로 돌릴 수 있는 433M Small 모델부터 H200 GPU용 1.4B Medium까지 라이즈업이 깔끔하다.
도자기를 만드는 과정을 상상해보자. 처음엔 그냥 흙 덩어리(노이즈)다. 도예가가 한 번에 완성품을 만드는 게 아니라, 빙글빙글 돌리면서 조금씩 모양을 다듬어 간다. 디퓨전 모델이 하는 일이 그것이다 — 잡음 → 음악을 여러 단계로 깎아낸다.
Stable Audio 3가 영리한 이유? 도자기를 통째로 빚지 않고, "도자기 설계 도면(latent)"부터 만든다. 그 도면을 다른 모델(SAME 디코더)이 실제 도자기(파형)로 굳혀준다. 도면이 작으니 빨리 만들 수 있다.
이전 세대 stable-audio-tools 레포가 연구용 풀스택이었다면, Stable Audio 3는 "추론·파인튜닝 전용으로 슬림화한 프로덕션 플랫폼"이다. 즉, 실제로 앱에 넣고 쓰라고 만든 버전. 가벼운 uv 패키지 매니저로 설치하고, Gradio UI 한 줄로 띄울 수 있다.
H200 + TensorRT 환경에서 30초 음악을 0.05초에 생성한다. 380초(약 6분 20초)짜리 medium 모델 곡도 0.43초. 실시간보다 1만 배 빠르다는 뜻이다.
| 모델 | 길이 | H200 | H200+TensorRT | Mac CoreML |
|---|---|---|---|---|
| small | 5초 | 0.41s | 0.017s | 0.23s |
| small | 120초 | 0.45s | 0.044s | 3.09s |
| medium | 120초 | 0.78s | 0.13s | — |
| medium | 380초 | 1.31s | 0.43s | — |
433M small 모델은 GPU 없이 Mac에서도 0.23초(5초 음악)에 생성된다. CoreML(애플) + TFLite로 컴파일되어 있어서, 데모 앱·웹서비스에 통합하기 쉽다. 같은 토대 위에 Apple Silicon MLX 최적화 변종도 별도 제공된다(optimized/mlx).
20~50개 클립만 있으면 특정 장르·악기·아티스트 스타일을 학습시켜 .safetensors 파일(~50–200MB)로 뽑을 수 있다. 베이스 모델 위에 여러 LoRA를 스택할 수도 있고, 런타임에 강도(0~10배)도 조절된다.
그냥 LoRA가 아니라 최신 논문 변종까지 모두 구현되어 있다. 메모리 빠듯하면 lora-xs(rank²개 파라미터만 학습), 표현력 원하면 bora 같은 식으로 골라 쓸 수 있다.
| 모델 | 오픈웨이트? | 인페인팅 | LoRA 학습 | CPU 추론 |
|---|---|---|---|---|
| Stable Audio 3 | ✓ (Stability Community License) | ✓ | ✓ | ✓ (small) |
| Suno v4 | ✗ (closed) | 일부 (extend) | ✗ | ✗ |
| Udio | ✗ (closed) | ✓ (extend) | ✗ | ✗ |
| MusicGen (Meta) | ✓ | ✗ | 제한적 | 제한적 |
| AudioLDM 2 | ✓ | 제한적 | 제한적 | 제한적 |
요컨대 "오픈웨이트 + 인페인팅 + LoRA + CPU"를 다 만족하는 음악 모델은 현재 Stable Audio 3가 유일에 가깝다. 그래서 트렌딩에 올랐다.
| 레이어 | 구성요소 | 역할 |
|---|---|---|
| 텍스트 인코더 | T5Gemma (Google DeepMind) | 프롬프트 텍스트를 임베딩으로 변환. T5 + Gemma 하이브리드 |
| 오토인코더 | SAME-S / SAME-L (266M / 1.7B) | 오디오 ↔ 256차원 잠재공간 변환. 5개 손실로 학습 |
| 생성 모델 | Diffusion Transformer (433M / 1.4B / 2.7B) | 잠재공간에서 노이즈→음악 trajectory 학습 (Flow Matching) |
| 가속 라이브러리 | Flash Attention 2 | Transformer attention의 메모리 효율 구현 |
[project]
requires-python = ">=3.10"
dependencies = [
"torch==2.7.1", # PyTorch 2.7 (CUDA 12.6 기본)
"torchaudio==2.7.1", # 오디오 I/O
"transformers>=5.8.0", # T5Gemma 로드용
"huggingface-hub>=1.7.1",# 모델 다운로드
"safetensors>=0.7.0", # 가중치 직렬화 (피클 대안)
"einops>=0.8.2", # 텐서 reshape (가독성)
"soundfile>=0.13.1", # WAV 입출력
]
[project.optional-dependencies]
ui = ["gradio==6.3.0", "matplotlib", "accelerate"]
lora = ["pytorch_lightning==2.5.5", "dill"]
.pt(피클)는 임의 코드 실행 취약점이 있어서 모르는 모델 다운받으면 위험. safetensors는 순수 텐서만 직렬화해서 안전 + zero-copy 로딩이 가능.pip + venv + pip-tools를 한 방에 대체하고 10~100배 빠르다. Astral(Ruff 만든 회사)이 만들었다. Stable Audio 3는 uv sync --extra ui 한 줄로 옵셔널 의존성까지 끝낸다.optimized/mlx 폴더에 별도 구현. M3/M4 Mac 네이티브 가속from stable_audio_3 import StableAudioModelstable-audio -p "lo-fi hip hop" --duration 30 -o beat.wavuv run python run_gradio.py --model medium로 로컬 웹 인터페이스왜 오디오 파형을 직접 학습하지 않고 잠재공간을 거치는가? 44.1kHz 스테레오 10초 = 882,000개 샘플이다. 디퓨전 모델이 이걸 다 학습하면 메모리 폭발 + 계산량 폭발이다.
SAME는 이걸 4096배 압축해서 10초 → 216×256 latent로 바꾼다. 디퓨전 모델은 작아진 잠재공간에서만 일하면 되고, 마지막에 SAME 디코더가 다시 파형으로 복원한다.
외국어 통역과 비슷하다. 한국어 → 영어 → 일본어로 번역할 때, 영한 사전과 일영 사전을 둘 다 가지고 한국어 문장 전체를 일본어 문장 전체로 매핑하면 너무 복잡하다.
대신 "의미(meaning)"라는 중간 표현을 거친다. 한국어 → 의미 → 일본어. 의미는 양쪽 언어 모두 다루기 쉽다.
SAME latent가 바로 그 "의미"다. 원본 파형은 너무 길고 디테일이 많으니, "이 음악이 본질적으로 무엇인지"만 256차원 벡터에 압축한다.
SAME는 단순히 "압축하고 복원만 잘 하는" 오토인코더가 아니다. "디퓨전 모델이 학습하기 좋은" 잠재공간이 되도록 5가지 손실로 훈련된다.
| 손실 종류 | 역할 |
|---|---|
| Spectral Reconstruction | phase-aware 스펙트럼 손실. 사람 귀에 들리는 차이를 정확히 잡음 |
| Adversarial (GAN) | 판별자가 가짜 오디오를 잡아냄 → 인공적 artifact 제거 |
| Diffusion Alignment | 작은 디퓨전 모델을 같이 학습시켜 "잠재공간이 생성하기 쉬운지" 강제 |
| Semantic Regression | pitch·스테레오 이미지 등 의미 정보가 잠재에 들어가게 강제 |
| Contrastive Latent | 텍스트-오디오 contrastive critic. 잠재가 cross-modal 의미를 갖게 함 |
전통 디퓨전 모델(DDPM)이 "100~1000번의 작은 노이즈 제거" 방식이라면, Stable Audio 3는 Flow Matching으로 노이즈→데이터의 직선 경로를 학습한다. 그래서 8 스텝만에 결과가 나온다.
variable-length diffusion으로 사전학습. 기존엔 30초 만들고 싶어도 380초짜리 시퀀스를 만든 뒤 잘라야 했는데, 이제 짧은 시퀀스는 짧게 효율적으로 생성.
전체 trajectory를 1 스텝에 수행하도록 distill. 빨라지지만 디테일이 죽음.
판별자 + 3가지 손실(Adversarial relativistic + Contrastive + CLAP)로 미세조정. 이게 추론용 "post-trained" 체크포인트. 기본은 8 스텝.
이미지 인페인팅처럼, 오디오 인페인팅도 "이 시간 구간만 다시 만들고, 나머지는 그대로 둬"가 핵심이다. 디퓨전 모델에 다음을 같이 주입한다:
덤으로 continuation(곡 이어 만들기) = 원본 길이부터 시작하는 마스크를 거는 것 = 인페인팅의 일종이다. 같은 코드 경로.
380초 medium 모델을 한 번에 디코딩하면 6.52GB VRAM 필요. 청크로 자르면 ~5.2GB로 떨어진다 (~20% 절약). (120초 기준으로는 6.49GB → 5.14GB로 절감.) 단점은 청크 경계에서 미세한 stitching artifact가 생길 수 있음. 기본은 chunked_decode=True.
| 경로 | 역할 |
|---|---|
stable_audio_3/models/ | Diffusion Transformer + SAME 아키텍처. ruff lint 제외 (자동완성 잘 안되니 주의) |
stable_audio_3/models/lora/ | 8가지 어댑터 구현. add_lora()·get_lora_params()·set_lora_strength() |
stable_audio_3/inference/ | 추론 파이프라인. T2A, A2A, inpainting 분기 |
stable_audio_3/cli.py | stable-audio 명령어. argparse 기반 |
scripts/train_lora.py | LoRA 학습 루프. PyTorch Lightning 사용 |
optimized/mlx/ | Apple MLX 변종. Mac M-시리즈 네이티브 가속 |
run_gradio.py | Gradio 6 웹 UI 진입점. 멀티 LoRA 컨트롤까지 포함 |
Stable Audio 3는 "잠재공간 + 디퓨전" 패턴의 교과서적 사례다. Stable Diffusion(이미지)과 동일 패러다임이라, 둘 다 공부하면 시너지가 크다.
최신 디퓨전 모델은 거의 다 Flow Matching으로 옮겨가고 있다. 왜 빠른지, 왜 더 안정적인지를 이 레포 코드로 직접 확인할 수 있다.
stable_audio_3/models/lora/에 8가지 어댑터가 한 자리에 구현되어 있다. 논문 읽으면서 코드와 매칭하면 PEFT(Parameter-Efficient Fine-Tuning) 영역 전체를 한 번에 정복 가능.
| 어댑터 | 파라미터 수 | 특징 |
|---|---|---|
| LoRA | rank × (fan_in + fan_out) | 표준. W = W₀ + (α/r)·B@A |
| DoRA-rows | + fan_out | 방향 × 크기로 분리. 디폴트 |
| BoRA | + fan_in + fan_out | 행·열 모두 magnitude 독립 |
| LoRA-XS | rank²만 | SVD 베이스 고정 + 작은 코어만 학습 |
| -XS 하이브리드 | rank² + magnitude | 위 셋의 -xs 변종 |
run_gradio.py는 단순 데모가 아니다. 다중 LoRA, per-LoRA 강도, sigma interval 필터, layer name regex 필터까지 collapsible accordion으로 묶어놓은 고급 패턴이다. Gradio 6 학습용으로 강추.
pyproject.toml + uv.lock + [tool.uv.sources] 구조는 Rust스러운 lock 파일 + 채널별 인덱스를 보여주는 좋은 사례. PyTorch CUDA 채널을 따로 가져오는 패턴([[tool.uv.index]])은 ML 프로젝트에 그대로 써먹을 수 있다.
기존 requirements.txt 기반 ML 프로젝트를 pyproject.toml + uv로 마이그레이션. --extra ui처럼 옵셔널 의존성 분리, --inexact 모드로 flash-attn 같은 외부 휠 처리까지 따라가 보기.
플래시 어텐션은 pyproject.toml에 명시되어 있지 않고 "외부 휠로 별도 설치"한다. 이유는 CUDA·PyTorch·Python 버전 매칭 매트릭스가 너무 다양하기 때문. 이 패턴은 최신 ML 레포의 표준이 되어 가고 있다.
모든 입출력이 torchaudio.load() 한 줄로 끝난다. WAV·MP3·FLAC 자동 처리. 32-bit float 44.1kHz 스테레오 텐서로 통일.
| 시나리오 | 요구사항 | 속도 (5초 음악) |
|---|---|---|
| small CPU (Mac/Linux) | RAM 4GB+, Python 3.10+ | 0.7s (Mac CPU) |
| small CoreML (Mac Apple Silicon) | M1 이상 | 0.23s |
| medium CUDA | VRAM 5GB+, Flash Attention 2, Linux 권장 | 0.60s |
| medium TensorRT | H200 등 데이터센터 GPU | 0.02s |
| LoRA 학습 (medium) | VRAM ~6.5GB (BF16 + lora-xs: 5.5GB) | 1000 step에 ~30분~수시간 |
| 모델 | 길이 | unchunked | chunked |
|---|---|---|---|
| small | 120초 | 2.40 GB | ≈ 2.0 GB |
| medium | 30초 | 5.49 GB | ≈ 5.0 GB |
| medium | 120초 | 6.49 GB | 5.14 GB |
| medium | 380초 | 6.52 GB | ≈ 5.2 GB |
Medium 모델은 Flash Attention 2 필수인데, pyproject.toml에 안 들어있어서 uv sync 하면 매번 지워진다. 반드시 uv sync --inexact로 동기화해야 한다.
휠은 cu126torch2.7-cp310처럼 CUDA·PyTorch·Python 버전 정확히 맞춰야 함. 잘못 깔면 출력이 "static glitch sound"가 나온다 (트러블슈팅 섹션 참고).
# uv 설치 (한 줄)
curl -LsSf https://astral.sh/uv/install.sh | sh
# 레포 클론 + 의존성 + UI
git clone https://github.com/Stability-AI/stable-audio-3
cd stable-audio-3
uv sync --extra ui
# small-music으로 5초 lofi 생성
uv run python run_gradio.py --model small-music
stable-audio --model small-sfx -p "..." --duration 3 -o sfx.wav로 다양한 SFX 프롬프트 실험. "TrackType: SFX, A blunt thud of wooden drawer slamming shut" vs "door slam"처럼 상세한 vs 단순한 프롬프트 차이 측정.
학습 목표: 프롬프트 엔지니어링 감각, AudioSparx 태그(TrackType: SFX) 효과 체감.
휘파람 녹음 → "violin solo" 프롬프트 + init_noise_level=0.5로 변환. init_noise_level을 0.2/0.5/0.8로 바꿔가며 결과 비교.
학습 목표: 멜로디는 유지하고 음색만 바꾸는 메커니즘 이해.
좋아하는 8마디 비트(20초) 마지막에 8마디(20초) 더 이어 만들기. inpaint_mask_start_seconds=20, inpaint_mask_end_seconds=40, duration=40으로 호출. 프롬프트로 "drum fill into chorus"처럼 발전 방향 유도.
학습 목표: 인페인팅의 mask 좌표, context 영향력 vs 프롬프트 영향력 균형.
Freesound에서 CC0 8비트 음악 30개 다운로드 + 각 파일에 .txt 캡션 작성. scripts/train_lora.py --model medium-base --rank 16 --adapter_type dora-rows --steps 1000로 학습. 결과 .safetensors(~80MB)를 Gradio에서 로드해 일반 음악 프롬프트에 8비트 효과 입히기.
학습 목표: 데이터셋 큐레이션, LoRA hyperparameter 감각, --exclude seconds_total 같은 layer filtering 효과 확인.
"장르" LoRA(예: jazz)와 "악기" LoRA(예: saxophone)을 둘 다 학습. Gradio UI에서:
[0.0, 1.0] (전체 적용)[0.0, 0.5] (후반 디테일만)이렇게 스타일은 처음부터 끝까지, 악기는 디테일 단계에서만 적용. SD에서 ControlNet 다중 적용처럼, 오디오 디퓨전의 multi-LoRA orchestration 패턴을 익힌다.
학습 목표: sigma(노이즈 레벨)와 생성 단계의 관계, layer filter의 의미, 멀티 어댑터 stacking.
| 주차 | 테마 | 핵심 자료 |
|---|---|---|
| 1주 | 오디오 신호 기초 | 44.1kHz, 스테레오, FFT/STFT, 멜 스펙트로그램 개념. librosa로 직접 그려보기 |
| 2주 | 오토인코더 일반론 | VAE 논문, β-VAE, VQ-VAE. PyTorch 튜토리얼로 MNIST AE 구현 |
| 3주 | SAME 논문 정독 | arXiv:2605.18613 — 5중 손실 각각의 의미 노트화 |
| 4주 | 디퓨전 모델 기초 | DDPM, DDIM. "What are Diffusion Models?" Lilian Weng 블로그 |
| 5주 | Flow Matching | Lipman et al. 논문 + 코드 (간단한 2D toy 예제부터) |
| 6주 | Transformer for Audio | AST, MusicGen 코드 읽기. Stable Audio 3의 DiT 모듈 직접 추적 |
| 7주 | 텍스트 조건부 생성 | CLIP, CLAP 논문. T5Gemma가 왜 선택됐는지 분석 |
| 8주 | LoRA·DoRA·BoRA 논문 시리즈 | 각 논문 1주씩. models/lora/ 코드와 1:1 매칭 |
| 9주 | LoRA-XS 깊게 | SVD 베이스가 왜 효과적인지 수학적으로 이해 |
| 10주 | Flash Attention 2 내부 | tiling, kernel fusion 이해. Tri Dao의 논문/유튜브 |
| 11주 | Adversarial Post-Training | GAN training의 안정화 기법, CLAP loss의 역할 |
| 12주 | 프로덕션 배포 | CoreML 변환, TensorRT 컴파일, MLX 포팅. 자기 앱에 통합 |
.safetensors.uv sync --extra ui 한 줄로 옵셔널 의존성까지 처리.TrackType: 같은 AudioSparx 태그 형식을 따르면 결과가 좋아진다.