Omni 모델: Qwen2.5-Omni와 Thinker-Talker 분리

2024년 5월 GPT-4o의 제품 데모가 충격적이었던 이유는 밑바탕 모델 자체보다 제품 형태 때문이었습니다. 사용자가 말하면 모델이 카메라가 보는 것을 함께 보고, 250ms 미만으로 다시 말해 주는 음성 인터페이스였습니다. 공개 생태계(open ecosystem)는 2024년과 2025년 내내 그 제품 형태에 도달하기 위해 달려왔습니다. Qwen2.5-Omni(2025년 3월)는 대표적인 공개 설계입니다. 큰 텍스트 생성 트랜스포머(transformer)인 Thinker와 병렬 음성 생성 트랜스포머인 Talker를 두고, 둘을 스트리밍 음성 토큰(streaming speech tokens)으로 연결합니다. Mini-Omni는 이 구조를 단순화했고, Moshi는 지연 시간(latency)을 맞췄으며, GLM-4-Voice는 중국어로 확장했습니다. 이 강의에서는 Thinker-Talker 아키텍처와, 실시간 스트리밍 대화를 가능하게 하는 지연 시간 예산을 함께 읽어 봅니다.

유형: Build 언어: Python (표준 라이브러리, 스트리밍 파이프라인 지연 시간 시뮬레이터 + VAD 루프) 선수 지식: Phase 12 · 19 (오디오 LLM), Phase 12 · 16 (임의 모달리티 간 변환(any-to-any)) 예상 시간: 약 180분

학습 목표

  • 추론 파이프라인을 Thinker(텍스트 추론)와 Talker(음성 합성)로 나누고, 병렬 스트리밍이 왜 작동하는지 설명합니다.
  • 대화형 상호작용의 첫 오디오 바이트까지 걸리는 시간(Time-to-First-Audio-Byte; TTFAB)을 구성 요소별로 계산합니다.
  • Thinker 안에서 비전, 오디오, 텍스트를 시간 정렬하는 TMRoPE의 위치 인코딩(position encoding)을 설명합니다.
  • 세 가지 실시간 대화 패턴인 반이중(half-duplex), 턴테이킹(turn-taking), 전이중(full-duplex)을 말할 수 있습니다.

문제

실시간 음성 비서는 많은 일을 빠르게 해야 합니다.

  1. 사용자의 말을 듣습니다. 실시간 음성 토큰화(speech tokenization)와, 사용자가 말을 끝냈는지 알기 위한 음성 활동 감지(Voice Activity Detection; VAD)가 필요합니다.
  2. 선택적으로 봅니다. 카메라 입력을 초당 2~4 프레임(2-4 FPS)으로 받아 오디오와 함께 Thinker로 스트리밍합니다.
  3. 생각합니다. 대화 이력(conversation history)에 조건을 둔 응답을 구성합니다.
  4. 말합니다. 오디오 토큰을 합성하고, 파형(waveform)으로 디코딩한 뒤, 사용자의 스피커로 스트리밍합니다.

각 단계마다 지연 시간이 더해집니다. 대화처럼 자연스럽게 느껴지려면 전체 왕복 시간이 500ms 미만이어야 하고, 그 아래에서는 사용자가 지연을 거의 의식하지 않습니다. GPT-4o는 약 250ms를 표방합니다. Moshi는 약 160ms이고, Qwen2.5-Omni는 약 350~500ms 수준입니다.

모든 구성 요소가 스트리밍되어야 합니다. "전부 묶어 처리한 뒤(batch) 마지막에 디코딩"하는 구조로는 안 됩니다.

사전 테스트

2문제 · 이 강의를 시작하기 전에 얼마나 알고 있는지 확인해보세요

1.옴니 사고자-화자 모델가 해결하는 핵심 과제는?

2.옴니 사고자-화자 모델 이전의 주요 한계는?

0/2 답변 완료

개념

Thinker와 Talker

Qwen2.5-Omni의 구성 요소 분해는 다음과 같습니다.

  • Thinker: 7B~80B 규모의 텍스트 생성 트랜스포머입니다. 텍스트 + 이미지 + 오디오 토큰이 섞여 들어오는 입력을 받아, 무엇을 말할지를 나타내는 텍스트 토큰을 출력합니다.
  • Talker: 더 작은 음성 생성 트랜스포머이며 보통 200M~1B 규모입니다. Thinker의 텍스트 출력 토큰과 최근 음성 문맥 토큰(speech-context tokens)을 받아, 이산 음성 토큰(discrete speech tokens), 즉 잔차 벡터 양자화(residual-VQ) 인덱스를 출력합니다.
  • 음성 디코더(speech decoder): SNAC, MoVQGAN 계열의 스트리밍 파형 디코더로, 음성 토큰을 받아 실시간으로 오디오 샘플을 만듭니다.

이 분리가 핵심입니다. Thinker는 좋은 추론을 위해 커야 합니다. Talker는 텍스트를 음성 토큰으로 바꾸는 국소적인 역할(local job)만 맡으므로 작아도 충분합니다. 오히려 Talker가 커진다고 표현력이 좋아지지는 않고, 대개 더 느려집니다.

