NL-296, LLAMA-OMNI: SEAMLESS SPEECH INTERACTION WITH LARGE LANGUAGE MODELS, ICLR 2025

Abstract

GPT-4o와 같은 모델들은 음성을 통한 대형 언어 모델(LLM)과의 실시간 상호작용을 가능하게 하여, 기존의 텍스트 기반 상호작용에 비해 사용자 경험을 크게 향상시켰다. 그러나 오픈소스 LLM을 기반으로 한 음성 상호작용 모델을 어떻게 구축할 수 있는지에 대해서는 아직 충분한 탐구가 이루어지지 않았다. 이를 해결하기 위해, 우리는 LLaMA-Omni라는 새로운 엔드투엔드 모델 아키텍처를 제안한다. 

이 모델은 LLM과의 저지연·고품질 음성 상호작용을 위해 설계되었으며, 사전 학습된 음성 인코더, 음성 어댑터, LLM, 그리고 스트리밍 음성 디코더를 통합한다.

LLaMA-Omni는 음성 전사를 필요로 하지 않으며, 음성 지시어로부터 직접 텍스트와 음성 응답을 동시에 생성할 수 있어 지연 시간이 극도로 낮다. 우리는 최신 Llama-3.1-8B-Instruct 모델을 기반으로 모델을 구축하였으며, 음성 상호작용 시나리오에 맞추기 위해 20만 개의 음성 지시어와 그에 대응하는 음성 응답으로 구성된 InstructS2S-200K라는 데이터셋을 새롭게 제작하였다. 이 데이터는 음성 상호작용의 특성에 더 잘 부합하는 스타일을 반영한다.
실험 결과, 기존 음성-언어 모델에 비해 LLaMA-Omni는 내용과 스타일 모두에서 더 나은 응답을 제공하며, 응답 지연은 최소 236ms에 불과하다. 또한 LLaMA-Omni는 단 4개의 GPU로 3일 이내에 학습이 가능하여, 향후 효율적인 음성-언어 모델 개발의 길을 제시한다.

1 INTRODUCTION

대형 언어 모델(LLMs), 예를 들어 ChatGPT(OpenAI, 2022)와 같은 모델은 강력한 범용 작업 해결 도구로 자리 잡아, 대화형 상호작용을 통해 사람들의 일상생활을 지원할 수 있다. 그러나 현재 대부분의 LLM은 텍스트 기반 상호작용만 지원하기 때문에, 텍스트 입력과 출력이 적합하지 않은 상황에서는 활용이 제한된다. 최근 GPT-4o(OpenAI, 2024)의 등장으로 음성을 통해 LLM과 상호작용하는 것이 가능해졌으며, 사용자의 지시에 극도로 낮은 지연 시간으로 반응함으로써 사용자 경험을 크게 향상시켰다. 하지만 오픈소스 커뮤니티에서는 이러한 음성 상호작용 모델을 LLM 기반으로 구축하는 연구가 여전히 부족하다. 따라서 LLM과의 저지연·고품질 음성 상호작용을 어떻게 달성할 수 있을지가 시급히 해결해야 할 도전 과제이다.

LLM에 음성 상호작용 기능을 제공하는 가장 단순한 방법은 자동 음성 인식(ASR)과 텍스트-음성 합성(TTS) 모델을 기반으로 한 계단식(cascaded) 시스템을 사용하는 것이다. 이 경우 ASR 모델이 사용자의 음성 지시를 텍스트로 전사하고, 이후 LLM의 텍스트 응답을 TTS 모델이 음성으로 합성한다. 

  • 그러나 이러한 계단식 시스템은 음성 → 텍스트, 텍스트 응답, 음성 응답을 순차적으로 생성하기 때문에 전체 지연 시간이 길어지는 경향이 있다.

이에 반해, 최근에는 멀티모달 음성-언어 모델이 제안되었다(Zhang et al., 2023; Rubenstein et al., 2023). 이 모델들은 음성을 토큰으로 이산화(discretize)하여 LLM의 어휘에 포함시켜, 음성 입력과 출력을 직접 지원할 수 있도록 확장한다. 이론적으로는 이러한 모델들이 중간 텍스트를 생성하지 않고도 음성 지시로부터 곧바로 음성 응답을 생성할 수 있어 매우 낮은 응답 지연을 달성할 수 있다. 그러나 실제로는 음성→음성 직접 생성이 복잡한 매핑 문제를 수반하기 때문에 품질 확보가 어렵고, 따라서 품질을 높이기 위해 중간 텍스트를 생성하는 방식이 일반적이다(Zhang et al., 2023). 하지만 이는 응답 지연을 희생하는 결과를 초래한다.

