오늘도 공부
Audio Diffusion PyTorch: 오디오 디퓨전 본문
오디오 생성은 이미지 생성보다 훨씬 까다롭습니다.
이미지는 한 번에 2D 공간을 보면 되지만, 오디오는 아주 긴 시간축, 미세한 파형 변화, 장기 구조, 샘플레이트 변환, 텍스트 조건부 생성까지 한꺼번에 해결해야 합니다. 그래서 많은 프로젝트가 특정 태스크 하나에만 집중합니다.
그런데 audio-diffusion-pytorch는 조금 다르게 접근합니다.
이 프로젝트는 “텍스트로 음악 만들기” 같은 데모용 모델 하나를 내놓는 대신, 오디오 생성 실험에 필요한 공통 부품을 라이브러리 형태로 정리해 둡니다. 무조건 생성기만 있는 것이 아니라, 무조건 생성, 텍스트 조건부 생성, 업샘플링, 보코더, 오토인코더, 인페인팅까지 하나의 PyTorch 인터페이스로 묶어 둔 점이 이 프로젝트의 핵심입니다. (GitHub)
GitHub - archinetai/audio-diffusion-pytorch: Audio generation using diffusion models, in PyTorch.
Audio generation using diffusion models, in PyTorch. - archinetai/audio-diffusion-pytorch
github.com
프로젝트 소개
Audio Diffusion PyTorch는 ArchiTect AI 계정에서 공개한 PyTorch 기반 오디오 디프퓨전 라이브러리입니다. 저장소 설명 그대로, 오디오 생성용 디프퓨전 모델을 구성하기 위한 fully featured 라이브러리를 지향합니다. README 기준으로 이 라이브러리는 unconditional audio generation, text-conditional generation, diffusion autoencoding, upsampling, vocoding을 포함하며, 제공되는 예시는 파형 기반이지만 내부 U-Net과 diffusion/sampler 설계는 차원에 종속되지 않도록 비교적 범용적으로 구성되어 있습니다. 저장소 메타데이터 기준으로 현재 공개 저장소이며 MIT 라이선스를 사용하고, PyPI 패키지 버전은 0.1.3으로 표시되어 있습니다. (GitHub)
이 프로젝트를 만든 사람은 setup.py 기준 Flavio Schneider이며, README에서도 논문 Moûsai의 설정을 참고하라고 안내합니다. 실제로 Moûsai 논문은 이 저장소를 오픈소스 구현 컬렉션의 일부로 명시하고 있고, 텍스트-투-뮤직을 위한 long-context latent diffusion 방향과 연결됩니다. 즉, 이 저장소는 단순 유틸리티가 아니라 연구 코드와 실험 플랫폼의 중간지대에 있는 프로젝트로 보는 것이 맞습니다. (GitHub)
기술 스택도 명확합니다. 설치 의존성에는 torch, torchaudio, einops, tqdm, a-unet이 포함되어 있고, 텍스트 조건부 생성은 README에서 transformers 추가 설치를 요구합니다. 내부 구조를 보면 실제 모델 조립은 a-unet 기반 플러그인 구조를 적극 활용하고, 오디오 전처리는 torchaudio.transforms를 통해 멜 스펙트로그램으로 연결합니다. (GitHub)
왜 이 프로젝트가 등장했을까
오디오 생성은 본질적으로 어렵습니다.
이미지처럼 한 번에 끝나는 문제가 아니라 다음과 같은 제약이 동시에 걸립니다.
첫째, 시간축이 길다는 점입니다. 음악이나 음성은 초 단위만 되어도 데이터 길이가 급격히 커집니다.
둘째, 파형을 직접 다루면 계산량이 매우 크다는 점입니다.
셋째, 텍스트-오디오 정렬과 고해상도 파형 복원은 서로 다른 문제인데, 실제 서비스에서는 둘 다 필요합니다.
Moûsai 논문도 이런 배경에서, 긴 문맥의 텍스트-투-뮤직을 위해 2단계 latent diffusion 접근을 제안합니다. 1단계에서는 오디오를 압축하는 diffusion autoencoder를 사용하고, 2단계에서는 그 latent 공간에서 텍스트 조건부 생성을 수행합니다. 이 저장소 README가 Moûsai 설정을 참고하라고 한 이유도 여기 있습니다. (arXiv)
즉, 이 프로젝트가 등장한 이유는 분명합니다.
오디오 생성 연구를 하려면 매번 다음을 새로 만들어야 했습니다.
- 파형 기반 U-Net
- 디프퓨전 손실과 샘플러
- 텍스트 조건부 결합
- 저해상도→고해상도 업샘플링
- 멜 스펙트로그램→파형 보코딩
- latent 오토인코딩
audio-diffusion-pytorch는 이 공통 부품들을 한 라이브러리 안에서 재조합 가능하게 만든 것에 가깝습니다. 특정 태스크용 완제품이라기보다, 오디오 생성 시스템을 설계할 때 레고 블록처럼 조합하는 프레임워크라고 이해하면 가장 정확합니다. (GitHub)
이 프로젝트를 한 문장으로 요약하면
**“오디오 생성용 디프퓨전 모델을 연구·실험·커스터마이징하기 위한 PyTorch 기반 모듈형 프레임워크”**입니다. (GitHub)
중요한 포인트는 두 가지입니다.
하나는 모델을 제공하는 프로젝트가 아니라 모델을 만들 수 있게 해주는 프로젝트라는 점입니다. README는 분명하게 사전학습 모델은 제공하지 않는다고 밝힙니다. 그래서 바로 음악 생성 데모를 돌리는 용도보다는, 직접 학습하고 실험하는 개발자에게 맞습니다. (GitHub)
다른 하나는 파형 기반(audio waveform-based) 설계를 기본으로 삼되, 멜 스펙트로그램과 latent 표현까지 포괄한다는 점입니다. 즉, “처음부터 끝까지 waveform only”가 아니라, 필요에 따라 파형·멜·latent를 오가며 시스템을 구성할 수 있습니다. (GitHub)
핵심 기능
1) Unconditional Audio Generation
가장 기본적인 형태는 노이즈에서 바로 오디오를 생성하는 무조건 생성 모델입니다. DiffusionModel에 UNetV0, VDiffusion, VSampler를 조합해 학습과 샘플링을 수행합니다. 학습 시에는 오디오 파형을 넣어 loss를 계산하고, 추론 시에는 노이즈 텐서에서 샘플을 뽑습니다. (GitHub)
이 구조가 좋은 이유는 간단합니다.
오디오 도메인에서 먼저 기본 파형 생성기를 검증한 뒤, 나중에 텍스트 조건이나 업샘플링을 추가할 수 있기 때문입니다.
import torch
from audio_diffusion_pytorch import DiffusionModel, UNetV0, VDiffusion, VSampler
model = DiffusionModel(
net_t=UNetV0,
in_channels=2,
channels=[8, 32, 64, 128, 256, 512, 512, 1024, 1024],
factors=[1, 4, 4, 4, 2, 2, 2, 2, 2],
items=[1, 2, 2, 2, 2, 2, 2, 4, 4],
attentions=[0, 0, 0, 0, 0, 1, 1, 1, 1],
attention_heads=8,
attention_features=64,
diffusion_t=VDiffusion,
sampler_t=VSampler,
)
audio = torch.randn(4, 2, 2**18)
loss = model(audio)
loss.backward()
noise = torch.randn(1, 2, 2**18)
sample = model.sample(noise, num_steps=20)
실제로 내부 구현을 보면 DiffusionModel은 net, diffusion, sampler를 각각 조립하는 얇은 래퍼입니다. 그래서 “모델 클래스”라기보다 조립기에 가깝습니다. (GitHub)
2) Text-Conditional Audio / Music Generation
이 프로젝트가 특히 흥미로운 이유는 텍스트 조건부 생성을 아주 노골적으로 지원한다는 점입니다. README에 따르면 기본 텍스트 임베딩은 t5-base를 사용하며, transformers 설치가 필요합니다. 또한 use_text_conditioning, use_embedding_cfg, cross_attentions 같은 옵션으로 텍스트 조건부 생성과 classifier-free guidance를 활성화합니다. (GitHub)
여기서 중요한 건 구현 방식입니다.
UNetV0는 a-unet 기반 플러그인 구조 위에서 만들어지며, 필요 시 TextConditioningPlugin, ClassifierFreeGuidancePlugin, TimeConditioningPlugin을 레이어처럼 감쌉니다. 즉, 텍스트 조건부 모델이 별도 클래스가 아니라 같은 U-Net을 플러그인으로 확장하는 구조입니다. 이 점이 매우 개발자 친화적입니다. (GitHub)
import torch
from audio_diffusion_pytorch import DiffusionModel, UNetV0, VDiffusion, VSampler
model = DiffusionModel(
net_t=UNetV0,
in_channels=2,
channels=[8, 32, 64, 128, 256, 512, 512, 1024, 1024],
factors=[1, 4, 4, 4, 2, 2, 2, 2, 2],
items=[1, 2, 2, 2, 2, 2, 2, 4, 4],
cross_attentions=[0, 0, 0, 1, 1, 1, 1, 1, 1],
use_text_conditioning=True,
use_embedding_cfg=True,
embedding_max_length=64,
embedding_features=768,
diffusion_t=VDiffusion,
sampler_t=VSampler,
)
audio = torch.randn(2, 2, 2**18)
loss = model(
audio,
text=["warm ambient synth with slow evolving pads",
"energetic rock drums with distorted guitar"],
embedding_mask_proba=0.1,
)
loss.backward()
noise = torch.randn(1, 2, 2**18)
sample = model.sample(
noise,
text=["cinematic piano with deep reverb"],
embedding_scale=5.0,
num_steps=20,
)
이 구조는 텍스트-투-뮤직, 텍스트-투-사운드 이펙트, 조건부 음성 합성 실험에 모두 확장 가능합니다. 다만 README가 명시하듯 프리트레인 모델은 없으므로, 곧바로 결과를 얻으려면 직접 데이터셋과 학습 파이프라인을 준비해야 합니다. (GitHub)
3) Diffusion Upsampler
오디오 서비스에서는 “작게 만들고 나중에 복원”하는 접근이 자주 필요합니다.
예를 들어 저해상도 오디오를 빠르게 생성한 뒤, 고해상도 오디오로 끌어올리고 싶을 수 있습니다.
이 라이브러리의 DiffusionUpsampler는 그런 패턴을 정면으로 다룹니다. README 예제에서는 upsample_factor=16으로 3kHz를 48kHz로 끌어올리는 예시를 제시합니다. 구현을 보면 업샘플러는 입력을 한 번 downsample 후 다시 upsample한 reupsampled 신호를 만들고, 이를 append_channels 형태로 원래 디프퓨전 네트워크에 붙여 조건으로 사용합니다. 즉, “이미 있는 저해상도 구조”를 힌트로 주면서 디테일을 복원하는 방식입니다. (GitHub)
import torch
from audio_diffusion_pytorch import DiffusionUpsampler, UNetV0, VDiffusion, VSampler
upsampler = DiffusionUpsampler(
net_t=UNetV0,
upsample_factor=16,
in_channels=2,
channels=[8, 32, 64, 128, 256, 512, 512, 1024, 1024],
factors=[1, 4, 4, 4, 2, 2, 2, 2, 2],
items=[1, 2, 2, 2, 2, 2, 2, 4, 4],
diffusion_t=VDiffusion,
sampler_t=VSampler,
)
hq_audio = torch.randn(2, 2, 2**18)
loss = upsampler(hq_audio)
loss.backward()
low_audio = torch.randn(1, 2, 2**14)
restored = upsampler.sample(low_audio, num_steps=20)
개발 관점에서 보면 이 기능은 음악 생성 자체보다도, 후처리 파이프라인에서 훨씬 실용적입니다.
처음부터 48kHz 스테레오 전 구간을 생성하는 대신, 더 낮은 해상도에서 구조를 만든 뒤 마지막 단계에서 품질을 올릴 수 있기 때문입니다. (GitHub)
4) Diffusion Vocoder
DiffusionVocoder는 멜 스펙트로그램을 waveform으로 바꾸는 컴포넌트입니다. README는 mel_n_fft, mel_channels, mel_sample_rate 등을 입력으로 받으며, 학습 시 waveform을 넣으면 내부적으로 멜 변환을 수행한다고 설명합니다. 실제 구현도 MelSpectrogram 모듈과 ConvTranspose1d를 사용해 스펙트럼 특징을 평탄화한 뒤, 이를 append channels로 네트워크에 넣는 구조입니다. (GitHub)
import torch
from audio_diffusion_pytorch import DiffusionVocoder, UNetV0, VDiffusion, VSampler
vocoder = DiffusionVocoder(
mel_n_fft=1024,
mel_channels=80,
mel_sample_rate=48000,
mel_normalize_log=True,
net_t=UNetV0,
channels=[8, 32, 64, 128, 256, 512, 512, 1024, 1024],
factors=[1, 4, 4, 4, 2, 2, 2, 2, 2],
items=[1, 2, 2, 2, 2, 2, 2, 4, 4],
diffusion_t=VDiffusion,
sampler_t=VSampler,
)
audio = torch.randn(2, 2, 2**18)
loss = vocoder(audio)
loss.backward()
mel = torch.randn(1, 2, 80, 1024)
wave = vocoder.sample(mel, num_steps=20)
이 기능은 텍스트-오디오 시스템을 만들 때 매우 중요합니다.
실제 서비스에서는 “텍스트 → latent/mel → waveform”처럼 여러 스테이지를 쪼개는 경우가 많은데, 이 라이브러리는 그런 캐스케이드 구조를 구현하는 데 필요한 마지막 파형 복원 단계를 제공합니다. (GitHub)
5) Diffusion Autoencoder
DiffusionAE는 이 프로젝트를 단순 라이브러리 이상으로 보이게 만드는 기능입니다. README에 따르면 인코더는 EncoderBase를 상속하거나 out_channels, downsample_factor 필드를 가지면 되고, 압축된 latent를 diffusion decoder가 다시 복원합니다. 코드에서도 encoder가 만든 latent를 특정 inject_depth에서 U-Net에 주입하고, 필요하면 adapter를 통해 입출력 포맷을 변환할 수 있게 설계되어 있습니다. (GitHub)
import torch
from audio_diffusion_pytorch import DiffusionAE, UNetV0, VDiffusion, VSampler
from audio_encoders_pytorch import MelE1d, TanhBottleneck
autoencoder = DiffusionAE(
encoder=MelE1d(
in_channels=2,
channels=512,
multipliers=[1, 1],
factors=[2],
num_blocks=[12],
out_channels=32,
mel_channels=80,
mel_sample_rate=48000,
mel_normalize_log=True,
bottleneck=TanhBottleneck(),
),
inject_depth=6,
net_t=UNetV0,
in_channels=2,
channels=[8, 32, 64, 128, 256, 512, 512, 1024, 1024],
factors=[1, 4, 4, 4, 2, 2, 2, 2, 2],
items=[1, 2, 2, 2, 2, 2, 2, 4, 4],
diffusion_t=VDiffusion,
sampler_t=VSampler,
)
audio = torch.randn(2, 2, 2**18)
loss = autoencoder(audio)
loss.backward()
latent = autoencoder.encode(audio)
reconstructed = autoencoder.decode(latent, num_steps=20)
이 구조를 보면 Moûsai 같은 latent diffusion 음악 생성기를 왜 이 라이브러리로 실험하기 좋은지 이해됩니다.
긴 고해상도 오디오를 직접 생성하는 대신, 먼저 압축된 latent 공간을 만들고, 그 공간에서 생성한 다음 다시 디코딩하면 계산량과 시퀀스 길이 문제를 훨씬 유리하게 다룰 수 있습니다. (arXiv)
6) Inpainting과 그 밖의 확장
README 하단에는 VInpainter 예시도 들어 있습니다. 마스크로 보존할 구간을 지정하고, 나머지 구간만 디프퓨전 과정에서 다시 채워 넣는 방식입니다. 구현을 보면 매 스텝에서 예측한 결과와 원본 noisy source를 마스크 기준으로 다시 합치며, num_resamples로 재샘플링 횟수를 제어합니다. (GitHub)
이 기능은 음악 생성보다도 오디오 복원, 노이즈 제거, 구간 재생성, 음성 편집 같은 편집형 워크플로우에 더 직접적으로 연결됩니다.
또 하나 흥미로운 점은 __init__.py와 models.py 기준으로 DiffusionAR, ARVDiffusion, ARVSampler 같은 autoregressive 변형도 노출된다는 점입니다. README의 대표 기능은 아니지만, 라이브러리 차원에서는 non-AR diffusion 외에도 더 긴 시퀀스를 다루기 위한 실험 여지를 남겨 두고 있습니다. (GitHub)
프로젝트 아키텍처 분석
이 저장소의 가장 좋은 점은 “클래스가 많다”가 아니라 역할 분리가 명확하다는 것입니다.
1. 상단 API: 모델 래퍼
상단에는 DiffusionModel, DiffusionUpsampler, DiffusionVocoder, DiffusionAE 같은 사용자용 API가 있습니다.
이 레이어는 “무슨 태스크를 하려는가”를 표현합니다. (GitHub)
2. 중간 레이어: U-Net 조립기
UNetV0는 실제 네트워크를 조립하는 팩토리입니다.
attention, cross-attention, time conditioning, text conditioning, context injection 여부를 설정해 하나의 U-Net을 다양한 태스크에 재사용합니다. (GitHub)
3. 하단 레이어: diffusion / sampler
VDiffusion은 학습 시 노이즈를 섞고 velocity target을 맞추는 손실을 계산하고, VSampler는 샘플링 스텝을 따라 노이즈에서 오디오를 복원합니다. 즉, 학습과 추론이 이 레이어에서 분리됩니다. (GitHub)
4. 보조 레이어: 플러그인과 변환기
AppendChannelsPlugin, LTPlugin, MelSpectrogram 같은 도구가 모델을 태스크별로 확장합니다. 업샘플러는 append channels를 붙이고, 보코더는 mel 변환을 수행하며, 오토인코더는 latent를 특정 깊이에 주입합니다. (GitHub)
아키텍처를 그리면 대략 이런 식입니다.

