오디오 트랜스포머(Audio Transformers) — Whisper 구조

오디오(Audio)는 시간에 따른 주파수 이미지(frequency image)입니다. Whisper는 멜 스펙트로그램(mel spectrogram)을 입력으로 먹고 텍스트(text)로 답하는 ViT입니다.

유형: Learn 언어: Python 선수 지식: Phase 7 · 05 (Full Transformer), Phase 7 · 08 (Encoder-Decoder), Phase 7 · 09 (ViT) 예상 시간: 약 45분

문제

Whisper(OpenAI, Radford et al. 2022) 이전의 최신 자동 음성 인식(state-of-the-art automatic speech recognition; ASR)은 wav2vec 2.0과 HuBERT가 주류였습니다. 자기지도 특징 추출기(self-supervised feature extractor)에 파인튜닝된 헤드(fine-tuned head)를 붙이는 방식이었습니다. 품질은 높지만 데이터 파이프라인(data pipeline)이 비싸고 도메인(domain)에 취약했습니다. 다국어 음성 인식(multilingual speech recognition)은 언어 계열(language family)별로 별도 모델이 필요했습니다.

Whisper는 세 가지에 걸었습니다.

  1. 모든 데이터로 학습한다. 97개 언어에 걸쳐 인터넷에서 수집한 약하게 라벨링된 오디오(weakly-labeled audio) 680,000시간을 사용했습니다. 깨끗한 학술 말뭉치(academic corpus)도, 음소 라벨(phoneme label)도 필요 없었습니다.
  2. 멀티태스크 단일 모델(multi-task single model). 하나의 디코더(decoder)를 전사(transcription), 번역(translation), 음성 활동 감지(voice activity detection), 언어 식별(language ID), 타임스탬프 생성(timestamping)에 공동으로 학습시켰습니다. 과제 토큰(task token)으로 동작을 제어합니다.
  3. 표준 인코더-디코더 트랜스포머(standard encoder-decoder transformer). 인코더는 로그-멜 스펙트로그램(log-mel spectrogram)을 입력으로 받고, 디코더는 텍스트 토큰(text token)을 자기회귀적으로(autoregressively) 생성합니다. 보코더(vocoder)도, CTC도, HMM도 없습니다.

그 결과 Whisper large-v3는 다양한 억양(accent), 잡음(noise), 깨끗한 라벨 데이터가 전혀 없는 언어에서도 견고하게(robust) 동작합니다. 2026년 기준 거의 모든 오픈소스 음성 비서(open-source voice assistant)와 많은 상용 음성 비서의 기본 음성 프런트엔드(speech front-end)로 자리 잡았습니다.

사전 테스트

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

1.Whisper는 별도의 모델 헤드 없이 전사(transcription), 번역(translation), 언어 식별(language ID) 등 수행할 과제를 어떻게 제어하나요?

2.Whisper에서 사용하는 로그-멜 스펙트로그램(log-mel spectrogram)은 오디오 처리 맥락에서 무엇을 나타내나요?

0/2 답변 완료

개념

whisper — encoder-decoder for speech recognition audio @ 16 kHz, 30 s window log-mel: 80 bins × 3000 frames conv1d × 2 stride 2 → 1500 encoder transformer (24 layers for large) self-attention + GELU FFN + sinusoidal positional encoding output: 1500 × 1280 hidden states <|startoftranscript|> <|en|> <|transcribe|> task tokens — 4-token prefix controls behavior decoder transformer masked self-attn + cross-attn to encoder + FFN 32 layers (large) or 4 layers (turbo) BPE vocabulary: GPT-2 + audio specials beam search width 5 at inference cross-attn "attention is all you need" encoder runs once. decoder runs autoregressively. task token decides transcribe vs translate.

Step 1 — 리샘플링(resample) + 윈도잉(window)