이 논문에서는 저지연이면서도 고품질의 LLM 기반 음성 상호작용을 가능하게 하는 새로운 모델 아키텍처, LLaMA-Omni를 제안한다. LLaMA-Omni는 음성 인코더, 음성 어댑터, LLM, 스트리밍 음성 디코더로 구성된다. 

  • 사용자의 음성 지시는 음성 인코더와 어댑터를 거쳐 LLM에 입력되며, LLM은 음성을 텍스트로 전사하지 않고 곧바로 텍스트 응답을 생성한다. 
  • 한편, 스트리밍 음성 디코더는 비자동회귀(non-autoregressive) Transformer 구조로, LLM의 은닉 상태(hidden states)를 입력받아 연결주의적 시계열 분류(CTC; Graves et al., 2006a)를 통해 음성 응답에 해당하는 이산 단위 시퀀스를 예측한다. 
  • 출력으로 텍스트 토큰을 내기도 하는데, 이 텍스트 토큰을 정하기 위한 llm 히든스테이트를 입력으로 하여 음성 응답또한 동시에 생성한다는 것
  • 추론 과정에서 LLM이 텍스트 응답을 점진적으로 생성하는 동시에, 음성 디코더도 대응되는 음성 단위를 실시간으로 생성한다.

또한 음성 상호작용의 특성에 맞추기 위해, 우리는 기존 텍스트 지시 데이터를 재작성하고 이를 음성 합성하여 InstructS2S-200K라는 데이터셋을 새로 구축하였다. 실험 결과, LLaMA-Omni는 236ms라는 매우 낮은 지연 시간으로 동시에 고품질의 텍스트와 음성 응답을 생성할 수 있음을 확인하였다. 더 나아가 기존 SpeechGPT(Zhang et al., 2023)와 같은 음성-언어 모델 대비, 필요한 학습 데이터와 연산 자원이 크게 줄어들어 최신 LLM 기반의 강력한 음성 상호작용 모델을 효율적으로 개발할 수 있음을 보여주었다.

2 모델: LLaMA-Omni

이 절에서는 LLaMA-Omni의 모델 아키텍처를 소개한다. *그림 2(왼쪽)*에 나타난 것처럼, 모델은 음성 인코더, 음성 어댑터, LLM, 음성 디코더로 구성된다. 사용자의 음성 지시어, 텍스트 응답, 음성 응답을 각각 XSX_S, YTY_T, YSY_S라고 한다.

2.1 음성 인코더

우리는 Whisper-large-v3(Radford et al., 2023)의 인코더를 음성 인코더 EE로 사용한다. Whisper는 대규모 오디오 데이터로 학습된 범용 음성 인식 모델로, 의미 있는 음성 표현을 추출할 수 있다. 구체적으로, 사용자 음성 지시어 XSX_S는 인코더에 의해 표현 H=E(XS)H = E(X_S)로 변환되며, 이는 H=[h1,...,hN]H = [h_1, ..., h_N] 형태의 길이 NN인 음성 표현 시퀀스이다. 학습 전체 과정에서 음성 인코더의 파라미터는 고정(freeze)한다.

텍스트에서 bert 같은 개념 아닐까?

2.2 음성 어댑터

LLM이 입력된 음성을 이해할 수 있도록, 우리는 음성 표현을 LLM 임베딩 공간으로 매핑하는 학습 가능한 음성 어댑터 AA를 도입한다. Ma et al. (2024b)을 따라, 먼저 음성 표현 HH를 다운샘플링하여 시퀀스 길이를 줄인다. 즉, 연속된 kk개의 프레임을 피처 차원에서 연결(concatenate)하여

h'_i = h_{k(i-1)+1} \oplus h_{k(i-1)+2} \oplus \cdots \oplus h_{ki}

와 같은 방식으로 표현 H=[h1,...,hN/k]H' = [h'_1, ..., h'_{\lfloor N/k \rfloor}]을 얻는다.

이후 HH'는 두 개의 선형 계층과 ReLU 활성화를 거쳐 최종 음성 표현 SS로 변환된다:

S = A(H) = \text{Linear}(\text{ReLU}(\text{Linear}(\text{DownSample}(H))))