개발자 입장에서 이 구조가 주는 장점은 분명합니다.
네트워크 구조를 바꾸고 싶으면 UNetV0 쪽을 건드리면 되고, 샘플링 전략을 바꾸고 싶으면 diffusion/sampler를 바꾸면 되며, 태스크를 추가하고 싶으면 wrapper를 하나 더 만들면 됩니다. 즉, 실험 축이 잘 분리되어 있습니다. (GitHub)
내부 동작을 조금 더 깊게 보면
이 라이브러리는 기본적으로 v-objective 기반 diffusion을 사용합니다. VDiffusion 구현을 보면 배치마다 sigma를 샘플링하고, alpha=cos(sigma*pi/2), beta=sin(sigma*pi/2) 형태로 원본 신호와 노이즈를 섞어 noisy input을 만든 뒤, 모델이 velocity를 예측하도록 학습합니다. VSampler도 같은 파라미터화에 맞춰 step-by-step으로 x를 복원합니다. README 인용 목록에 DDPM, DDIM, Progressive Distillation(V-Diffusion) 관련 참고문헌이 들어 있는 것도 이 구현과 일치합니다. (GitHub)
또한 UNetV0는 레이어별로 channels, factors, items, attentions, cross_attentions, context_channels를 받아 XUNet block 배열을 만듭니다. 이 말은 곧, 오디오 생성기라기보다 1D 시그널용 configurable U-Net generator에 가깝다는 뜻입니다. 텍스트 조건, CFG, 시간 조건이 모두 플러그인으로 붙는 구조라 연구용 확장성이 높습니다. (GitHub)
개발자가 실제로 언제 쓰면 좋을까
이 프로젝트는 모든 사람에게 맞지는 않습니다.
잘 맞는 경우
1) 오디오 생성 연구나 프로토타입을 직접 만들 때
텍스트 조건부 음악 생성, 음성 합성, 오디오 업샘플링, 오디오 인페인팅 같은 실험을 하나의 코드베이스에서 통일된 방식으로 다루고 싶을 때 적합합니다. (GitHub)
2) latent diffusion 기반 오디오 시스템을 설계할 때
오토인코더와 보코더, 텍스트 조건부 생성기를 분리해 캐스케이드 아키텍처를 만들려는 경우 특히 좋습니다. Moûsai 계열 접근과 잘 맞습니다. (arXiv)
3) waveform 레벨에서 품질 실험을 하고 싶을 때
많은 오디오 생성 프로젝트가 spectrogram 중심인데, 이 라이브러리는 waveform 기반 모델링을 전면에 내세웁니다. 그래서 저수준 파형 품질까지 직접 통제하고 싶은 경우 유용합니다. (GitHub)
덜 맞는 경우
1) 바로 실행 가능한 완제품이 필요할 때
프리트레인 체크포인트가 없기 때문에, “설치하고 바로 음악 생성”을 기대하면 실망할 수 있습니다. (GitHub)
2) 대규모 학습 파이프라인이 이미 완성된 프레임워크를 원할 때
이 프로젝트는 훈련 인프라 전체보다 모델링 레이어에 더 가깝습니다. 데이터셋 처리, 실험 관리, 분산 학습 운영은 별도로 붙여야 합니다. 이는 저장소 구조가 비교적 작고, 핵심이 audio_diffusion_pytorch 패키지 내부 모듈에 집중되어 있다는 점에서도 드러납니다. (GitHub)
실전 사용 시 추천 접근
처음부터 텍스트-투-뮤직 전체 시스템을 만들기보다 다음 순서로 가는 편이 좋습니다.
- DiffusionModel로 짧은 waveform 생성이 되는지 확인
- DiffusionUpsampler로 고해상도 복원을 붙이기
- DiffusionVocoder로 mel 기반 파이프라인 실험
- DiffusionAE로 latent 압축 구조 도입
- 마지막에 텍스트 conditioning과 CFG를 연결
이 순서가 좋은 이유는, 오디오 생성 문제를 한 번에 다 풀려고 하면 어디서 망가졌는지 알기 어렵기 때문입니다. 이 라이브러리는 모듈이 분리되어 있어서 이런 단계적 접근과 잘 맞습니다. (GitHub)
총평
audio-diffusion-pytorch는 “텍스트로 음악을 생성하는 라이브러리”라고만 소개하면 절반밖에 설명하지 못한 것입니다.
정확히 말하면 이 프로젝트는:
- 오디오 디프퓨전의 핵심 구성요소를 모듈화했고
- waveform, mel, latent를 모두 다룰 수 있으며
- unconditional / conditional / upsampling / vocoder / autoencoder / inpainting을 한 체계로 묶고
- 연구자가 새로운 오디오 생성 아키텍처를 빠르게 조립할 수 있게 만든
오디오 생성용 실험 플랫폼입니다. (GitHub)
특히 인상적인 부분은 플러그인 중심 U-Net 설계와 태스크별 wrapper 분리입니다.
이 덕분에 개발자는 “텍스트 조건을 더할까?”, “latent로 내릴까?”, “mel을 거칠까?”, “저해상도 먼저 만들까?” 같은 시스템 설계 질문을 코드 수준에서 바로 실험할 수 있습니다. (GitHub)
반대로, 당장 실행 가능한 제품형 모델을 기대한다면 이 저장소는 출발점이지 도착점은 아닙니다.
하지만 오디오 생성 시스템을 진짜로 이해하고 싶은 개발자에게는, 이런 종류의 프로젝트가 훨씬 가치 있습니다. 모델 하나를 쓰는 법이 아니라, 오디오 디프퓨전 시스템을 조립하는 법을 보여주기 때문입니다. (GitHub)
'AI' 카테고리의 다른 글
| Multica: AI 에이전트를 팀원처럼 운영하는 AI 네이티브 프로젝트 관리 도구 (0) | 2026.04.02 |
|---|---|
| TimesFM: Google Research : 시계열도 AI로 가능? (0) | 2026.04.02 |
| EmDash: WordPress의 전제를 다시 쓰는 CMS (0) | 2026.04.02 |
| Pi(pi) 확장 만들기 — pi-subagents 스타일 포함 (0) | 2026.04.01 |
| Apple 은 바이브 코딩 앱을 차단중이다. (0) | 2026.04.01 |
