오디오(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는 세 가지에 걸었습니다.
모든 데이터로 학습한다. 97개 언어에 걸쳐 인터넷에서 수집한 약하게 라벨링된 오디오(weakly-labeled audio) 680,000시간을 사용했습니다. 깨끗한 학술 말뭉치(academic corpus)도, 음소 라벨(phoneme label)도 필요 없었습니다.
멀티태스크 단일 모델(multi-task single model). 하나의 디코더(decoder)를 전사(transcription), 번역(translation), 음성 활동 감지(voice activity detection), 언어 식별(language ID), 타임스탬프 생성(timestamping)에 공동으로 학습시켰습니다. 과제 토큰(task token)으로 동작을 제어합니다.
표준 인코더-디코더 트랜스포머(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 답변 완료
개념
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)으로 시작합니다.
모델은 이 관례(convention)에 맞춰 학습되었습니다. 접두사(prefix)만으로 과제를 제어합니다. 음성에 적용된 2026년판 명령어 튜닝(instruction-tuning)에 가깝습니다.
Step 6 — 출력(output)
너비(width) 5의 빔 서치(beam search)와 로그 확률 임계값(log-prob threshold)을 사용합니다. <|notimestamps|> 토큰이 없으면 오디오의 0.02초 단위마다 타임스탬프(timestamp)가 예측됩니다.
Whisper 모델 크기
Model
Params
Layers
d_model
Heads
VRAM (fp16)
Tiny
39M
4
384
6
~1 GB
Base
74M
6
512
8
~1 GB
Small
244M
12
768
12
~2 GB
Medium
769M
24
1024
16
~5 GB
Large
1550M
32
1280
20
~10 GB
Large-v3
1550M
32
1280
20
~10 GB
Large-v3-turbo
809M
32
1280
20
~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)
영어 ASR
Whisper-turbo, Moonshine
Moonshine은 엣지(edge) 환경에서 4배 빠릅니다
다국어 ASR
Whisper-large-v3
97개 언어 지원
스트리밍 ASR
faster-whisper + VAD
150 ms 지연(latency) 목표 달성 가능
TTS
Piper, XTTS-v2, Kokoro
Whisper 형태의 인코더-디코더 패턴(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) 버전을 사용합니다.
이 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)을 선택해 줍니다.
연습문제
쉬움.code/main.py를 실행합니다. 16 kHz, 10 ms 보폭(hop) 조건에서 1초 신호의 프레임 수가 약 100개인지 확인합니다. 30초 신호에서는 약 3,000개 프레임이 나옵니다.
중간.numpy.fft를 사용해 전체 로그-멜 스펙트로그램을 직접 만들어 봅니다. librosa.feature.melspectrogram(n_mels=80)의 결과와 수치 오차(numerical error) 범위 안에서 일치하는지 검증합니다.
어려움. 스트리밍 추론(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배 빠르다.