둘을 병렬로 실행하면 다음과 같은 흐름이 됩니다.

  1. Thinker가 텍스트 토큰 t_i를 출력합니다.
  2. Talker가 스트리밍 방식으로 t_i를 받아 음성 토큰 s_i, s_{i+1}, ..., s_{i+k}를 출력합니다.
  3. 음성 디코더는 음성 토큰이 들어오는 즉시 받아서 오디오 샘플로 변환합니다.
  4. Thinker가 텍스트 토큰 t_{i+3}까지 진행했을 때, Talker는 이미 t_0..t_{i+2}에 해당하는 오디오를 스트리밍하고 있습니다.

TMRoPE — 시간 정렬 멀티모달 위치 인코딩

Thinker는 이미지 프레임, 오디오 프레임, 대화 이력의 텍스트를 한꺼번에 통합해야 합니다. 예를 들어 이미지 프레임은 초당 4프레임(4 FPS)으로 들어오고, 오디오 프레임은 초당 50프레임으로 들어옵니다. 순진하게 "모든 이미지를 먼저, 그다음 모든 오디오, 그다음 텍스트" 순서로 나열하면 시간 정렬(temporal alignment)이 사라집니다.

TMRoPE는 모든 토큰에 절대 타임스탬프(absolute timestamp)를 부여합니다. t=2.3s의 비전 토큰, t=2.32s의 오디오 토큰, 사용자의 "멈춰"라는 텍스트 토큰은 t=2.35s에 함께 놓일 수 있습니다. RoPE는 타임스탬프에 따라 어텐션을 회전시키고, 모델은 이 토큰들이 시간적으로 동시에 일어난 것처럼 인식합니다.

이것이 "사용자가 안녕이라고 말하면서 손을 흔들었다" 같은 상황을 처리하기 위한 기반입니다. 모델은 같은 개념적 순간의 비디오 프레임과 오디오를 함께 볼 수 있게 됩니다.

스트리밍 음성 합성

음성 토큰은 반드시 스트리밍되어야 합니다. Mini-Omni(Xie & Wu, 2024)는 "언어 모델이 듣고, 생각하면서 동시에 말할 수 있다"는 스트리밍 구조를 도입했습니다. Thinker가 출력하는 토큰과 Talker가 출력하는 토큰이 같은 시퀀스 안에서 서로 교차합니다. Talker는 Thinker가 다음 텍스트 토큰을 확정하는 즉시 동작하며, 따로 묶어서 처리하는 배치 경계(batch boundaries)가 없습니다.

Moshi(Défossez et al., 2024년 10월)는 가장 빠른 공개 구현입니다. 단일 A100에서 160ms TTFAB를 달성합니다. 구조는 텍스트 토큰과 음성 토큰을 번갈아 출력하는 하나의 7B 트랜스포머이며, 사고 스트림(thinking stream)과 발화 스트림(speaking stream)을 분리하는 "내적 독백(inner monologue)" 설계를 가집니다. 이는 사실상 Thinker와 Talker를 하나의 모델로 융합한 뒤, 세심하게 학습한 구조입니다.

VAD와 턴테이킹(turn-taking)

음성 활동 감지는 입력 쪽에서 동작합니다. 두 가지 패턴이 있습니다.

  • 반이중(half-duplex): 사용자가 말할 때 모델은 듣고, 모델이 말할 때 사용자는 듣습니다. 보통 약 200ms의 침묵을 감지해 턴을 명확히 넘겨줍니다.
  • 전이중(full-duplex): 양쪽이 동시에 말할 수 있습니다. 모델이 "음, 그렇군요" 같은 추임새(backchannel; 백채널)를 하거나 사용자의 말 중간에 끼어들 수 있습니다. 구현 난도는 훨씬 높으며, Moshi는 이를 지원합니다.

Qwen2.5-Omni는 기본적으로 반이중을 지원하고, 침묵 임계값(silence threshold)을 통해 턴테이킹을 처리합니다. 전이중은 애플리케이션 계층(application layer)에서 별도 처리가 필요합니다.

Qwen3-Omni(2025년 11월)

후속 모델입니다. Qwen3-80B Thinker, 더 큰 Talker, 개선된 TMRoPE-v2를 사용합니다. 지연 시간은 GPT-4o의 250ms 수준에 가깝고, 가중치(weights)도 공개되어 있습니다. OmniBench 평가에서는 Gemini 2.0 Live와 경쟁할 만한 결과를 보입니다.

프로덕션 지연 시간 예산

일반적인 스트리밍 상호작용의 예산은 다음과 같습니다.

  • 마이크 -> 오디오 토큰: 40~80ms
  • 프리필(prefill, 프롬프트 + 이력): 7B에서는 100~200ms, 70B에서는 훨씬 더 큼
  • 첫 Thinker 텍스트 토큰: 40ms
  • Talker가 첫 텍스트 토큰을 처리: 20ms
  • 첫 음성 토큰 확정: 40ms
  • 잔차 벡터 양자화(residual-VQ) 디코딩: 30ms
  • 음성 파형 디코딩: 50~80ms