음성 입력을 -> whisper로 벡터화 -> 연속된 k개씩 묶어서 concat하여 개수 줄이고, 이를 linear-relu-linear adaptor을 통해 최종 음성 표현 S 만듬
k개씩 묶고/adaptor 쓰는 이유는, 음성 표현을 llm embedding 공간과 얼라인하기 위함인듯

2.3 대형 언어 모델 (LLM)

우리는 현재 공개된 최첨단 오픈소스 LLM인 Llama-3.1-8B-Instruct(Dubey et al., 2024)를 LLM MM으로 사용한다. 이 모델은 강력한 추론 능력을 갖추었고 인간 선호도에 잘 맞춰져 있다. 프롬프트 템플릿 P()P(\cdot)는 부록 A에 제시되어 있다.

음성 표현 시퀀스 SS는 프롬프트 내의 <speech> 위치에 삽입되어 전체 시퀀스 P(S)P(S)가 LLM에 입력된다. 이후 LLM은 음성 전사를 거치지 않고, 직접 텍스트 응답 YT=[y1T,...,yMT]Y_T = [y^T_1, ..., y^T_M]을 자기회귀적으로 생성하며, 교차 엔트로피 손실로 학습된다:

L_{LLM} = -\sum_{i=1}^M \log P(y^T_i \mid P(S), Y^T_{<i})

2.4 음성 디코더

음성 응답 YSY_S 생성을 위해 먼저 Zhang et al. (2023)을 따라 음성을 **이산 단위(discrete units)**로 변환한다. 구체적으로, 사전학습된 HuBERT(Hsu et al., 2021)로 연속 표현을 추출한 뒤 K-means로 클러스터 인덱스로 양자화한다. 연속으로 같은 인덱스가 반복되면 하나로 병합하여 최종 이산 단위 시퀀스

YU=[y1U,,yLU],yiU{0,1,,K1}, 1iLY_U = [y^U_1,\ldots,y^U_L],\quad y^U_i \in \{0,1,\ldots,K-1\},\ \forall\,1\le i\le L

를 얻는다. 여기서 KK는 클러스터 수, LL은 단위 시퀀스 길이이다. 이산 단위로부터 파형을 합성하기 위해, 우리는 단위 기반 HiFi-GAN 보코더(Polyak et al., 2021)를 사용한다. 이 보코더는 각 단위의 지속 시간을 예측해 반복(길이 확장)하여 운율을 모델링한 뒤, 파형을 생성한다.

텍스트와 음성을 동시에 생성하기 위해 LLM 뒤에 스트리밍 음성 디코더 DD를 추가한다. 이는 LLaMA(Dubey et al., 2024)와 동일한 구조의 Transformer 층들(각 층은 인과적 자기어텐션과 FFN 포함)로 이루어지며, 비자동회귀(non-autoregressive) 방식으로 동작한다. 디코더는 LLM에서 나온 출력 은닉 상태를 입력으로 받아 해당하는 이산 단위 시퀀스를 생성한다.

텍스트 응답에 대응하는 LLM의 출력 은닉 상태를 C=[c1,,cM]C=[c_1,\ldots,c_M]라 하자(여기서 cic_i는 프롬프트 P(S)P(S)와 현재까지의 텍스트 출력 Y<iTY^T_{<i}에 조건화되어 생성된 은닉 벡터). 각 은닉 상태를 업샘플링 비율 λ\lambda만큼 복제하여 길이 λ ⁣ ⁣M\lambda\!\cdot\!M의 시퀀스 Cb=[cˉ1,,cˉλM]C_b=[\bar c_1,\ldots,\bar c_{\lambda M}]를 만들고, cˉi=ci/λ\bar c_i=c_{\lfloor i/\lambda \rfloor}로 둔다. CbC_b를 디코더 DD에 넣어 출력 은닉 시퀀스 O=[o1,,oλM]O=[o_1,\ldots,o_{\lambda M}]를 얻는다.

데이터 세팅: 음성입력 -> (텍스트, 음성) 출력

  • 음성 입력 -> llm 히든 스페이스 -> 이를 단순 복제하여 Cb 만듬
    • “텍스트 hidden state 시퀀스(M)”만으로는 “음성 단위열(L)”을 표현하기에 길이가 부족합니다.
    • 그래서 업샘플링해서 조밀하게 만든다는 듯
  • Cb을 통해 음성 출력을 예측해야함
  • 음성 출력은 HuBERT로 양자화하고 클러스터링해서 Yu을 만듬
  • Cb와 Yu 사이를 학습해야하는데, 토큰수 및 음성수가 달라서 학습이 어려움
  • CTC을 통해 이를 얼라인하여 학습한다는 것
