<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>Codec on dirac042</title><link>https://dirac042.github.io/tags/codec/</link><description>dirac042's journal — notes on mathematics, computer science and building things.</description><generator>Hugo</generator><language>ko-kr</language><managingEditor>dirac042</managingEditor><copyright>This work is licensed under a Creative Commons Attribution-NonCommercial 4.0 International License.</copyright><lastBuildDate>Mon, 06 Jul 2026 10:00:00 +0900</lastBuildDate><atom:link href="https://dirac042.github.io/tags/codec/index.xml" rel="self" type="application/rss+xml"/><item><title>DAC (Descript Audio Codec) 정리</title><link>https://dirac042.github.io/posts/dac/</link><pubDate>Mon, 06 Jul 2026 10:00:00 +0900</pubDate><guid>https://dirac042.github.io/posts/dac/</guid><category>Audio</category><category>Codec</category><category>Paper Notes</category><description>Descript Audio Codec: Neural Audio Codec (오디오를 작게 압축하고, 원본에 가까운 음질로 복원). 오디오 생성 모델들이 Latent를 만들 때 자주 쓰는 코덱이라 구조를 짧게 정리해 둔다. 논문은 Kumar et al., High-Fidelity Audio Compression with Improved RVQGAN (NeurIPS 2023). 숫자로 요약하면 44.1 kHz 오디오를 8 kbps, 약 90배 압축하면서 음성·음악·환경음을 모델 하나로 다룬다.</description><content:encoded>&lt;p>Descript Audio Codec: Neural Audio Codec (오디오를 작게 압축하고, 원본에 가까운 음질로 복원). 오디오 생성 모델들이 Latent를 만들 때 자주 쓰는 코덱이라 구조를 짧게 정리해 둔다. 논문은 Kumar et al., &lt;a href="https://arxiv.org/abs/2306.06546" target="_blank" rel="noopener noreferrer">&lt;em>High-Fidelity Audio Compression with Improved RVQGAN&lt;/em>&lt;/a> (NeurIPS 2023). 숫자로 요약하면 &lt;strong>44.1 kHz 오디오를 8 kbps, 약 90배 압축&lt;/strong>하면서 음성·음악·환경음을 모델 하나로 다룬다.&lt;/p>
&lt;h2 id="구조">구조&lt;/h2>
&lt;ol>
&lt;li>
&lt;p>Encoder: Waveform을 CNN에 태우기 → Continuous Latent Representation 생성&lt;/p>
&lt;/li>
&lt;li>
&lt;p>&lt;strong>RVQ (Residual Vector Quantization)&lt;/strong>&lt;/p>
&lt;ul>
&lt;li>연속적인 값을 Discrete한 Token으로 바꾸기 → Quantization&lt;/li>
&lt;li>첫 번째 층: 전체적 뼈대만 잡아서 토큰화 → Residual이 크다&lt;/li>
&lt;li>두 번째 ~ n번째 층: 이전 층의 오차(Residual)만 받아와서 Token화 → 반복…&lt;/li>
&lt;li>오차가 0에 수렴 → 적은 Token으로 디테일한 소리 정보 저장.&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>
&lt;p>Decoder: RVQ의 Discrete Token을 입력받아, Waveform으로 만들기&lt;br>
→ 훈련을 GAN으로 함. (그래서 이름이 RVQGAN)&lt;/p>
&lt;/li>
&lt;/ol>
&lt;figure class="post-figure">
&lt;img src="https://dirac042.github.io/images/fig-rvq.png" alt="Image Description" loading="lazy" decoding="async">
&lt;/figure>&lt;blockquote>
&lt;p>RVQ 한 장 요약. 각 단계는 &amp;ldquo;남은 오차&amp;quot;만 양자화하므로, 뒤 코드북일수록 미세한 디테일을 담당한다.&lt;/p>
&lt;/blockquote>&lt;aside class="callout callout-note">
&lt;p class="callout-title">비트레이트를 직접 계산해보면&lt;br>&lt;/p>
&lt;div class="callout-body">
&lt;p>Encoder의 stride가 512라서 44.1 kHz 파형이 초당 약 86 프레임(44100/512 ≈ 86.1)의 latent가 된다. 프레임마다 코드북 9개가 각각 10비트(1024개 코드 중 하나) 인덱스를 내놓으니 86 × 9 × 10 ≈ 7,750 bps ≈ &lt;strong>8 kbps&lt;/strong>. 원본 16-bit PCM(705.6 kbps)과 비교하면 약 91배 압축이다. 코드북 개수를 줄이면(예: 앞 4개만) 그대로 낮은 비트레이트 모델이 되는데, 이게 되도록 학습 때 &lt;strong>quantizer dropout&lt;/strong>(예시마다 p=0.5 확률로 코드북 개수를 랜덤하게 자름)을 쓴다.&lt;/p>
&lt;/div>
&lt;/aside>&lt;aside class="callout callout-note">
&lt;p class="callout-title">코드북이 죽지 않게 하는 두 가지 트릭&lt;br>&lt;/p>
&lt;div class="callout-body">
&lt;p>VQ의 고질병은 코드북의 일부만 쓰이고 나머지는 죽어버리는 것(codebook collapse). DAC는 이미지 쪽 Improved VQGAN에서 두 가지를 가져왔다. &lt;strong>Factorized codes&lt;/strong>: 코드 lookup은 8차원(또는 32차원)의 낮은 공간에서 하고, 실제 임베딩은 1024차원에 둔다 — 찾기는 쉽게, 표현력은 크게. &lt;strong>L2-normalized codes&lt;/strong>: 인코더 출력과 코드북 벡터를 정규화해 유클리드 거리 대신 코사인 유사도로 매칭 → 안정성과 품질이 좋아진다.&lt;/p>
&lt;/div>
&lt;/aside>&lt;h2 id="구조적-특징">구조적 특징&lt;/h2>
&lt;ol>
&lt;li>Fully Convolutional Network(FCN, 1차원 CNN)을 Encoder/Decoder에 사용&lt;/li>
&lt;li>Snake Activation Function을 전 Layer에 사용 (주기가 있는 함수에 good)&lt;/li>
&lt;li>Dilated Convolution으로 듬성듬성 넘어가서 Receptive Field 넓히기&lt;/li>
&lt;/ol>
&lt;figure class="post-figure">
&lt;img src="https://dirac042.github.io/images/fig-snake.png" alt="Image Description" loading="lazy" decoding="async">
&lt;/figure>&lt;blockquote>
&lt;p>Snake: &lt;span class="math math-inline">\(x&amp;#43;\frac{1}{\alpha}\sin^2(\alpha x)\)&lt;/span>. 항등함수에 주기적인 굴곡이 들어가 있어서, ReLU로는 잘 못 배우는 주기 신호(= 소리)를 표현하기 좋다. 논문에서는 ReLU를 Snake로 바꾸는 것만으로 SI-SDR이 눈에 띄게 올랐다.&lt;/p>
&lt;/blockquote>&lt;aside class="callout callout-note">
&lt;p class="callout-title">어떻게 학습시키나 (loss 구성)&lt;br>&lt;/p>
&lt;div class="callout-body">
&lt;p>Decoder는 GAN으로 학습하는데, 판별자가 세 종류다: &lt;strong>multi-period&lt;/strong> 파형 판별자(주기 2, 3, 5, 7, 11로 파형을 접어서 봄), &lt;strong>multi-scale STFT&lt;/strong> 판별자(window 2048/1024/512), 그리고 STFT를 sub-band로 쪼개 고주파와 앨리어싱을 잡는 &lt;strong>multi-band multi-scale STFT&lt;/strong> 판별자. 손실은 multi-scale mel reconstruction(가중치 15), feature matching(2), adversarial(HingeGAN, 1), codebook(1), commitment(0.25)의 합이다.&lt;/p>
&lt;/div>
&lt;/aside>&lt;h2 id="다음-이야기">다음 이야기&lt;/h2>
&lt;p>→ Discrete Token을 생성하는 RVQ를 버리고, Continuous한 VAE를 쓰자 → DAC-VAE (Semantic-VAE)&lt;/p>
&lt;h2 id="참고-자료">참고 자료&lt;/h2>
&lt;ul>
&lt;li>R. Kumar, P. Seetharaman, A. Luebs, I. Kumar, K. Kumar, &lt;a href="https://arxiv.org/abs/2306.06546" target="_blank" rel="noopener noreferrer">&lt;em>High-Fidelity Audio Compression with Improved RVQGAN&lt;/em>&lt;/a>, NeurIPS 2023. 코드/가중치: &lt;a href="https://github.com/descriptinc/descript-audio-codec" target="_blank" rel="noopener noreferrer">descriptinc/descript-audio-codec&lt;/a>.&lt;/li>
&lt;li>N. Zeghidour et al., &lt;a href="https://arxiv.org/abs/2107.03312" target="_blank" rel="noopener noreferrer">&lt;em>SoundStream: An End-to-End Neural Audio Codec&lt;/em>&lt;/a>, 2021 — RVQ를 오디오 코덱에 처음 쓴 논문. A. Défossez et al., &lt;a href="https://arxiv.org/abs/2210.13438" target="_blank" rel="noopener noreferrer">&lt;em>High Fidelity Neural Audio Compression&lt;/em>&lt;/a> (EnCodec), 2022 — DAC가 주로 비교하는 상대.&lt;/li>
&lt;li>L. Ziyin, T. Hartwig, M. Ueda, &lt;a href="https://arxiv.org/abs/2006.08195" target="_blank" rel="noopener noreferrer">&lt;em>Neural networks fail to learn periodic functions and how to fix it&lt;/em>&lt;/a>, NeurIPS 2020 — Snake activation의 출처. BigVGAN도 같은 활성함수를 쓴다.&lt;/li>
&lt;/ul></content:encoded></item></channel></rss>