오디오를 16 kHz로 맞춥니다. 30초 길이에 맞게 자르거나 패딩(clip/pad)합니다. 그런 다음 로그-멜 스펙트로그램을 계산합니다. 멜 빈(mel bin) 80개와 10 ms 보폭(stride)을 쓰면 약 3,000개 프레임(frame) × 80개 특성(feature) 행렬이 만들어집니다. 이것이 바로 Whisper가 보는 "입력 이미지(input image)"입니다.

Step 2 — 합성곱 스템(convolutional stem)

커널(kernel) 크기 3, 보폭(stride) 2의 Conv1D 계층 두 개가 3,000개 프레임을 1,500개로 줄입니다. 파라미터(parameter)를 많이 늘리지 않으면서 시퀀스 길이(sequence length)를 절반으로 줄이는 역할입니다.

Step 3 — 인코더(encoder)

라지(large) 모델 기준으로 24-계층 트랜스포머 인코더가 1,500개 타임스텝(timestep)을 처리합니다. 사인파 위치 인코딩(sinusoidal positional encoding), 셀프 어텐션(self-attention), GELU 활성화의 FFN을 사용해 1,500 × 1,280 크기의 은닉 상태(hidden state)를 만들어냅니다.

Step 4 — 디코더(decoder)

24-계층 트랜스포머 디코더는 GPT-2 어휘의 상위 집합(superset)에 오디오 전용 특수 토큰(audio-specific special token) 몇 개를 더한 BPE 어휘(vocabulary)에서 토큰을 자기회귀적으로 생성합니다.

Step 5 — 과제 토큰(task token)

디코더 프롬프트(decoder prompt)는 모델에게 무엇을 할지 알려주는 제어 토큰(control token)으로 시작합니다.

<|startoftranscript|>  <|en|>  <|transcribe|>  <|0.00|>

또는:

<|startoftranscript|>  <|fr|>  <|translate|>   <|0.00|>

모델은 이 관례(convention)에 맞춰 학습되었습니다. 접두사(prefix)만으로 과제를 제어합니다. 음성에 적용된 2026년판 명령어 튜닝(instruction-tuning)에 가깝습니다.

Step 6 — 출력(output)

너비(width) 5의 빔 서치(beam search)와 로그 확률 임계값(log-prob threshold)을 사용합니다. <|notimestamps|> 토큰이 없으면 오디오의 0.02초 단위마다 타임스탬프(timestamp)가 예측됩니다.

Whisper 모델 크기

ModelParamsLayersd_modelHeadsVRAM (fp16)
Tiny39M43846~1 GB
Base74M65128~1 GB
Small244M1276812~2 GB
Medium769M24102416~5 GB
Large1550M32128020~10 GB
Large-v31550M32128020~10 GB
Large-v3-turbo809M32128020~6 GB (4-layer decoder)

Large-v3-turbo(2024)는 디코더 계층 수를 32개에서 4개로 줄였습니다. 단어 오류율(WER) 회귀는 1 포인트 미만이지만 디코딩(decoding) 속도는 8배 빨라졌습니다. 이 디코딩 속도 향상이 2026년 실시간 음성 에이전트(real-time voice agent)의 기본값이 된 이유입니다.

Whisper가 하지 않는 것

  • 화자 분리(diarization), 즉 누가 말하고 있는지는 식별하지 못합니다. 이 작업은 pyannote와 짝지어 사용합니다.
  • 자체 실시간 스트리밍(real-time streaming)은 지원하지 않습니다. 30초 윈도우가 고정되어 있기 때문입니다. faster-whisper, WhisperX 같은 래퍼(wrapper)가 VAD와 오버랩(overlap) 처리로 스트리밍을 덧붙입니다.
  • 외부 청킹(external chunking) 없이는 30초를 넘는 긴 형식의 문맥(long-form context)을 다루지 못합니다. 다만 인간의 말은 전사(transcription)할 때 긴 문맥을 거의 필요로 하지 않아 실제로는 잘 동작합니다.