테스트 환경에서는 

  • Cb -> Speech decoder -> predicted Yu -> HiFi-GAN vocoder에 들어가서 음성이 되는 것 같음

Yu

  • 음성 'hello' 1초라고 하면
  • 음성을 20ms 단위 프레임으로 쪼갬 → 총 50프레임의 벡터가 생김
  • 코드북으로 가까운 discrete unit sequence으로 매핑
  • Yu = 연속된 같은것은 클러스터링

CTC로 어떻게 얼라인이 되나?

  • Cb을 Speech Decoder에 태우고 softmax을 취한다
  • Speech Decoder라는것은 Transformer deocder 구조라고함
  • 어쨌든 차원을 Yu에서 쓰이는 vocab 차원으로 맞춤 (정확히는 공백을 의미하는 토큰 e을 추가하여 K+1로 맞춤)
  • 아래 식에서는 이를 P(ai|O)라고 부르고, 이를 붕괴함수 β을 태워숴 Yu가 되는 경우에 대해 Loss가 계산됨
예를 들면

  • c1=[0.2,0.7],c2=[0.1,0.9],c3=[0.5,0.5]
  • C=[c1,c1,c1,c2,c2,c2,c3,c3,c3] 
  • A = argmax softmax(Speech decoder(C)) = [ϵ,H,H,ϵ,E,L,L,O,ϵ]
    • 실제로 학습때 argmax가 있는것은 아님
    • 공백제거 함수 β([ϵ,H,H,ϵ,E,L,L,O,ϵ]) 태운것이 label Yu와 같아지도록 학습됨
  • 즉 Yu=[H,E,L,O]라고 했을때 predicted A가 같도록 학습됨
    • 실제로 Yu가 나오기 위해서 A가 나올 alignment 경로는 엄청 많음
    • 모든 alignment 경로를 일일히 알아야 하는 것은 아니고, forward-backward 알고리즘으로 정답 [H,E,L,O]로 collapse될 수 있는 모든 alignment 경로의 확률을 합산할 수 있다고 함?
  • 만약 Yu가 같은게 없으면 loss = -log 0으로 가까워지게 되서 무한대로 가는 느낌임
Forward-Backward 알고리즘
  • 타겟 = [A, B] --> 확장된 타겟 Y' = [ϵ, A, ϵ, B, ϵ]

    • i=1: ϵ

    • i=2: A

    • i=3: ϵ

    • i=4: B

    • i=5: ϵ

  • α(t,i)=입력 step t까지 보고Y i번째 심볼까지 처리했을 누적 확률
  • α(t,i)=(α(t1,i)+α(t1,i1)+δ(i)α(t1,i2))P(yiot)
    • delta는 타겟이 [A,A]와 같은 경우는 A,e,A가 순서대로 나와야하므로 a(t-1,i-2)가 고려되면 안됨
  • 식으로 귀납식으로 계산해 나가는것
  • https://chatgpt.com/share/68a2e085-29f0-8009-b700-0885c3412e57

이때 CTC(Connectionist Temporal Classification)(Graves et al., 2006a)을 사용해 OO와 이산 단위 시퀀스 YUY_U를 정렬한다. CTC는 출력 어휘에 공백(blank) 토큰 ϵ\epsilon을 추가한다. 각 시점 ii에서의 출력 분포는 다음과 같다:

\text{(식 4)}\qquad P(a_i\mid O)=\operatorname{softmax}(W o_i + b)[a_i],\quad \forall\, a_i\in\{0,1,\ldots,K-1,\epsilon\},

여기서 WR(K+1)×dW\in \mathbb{R}^{(K+1)\times d}, bRK+1b\in \mathbb{R}^{K+1}는 선형층의 가중치와 바이어스이고, 정렬 시퀀스 A=[a1,,aλM]A=[a_1,\ldots,a_{\lambda M}]를 예측한다. 가변 길이 매핑을 모델링하기 위해, CTC는 붕괴 함수 β(A)\beta(A)를 도입한다. β\beta는 먼저 인접한 반복 토큰을 병합하고, 이어서 모든 공백 ϵ\epsilon을 제거한다. 예: β([1,1,2,ϵ,ϵ,2,3])=[1,2,2,3]\beta([1,1,2,\epsilon,\epsilon,2,3])=[1,2,2,3].

