본문 바로가기
기술 이야기/논문 리뷰

(1/2) AudioGen: Textually Guided Audio Generation 리뷰

by 넌 꿈이 뭐야? 2023. 8. 3.

안녕하세요, 오늘은 AudioGen: Textually Guided Audio Generation 논문을 살펴보도록 하겠습니다.

논문 제목은 AudioGen인데 코드나 블로그에서는 AudioCraft라고 소개하고 있습니다. 프로젝트 이름이 AudioCraft, 모델 이름이 AudioGen입니다.

이번 논문은 제목처럼 텍스트를 입력으로 받아 그에 맞는 소리를 생성하는 생성 AI입니다. 일전에 소개드렸던 ImageBind 리뷰처럼 비슷한 연구가 있어 아주 참신하지는 않지만 어떤 특징을 갖고 어떤 장점이 있는지 설명하겠습니다.

참고로 이 글은 블로그와 논문을 함께 참고하며 작성했습니다.

Introduction

소리를 생성하는 연구는 이미지나 텍스트보다 조금 발전이 더딘 감이 있습니다. 왜 그럴까요?

우리가 눈으로 세상을 보고 적혀 있는 글을 읽는 것보다는 직관적이지 않은 것일까요? 여러가지 생각을 해볼 수 있지만 저자들이 말하는 이유는

  • 음원지 구별의 어려움: 소리는 1차원 데이터라 그 안에서 동시간에 존재하는 다양한 소리의 출처를 구별하기 어려움
  • 반향(Reverberation)의 존재: 주변 사물에 음파가 부딪혀 반사되며 생기는 반향 때문에 분석이 어려움
  • 소리의 해상도(resolution) 분석의 어려움: 인간이 소리를 들을 때 주파수 대역별로 민감도가 다릅니다. 이 내용은 Equal-loudness Contour 또는 등청감곡선에서 잘 설명하고 있습니다. 한마디로 소리를 주파수 별로 나누어 우리가 볼 수 있게 표시한다고 하더라도 함정이 있다는 뜻입니다.
  • 적은 데이터: AI에게 가장 중요한 '데이터 수'가 Image-Text 친구보다 부족해서

이런 여러가지 이유 때문에 Audio는 혁신적인 연구가 적었다고 합니다.

그럼 AudioCraft는 위의 문제들을 어떻게 해결한 걸까요?

최근 Meta의 행보를 생각하면 Segment Anything, MMS에서 보여주었듯 많은 데이터를 때려박아 훌륭한 결과를 냈을 것 같은데 이번엔 아니었습니다.

이번 모델인 AudioGen 자체의 우수함을 적극 어필하는 모습이 매우 고무적입니다.

먼저 이번 연구의 훌륭함을 정리하면

  • 텍스트 또는 오디오 Prompt를 받아 Auto-regressive하게 소리를 생성하여 SOTA를 달성
  • Text-to-Audio를 두가지 측면에서 개선
    • 모델 맨 끝에 Classifier-free Guidance를 추가하여 텍스트에 따른 더욱 적절한 오디오 생성을 유도하고
    • On-the-fly Text-Audio mixing을 통해 데이터 구성을 더욱 풍부하게 했다고 함 (잘 이해가 안됩니다)
  • 텍스트 Prompt 유무와 관계 없이 계속해서 오디오를 이어 생성할 수 있음
  • 오디오의 정교함? (Fidelity)와 샘플링 타임 간의 Trade-off에 대해 분석함

AudioGen Method

논문에 나와있는 AudioGen Architecture

AudioGen은 두 단계로 구성되어 있습니다.

  1. Autoencoder 방식으로 오디오 원본의 discrete representation 획득
  2. 1에서 얻은 audio representation과 텍스트를 받아 Transformer 학습

AudioGen의 대략적인 구조

Discrete representation이라고 하니 VQ-VAE, DALL-E가 생각나고, Auto-regressive 방식에서는 GPT가 대표적으로 생각납니다. 최소한 GPT의 구조를 아시는 분들이라면 텍스트를 받았을 때 순차적으로 그 다음 토큰을 추론하고, 추론한 토큰까지 함께 입력으로 넣어 또 다음 토큰을 추론하는...

일단 아무 말이나 내뱉는 GPT처럼 동작한다고 이해가 됩니다.

아래는 Auto-regressive의 구조를 이해하기 위한 GPT 동작 방식을 첨부합니다 (출처)

GPT의 동작 방식

Audio Representation

오디오는 ffmpeg 같은 코덱을 이용해 \(x \in [-1, 1]^{C_{a}\times T}\)의 형태로 인코딩 합니다. 여기서

  • \(T = d \cdot f_{sr}\)
    • \(d\): 오디오 길이(초)
    • \(f_{sr}\): Sampling rate (보통 16kHz)
  • \(C_{a}\): 오디오 채널 수

입니다.

그리고 아래와 같은 과정을 수행합니다.

  1. Audio Encoder Network \(\textit{E}\)에 넣어 latent representation \(z\)를 얻습니다.
  2. \(z\)를 Vector Quantization layer \(Q\)에 넣어 \(z_{q}\)를 얻습니다.
    여기서 Vector Quantization이란, VQ-VAE에서 Codebook을 사용한 방법을 말합니다. 예를 들어 미리 2048개의 \(z\)와 같은 사이즈의 임베딩을 준비해놓고, 그 중 \(z\)와 가장 유사한 임베딩을 찾아 그것을 활용하는 방법입니다. (참고)
  3. Audio Decoder Network가 \(z_{q}\)를 이용해 \(\hat{x}\)를 만듭니다.
  4. 설계한 Loss function에 따라 네트워크를 학습합니다. (Reconstruction + Perpetual Loss)

모델 구조는 특별할 게 없는 1D Convolution의 연속입니다. audiocraft encodec code를 참고하시면 많은 abstractmethod와 함께 코드를 확인하실 수 있습니다.

중요한 점은 Loss function입니다. 내용이 좀 길어서 2부에서 다루도록 하겠습니다.

반응형

댓글