2026년 음성 인식 지형도(landscape)

과제(Task)모델(Model)메모(Notes)
영어 ASRWhisper-turbo, MoonshineMoonshine은 엣지(edge) 환경에서 4배 빠릅니다
다국어 ASRWhisper-large-v397개 언어 지원
스트리밍 ASRfaster-whisper + VAD150 ms 지연(latency) 목표 달성 가능
TTSPiper, XTTS-v2, KokoroWhisper 형태의 인코더-디코더 패턴(encoder-decoder pattern)
오디오 + 언어AudioLM, SeamlessM4T텍스트 토큰과 오디오 토큰을 하나의 트랜스포머에서 처리

직접 만들기

code/main.py를 살펴봅니다. 여기서는 Whisper 자체를 학습하지는 않습니다. 실제 운영(production)에서 직접 다루게 되는 로그-멜 스펙트로그램 파이프라인과 과제 토큰 프롬프트 포매터(task-token prompt formatter)를 만듭니다.

Step 1: 오디오 합성

16 kHz로 샘플링한 440 Hz 사인파(sine wave) 1초짜리 신호를 만듭니다. 샘플(sample) 수는 16,000개가 됩니다.

Step 2: 로그-멜 스펙트로그램(단순화 버전)

전체(full) 멜 스펙트로그램은 고속 푸리에 변환(FFT)이 필요합니다. 여기서는 librosa 없이 파이프라인의 흐름을 보여주기 위해 프레이밍(framing)과 프레임당 에너지(per-frame energy) 버전을 사용합니다.

def frame_signal(x, frame_size=400, hop=160):
    frames = []
    for start in range(0, len(x) - frame_size + 1, hop):
        frames.append(x[start:start + frame_size])
    return frames

프레임 길이는 25 ms, 보폭(hop)은 10 ms입니다. Whisper의 윈도잉(windowing)과 동일합니다. 프레임당 에너지는 교육적 설명을 위해 멜 빈을 대체하는 대용물(stand-in) 역할을 합니다.

Step 3: 30초로 패딩(pad)

Whisper는 언제나 30초 청크(chunk) 단위로 입력을 처리합니다. 스펙트로그램을 3,000 프레임에 맞춰 패딩하거나 잘라냅니다.

Step 4: 프롬프트 토큰 구성

def whisper_prompt(lang="en", task="transcribe", timestamps=True):
    tokens = ["<|startoftranscript|>", f"<|{lang}|>", f"<|{task}|>"]
    if not timestamps:
        tokens.append("<|notimestamps|>")
    return tokens

이 4개 토큰짜리 접두사가 과제를 제어하는 전체 인터페이스(task-control surface)입니다.

사용해보기

import whisper
model = whisper.load_model("large-v3-turbo")
result = model.transcribe("meeting.wav", language="en", task="transcribe")
print(result["text"])
print(result["segments"][0]["start"], result["segments"][0]["end"])

더 빠르면서 OpenAI 호환(OpenAI-compatible) 방식입니다.

from faster_whisper import WhisperModel
model = WhisperModel("large-v3-turbo", compute_type="int8_float16")
segments, info = model.transcribe("meeting.wav", vad_filter=True)
for s in segments:
    print(f"{s.start:.2f} - {s.end:.2f}: {s.text}")

2026년에 Whisper를 고르는 경우:

  • 하나의 모델로 다국어 ASR을 처리해야 할 때.
  • 잡음과 억양이 다양한 오디오를 견고하게 전사해야 할 때.
  • 연구나 시제품(prototype) 단계의 ASR에서 가장 빠르게 시작하고 싶을 때.

다른 선택지가 더 나은 경우:

  • 엣지에서 초저지연(ultra-low latency) 스트리밍이 필요하다면 Moonshine이 동등한 품질에서 더 빠릅니다.
  • 실시간 대화형 AI(real-time conversational AI)에서 200 ms 미만 응답이 필요하다면 전용 스트리밍 ASR이 필요합니다.
  • 화자 분리(speaker diarization)가 필요하다면 Whisper만으로는 부족하고 pyannote를 함께 사용해야 합니다.