학습 시에는 가능한 모든 정렬에 대해 주변화(marginalization)를 수행한다:

\text{(식 5)}\qquad L_{\mathrm{CTC}} =-\log P(Y_U\mid O) =-\log \sum_{A\in \beta^{-1}(Y_U)} P(A\mid O) =-\log \sum_{A\in \beta^{-1}(Y_U)} \prod_{i=1}^{\lambda M} P(a_i\mid O).

여기서 β1(YU)\beta^{-1}(Y_U)β\beta를 적용하면 YUY_U가 되는 길이 λM\lambda M의 모든 정렬 집합이다. 정렬은 비자동회귀적으로 모델링된다. 추론 시에는

A\*=argmaxAP(AO)A^\*=\arg\max_A P(A\mid O)

를 선택하고, β(A\*)\beta(A^\*)를 적용해 최종 이산 단위 시퀀스를 얻어 이를 보코더에 넣어 파형을 합성한다.

2.5 학습 (Training)

그림 2(오른쪽)에 보이듯, 우리는 LLaMA-Omni 학습에 **2단계 학습 전략(two-stage training strategy)**을 채택한다.

  • 1단계(Stage 1): 텍스트 응답 생성 학습
    이 단계에서는 모델이 음성 지시어로부터 직접 텍스트 응답을 생성하도록 학습한다. 구체적으로, 음성 인코더는 고정(freeze)된 상태로 두고, 음성 어댑터와 LLM만 학습한다. 학습 목표는 식 (3)에서 정의된 LLLML_{LLM}이다. 이 단계에서는 음성 디코더는 학습에 참여하지 않는다.

  • 2단계(Stage 2): 음성 응답 생성 학습
    이 단계에서는 모델이 음성 응답을 생성하도록 학습한다. 이때 **음성 인코더, 음성 어댑터, LLM은 모두 고정(freeze)**시키고, 음성 디코더만 학습한다. 학습 목표는 식 (5)에서 정의된 LCTCL_{CTC}이다.

즉, LLaMA-Omni는 먼저 음성 지시어 → 텍스트 응답 학습을 거쳐 텍스트 생성 능력을 확보한 뒤, 그 위에서 음성 응답을 학습하는 구조를 따른다.

2.6 추론 (Inference)

추론 단계에서는 LLM이 음성 지시어를 기반으로 텍스트 응답을 자기회귀적으로(autoregressively) 생성한다.

동시에, 우리의 음성 디코더는 인과적(causal) 어텐션을 사용하기 때문에, LLM이 텍스트 응답의 접두(prefix) YiTY^T_{\leq i}를 생성하면, 해당 부분에 대응하는 업샘플된 은닉 상태 CbλiC_b^{\leq \lambda \cdot i}를 음성 디코더에 바로 입력할 수 있다. 이렇게 하면 부분 정렬 AλiA_{\leq \lambda \cdot i}를 얻을 수 있고, 이 정렬은 곧 해당 텍스트 접두사에 대응하는 이산 음성 단위 시퀀스를 만들어낸다.

또한, **스트리밍 음성 합성(streaming synthesis)**을 가능하게 하기 위해, 생성된 이산 단위의 개수가 미리 정의된 최소 청크 크기 Ω\Omega에 도달하면, 그 단위 구간을 보코더에 입력하여 부분 음성 파형을 합성하고 즉시 사용자에게 재생한다. 따라서 사용자는 전체 텍스트 응답이 다 생성될 때까지 기다릴 필요 없이 곧바로 음성 출력을 들을 수 있으며, 응답 지연(latency)은 텍스트 응답의 길이에 영향을 받지 않는다. 이 과정은 알고리즘 1에 설명되어 있다.

추가적으로, 음성 디코더는 비자동회귀(non-autoregressive) 모델링을 사용하기 때문에, 각 텍스트 토큰 yiTy^T_i에 해당하는 정렬 Aλ(i1)+1:λiA_{\lambda \cdot (i-1)+1:\lambda \cdot i}가 청크 내에서 병렬적으로 생성된다. 따라서 텍스트와 음성을 동시에 생성하는 경우와 텍스트만 생성하는 경우의 디코딩 속도는 큰 차이가 없다.





















Reference

댓글