전체 TTFAB는 7B에서 320510ms, 70B에서 600900ms 수준입니다. 최전선 수준의 품질은 보통 70B 이상을 의미하기 때문에, 최전선 모델일수록 지연 시간 격차가 발생합니다.

토큰 속도 계산

16 kHz 음성과 초당 50회(50 Hz) 기본 음성 토큰을 사용하면, 출력 1초당 50개의 음성 토큰이 필요합니다. Talker는 실시간을 따라가기 위해 초당 50토큰 이상을 출력해야 합니다. H100에서 일반적인 LLM 처리량이 초당 3080토큰(tok/s)이라면, 작은 200300M 규모의 Talker는 충분히 빠릅니다. 반면 7B 규모의 Talker는 따라가지 못하고 뒤처질 수 있습니다.

이것이 바로 "그냥 메인 모델 하나를 쓰면 되지 않을까"가 아니라, 작고 전용화된 Talker 모델을 따로 두는 이유입니다.

사용해보기

code/main.py는 다음 기능을 포함합니다.

  • 모의 토큰 출력 속도를 갖는 Thinker-Talker 파이프라인을 시뮬레이션합니다.
  • 설정 가능한 모델 크기와 마이크 샘플링 레이트(sample rate)에 대해 TTFAB를 계산합니다.
  • VAD 침묵 임계값을 사용해 반이중 턴테이킹을 시연합니다.

산출물 만들기

이 강의는 outputs/skill-omni-streaming-budget.md를 만듭니다. 실시간 음성 제품의 목표 TTFAB와 기능 세트(비전 입력, 이중언어 지원, 전이중)가 주어지면, Qwen2.5-Omni, Qwen3-Omni, Moshi, Mini-Omni 중 무엇을 쓸지 고르고 Thinker와 Talker의 크기를 정해 줍니다.

연습문제

  1. 목표 TTFAB가 300ms라고 가정합니다. 7B Thinker와 300M Talker에서 각 구성 요소의 지연 시간을 모두 써 봅니다.

  2. Qwen2.5-Omni는 TMRoPE를 사용합니다. 사용자가 t=1s에 말하기 시작하고 카메라가 t=1.2s에 제스처를 잡은 프롬프트에서, 모델이 어떤 토큰들을 보는지 설명합니다.

  3. 전이중을 지원하려면 모델이 듣는 동시에 오디오를 출력할 수 있어야 합니다. 이런 능력을 가르치기 위한 학습 데이터 형식을 제안해 봅니다.

  4. Moshi 논문의 4절(Section 4)을 읽고, "내적 독백" 분리가 무엇이며 왜 Thinker-Talker 분리 구조를 피할 수 있게 하는지 설명합니다.

  5. 처리량 예산을 계산해 봅니다. 16 kHz 음성에서 초당 50개의 기본 계층 토큰(base-layer tokens/sec)을 따라가려면 Talker가 얼마나 빠르게 토큰을 출력해야 합니까?

핵심 용어

용어흔한 설명실제 의미
Thinker"추론 두뇌"무엇을 말할지 생성하는 큰 텍스트 생성 트랜스포머
Talker"음성 생성 입"Thinker의 텍스트에서 이산 음성 토큰을 생성하는 작은 트랜스포머
TTFAB(Time-to-First-Audio-Byte)"지연 시간 예산"사용자 발화 종료부터 첫 오디오 샘플 출력까지 걸리는 시간
TMRoPE"시간 정렬 RoPE"비전, 오디오, 텍스트 전반에서 절대 타임스탬프를 사용하는 위치 인코딩
반이중(Half-duplex)"턴테이킹"사용자와 모델이 번갈아 말하며, VAD 침묵으로 사용자 발화 종료를 감지하는 방식
전이중(Full-duplex)"동시 발화"모델이 듣고 말하는 일을 동시에 할 수 있으며 백채널이 가능한 방식
내적 독백(Inner monologue)"Moshi 분리"사고 스트림과 발화 스트림을 하나의 모델 안에서 끼워 넣는 설계

더 읽을거리

실습 코드

이 강의의 실습 코드 1개

main
Code

산출물

이 강의에서 생성된 프롬프트, 스킬, 코드 산출물 1개

omni-streaming-budget

Size a Thinker-Talker streaming voice pipeline (Qwen-Omni / Moshi / Mini-Omni) for a target TTFAB and feature set.

Skill

확인 문제

3문제 · 모두 맞추면 완료 표시가 가능합니다

1.프로덕션에서 옴니 사고자-화자 모델의 가장 중요한 설계 원칙은?

2.옴니 사고자-화자 모델가 올바른 선택이 아닌 경우는?

3.옴니 사고자-화자 모델는 AI 생태계에 어떻게 들어맞나요?

0/3 답변 완료

추가 문제 풀기

AI가 강의 내용을 바탕으로 새로운 문제를 생성합니다