- Whisper๋ OpenAI๊ฐ ๊ณต๊ฐํ ๋ฒ์ฉ ์์ฑ ์ธ์(ASR) ๋ชจ๋ธ
- 680,000์๊ฐ์ ๋ค๊ตญ์ด ์น ์ค๋์ค ๋ฐ์ดํฐ๋ก ํ์ต๋ Transformer ๊ธฐ๋ฐ Encoder-Decoder ๋ชจ๋ธ
- 99๊ฐ ์ธ์ด์ ์ ์ฌ(transcription), ์์ด ๋ฒ์ญ(translation), ์ธ์ด ๊ฐ์ง(language detection)๋ฅผ ๋จ์ผ ๋ชจ๋ธ๋ก ์ํํ๋ ๋ฉํฐํ์คํฌ ์ํคํ ์ฒ
- whisper.cpp๋ฅผ ํตํด ๋ชจ๋ฐ์ผยท์ฃ์ง ๊ธฐ๊ธฐ์์ ์จ๋๋ฐ์ด์ค ์ถ๋ก ์ด ๊ฐ๋ฅํ ๊ฒฝ๋ ๋ฐฐํฌ ๋ชจ๋ธ
- STT(Speech-to-Text) ์ ์ฉ ๋ชจ๋ธ๋ก, TTS(Text-to-Speech)๋ ์ง์ํ์ง ์์
ํด๋น ๊ฐ๋ ์ด ํ์ํ ์ด์
- ๊ธฐ์กด ์์ฑ ์ธ์ ๋ชจ๋ธ์ ํน์ ์ธ์ดยทํ๊ฒฝ์ ํนํ๋์ด, ์๋ก์ด ๋๋ฉ์ธ์ ์ ์ฉํ๋ ค๋ฉด fine-tuning์ด ํ์์ ์ด์์
- Whisper๋ ๋๊ท๋ชจ ์ฝ์ง๋ ํ์ต(weak supervision)์ผ๋ก zero-shot ์ ์ด ์ฑ๋ฅ์ด ๋ฐ์ด๋, fine-tuning ์์ด๋ ๋ค์ํ ํ๊ฒฝ์์ ๋ฐ๋ก ์ฌ์ฉ ๊ฐ๋ฅ
- MIT ๋ผ์ด์ ์ค๋ก ๊ณต๊ฐ๋์ด ์์ ์ ํ์ฉ ํฌํจ ์์ ๋กญ๊ฒ ์ฌ์ฉ ๊ฐ๋ฅ
- ๋ชจ๋ธ ๊ฐ์ค์น๊ฐ ๋ก์ปฌ์ ๋ค์ด๋ก๋๋์ด API ํธ์ถ์ด๋ ์ธํฐ๋ท ์ฐ๊ฒฐ ์์ด ์์ ํ ์คํ๋ผ์ธ ๋์์ด ๊ฐ๋ฅ
AS-IS
sequenceDiagram autonumber participant User as ์ฌ์ฉ์ participant STT as ๊ธฐ์กด ASR ์์คํ participant Pipeline as ํ์ฒ๋ฆฌ ํ์ดํ๋ผ์ธ User->>STT: ์์ฑ ์ ๋ ฅ (ํน์ ์ธ์ด) STT->>STT: ์์ฑ ์ธ์ (๋จ์ผ ์ธ์ด ์ ์ฉ ๋ชจ๋ธ) STT->>Pipeline: ํ ์คํธ ์ถ๋ ฅ Pipeline->>Pipeline: ๋ณ๋ ์ธ์ด ๊ฐ์ง ๋ชจ๋ Pipeline->>Pipeline: ๋ณ๋ ๋ฒ์ญ ๋ชจ๋ Pipeline->>User: ์ต์ข ๊ฒฐ๊ณผ Note over STT,Pipeline: ๊ฐ ๋จ๊ณ๋ณ ๋ณ๋ ๋ชจ๋ธ ํ์<br/>์ ์ธ์ด/๋๋ฉ์ธ๋ง๋ค fine-tuning ํ์
TO-BE
sequenceDiagram autonumber participant User as ์ฌ์ฉ์ participant Whisper as Whisper ๋ชจ๋ธ User->>Whisper: ์์ฑ ์ ๋ ฅ (์ด๋ค ์ธ์ด๋ ) Whisper->>Whisper: Mel Spectrogram ๋ณํ Whisper->>Whisper: Encoder (์์ฑ ํน์ง ์ถ์ถ) Whisper->>Whisper: Decoder (ํ์คํฌ ํ ํฐ์ ๋ฐ๋ผ ์ ์ฌ/๋ฒ์ญ/์ธ์ด๊ฐ์ง) Whisper->>User: ํ ์คํธ ๊ฒฐ๊ณผ Note over Whisper: ๋จ์ผ ๋ชจ๋ธ์ด ๋ชจ๋ ํ์คํฌ ์ํ<br/>zero-shot์ผ๋ก ๋ค์ํ ํ๊ฒฝ ๋์
Whisper ์ํคํ ์ฒ
Whisper๋ Transformer ๊ธฐ๋ฐ์ Encoder-Decoder ๊ตฌ์กฐ๋ฅผ ์ฌ์ฉํ๋ค.
Encoder ๋จ๊ณ์์๋ ์ ๋ ฅ ์ค๋์ค๋ฅผ 80์ฑ๋์ Mel Spectrogram์ผ๋ก ๋ณํํ ๋ค, 30์ด ๋จ์์ ์ฌ๋ผ์ด๋ฉ ์๋์ฐ๋ก ๋ถํ ํ์ฌ ์ฒ๋ฆฌํ๋ค. Encoder๋ ์ด ์คํํธ๋ก๊ทธ๋จ์์ ์์ฑ์ ํน์ง(feature)์ ์ถ์ถํ๋ค.
Decoder ๋จ๊ณ์์๋ ํน์ ํ์คํฌ ํ ํฐ(<|transcribe|>, <|translate|>, <|language|> ๋ฑ)์ ์
๋ ฅ์ผ๋ก ๋ฐ์, ํ๋์ ๋ชจ๋ธ์ด ์ฌ๋ฌ ํ์คํฌ๋ฅผ autoregressiveํ๊ฒ ์ํํ๋ค. ์ด ๋ฉํฐํ์คํฌ ํ์ต ํฌ๋งท ๋๋ถ์ ์ ์ฌยท๋ฒ์ญยท์ธ์ด ๊ฐ์ง๋ฅผ ๋ณ๋ ๋ชจ๋ธ ์์ด ์ฒ๋ฆฌํ ์ ์๋ค.
์ค๋์ค โ [Mel Spectrogram (80ch, 30s window)]
โ [Encoder: Transformer blocks]
โ [Decoder: Task token + Autoregressive generation]
โ ํ
์คํธ ์ถ๋ ฅ
Whisper๊ฐ ์ํํ๋ ํ์คํฌ๋ ๋ชจ๋ ์์ฑ์ ์ ๋ ฅ์ผ๋ก ๋ฐ์ ํ ์คํธ๋ฅผ ์ถ๋ ฅํ๋ STT ๋ฐฉํฅ์ด๋ค. ๊ตฌ์ฒด์ ์ผ๋ก ๋ค๊ตญ์ด ์์ฑ ์ ์ฌ, ์์ฑโ์์ด ๋ฒ์ญ, ์ธ์ด ๊ฐ์ง, ์์ฑ ํ๋ ๊ฐ์ง(VAD)๋ฅผ ์ง์ํ๋ค. ํ ์คํธ์์ ์์ฑ์ ์์ฑํ๋ TTS๋ Whisper์ ๋ฒ์ ๋ฐ์ด๋ฉฐ, OpenAI๋ TTS๋ฅผ ์ํด ๋ณ๋ ๋ชจ๋ธ์ ์ ๊ณตํ๋ค.
๋ชจ๋ธ ์ฌ์ด์ฆ๋ณ ๋น๊ต
| ๋ชจ๋ธ | ํ๋ผ๋ฏธํฐ | VRAM | ์๋ ์๋ | ๋น๊ณ |
|---|---|---|---|---|
| Tiny | 39M | ~1GB | 10x | English-only ๋ณํ ์ ๊ณต |
| Base | 74M | ~1GB | 7x | English-only ๋ณํ ์ ๊ณต |
| Small | 244M | ~2GB | 4x | English-only ๋ณํ ์ ๊ณต |
| Medium | 769M | ~5GB | 2x | English-only ๋ณํ ์ ๊ณต |
| Large | 1,550M | ~10GB | 1x (๊ธฐ์ค) | ๋ค๊ตญ์ด ์ ์ฉ |
| Turbo | 809M | ~6GB | 8x | Large ์ต์ ํ ๋ณํ, ๋ฒ์ญ ๋ฏธ์ง์ |
English-only ๋ชจ๋ธ(tiny.en, base.en ๋ฑ)์ ์ํ ์ฌ์ด์ฆ์์ ๋ค๊ตญ์ด ๋ชจ๋ธ๋ณด๋ค ์ฑ๋ฅ์ด ์ฐ์ํ๋ค. Large ๋ชจ๋ธ๋ถํฐ๋ ๋ค๊ตญ์ด ๋ชจ๋ธ๋ง ์ ๊ณต๋๋ค.
์ฝ์ง๋ ํ์ต(Weak Supervision)๊ณผ Zero-shot ์ ์ด
Whisper์ ํต์ฌ ํ์ ์ ํ์ต ๋ฐ์ดํฐ ์ ๋ต์ ์๋ค. ์ธํฐ๋ท์์ ์์งํ 680,000์๊ฐ์ ์ค๋์ค-ํ ์คํธ ์์ ์ฌ์ฉํ์ผ๋ฉฐ, ์ด ๋ฐ์ดํฐ๋ ์๋ฒฝํ๊ฒ ๋ ์ด๋ธ๋ง๋ ๊ฒ์ด ์๋๋ผ ์๋ ์์ฑ๋ ์๋ง ๋ฑ **์ฝํ ์ง๋ ์ ํธ(weak supervision)**๋ฅผ ํ์ฉํ ๊ฒ์ด๋ค.
์ด ์ ๊ทผ๋ฒ์ ์ฅ์ :
- ๋ฐ์ดํฐ ๋ค์์ฑ: ๋ค์ํ ์ต์, ๋ฐฐ๊ฒฝ ์์, ์ ๋ฌธ ์ฉ์ด๊ฐ ํฌํจ๋ ์คํ๊ฒฝ ๋ฐ์ดํฐ
- ๊ท๋ชจ: ๊ธฐ์กด ์ง๋ํ์ต ๋ฐ์ดํฐ์ ๋๋น ์๋์ ๊ท๋ชจ
- ์ผ๋ฐํ: ํน์ ๋ฒค์น๋งํฌ์ ๊ณผ์ ํฉ๋์ง ์์ zero-shot ์ ์ด ์ฑ๋ฅ์ด ์ฐ์
- ๋ ผ๋ฌธ์ ๋ฐ๋ฅด๋ฉด โ์ฌ๋์ ์ ํ๋์ ๊ฐ๊ฑด์ฑ์ ๊ทผ์ ํ๋โ ์์ค์ ์ฑ๋ฅ
์จ๋๋ฐ์ด์ค ๋ฐฐํฌ: whisper.cpp
Whisper๋ pip install openai-whisper๋ง์ผ๋ก ๋ชจ๋ธ ๊ฐ์ค์น๊ฐ ๋ก์ปฌ์ ๋ค์ด๋ก๋๋์ด ์์ ํ ์คํ๋ผ์ธ์ผ๋ก ๋์ํ๋ค. ์ฌ๊ธฐ์ ๋ํด whisper.cpp ํ๋ก์ ํธ๊ฐ C/C++๋ก Whisper๋ฅผ ์ฌ๊ตฌํํ์ฌ, ๋ชจ๋ฐ์ผยท์ฃ์ง ๊ธฐ๊ธฐ์์๋ ์จ๋๋ฐ์ด์ค ์ถ๋ก ์ ๊ฐ๋ฅํ๊ฒ ํ๋ค. ์ธ๋ถ ์์กด์ฑ ์์ด ์์ C/C++๋ก ์์ฑ๋์ด ๋ค์ํ ํ๋ซํผ์์ ๋์ํ๋ค.
์ง์ ํ๋ซํผ:
- ๋ชจ๋ฐ์ผ: iOS, Android (Apple Silicon์ ์ต์ ํ)
- ๋ฐ์คํฌํ: macOS (Intel/ARM), Linux, Windows
- ์ฃ์ง/์๋ฒ ๋๋: Raspberry Pi, WebAssembly, Docker
์จ๋๋ฐ์ด์ค ์ต์ ํ ๊ธฐ์ :
- ARM NEON / Accelerate ํ๋ ์์ํฌ (Apple Silicon)
- AVX intrinsics (x86)
- Metal GPU ๊ฐ์ / Core ML (Apple Neural Engine)
- NVIDIA CUDA, Vulkan (ํฌ๋ก์ค ๋ฒค๋ GPU)
- GGML ํฌ๋งท + ์์ํ(Quantization): Q5_0 ๋ฑ์ผ๋ก ๋ชจ๋ธ ํฌ๊ธฐ ๋ํญ ์ถ์
- ๋ฐํ์ ์ zero memory allocation
์จ๋๋ฐ์ด์ค ๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ๋:
| ๋ชจ๋ธ | ๋์คํฌ | ๋ฐํ์ ๋ฉ๋ชจ๋ฆฌ |
|---|---|---|
| Tiny | 75 MiB | ~273 MB |
| Base | 142 MiB | ~388 MB |
| Small | 466 MiB | ~852 MB |
| Medium | 1.5 GiB | ~2.1 GB |
| Large | 2.9 GiB | ~3.9 GB |
์ค์๊ฐ ์ถ๋ก ์ ์ํด 500ms ๊ฐ๊ฒฉ์ผ๋ก ๋ง์ดํฌ ์ ๋ ฅ์ ์ํ๋งํ๋ stream ๋๊ตฌ๋ ์ ๊ณต๋๋ค.
๊ฒฝ์ ๋ชจ๋ธ ๋น๊ต
| ๋ชจ๋ธ | ๊ฐ๋ฐ์ฌ | ํน์ง | Whisper ๋๋น | ์จ๋๋ฐ์ด์ค |
|---|---|---|---|---|
| Faster Whisper | SYSTRAN | CTranslate2 ๊ธฐ๋ฐ Whisper ์ฌ๊ตฌํ | 4x ๋น ๋ฆ, ๋์ผ ์ ํ๋, ๋ฉ๋ชจ๋ฆฌ ์ ๊ฐ | O (๋ก์ปฌ GPU/CPU) |
| NVIDIA Canary-1B | NVIDIA | FastConformer ์ธ์ฝ๋, 1B ํ๋ผ๋ฏธํฐ | WER ์ฐ์ (LibriSpeech clean 1.48%), 4๊ฐ ์ธ์ด, CC-BY-NC | O (๋ก์ปฌ ์คํ ๊ฐ๋ฅ, NeMo ํ๋ ์์ํฌ) |
| whisper.cpp | ggerganov | Whisper์ C/C++ ํฌํ | ์จ๋๋ฐ์ด์ค ํนํ, ์์ํ ์ง์, ๋์ผ ๋ชจ๋ธ | O (๋ชจ๋ฐ์ผ/์ฃ์ง/์๋ฒ ๋๋) |
| Google Speech-to-Text | ํด๋ผ์ฐ๋ API ๊ธฐ๋ฐ | ๋์ ์ ํ๋ | X (ํด๋ผ์ฐ๋ API ํ์) | |
| Apple Speech Framework | Apple | iOS/macOS ๋ด์ฅ | Apple ์ํ๊ณ ํ์ , ๋น๊ณต๊ฐ ๋ชจ๋ธ | O (Apple ๊ธฐ๊ธฐ ์ ์ฉ) |
| Meta SeamlessM4T | Meta | ์์ฑ+ํ ์คํธ ๋ค๊ตญ์ด ๋ฒ์ญ | ๋ฒ์ญ ๊ฐ์ , 100๊ฐ ์ธ์ด, ์ ํ์ ๋ผ์ด์ ์ค | O (๋ก์ปฌ ์คํ ๊ฐ๋ฅ, HuggingFace ๊ณต๊ฐ) |
Google Speech-to-Text๋ง ์จ๋๋ฐ์ด์ค๊ฐ ๋ถ๊ฐํ๊ณ ๋๋จธ์ง๋ ๋ชจ๋ ๋ก์ปฌ ์คํ์ด ๊ฐ๋ฅํ๋ค. ๋ค๋ง ์จ๋๋ฐ์ด์ค์ ์์ค์๋ ์ฐจ์ด๊ฐ ์๋ค:
- ๋ชจ๋ฐ์ผ/์ฃ์ง๊น์ง ๊ฐ๋ฅ: whisper.cpp, Apple Speech Framework
- ๋ฐ์คํฌํ/์๋ฒ ๋ก์ปฌ: Faster Whisper, Canary-1B, SeamlessM4T
๋ชจ๋ธ ์ ํ ๊ธฐ์ค:
- ์ ํ๋ ์ต์ฐ์ โ NVIDIA Canary ๋๋ Whisper Large
- ์๋ ์ต์ฐ์ โ Faster Whisper (GPU) ๋๋ whisper.cpp (์ฃ์ง)
- ์จ๋๋ฐ์ด์ค + ์คํ์์ค โ Whisper + whisper.cpp ์กฐํฉ์ด ๊ฐ์ฅ ํ์ค์
- ์์ ์ ์์ ๋ โ Whisper (MIT) > ๋๋ถ๋ถ์ ๊ฒฝ์ ๋ชจ๋ธ
์ฌ์ฉ๋ฒ
CLI๋ก ์ ์ฌ:
whisper audio.wav --model turboํน์ ์ธ์ด ์ง์ :
whisper japanese.wav --language Japanese์์ด ๋ฒ์ญ:
whisper japanese.wav --model medium --language Japanese --task translatePython API:
import whisper
model = whisper.load_model("turbo")
result = model.transcribe("audio.mp3")
print(result["text"])์ ์์ค API (detect_language(), decode(), load_audio(), log_mel_spectrogram())๋ฅผ ํตํด ์ธ์ด ๊ฐ์ง์ ๋์ฝ๋ฉ์ ๊ฐ๋ณ์ ์ผ๋ก ์ ์ดํ ์๋ ์๋ค.