Demucs 튜토리얼: AI가 만든 노래를 8GB GPU로 MR·아카펠라로 분리하기
on this page
TL;DR
- ACE-Step 1.5로 만든 한국어 발라드를 Demucs v4로 보컬·MR·악기 스템으로 분리했습니다.
- 설치는
pip install "demucs>=4.1.0", 분리는 명령 한 줄입니다. - RTX 5060 8GB에서 30초 음원을 1.4초에 분리했습니다(htdemucs). 3분 곡도 5.4초입니다.
- GPU 메모리는 최대 약 1.5GB만 썼습니다. 8GB의 5분의 1 수준입니다.
- 반주만 나오는 구간에서 보컬 스템은 원곡보다 30~42dB 작아, 사실상 무음이었습니다.
- MR·아카펠라용이라면
htdemucs --two-stems=vocals를 추천합니다. 6스템 모델은 피아노 분리 품질에 한계가 있습니다.
들어가며
지난 ACE-Step 1.5 편에서는 RTX 5060 8GB로 한국어 발라드를 생성했습니다. 이번에는 그 노래를 다시 분해합니다. 보컬만 남긴 아카펠라, 반주만 남긴 MR, 악기별 스템까지 만들어 봅니다.
사용 모델은 Meta AI가 공개한 음원 분리 모델 **Demucs v4(Hybrid Transformer Demucs)**입니다. MIT 라이선스이고, 현재는 원작자 저장소(adefossez/demucs)에서 공식 유지되며 2026년 7월 4.1.0이 나왔습니다.
| 항목 | 내용 |
|---|---|
| 입력 | ACE-Step 1.5로 생성한 한국어 발라드 30초 (자체 생성곡) |
| 모델 | htdemucs, htdemucs_ft, htdemucs_6s |
| GPU | gcube RTX 5060 8GB |
| 결과물 | 보컬/드럼/베이스/기타 4스템, 보컬+MR 2스템, 6스템 |
입력으로 직접 생성한 곡을 쓴 이유는 저작권입니다. Demucs 라이선스와 별개로, 상용 음원을 분리해 공개하면 원곡 저작권 문제가 생길 수 있습니다.
1. 환경 준비: gcube 워크로드 만들기
gcube 콘솔에서 RTX 5060 8GB를 선택하고 아래와 같이 입력합니다. YOLO26 편과 같은 이미지에 ffmpeg만 추가했습니다.
| 항목 | 입력값 |
|---|---|
| 컨테이너 이미지 | pytorch/pytorch:2.9.1-cuda12.8-cudnn9-runtime |
| 컨테이너 포트 | 8888 |
| 환경변수 | HF_HOME=/workspace/hf_cache |
컨테이너 명령
bash -c "apt-get update && DEBIAN_FRONTEND=noninteractive apt-get install -y git wget ffmpeg && pip install jupyterlab && jupyter lab --ip=0.0.0.0 --port=8888 --no-browser --allow-root --ServerApp.token='' --ServerApp.password=''"
- 이미지: RTX 5060은 Blackwell(sm_120) 아키텍처라 CUDA 12.8 이상으로 빌드된 PyTorch가 필요합니다.
- ffmpeg: Demucs 4.1.0은 MP3·FLAC 출력과 일부 입력 포맷 디코딩에 ffmpeg를 사용합니다.
- HF_HOME: 4.1.0부터 사전학습 가중치를 Hugging Face에서 받습니다. 개인 저장소를
/workspace에 연결하면 재시작 후에도 다시 받지 않습니다.
워크로드가 실행되면 서비스 주소 뒤에 /lab을 붙여 JupyterLab에 접속하고, ACE-Step으로 만든 음원(ballad_30s.wav)을 업로드합니다.
2. 설치와 GPU 확인
새 노트북(Python 3)을 열고 Demucs를 설치합니다. 버전은 반드시 4.1.0 이상으로 지정합니다.
!pip install -q "demucs>=4.1.0"
import torch, importlib.metadata as md
print(torch.__version__, torch.cuda.get_device_name(0))
print("demucs", md.version("demucs"))
2.9.1+cu128, NVIDIA GeForce RTX 5060, demucs 4.1.0이 보이면 준비 완료입니다.
왜 4.1.0인가요? torchaudio 2.9부터 load/save가 TorchCodec 기반으로 바뀌었습니다. 구버전 Demucs는 이 변경 때문에 음원을 읽거나 저장하는 단계에서 실패할 수 있습니다. 4.1.0은 추론에서 torchaudio를 제거하고 sphn으로 디코딩하기 때문에 이 문제가 없습니다.
3. 음원 분리 실행
3-1. 4스템 분리 (기본)
명령 한 줄이면 보컬(vocals), 드럼(drums), 베이스(bass), 기타 악기(other) 4개 파일이 나옵니다. 첫 실행 때는 가중치를 자동으로 내려받습니다.
!demucs -n htdemucs -o separated ballad_30s.wav
결과는 separated/htdemucs/ballad_30s/ 아래에 저장됩니다.
3-2. MR과 아카펠라 만들기 (2스템)
-two-stems=vocals를 붙이면 보컬(vocals)과 나머지 전부(no_vocals, 곧 MR)로 나눕니다. 공유용이라면-mp3로 바로 저장할 수 있습니다.
!demucs -n htdemucs --two-stems=vocals --mp3 -o separated_mr ballad_30s.wav
3-3. 모델 3종 비교: 처리 시간과 VRAM 측정
Python API(demucs.api.Separator)를 쓰면 모델별 처리 시간과 최대 VRAM을 한 번에 측정할 수 있습니다.
import time, torch, demucs.api
for name in ["htdemucs", "htdemucs_ft", "htdemucs_6s"]:
sep = demucs.api.Separator(model=name, device="cuda")
torch.cuda.empty_cache(); torch.cuda.reset_peak_memory_stats(); torch.cuda.synchronize()
t = time.time()
origin, stems = sep.separate_audio_file("ballad_30s.wav")
torch.cuda.synchronize()
sec = time.time() - t
peak = torch.cuda.max_memory_allocated() / 1024**3
print(f"{name:12s} {sec:6.1f}s peak {peak:.2f}GB stems={list(stems)}")
for k, v in stems.items():
demucs.api.save_audio(v, f"{name}_{k}.wav", samplerate=sep.samplerate)
del sep
| 모델 | 스템 | 특징 |
|---|---|---|
| htdemucs | 4 | 기본 모델. 속도와 품질의 균형 |
| htdemucs_ft | 4 | 보컬·드럼 등 스템별로 파인튜닝한 모델 4개의 묶음. 약 4배 느리지만 품질이 조금 더 낫다고 알려짐 |
| htdemucs_6s | 6 | 기타·피아노를 추가로 분리. 공식 문서상 실험적 모델 |
VRAM이 부족한 GPU라면: 이번 측정에서는 8GB에 여유가 충분했지만, 더 작은 GPU에서는 --segment 값을 줄이고 PYTORCH_NO_CUDA_MEMORY_CACHING=1을 설정합니다. HT 모델은 segment를 최대 7.8초까지만 지원하므로 7 이하로 지정합니다.
4. 결과
4-1. 처리 속도와 VRAM (RTX 5060 8GB)
| 모델 | 처리 시간 (30초 곡) | 처리 시간 (3분 곡) | 실시간 대비 속도 | PyTorch 최대 할당 |
|---|---|---|---|---|
| htdemucs | 1.4초 | 5.4초 | 약 21~33배 | 0.54GB |
| htdemucs_ft | 4.2초 | 19.8초 | 약 7~9배 | 0.54GB |
| htdemucs_6s | 1.0초 | - | 약 30배 | 0.61GB |
- 측정은 가중치를 받아 둔 뒤 두 번 실행했고, 두 번 모두 같은 값이 나왔습니다. 처음 실행할 때는 가중치 다운로드 때문에 수십 초가 더 걸립니다.
nvidia-smi로 본 GPU 전체 메모리 사용량은 최대 약 1.5GB였습니다. CUDA 컨텍스트와 유휴 상태 사용량(약 0.5GB)을 포함한 값입니다.- 3분 곡을 넣어도 최대 메모리는 30초 곡과 같았습니다. 곡을 짧은 구간으로 나눠 처리하기 때문입니다.
이 속도라면 RTX 5060 한 장으로 3분 곡을 시간당 약 600곡 분리할 수 있습니다(htdemucs, 파일 입출력 제외).
4-2. 출력 형식
입력은 48kHz였지만, 출력은 44.1kHz · 16bit WAV로 저장됩니다. Demucs 모델이 44.1kHz로 학습되어 있기 때문입니다. 더 높은 비트 심도가 필요하면 --int24 또는 --float32를 붙입니다.
4-3. 분리 품질 확인
AI 생성곡에는 원본 스템(정답)이 없어서 SDR 같은 표준 지표를 계산할 수 없습니다. 대신 두 가지를 확인했습니다.
- 보컬 누출: 반주만 나오는 도입부(0
10초)에서 보컬 스템의 음량은 약 -56dBFS로, 원곡(-14-28dBFS)보다 30~42dB 낮았습니다. 보컬이 없는 구간에는 사실상 무음이 남습니다. - 재구성 오차: 모든 스템을 다시 합친 소리와 원곡을 비교했습니다. 값이 높을수록 분리 과정에서 사라진 소리가 적다는 뜻입니다.
| 모델 | 재구성 SNR (2회 실행) | 스템별 에너지 비중 |
|---|---|---|
| htdemucs | 27~29dB | 보컬 49% · other 50% · 베이스 1% · 드럼 0% |
| htdemucs_ft | 24~26dB | 보컬 48% · other 50% · 베이스 2% · 드럼 0% |
| htdemucs_6s | 17dB | 보컬 54% · 피아노 27% · other 19% · 기타·베이스·드럼 0% |
값이 실행마다 2~3dB씩 달라지는 것은 Demucs가 분리할 때 입력을 무작위로 조금씩 밀어서(random shift) 처리하기 때문입니다.
해석
- 이 곡은 피아노와 스트링이 중심인 발라드라, 4스템 모델에서는 반주 대부분이
other에 들어갑니다. 드럼 스템은 거의 비어 있습니다. htdemucs_6s는 피아노를 별도 스템으로 떼냈지만, 재구성 SNR이 다른 모델보다 7~12dB 낮습니다. 공식 문서도 피아노 스템에 소리 섞임과 잡음이 많다고 밝힌 실험적 모델입니다.- MR·아카펠라가 목적이라면
htdemucs --two-stems=vocals가 가장 실용적입니다.
[오디오/영상: 원곡 → 아카펠라 → MR 비교]
5. FAQ
Q. 상용 음원을 분리해도 되나요?
Demucs는 MIT 라이선스라 모델 사용에는 제약이 없습니다. 하지만 분리한 결과물을 공개하거나 배포하면 원곡의 저작권 문제가 생길 수 있습니다. 이 글에서는 직접 생성한 곡만 사용했습니다.
Q. 가장 좋은 모델은 무엇인가요?
MR·아카펠라가 목적이라면 htdemucs로 충분합니다. 품질을 조금 더 끌어올리려면 htdemucs_ft를 쓰되, 처리 시간이 약 4배 늘어납니다.
Q. 긴 곡도 8GB에서 되나요?
됩니다. Demucs는 곡을 짧은 구간(segment)으로 나눠 처리합니다. 3분 곡을 넣어도 최대 메모리는 30초 곡과 같은 0.54GB였고, 처리 시간만 5.4초로 늘었습니다.
Q. You are sending unauthenticated requests to the HF Hub 경고가 떠요.
가중치를 Hugging Face에서 받을 때 나오는 안내입니다. 분리 결과에는 영향이 없으니 무시해도 됩니다.
Q. 음원을 읽거나 저장할 때 torchaudio·TorchCodec 관련 오류가 나요.
Demucs 4.0.x 이하는 음원 입출력에 torchaudio를 씁니다. torchaudio 2.9 이상과 함께 쓰면 이 단계에서 실패할 수 있습니다. pip install -U "demucs>=4.1.0"으로 업그레이드하세요.
마무리
ACE-Step으로 만든 노래를 Demucs로 다시 분해해 보았습니다. 생성과 분리 모두 RTX 5060 8GB 한 장에서 돌아갑니다. 분리한 보컬은 음성 인식(STT) 정확도를 높이는 전처리나 음성 데이터셋 정제에도 활용할 수 있습니다.
gcube에서는 RTX 5060부터 RTX 5090까지 필요한 만큼 GPU를 빌려 이런 실험을 바로 해볼 수 있습니다.