Stable audio는 stereo 44.1 kHz에 길이가 긴 오디오를 Latent Diffusion model로 생성하는걸 목표로 한다.
결론적으로는 성능이 좋고(music 기준. audio는 데이터가 적다), 기존의 AR model들보다 생성 속도가 훨씬 빠르다.
Evaluation metric을 새롭게 세팅했다.
- FAD based on OpenL3 embedding for plausibility(소리가 정상적인지)
- KLD for semantic 일치
- CLAP score between 입력 텍스트와 생성된 오디오
Mousai는 output latent를 diffusion decoder로 바로 waveform으로 변환하고, AudioLDM은 latent를 spectrogram으로 변환한 다음 Hifi-GAN을 이용하여 waveform으로 변환한다.
VAE
44.1 kHz audio를 latent로 변환시키는데, 입력 길이가 고정이 아니어야함. DAC 구조를 따르면서 quantizer는 없앤 구조를 쓴다 - fully convolution, 133M 파라미터
scratch부터 새로 학습했고, 길이를 1024배 압축하고 채널은 64가 된다. 2(stereo) X L → 64 X L/102 → 결론은 32배 압축임.
학습도 디테일하게 명시해두었다. 두개 같이 46만 step학습하고, encoder는 얼린 뒤 decoder만 64만 step 추가 학습했다.
Text condition
CLAP도 새로 학습했다고 한다.
Stable Diffusion에서 텍스트 컨디션 쓸 때, 마지막 이전 레이어의 feature를 쓰는게 나았다는 실험결과가 있음 → 여기서도 그렇게 했다(CLAP의).
Timing embeddings
timing 정보를 생성에 이용하는 방법은 Jukebox(AR model)에서 먼저 소개되었다.
여기서는 1) seconds_start : 청크가 전체 오디오의 몇초에서 시작하는지, 2) seconds_total : 전체 오디오가 몇초짜리인지
를 쓴다.
per-second learned embedding으로 바뀐 뒤 text feature에 concat되어서 들어간다.
window 크기가 95초인데 만약 오디오가 30초 짜리면, 뒤에는 silence 패딩을 넣어서 학습한다. 그래서 생성할 때도 0, 20으로 넣으면 95초인데 뒤 75초는 무음인 오디오가 생성된다
Diffusion model 구조
U-net
- 4단계의 downsampling encoder - upsampling decoder with skip connections
- 각 단계의 channel은 1024, 1024, 1280이고 downsample factor는 [1, 2, 2, 4]이다. 처음은 1이므로 다운샘플 안함.
- → bottle-neck block 채널은 1280
- 각 block은 2 conv residual, 뒤에는 self-attention, cross-attention가 3개 쌓인 layer가 있다(첫번째 level은 1개)
학습시
A100 64대로 batch size 256, 640,000 step학습. 95.1초로 오디오를 잘라서 sample은 4,194,304개가 나왔다.
classifier-free guidance 사용을 위해서 conditioning signal은 10% dropout시켰다. text encoder는 diffusion 학습할 때는 frozen
Inference
sampling 방법은 DPM-Solver++ 사용, classifier-free guidance
100스텝으로 인퍼런스
Dataset
ㅤ | nums | hours |
total | 806,284 | 19,500 |
music | 537,522 (66%) | 18,330 (94%) |
sound effect | 201,571 (25%) | 975 (5%) |
instrument stem | 9% | 1% |
정량적 결과
FD와 KL, CLAP차이가 크네
정성적 실험 결과 정리
- Autoencoder가 audio fidelity에 어떻게 영향을 끼쳤나?
autoencoder 자체가 별로면 학습이 이상했을 수 있으니 데이터 몇개를 골라서 audio → laten → audio를 해봤다. 약간 오디오 퀄리티가 낮아지긴 했는데 블라인드 테스트했을 때 큰 차이를 느끼진 못했다.
= 큰 영향 없었다
- 어떤 text encoder가 가장 효과가 좋은가
일반 CLAP, CLAP_LAION, T5, 자체 학습한 CLAP을 비교해봤다.
자체 학습한 CLAP이 좀 더 좋은 성능을 보였다. 학습 데이터셋은 diffusion model과 같았기 때문에, 이게 좋은 영향을 주지 않았을까
- timing 컨디션은 얼마나 정확했는가
예를 들어, 30초로 condition이 들어가면 30초는 소리, 65초는 무음으로 나와야 한다.
잘 나오는데 40~60 사이가 특히 잘 안나온다. 여기 해당하는 데이터가 많지 않아서 그런듯하다.
Share article
Subscribe to our newsletter