산출물 만들기

outputs/skill-asr-configurator.md를 봅니다. 이 스킬(skill)은 새로운 음성 애플리케이션(speech application)에 맞는 ASR 모델, 디코딩 파라미터(decoding parameter), 전처리 파이프라인(preprocessing pipeline)을 선택해 줍니다.

연습문제

  1. 쉬움. code/main.py를 실행합니다. 16 kHz, 10 ms 보폭(hop) 조건에서 1초 신호의 프레임 수가 약 100개인지 확인합니다. 30초 신호에서는 약 3,000개 프레임이 나옵니다.
  2. 중간. numpy.fft를 사용해 전체 로그-멜 스펙트로그램을 직접 만들어 봅니다. librosa.feature.melspectrogram(n_mels=80)의 결과와 수치 오차(numerical error) 범위 안에서 일치하는지 검증합니다.
  3. 어려움. 스트리밍 추론(streaming inference)을 구현합니다. 오디오를 2초 오버랩이 있는 10초 윈도우로 나누고 각 청크에서 Whisper를 실행한 뒤 전사 결과를 병합합니다. 5분 길이의 팟캐스트(podcast) 샘플에서 한 번에 처리한 결과 대비 단어 오류율(WER)을 측정합니다.

핵심 용어

용어흔한 설명실제 의미
멜 스펙트로그램(Mel spectrogram)"오디오 이미지"한 축에는 주파수 빈(frequency bin), 다른 축에는 시간 프레임(time frame)이 놓인 2D 표현이다. 각 셀은 로그 스케일의 에너지값이다.
로그-멜(Log-mel)"Whisper가 보는 것"멜 스펙트로그램에 로그를 적용한 결과이다. 사람이 큰 소리(loudness)를 지각하는 방식에 더 가깝다.
프레임(Frame)"하나의 시간 조각"25 ms 길이의 샘플 윈도우이다. 10 ms 보폭으로 겹치며 추출된다.
과제 토큰(Task token)"음성용 프롬프트 접두사"디코더 프롬프트에 들어가는 `<
음성 활동 감지(Voice Activity Detection; VAD)"말하는 구간 찾기"무음을 제거하는 게이트(gate)이다. ASR 비용을 크게 줄여 준다.
CTC"Connectionist Temporal Classification"정렬 없이 학습하는 고전적 ASR 손실 함수이다. Whisper는 사용하지 않는다.
Whisper-turbo"작은 디코더, 그대로의 인코더"large-v3 인코더에 4-계층 디코더를 결합한 구조이다. 디코딩이 8배 빠르다.
Faster-whisper"운영용 래퍼"CTranslate2 기반 재구현체이다. int8 양자화(quantization)를 지원하며 OpenAI 레퍼런스 대비 4배 빠르다.

더 읽을거리

실습 코드

이 강의의 실습 코드 1개

main
Code

산출물

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

asr-configurator

Pick an ASR model (Whisper variant / Moonshine / faster-whisper) and decoding parameters for a new speech pipeline.

Skill

확인 문제

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

1.Whisper large-v3-turbo는 인코더는 유지하면서 디코더 레이어를 32개에서 4개로 줄였습니다. 이 절충이 실시간 음성 에이전트(voice agent)에서 잘 작동하는 이유는 무엇인가요?

2.실시간 스트리밍 전사가 필요하지만 Whisper는 고정된 30초 청크(chunk)로 처리합니다. 이 제약을 해결하는 방법은 무엇인가요?

3.Whisper의 합성곱 스템(convolutional stem)은 스트라이드(stride) 2인 Conv1D 레이어 두 개를 사용합니다. 이 설계의 주된 목적은 무엇인가요?

0/3 답변 완료

추가 문제 풀기

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