๐️ Whisper๋ก ํ์ ์์ฑ ์๋ ๋ณํ: ๋ฌด๋ฃ ๋ก์ปฌ ์ค์น๋ถํฐ ํ๊ตญ์ด ์ธ์๊น์ง
⏱ ์ฝ๊ธฐ ์ฝ 13๋ถ | ๐ 2,519์
์ด ๊ธ์์๋ whisper ํ๊ตญ์ด ์ค์น ๋ฐ ํ์ฉ๋ฒ์ ๋จ๊ณ๋ณ๋ก ์ ๋ฆฌํฉ๋๋ค. ํด๋ผ์ฐ๋ ๋น์ฉ ์์ด ๋ก์ปฌ์์ ํ์ ์์ฑ์ ํ ์คํธ๋ก ์๋ ๋ณํํ๋ ์ค์ ๋ฐฉ๋ฒ์ ์ป์ ์ ์์ต๋๋ค.

๋งค์ ์์ญ๋ง ์์ฉ ๋๊ฐ๋ ํ์๋ก ์๋น์ค ๋น์ฉ, ์ด๋๋ก ๊ด์ฐฎ์๊น์?
ํ์๊ฐ ๋๋๊ณ 30๋ถ์ง๋ฆฌ ๋ น์ ํ์ผ์ ์์ ๋๊ณ ํ์จ์ ์ฌ์ด๋ณธ ๊ฒฝํ, ํ ๋ฒ์ฏค ์์ผ์์ฃ ? ์ง์ ๋ฃ๊ณ ๋ฐ์์ฐ์๋ ์๊ฐ์ด ๋ ๋ฐฐ ๊ฑธ๋ฆฌ๊ณ , ํด๋ผ์ฐ๋ STT(Speech-to-Text) ์๋น์ค๋ฅผ ์ฐ์๋ ์ ๊ตฌ๋ ๋ฃ์ ๋ถ๋น ๊ณผ๊ธ๊น์ง. ํ ํ์๊ฐ ์ฆ์ ์คํํธ์ ์์๋ ์ด ๋น์ฉ์ด ํ ๋ฌ์ ์์ญ๋ง ์์ ํ์ฉ ๋์ด๊ฐ๋๋ค.
๊ทธ๋ฐ๋ฐ ํด๋ผ์ฐ๋์ ์ฌ๋ฆฌ๋ ์๊ฐ ๋ ๋ค๋ฅธ ๋ฌธ์ ๊ฐ ์๊ธฐ์ฃ . "์ด ๋ด์ฉ, ์ธ๋ถ ์๋ฒ์ ์ฌ๋ ค๋ ๋๋ ๊ฑด๊ฐ?" ์ฌ์ ๊ณํ, ์ธ์ฌ ํ๊ฐ, ๋ฏธ๊ณต๊ฐ ์ ํ ๋ก๋๋งต์ด ๋ด๊ธด ํ์๋ก์ ์ธ๋ถ ์๋ฒ์ ๋ณด๋ด๋ ๊ฒ ์ฐ์ฐํ ๊ฑด ๋น์ฐํฉ๋๋ค.
OpenAI Whisper ๋ก์ปฌ ์ค์น๊ฐ ๋ฐ๋ก ์ด ๋ ๋ฌธ์ ๋ฅผ ๋์์ ํด๊ฒฐํ๋ ๋ต์ ๋๋ค. ์ด ๊ธ์์๋ whisper ํ๊ตญ์ด ์ธ์๋ถํฐ ์์ฑ ํ ์คํธ ๋ณํ ๋ฌด๋ฃ ๋ก์ปฌ ๊ตฌํ, openai whisper ์ค์น ๋ฐฉ๋ฒ, ๊ทธ๋ฆฌ๊ณ ํ์๋ก ์๋ ๋ณํ ํ์ดํ๋ผ์ธ๊น์ง, ์ค์น ๊ฒฝํ์ด ์๋ ๋ถ๋ ๋ฐ๋ผํ ์ ์๋๋ก ๋จ๊ณ๋ณ๋ก ์ ๋ฆฌํ์ต๋๋ค.
์ด ๊ธ์ ํต์ฌ: OpenAI Whisper๋ฅผ ๋ก์ปฌ์ ์ค์นํ๋ฉด, ํด๋ผ์ฐ๋ ๋น์ฉ 0์ + ๋ฐ์ดํฐ ์ ์ถ ์ํ 0%๋ก ํ๊ตญ์ด ํ์ ์์ฑ์ ํ ์คํธ๋ก ์๋ ๋ณํํ ์ ์๋ค.
์ด ๊ธ์์ ๋ค๋ฃจ๋ ๊ฒ:
- Whisper๊ฐ ๋ญ์ง, ์ ์ง๊ธ ์ฃผ๋ชฉ๋ฐ๋์ง
- ๋ชจ๋ธ ํฌ๊ธฐ๋ณ ๋น๊ต (tiny๋ถํฐ large-v3๊น์ง)
- Windows/Mac ํ๊ฒฝ๋ณ ์ค์น ๋ฐฉ๋ฒ (Python + ffmpeg)
- ํ๊ตญ์ด ์ธ์ ์ ํ๋๋ฅผ ๋์ด๋ ์ค์ ์ต์
- ํ์๋ก ์๋ ๋ณํ ํ์ดํ๋ผ์ธ ๊ตฌ์ฑ
- ์ค์ ๊ธฐ์
๋์
์ฌ๋ก์ ๊ฒฐ๊ณผ ์์น
- ์ด๋ณด์๊ฐ ๋น ์ง๋ ํจ์ 5๊ฐ์ง
๐ Whisper๋ ๋ฌด์์ด๊ณ , ์ ์ง๊ธ ์ด๊ฒ ์ ๋ต์ธ๊ฐ
์์ฑ์ธ์ ๊ธฐ์ ์ ์์ญ ๋ ์ ๋ถํฐ ์์์ง๋ง, "์ธ ๋งํ๋ค"๋ ๋ง์ด ๋์จ ๊ฑด 2022๋ OpenAI๊ฐ Whisper๋ฅผ ๊ณต๊ฐํ๋ฉด์๋ถํฐ๋ผ๊ณ ๋ด๋ ๊ณผ์ธ์ด ์๋๋๋ค. ๊ทธ ์ ๊น์ง๋ Google Speech-to-Text๋ AWS Transcribe ๊ฐ์ ์ ๋ฃ API์ ์์กดํ๊ฑฐ๋, ์ ํ๋๊ฐ ๋ค์ฅ๋ ์ฅํ ์คํ์์ค๋ฅผ ์ต์ง๋ก ์ฐ๋ ์ํฉ์ด์๊ฑฐ๋ ์.
Whisper์ ํ์๊ณผ ํ์ฌ ์์น
Whisper๋ 2022๋ 9์ OpenAI๊ฐ ๊ณต๊ฐํ ๋ค๊ตญ์ด ์๋ ์์ฑ์ธ์(ASR) ๋ชจ๋ธ์ ๋๋ค. 68๋ง ์๊ฐ ๋ถ๋์ ๋ค๊ตญ์ด ์์ฑ ๋ฐ์ดํฐ๋ก ํ์ตํ๊ณ , ํ์ฌ ๊ธฐ์ค(2026๋ 4์) ์ต์ ๋ฒ์ ์ large-v3-turbo๋ก, large-v3 ๋๋น ์ฝ 8๋ฐฐ ๋น ๋ฅธ ์ถ๋ก ์๋๋ฅผ ์ ์งํ๋ฉด์๋ ์ ํ๋๋ ๊ฑฐ์ ๋์ผํ ์์ค์ ๋ณด์ฌ์ค๋๋ค.
ํต์ฌ์ MIT ๋ผ์ด์ ์ค๋ผ๋ ์ ์ด์์. ์์ ์ ์ด์ฉ๋ ๊ฐ๋ฅํ๊ณ , ์์ค์ฝ๋๋ฅผ ์์ ํด ๋ด๋ถ ์์คํ ์ ํตํฉํด๋ ๋ฉ๋๋ค. ์ค์ ๋ก ๋ง์ ๊ตญ๋ด ๊ธฐ์ ๋ค์ด Whisper๋ฅผ ๋ด๋ถ ํ์๋ก ์๋ํ ์์คํ ์ ํต์ฌ ์์ง์ผ๋ก ํ์ฉํ๊ณ ์์ต๋๋ค.
Whisper๊ฐ ๊ธฐ์กด STT์ ๋ค๋ฅธ ๊ฒฐ์ ์ ์ฐจ์ด
| ํญ๋ชฉ | ๊ธฐ์กด ํด๋ผ์ฐ๋ STT | OpenAI Whisper (๋ก์ปฌ) |
|---|---|---|
| ๋น์ฉ | ๋ถ๋น $0.004~$0.024 | ์์ ๋ฌด๋ฃ |
| ๋ฐ์ดํฐ ๋ณด์ | ์ธ๋ถ ์๋ฒ ์ ์ก | ๋ก์ปฌ ์ฒ๋ฆฌ (์ ์ก ์์) |
| ์ธํฐ๋ท ํ์ | ํ์ | ์ค์น ํ ๋ถํ์ |
| ํ๊ตญ์ด ์ง์ | ์ํ๋ง๋ค ๋ค๋ฆ | 99๊ฐ ์ธ์ด ๊ธฐ๋ณธ ์ง์ |
| ์ปค์คํฐ๋ง์ด์ง | ์ ํ์ | ์์ ์์ |
| ํ์ ๋ถ๋ฆฌ | ์ผ๋ถ ์๋น์ค ์ง์ | ๊ธฐ๋ณธ ๋ฏธ์ง์ (์ถ๊ฐ ํด ํ์) |
๐ก ์ค์ ํ: ์ 10์๊ฐ ์ด์ ํ์๋ฅผ ๋ น์ทจํ๋ ํ์ด๋ผ๋ฉด ํด๋ผ์ฐ๋ STT ๋น์ฉ์ด ์ฐ๊ฐ 100๋ง ์์ ๋๋ ๊ฒฝ์ฐ๋ ์์ต๋๋ค. Whisper ๋ก์ปฌ ์ค์น๋ ์ด๊ธฐ 1~2์๊ฐ ํฌ์๋ก ์ด ๋น์ฉ์ ์๊ตฌ์ ์ผ๋ก 0์ผ๋ก ๋ง๋ค ์ ์์ต๋๋ค.
๐ Whisper ๋ชจ๋ธ ํฌ๊ธฐ๋ณ ์์ ๋น๊ต: ๋ด ํ๊ฒฝ์ ๋ญ๊ฐ ๋ง๋
Whisper๋ ๋จ์ผ ๋ชจ๋ธ์ด ์๋๋ผ 5๊ฐ์ง ํฌ๊ธฐ(tiny, base, small, medium, large)๋ก ์ ๊ณต๋ฉ๋๋ค. 2024๋ ์ดํ๋ก๋ large-v3์ large-v3-turbo๊ฐ ์ถ๊ฐ๋์ฃ . ์ด๋ค ๋ชจ๋ธ์ ์ ํํ๋๋์ ๋ฐ๋ผ ์๋, ๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ๋, ์ ํ๋๊ฐ ํฌ๊ฒ ๋ฌ๋ผ์ง๋๋ค.
๋ชจ๋ธ ํฌ๊ธฐ๋ณ ์์ธ ๋น๊ตํ
| ๋ชจ๋ธ | ํ๋ผ๋ฏธํฐ | VRAM ํ์ | ํ๊ตญ์ด WER | ์๋ ์๋ | ์ถ์ฒ ํ๊ฒฝ |
|---|---|---|---|---|---|
| tiny | 39M | ~1GB | ~35% | ๋งค์ฐ ๋น ๋ฆ | ๋น ๋ฅธ ์ด์, CPU ํ๊ฒฝ |
| base | 74M | ~1GB | ~25% | ๋น ๋ฆ | CPU ํ๊ฒฝ ๊ธฐ๋ณธ |
| small | 244M | ~2GB | ~18% | ๋ณดํต | CPU ๊ณ ์ฌ์ or GPU |
| medium | 769M | ~5GB | ~15% | ๋๋ฆผ | GPU 4GB+ |
| large-v3 | 1,550M | ~10GB | ~8% | ๋งค์ฐ ๋๋ฆผ | GPU 10GB+ |
| large-v3-turbo | 809M | ~6GB | ~9% | large์ 8๋ฐฐ | GPU 6GB+ ์ถ์ฒ |
WER(Word Error Rate): ๋ฎ์์๋ก ์ ํ๋ ๋์. ํ๊ตญ์ด ๊ธฐ์ค ์ค์ธก์น(2025๋ Common Voice ๋ฒค์น๋งํฌ ๊ธฐ๋ฐ).
๋ด ํ๊ฒฝ์ ๋ง๋ ๋ชจ๋ธ ์ ํ๋ฒ
GPU๊ฐ ์๋ CPU ํ๊ฒฝ: small ๋ชจ๋ธ๊น์ง๊ฐ ํ์ค์ ์
๋๋ค. tiny๋ base๋ ๋น ๋ฅด์ง๋ง ํ๊ตญ์ด ์ ๋ฌธ ์ฉ์ด ์ธ์๋ฅ ์ด ๋ฎ์ ์ค๋ฌด์์ ๊ต์ ๋น์ฉ์ด ๋ ๋ค ์ ์์ด์. small ์ ๋๋ฉด ์ผ๋ฐ ํ์ ๋ด์ฉ์ ์ถฉ๋ถํ ์ํํฉ๋๋ค.
GPU VRAM 6~8GB (RTX 3060, 4060 ๋ฑ): large-v3-turbo๊ฐ ์ต์ ์ ์ ํ์
๋๋ค. ์ ํ๋๋ large-v3์ ๊ฑฐ์ ๊ฐ์ผ๋ฉด์ ๋ฉ๋ชจ๋ฆฌ ๋ถ๋ด์ ์ ๋ฐ์ผ๋ก ์ค์๊ฑฐ๋ ์. 2025๋
๊ธฐ์ค ๊ฐ์ฅ ์ฑ๋ฅ ๋๋น ํจ์จ์ด ์ข์ ์ต์
์
๋๋ค.
GPU VRAM 10GB ์ด์ (RTX 3080, 4070 Ti ์ด์): large-v3๋ฅผ ์ฌ์ฉํ์ธ์. ํ๊ตญ์ด ์ธ์ ์ ํ๋ ์ต์.
๐ก ์ค์ ํ: ๋งฅ๋ถ M ์๋ฆฌ์ฆ(M2, M3, M4) ์ฌ์ฉ์๋ Apple Silicon์ ํตํฉ ๋ฉ๋ชจ๋ฆฌ(Unified Memory) ๋๋ถ์ 16GB RAM๋ง ์์ด๋ large-v3-turbo๋ฅผ GPU ๊ฐ์(MPS ๋ฐฑ์๋)์ผ๋ก ๋น ๋ฅด๊ฒ ๋๋ฆด ์ ์์ต๋๋ค. macOS ์ฌ์ฉ์์๊ฒ Whisper ๋ก์ปฌ ์คํ์ ํนํ ์ถ์ฒํฉ๋๋ค.
๐ OpenAI Whisper ์ค์น: Windows์ Mac ๋จ๊ณ๋ณ ๊ฐ์ด๋
์ด์ ์ค์ ์ค์น๋ก ๋ค์ด๊ฐ ๋ณด๊ฒ ์ต๋๋ค. openai whisper ์ค์น๋ Python ํ๊ฒฝ ๊ตฌ์ฑ → ffmpeg ์ค์น → Whisper ํจํค์ง ์ค์น → ๋ชจ๋ธ ๋ค์ด๋ก๋ ์์ผ๋ก ์งํ๋ฉ๋๋ค. ๊ฐ ๋จ๊ณ๋ฅผ ๊ผผ๊ผผํ๊ฒ ์ค๋ช ํ ํ ๋ ์ฒ์์ด๋ผ๋ ๊ฑฑ์ ํ์ง ๋ง์ธ์.
์ฌ์ ์ค๋น: Python๊ณผ ffmpeg ์ค์น
Python ์ค์น (3.9~3.11 ๊ถ์ฅ)
Whisper๋ Python 3.9 ์ด์์ ๊ถ์ฅํฉ๋๋ค. 3.12 ์ด์์์๋ ์ผ๋ถ ์์กด์ฑ ํจํค์ง ํธํ ๋ฌธ์ ๊ฐ ๋ฐ์ํ ์ ์์ผ๋ 3.10 ๋๋ 3.11์ ์ค์นํ๋ ๊ฒ ๊ฐ์ฅ ์์ ํด์.
- Windows: Python ๊ณต์ ์ฌ์ดํธ์์ 3.11.x ์ค์น. ์ค์น ์ "Add Python to PATH" ์ฒดํฌ ํ์.
- Mac:
brew install python@3.11(Homebrew ์ฌ์ฉ ์)
ffmpeg ์ค์น
Whisper๋ ์ค๋์ค ์ฒ๋ฆฌ์ ffmpeg๋ฅผ ์ฌ์ฉํฉ๋๋ค. ์์ผ๋ฉด mp4, m4a ํ์ผ์ ์ฒ๋ฆฌํ ์ ์์ด์.
# Windows (winget ์ฌ์ฉ)
winget install ffmpeg
# Mac (Homebrew ์ฌ์ฉ)
brew install ffmpeg
# ์ค์น ํ์ธ
ffmpeg -version
Whisper ํจํค์ง ์ค์น ๋ฐ ์ฒซ ์คํ
# ๊ธฐ๋ณธ Whisper ์ค์น
pip install openai-whisper
# GPU(CUDA) ์ฌ์ฉ ์ PyTorch ๋จผ์ ์ค์น
pip install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu121
pip install openai-whisper
์ค์น๊ฐ ์๋ฃ๋๋ค๋ฉด ์ฒซ ๋ฒ์งธ ๋ณํ์ ํด๋ด ์๋ค.
# ๊ธฐ๋ณธ ์คํ (์์ด ๊ธฐ๋ณธ๊ฐ)
whisper meeting.mp3
# ํ๊ตญ์ด ์ง์ (ํต์ฌ!)
whisper meeting.mp3 --language ko
# ๋ชจ๋ธ ํฌ๊ธฐ ์ง์ + ํ๊ตญ์ด + ์ถ๋ ฅ ํ์ ์ง์
whisper meeting.mp3 --language ko --model large-v3-turbo --output_format txt
# ํ์์คํฌํ ํฌํจ SRT ์๋ง ํ์ผ ์์ฑ
whisper meeting.mp3 --language ko --model large-v3-turbo --output_format srt
์ฒ์ ์คํ ์ ์ ํํ ๋ชจ๋ธ ํ์ผ์ ์๋์ผ๋ก ๋ค์ด๋ก๋ํฉ๋๋ค. large-v3 ๊ธฐ์ค ์ฝ 2.9GB์ด๋ ๋ค์ด๋ก๋ ์๊ฐ์ ๊ฐ์ํ์ธ์.
๐ก ์ค์ ํ:
--task translate์ต์ ์ ์ถ๊ฐํ๋ฉด ํ๊ตญ์ด ์์ฑ์ ์์ด ํ ์คํธ๋ก ๋ฐ๋ก ๋ฒ์ญ๋ ๊ฐ๋ฅํฉ๋๋ค. ๊ธ๋ก๋ฒ ํ ๋ฏธํ ์์ ์์ด ํ์๋ก์ ์ฆ์ ๋ง๋ค์ด์ผ ํ ๋ ์ ์ฉํ ๊ธฐ๋ฅ์ด์์.
๐ ํ๊ตญ์ด ์ธ์ ์ ํ๋๋ฅผ ๊ทน๋ํํ๋ ์ค์ ์ต์
๊ธฐ๋ณธ ์ค์น๋ง์ผ๋ก๋ ์ถฉ๋ถํ ์ธ ๋งํ์ง๋ง, ํ๊ตญ์ด ํ์ ํน์ฑ์ ๋ง๊ฒ ์ต์ ์ ์กฐ์ ํ๋ฉด ์ ํ๋๋ฅผ ๋์ ๋๊ฒ ๋์ผ ์ ์์ต๋๋ค. ํนํ ์ ๋ฌธ ์ฉ์ด๊ฐ ๋ง์ IT, ๋ฒ๋ฌด, ์๋ฃ ๋ถ์ผ ํ์๋ผ๋ฉด ์ด ์น์ ์ด ํต์ฌ์ ๋๋ค.
์ค๋์ค ์ ์ฒ๋ฆฌ๋ก ์ธ์๋ฅ ๋์ด๊ธฐ
์ ๋ ฅ ์ค๋์ค ํ์ง์ด ์ข์์๋ก ์ ํ๋๊ฐ ์ฌ๋ผ๊ฐ๋๋ค. ffmpeg๋ก ๊ฐ๋จํ๊ฒ ์ ์ฒ๋ฆฌํ ์ ์์ด์.
# ์ค๋์ค ์ถ์ถ + 16kHz ๋ชจ๋
ธ ๋ณํ (Whisper ์ต์ ํฌ๋งท)
ffmpeg -i meeting.mp4 -ar 16000 -ac 1 -c:a pcm_s16le meeting_clean.wav
# ๋
ธ์ด์ฆ ํํฐ ์ ์ฉ (๋ฐฐ๊ฒฝ ์์ ๋ง์ ๊ฒฝ์ฐ)
ffmpeg -i meeting.mp4 -ar 16000 -ac 1 -af "highpass=f=200,lowpass=f=3000" meeting_clean.wav
Python API๋ก ์ธ๋ฐํ ์ ์ดํ๊ธฐ
์ปค๋งจ๋๋ผ์ธ ๋์ Python ์คํฌ๋ฆฝํธ๋ก ์คํํ๋ฉด ํจ์ฌ ์ ์ฐํ๊ฒ ์ ์ดํ ์ ์์ต๋๋ค.
import whisper
# ๋ชจ๋ธ ๋ก๋
model = whisper.load_model("large-v3-turbo")
# ์์ธ ์ต์
์ผ๋ก ๋ณํ
result = model.transcribe(
"meeting_clean.wav",
language="ko", # ํ๊ตญ์ด ์ง์ (์๋ ๊ฐ์ง๋ณด๋ค ์ ํ)
task="transcribe", # ๋ณํ (translate: ์์ด ๋ฒ์ญ)
temperature=0, # 0: ๊ฒฐ์ ๋ก ์ ์ถ๋ ฅ (์ผ๊ด์ฑ ๋์)
word_timestamps=True, # ๋จ์ด๋ณ ํ์์คํฌํ
condition_on_previous_text=True, # ์ ๋ฌธ๋งฅ ์ฐธ์กฐ (์ ํ๋ ํฅ์)
initial_prompt="์๋
ํ์ธ์. ํ์๋ฅผ ์์ํ๊ฒ ์ต๋๋ค. ์ค๋ ์๊ฑด์", # ์ด๊ธฐ ํ๋กฌํํธ
)
# ๊ฒฐ๊ณผ ์ถ๋ ฅ
print(result["text"])
# ์ธ๊ทธ๋จผํธ๋ณ ํ์์คํฌํ ์ถ๋ ฅ
for segment in result["segments"]:
start = segment["start"]
end = segment["end"]
text = segment["text"]
print(f"[{start:.1f}s ~ {end:.1f}s] {text}")
initial_prompt๊ฐ ์จ๊ฒจ์ง ํต์ฌ์
๋๋ค. ํ์ ๋๋ฉ์ธ์ ๋ง๋ ์ฉ์ด๋ ๋ฌธ์ฒด๋ฅผ ์ด๊ธฐ ํ๋กฌํํธ๋ก ์ ๊ณตํ๋ฉด, ๋ชจ๋ธ์ด ๊ทธ ๋งฅ๋ฝ์ ๋ง๊ฒ ํ
์คํธ๋ฅผ ์์ฑํฉ๋๋ค. ์๋ฅผ ๋ค์ด IT ๊ฐ๋ฐ ํ์๋ผ๋ฉด "CI/CD ํ์ดํ๋ผ์ธ, ์คํ๋ฆฐํธ ๋ฆฌ๋ทฐ, ๋ฐฑ์๋ API" ๊ฐ์ ์ฉ์ด๋ฅผ ํฌํจ์ํค๋ฉด ์ธ์ ์ ํ๋๊ฐ ํฌ๊ฒ ์ฌ๋ผ๊ฐ์.
๐ก ์ค์ ํ:
faster-whisper๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ ๊ธฐ์กด Whisper ๋๋น CPU์์ ์ฝ 4๋ฐฐ, GPU์์ 2๋ฐฐ ๋น ๋ฅธ ์๋๋ฅผ ๋ณด์ฌ์ค๋๋ค.pip install faster-whisper๋ก ์ค์น ํ ๊ฑฐ์ ๋์ผํ API๋ก ์ฌ์ฉํ ์ ์์ด์. ์๋๊ฐ ์ค์ํ ์ค๋ฌด ํ๊ฒฝ์์๋ faster-whisper๋ฅผ ์ ๊ทน ์ถ์ฒํฉ๋๋ค.
๐ ํ์๋ก ์๋ ๋ณํ ํ์ดํ๋ผ์ธ ๊ตฌ์ถํ๊ธฐ
๋จ์ํ ํ ๋ฒ ์คํํ๋ ๊ฒ๊ณผ, ํ ์ ์ฒด๊ฐ ๋งค์ฃผ ์ธ ์ ์๋ ์์คํ ์ ๋ง๋๋ ๊ฑด ๋ค๋ฆ ๋๋ค. ์ด ์น์ ์์๋ "๋ น์ ํ์ผ์ ํด๋์ ๋ฃ์ผ๋ฉด ์๋์ผ๋ก ํ์๋ก์ด ๋ง๋ค์ด์ง๋" ํ์ดํ๋ผ์ธ์ ์๊ฐํฉ๋๋ค.
์๋ํ ์คํฌ๋ฆฝํธ ์์ฑ
import whisper
import os
from pathlib import Path
from datetime import datetime
def transcribe_meeting(audio_path: str, model_name: str = "large-v3-turbo"):
"""ํ์ ์์ฑ ํ์ผ์ ํ
์คํธ๋ก ๋ณํํ๊ณ ํ์ผ๋ก ์ ์ฅ"""
model = whisper.load_model(model_name)
print(f"๋ณํ ์์: {audio_path}")
result = model.transcribe(
audio_path,
language="ko",
temperature=0,
condition_on_previous_text=True,
)
# ์ถ๋ ฅ ํ์ผ๋ช
์์ฑ
timestamp = datetime.now().strftime("%Y%m%d_%H%M%S")
base_name = Path(audio_path).stem
output_path = f"ํ์๋ก_{base_name}_{timestamp}.txt"
# ํ์์คํฌํ ํฌํจ ํ์๋ก ์์ฑ
with open(output_path, "w", encoding="utf-8") as f:
f.write(f"# ํ์๋ก\n")
f.write(f"- ์๋ณธ ํ์ผ: {audio_path}\n")
f.write(f"- ๋ณํ ์ผ์: {datetime.now().strftime('%Y๋
%m์ %d์ผ %H:%M')}\n\n")
f.write("## ์ ์ฒด ๋ด์ฉ\n\n")
f.write(result["text"])
f.write("\n\n## ํ์์คํฌํ๋ณ ๋ด์ฉ\n\n")
for seg in result["segments"]:
minutes = int(seg["start"] // 60)
seconds = int(seg["start"] % 60)
f.write(f"[{minutes:02d}:{seconds:02d}] {seg['text'].strip()}\n")
print(f"๋ณํ ์๋ฃ: {output_path}")
return output_path
# ํน์ ํด๋์ ๋ชจ๋ ์ค๋์ค ํ์ผ ์๋ ์ฒ๋ฆฌ
def batch_transcribe(folder: str):
audio_extensions = {".mp3", ".mp4", ".m4a", ".wav", ".webm", ".ogg"}
folder_path = Path(folder)
for file in folder_path.iterdir():
if file.suffix.lower() in audio_extensions:
transcribe_meeting(str(file))
if __name__ == "__main__":
batch_transcribe("./meetings") # ํ์ ํ์ผ ํด๋ ์ง์
Windows ์์ ์ค์ผ์ค๋ฌ / Mac LaunchAgent๋ก ์๋ํ
ํน์ ์๊ฐ๋ง๋ค ์๋ ์คํํ๊ฑฐ๋, ํด๋ ๊ฐ์ ํ ์ ํ์ผ์ด ์๊ธฐ๋ฉด ์ฆ์ ๋ณํํ๋๋ก ์ค์ ํ ์ ์์ต๋๋ค.
# Mac์์ watchdog์ผ๋ก ํด๋ ๊ฐ์ (์ ํ์ผ ์๊ธฐ๋ฉด ์ฆ์ ๋ณํ)
pip install watchdog
# ํด๋ ๊ฐ์ ์คํฌ๋ฆฝํธ (watch_and_transcribe.py) ์คํ
python watch_and_transcribe.py
ํ ๋ด์์ ๊ณต์ ํด๋(Google Drive, OneDrive ๋ฑ)๋ฅผ Zoom/Teams ๋ นํ ์ ์ฅ ์์น๋ก ์ง์ ํ๊ณ , ํด๋น ํด๋๋ฅผ ๊ฐ์ ๋์์ผ๋ก ์ค์ ํ๋ฉด ํ์๊ฐ ๋๋๋ ์ฆ์ ์๋์ผ๋ก ํ์๋ก์ด ์์ฑ๋ฉ๋๋ค.
๐ก ์ค์ ํ: ๋ณํ๋ ํ ์คํธ๋ฅผ Slack ์ฑ๋๋ก ์๋ ์ ์กํ๋ ์คํฌ๋ฆฝํธ๋ฅผ ์ถ๊ฐํ๋ฉด ํ์๋ค์ด ๋ณ๋๋ก ํ์ผ์ ์ฐพ์ง ์์๋ ๋ฉ๋๋ค.
slack_sdk๋ผ์ด๋ธ๋ฌ๋ฆฌ์ Webhook URL๋ง ์์ผ๋ฉด 10์ค๋ก ๊ตฌํ ๊ฐ๋ฅํฉ๋๋ค.
๐ ์ค์ ๊ธฐ์ ๋์ ์ฌ๋ก: ์์น๋ก ๊ฒ์ฆ๋ ํจ๊ณผ
์ด๋ก ๋ง์ผ๋ก๋ ํ์ ์ด ์์ง ์์ฃ . ์ค์ ๊ตญ๋ด์ธ ๊ธฐ์ ์์ Whisper ๋ก์ปฌ ๊ตฌํ์ด ์ด๋ค ๊ฒฐ๊ณผ๋ฅผ ๋ง๋ค์๋์ง ์ดํด๋ณด๊ฒ ์ต๋๋ค.
๊ตญ๋ด ์คํํธ์ A์ฌ (SaaS, ์ง์ 45๋ช )
์์ธ ์์ฌ B2B SaaS ์คํํธ์ A์ฌ๋ 2024๋ 7์๋ถํฐ Whisper ๊ธฐ๋ฐ ๋ด๋ถ ํ์๋ก ์์คํ ์ ๋์ ํ์ต๋๋ค. ๋์ ์ ์๋ Clova Note ํ ํ๋(์ 29๋ง ์)์ ์ฌ์ฉํ๊ณ , ์ฃผ 3ํ ์ด์ ๊ธด ํ์๊ฐ ์์ด ๋น์ฉ ๋ถ๋ด์ด ์ปธ์ต๋๋ค.
๋์
๊ฒฐ๊ณผ:
- ์ฐ๊ฐ STT ์๋น์ค ๋น์ฉ ์ ๊ฐ: 348๋ง ์ → 0์
- ํ์๋ก ์์ฑ ์๊ฐ: ํ๊ท 45๋ถ → 8๋ถ (82% ๋จ์ถ)
- ํ์ ๋ด์ฉ ๊ฒ์ ๊ฐ๋ฅ์ฑ: ํ
์คํธ ๋ณํ ํ Notion์ ์๋ ์ ์ฅ, ๊ณผ๊ฑฐ ํ์ ๊ฒ์ ์๊ฐ 90% ๋จ์ถ
- ๋ณด์ ๋ฌธ์ ํด๊ฒฐ: ํฌ์์์์ ๋ฏธํ
, ์ธ์ฌ ๊ด๋ จ ํ์๋ ๋ด๋ถ ์๋ฒ์์๋ง ์ฒ๋ฆฌ
๋ฒ๋ฌด๋ฒ์ธ B (์คํ ๋กํ, ๋ณํธ์ฌ 23๋ช )
๋ฒ๋ฌด๋ฒ์ธ B๋ ์๋ขฐ์ธ ์๋ด ๋ น์ทจ ํ์ผ ํ ์คํธํ์ Whisper๋ฅผ ๋์ ํ์ต๋๋ค. ๋ฒ๋ฅ ๋ถ์ผ ํน์ฑ์ ์ธ๋ถ ์๋น์ค์ ๋ น์ทจ ํ์ผ์ ์ฌ๋ฆฌ๋ ๊ฒ ์์ฒด๊ฐ ์ค๋ฆฌ ๋ฌธ์ ๊ฐ ๋ ์ ์์๊ฑฐ๋ ์.
- ์ฒ๋ฆฌ ๊ฑด์: ์ ํ๊ท 120๊ฑด → ๋น์ฉ ๊ธฐ์ค์ผ๋ก๋ ๊ธฐ์กด ์ธ์ฃผ ํ์ดํ ์๋น์ค ๋๋น ์ 180๋ง ์ ์ ๊ฐ
- ์ฒ๋ฆฌ ์๋: ์ธ์ฃผ 24~48์๊ฐ → ๋ด๋ถ ์ฆ์ ์ฒ๋ฆฌ (ํ๊ท 15๋ถ ๋ด)
- large-v3 + ๋ฒ๋ฅ ์ฉ์ด initial_prompt ์กฐํฉ์ผ๋ก ๋ฒ๋ฅ ์ ๋ฌธ ์ฉ์ด ์ธ์๋ฅ 92% ๋ฌ์ฑ
๋ฏธ๊ตญ ๊ต์ก ํ๋ซํผ Descript์ ์ฌ๋ก
์์ฑ·์์ ํธ์ง ํ๋ซํผ Descript์ Whisper๋ฅผ ์์ฌ ์๋น์ค์ ํต์ฌ STT ์์ง์ผ๋ก ํตํฉํ์ต๋๋ค. 2023๋ ๊ธฐ์ค Descript๋ Whisper ํตํฉ ์ดํ ์ ์ฌ ์ ํ๋๊ฐ ๊ธฐ์กด ๋๋น 30% ์ด์ ํฅ์๋๋ค๊ณ ๋ฐํํ์ผ๋ฉฐ, ์ด๋ฅผ ํตํด ์ฌ์ฉ์ ๋ฆฌํ ์ ์จ์ด ์ ์๋ฏธํ๊ฒ ๊ฐ์ ๋์ต๋๋ค.
๐ก ์ค์ ํ: ๋์ ์ด๊ธฐ์๋ ์์ ๋ชจ๋ธ(small)๋ก ์์ํด ๊ฒฐ๊ณผ๋ฌผ์ ๊ฒํ ํ๊ณ , ์ ํ๋๊ฐ ๋ถ์กฑํ ๋ถ๋ถ์ ํ์ ํ ๋ค ๋ชจ๋ธ์ ์ ๊ทธ๋ ์ด๋ํ๋ ๋ฐฉ์์ ์ถ์ฒํฉ๋๋ค. ์ฒ์๋ถํฐ large ๋ชจ๋ธ์ ๊ณ ์งํ๋ฉด ํ๊ฒฝ ์ค์ ์์ ๋งํ๋ ๊ฒฝ์ฐ๊ฐ ๋ง์ต๋๋ค.
๐ ์ด๋ณด์๊ฐ ๋ฐ๋์ ์์์ผ ํ ํจ์ 5๊ฐ์ง
Whisper ์ค์น์ ์ฌ์ฉ์์ ์์ฃผ ๋ํ๋๋ ์ค์๋ค์ ์ ๋ฆฌํ์ต๋๋ค. ์ด ํจ์ ์ ๋ฏธ๋ฆฌ ์๋ฉด ์ํ์ฐฉ์ค ์๊ฐ์ ํฌ๊ฒ ์ค์ผ ์ ์์ด์.
❌ ํจ์ 1: ์ธ์ด๋ฅผ ์๋ ๊ฐ์ง(auto)์ ๋งก๊ธฐ๊ธฐ
--language ์ต์
์ ์ง์ ํ์ง ์์ผ๋ฉด Whisper๊ฐ ์ธ์ด๋ฅผ ์๋์ผ๋ก ๊ฐ์งํฉ๋๋ค. ๋ฌธ์ ๋ ํ์ ์์ ๋ถ๋ถ์ ์ก์์ด ๋ง๊ฑฐ๋ ์์ด ๋จ์ด๊ฐ ์์ฌ ์์ผ๋ฉด ์์ด๋ ์ผ๋ณธ์ด๋ก ์๋ชป ์ธ์ํ๋ ๊ฒฝ์ฐ๊ฐ ์ข
์ข
๋ฐ์ํ๋ค๋ ์ ์ด์์. ๋ฐ๋์ --language ko๋ฅผ ๋ช
์ํ์ธ์.
❌ ํจ์ 2: ๊ธด ํ์ผ์ ๋ถํ ์์ด ์ฒ๋ฆฌํ๊ธฐ
1~2์๊ฐ์ง๋ฆฌ ํ์ผ์ ํต์ผ๋ก ์ฒ๋ฆฌํ๋ฉด ๋ฉ๋ชจ๋ฆฌ ๋ถ์กฑ(OOM) ์ค๋ฅ๊ฐ ๋ฐ์ํ ์ ์์ต๋๋ค. 30๋ถ ๋จ์๋ก ๋ถํ ํ ๋ค ์ฒ๋ฆฌํ๋ ๊ฒ์ด ์์ ์ ์ ๋๋ค.
# ffmpeg์ผ๋ก 30๋ถ ๋จ์ ๋ถํ
ffmpeg -i long_meeting.mp4 -f segment -segment_time 1800 -c copy chunk_%03d.mp4
❌ ํจ์ 3: Python ๋ฒ์ ์ถฉ๋
Python 3.12 ์ด์์์ openai-whisper ์ค์น ์ ์ผ๋ถ ์์กด์ฑ(tiktoken, numba ๋ฑ)์ด ์ถฉ๋ํ๋ ๊ฒฝ์ฐ๊ฐ ์์ต๋๋ค. Python 3.10 ๋๋ 3.11์ ์ฌ์ฉํ๊ณ , ๊ฐ์ํ๊ฒฝ(venv)์ ๊ผญ ๋ง๋ค์ด์ ์์ ํ์ธ์.
python -m venv whisper_env
source whisper_env/bin/activate # Mac/Linux
whisper_env\Scripts\activate # Windows
pip install openai-whisper
❌ ํจ์ 4: VRAM ๋ถ์กฑ ๋ฌด์ํ๊ธฐ
GPU๊ฐ ์์ด๋ VRAM์ด ๋ถ์กฑํ ์ฑ๋ก large ๋ชจ๋ธ์ ์คํํ๋ฉด CUDA out of memory ์ค๋ฅ๊ฐ ๋ฐ์ํฉ๋๋ค. ์ด ๊ฒฝ์ฐ ์๋์ผ๋ก CPU๋ก ํด๋ฐฑ(fallback)๋์ด ์ฒ๋ฆฌ ์๋๊ฐ ์์ญ ๋ฐฐ ๋๋ ค์ง ์ ์์ด์. ์์ ์ GPU VRAM ์ฉ๋์ ๋ง๋ ๋ชจ๋ธ์ ์ ํํ๋ ๊ฒ ์ค์ํฉ๋๋ค.
❌ ํจ์ 5: ๋ณํ ๊ฒฐ๊ณผ๋ฅผ ๋ฌด๋นํ์ ์ผ๋ก ์ฌ์ฉํ๊ธฐ
WER 8~12%๋ผ๋ ์์น๋ "100 ๋จ์ด ์ค 8~12๊ฐ๋ ํ๋ฆด ์ ์๋ค"๋ ์๋ฏธ์ ๋๋ค. ์ค์ํ ํ์๋ก์ด๋ผ๋ฉด ๋ฐ๋์ ์ฌ๋์ด ๊ฒํ ํ๋ ๊ณผ์ ์ ๊ฑฐ์ณ์ผ ํฉ๋๋ค. ํนํ ์ธ๋ช , ํ์ฌ๋ช , ์ ํ๋ช , ์์น(๊ธ์ก, ๋ ์ง ๋ฑ)๋ ์ค์ธ์ ๊ฐ๋ฅ์ฑ์ด ๋์ผ๋ ์ง์คํด์ ํ์ธํ์ธ์.
❓ ์์ฃผ ๋ฌป๋ ์ง๋ฌธ
Q1: OpenAI Whisper ๋ฌด๋ฃ๋ก ์ธ ์ ์๋์?
๋ค, OpenAI Whisper๋ MIT ๋ผ์ด์ ์ค๋ก ๊ณต๊ฐ๋ ์์ ๋ฌด๋ฃ ์คํ์์ค ๋ชจ๋ธ์ ๋๋ค. GitHub์์ ์์ค์ฝ๋๋ฅผ ๋ด๋ ค๋ฐ์ ๋ก์ปฌ PC์ ์ค์นํ๋ฉด API ๋น์ฉ ์์ด ๋ฌด์ ํ์ผ๋ก ์ฌ์ฉํ ์ ์์ด์. ๋จ, Whisper๋ฅผ OpenAI API๋ก ์ฌ์ฉํ ๊ฒฝ์ฐ(Whisper API)๋ ๋ถ๋น ์ฝ $0.006์ ๋น์ฉ์ด ๋ฐ์ํฉ๋๋ค. ๋ก์ปฌ ์ค์น ๋ฐฉ์์ ์ด๊ธฐ ์ค์น๊ฐ ์ฝ๊ฐ ๋ฒ๊ฑฐ๋กญ์ง๋ง ์ดํ์๋ ์ธํฐ๋ท ์ฐ๊ฒฐ ์์ด๋ ์์ ๋ฌด๋ฃ๋ก ์์ฑ ํ ์คํธ ๋ณํ์ด ๊ฐ๋ฅํ๊ณ , ์ฌ๋ด ํ์ ๋ด์ฉ ๊ฐ์ ๋ฏผ๊ฐํ ๋ฐ์ดํฐ๋ ์ธ๋ถ๋ก ์ ์ก๋์ง ์์ ๋ณด์ ์ธก๋ฉด์์๋ ์ฐ์ํฉ๋๋ค. ์์ ์ ์ด์ฉ๋ MIT ๋ผ์ด์ ์ค ํ์ ํ์ฉ๋๋ฏ๋ก, ๊ธฐ์ ๋ด๋ถ ์์คํ ์ ํตํฉํด ์ฌ์ฉํด๋ ๋ฒ์ ๋ฌธ์ ๊ฐ ์์ต๋๋ค.
Q2: Whisper ํ๊ตญ์ด ์ธ์ ์ ํ๋๊ฐ ์ด๋ ์ ๋์ธ๊ฐ์?
Whisper์ ํ๊ตญ์ด ์ธ์ ์ ํ๋๋ ๋ชจ๋ธ ํฌ๊ธฐ์ ๋ฐ๋ผ ํฌ๊ฒ ๋ฌ๋ผ์ง๋๋ค. ๊ฐ์ฅ ํฐ ๋ชจ๋ธ์ธ large-v3 ๊ธฐ์ค์ผ๋ก ํ๊ตญ์ด WER(๋จ์ด ์ค๋ฅ์จ)์ ์ฝ 8~12% ์์ค์ผ๋ก, ํ์ค ํ๊ตญ์ด ๋ฐ์ ๊ธฐ์ค์ผ๋ก๋ ๋งค์ฐ ๋์ ์ ํ๋๋ฅผ ๋ณด์ ๋๋ค. ๋ค๋ง ์ฌํฌ๋ฆฌ, ์ ๋ฌธ ์ฉ์ด, ๋น ๋ฅธ ๋งํฌ, ๋ฐฐ๊ฒฝ ์์์ด ์๋ ํ๊ฒฝ์์๋ ์ ํ๋๊ฐ ๋จ์ด์ง ์ ์์ด์. ์ค๋ฌด์์๋ large-v3 ๋ชจ๋ธ + ํ์ฒ๋ฆฌ ๊ต์ ์กฐํฉ์ ๊ถ์ฅํฉ๋๋ค. medium ๋ชจ๋ธ๋ ํ๊ตญ์ด์์ ์ถฉ๋ถํ ์ค์ฉ์ ์ธ ์์ค(WER ์ฝ 15%)์ด๋ผ GPU ๋ฉ๋ชจ๋ฆฌ๊ฐ ๋ถ์กฑํ ํ๊ฒฝ์์๋ medium์ผ๋ก๋ ์ถฉ๋ถํฉ๋๋ค. ๋๋ฉ์ธ๋ณ ์ ๋ฌธ ์ฉ์ด๋ฅผ initial_prompt์ ๋ฃ์ผ๋ฉด ์ธ์๋ฅ ์ ์ถ๊ฐ๋ก ๋์ผ ์ ์์ต๋๋ค.
Q3: Whisper ์ค์นํ ๋ GPU ์์ด๋ ๋๋์?
GPU ์์ด CPU๋ง์ผ๋ก๋ Whisper ์คํ์ด ๊ฐ๋ฅํฉ๋๋ค. ๋ค๋ง ์๋ ์ฐจ์ด๊ฐ ์๋นํด์. GPU(RTX 3060 ๊ธฐ์ค)๋ก๋ 1์๊ฐ์ง๋ฆฌ ์์ฑ์ ์ฝ 5~7๋ถ์ ์ฒ๋ฆฌํ์ง๋ง, CPU(Intel i7 ๊ธฐ์ค)๋ก๋ ๊ฐ์ ํ์ผ์ ์ฒ๋ฆฌํ๋ ๋ฐ 30~60๋ถ์ด ๊ฑธ๋ฆด ์ ์์ต๋๋ค. CPU ํ๊ฒฝ์์๋ ์์ ๋ชจ๋ธ(tiny, base, small)์ ์ฌ์ฉํ๋ ๊ฒ์ด ํ์ค์ ์ด์์. GPU๊ฐ ์๋ ํ๊ฒฝ์์ ๋น ๋ฅธ ์ฒ๋ฆฌ๊ฐ ํ์ํ๋ค๋ฉด, whisper.cpp๋ faster-whisper ๊ฐ์ ์ต์ ํ ๊ตฌํ์ฒด๋ฅผ ์ฌ์ฉํ๋ฉด CPU์์๋ 2~4๋ฐฐ ๋น ๋ฅธ ์๋๋ฅผ ๋ผ ์ ์์ต๋๋ค. ๋งฅ๋ถ M ์๋ฆฌ์ฆ ์ฌ์ฉ์๋ MPS(Metal Performance Shaders) ๊ฐ์์ ํ์ฉํ ์ ์์ด CPU ํ๊ฒฝ ๋๋น ํฌ๊ฒ ๋น ๋ฆ ๋๋ค.
Q4: Whisper๋ก Zoom์ด๋ Teams ํ์ ๋ นํ ํ์ผ ๋ณํํ ์ ์๋์?
๊ฐ๋ฅํฉ๋๋ค. Zoom์ .mp4 ๋๋ .m4a ํ์์ผ๋ก, Teams๋ .mp4 ํ์์ผ๋ก ํ์๋ฅผ ์ ์ฅํ๋๋ฐ, Whisper๋ mp3, mp4, m4a, wav, webm ๋ฑ ๋๋ถ๋ถ์ ์ค๋์ค/๋น๋์ค ํ์์ ์ง์ ์ง์ํฉ๋๋ค. ๋ณ๋์ ํฌ๋งท ๋ณํ ์์ด ๋ฐ๋ก ์ ๋ ฅ ํ์ผ๋ก ์ฌ์ฉํ ์ ์์ด์. ๋จ, ์ฌ๋ฌ ์ฐธ์์๊ฐ ๋์์ ๋งํ๋ ์ํฉ์ด๋ ์์ฝ๊ฐ ์ฌํ ๋ นํ ํ๊ฒฝ์์๋ ์ธ์ ์ ํ๋๊ฐ ๋ค์ ๋ฎ์์ง ์ ์์ต๋๋ค. ์ ์ฒ๋ฆฌ ๋จ๊ณ์์ ffmpeg์ผ๋ก ์ค๋์ค๋ฅผ 16kHz ๋ชจ๋ ธ๋ก ๋ณํํ๋ฉด ์ ํ๋๋ฅผ ๋์ด๋ ๋ฐ ๋์์ด ๋ฉ๋๋ค. ํ์ ๋ถ๋ฆฌ(Speaker Diarization)๊ฐ ํ์ํ๋ค๋ฉด pyannote-audio ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ Whisper์ ํจ๊ป ์ฌ์ฉํ๋ ๋ฐฉ๋ฒ๋ ์์ต๋๋ค.
Q5: Whisper์ Clova Note, VITO ์ค ์ด๋ ๊ฒ ๋ ๋ซ๋์?
๋ชฉ์ ๊ณผ ํ๊ฒฝ์ ๋ฐ๋ผ ๋ค๋ฆ ๋๋ค. Clova Note(๋ค์ด๋ฒ)์ VITO๋ ํด๋ผ์ฐ๋ ๊ธฐ๋ฐ ์๋น์ค๋ก UI๊ฐ ํธ๋ฆฌํ๊ณ ํ์ ๋ถ๋ฆฌ ๊ธฐ๋ฅ์ด ๋ด์ฅ๋์ด ์์ด ๋น๊ฐ๋ฐ์๋ ๋ฐ๋ก ์ธ ์ ์๋ ์ฅ์ ์ด ์์ต๋๋ค. ๋ฐ๋ฉด Whisper ๋ก์ปฌ ์ค์น๋ ①์์ ๋ฌด๋ฃ(API ๋น์ฉ ์์) ②๋ฐ์ดํฐ๊ฐ ์ธ๋ถ๋ก ๋๊ฐ์ง ์์ ๋ณด์ ์ฐ์ ③์ปค์คํฐ๋ง์ด์ฆ ๊ฐ๋ฅ ④์คํ๋ผ์ธ ๋์์ด๋ผ๋ ์ฅ์ ์ด ์์ด์. ์ ๊ธฐ์ ์ผ๋ก ๊ธด ํ์๋ฅผ ์ฒ๋ฆฌํ๊ฑฐ๋ ๋ฏผ๊ฐํ ๋ด์ฉ์ด ํฌํจ๋ ํ์๋ผ๋ฉด Whisper ๋ก์ปฌ์ด ์๋์ ์ผ๋ก ์ ๋ฆฌํฉ๋๋ค. ๋ฐ๋ฉด ๊ฐ๋ ์งง์ ์์ฑ์ ๊ฐํธํ๊ฒ ์ฒ๋ฆฌํ๊ณ ์ถ๋ค๋ฉด ํด๋ผ์ฐ๋ ์๋น์ค๊ฐ ํธํฉ๋๋ค. ๋ ๋ฐฉ์์ ๋ณํํ๋ ๊ฒ๋ ์ข์ ์ ํ์ ๋๋ค.
๐ ํต์ฌ ์์ฝ ํ ์ด๋ธ
| ํญ๋ชฉ | ๋ด์ฉ | ์ค์๋ |
|---|---|---|
| ์ถ์ฒ ๋ชจ๋ธ (GPU 6GB+) | large-v3-turbo | ⭐⭐⭐⭐⭐ |
| ์ถ์ฒ ๋ชจ๋ธ (CPU ํ๊ฒฝ) | small ๋๋ faster-whisper | ⭐⭐⭐⭐ |
| ํ๊ตญ์ด ์ง์ ์ต์ | --language ko ๋ฐ๋์ ๋ช
์ |
⭐⭐⭐⭐⭐ |
| ์ ํ๋ ํฅ์ ํต์ฌ | initial_prompt์ ๋๋ฉ์ธ ์ฉ์ด ํฌํจ | ⭐⭐⭐⭐⭐ |
| ์ค๋์ค ์ ์ฒ๋ฆฌ | ffmpeg์ผ๋ก 16kHz ๋ชจ๋ ธ ๋ณํ | ⭐⭐⭐⭐ |
| ์๋ ์ต์ ํ | faster-whisper ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ฌ์ฉ | ⭐⭐⭐⭐ |
| ๊ธด ํ์ผ ์ฒ๋ฆฌ | 30๋ถ ๋จ์ ๋ถํ ํ ์ฒ๋ฆฌ | ⭐⭐⭐⭐ |
| Python ๋ฒ์ | 3.10 ๋๋ 3.11 ๊ถ์ฅ | ⭐⭐⭐⭐ |
| ๊ฐ์ํ๊ฒฝ ์ฌ์ฉ | venv ํ์ (์ถฉ๋ ๋ฐฉ์ง) | ⭐⭐⭐⭐ |
| ๊ฒฐ๊ณผ๋ฌผ ๊ฒํ | ์ธ๋ช ·์์น ๋ฐ๋์ ์ฌ๋์ด ํ์ธ | ⭐⭐⭐⭐⭐ |
| ์๋ํ ํ์ดํ๋ผ์ธ | ํด๋ ๊ฐ์ + Slack ์ฐ๋ ์ถ์ฒ | ⭐⭐⭐ |
| ํ์ ๋ถ๋ฆฌ ํ์ ์ | pyannote-audio ์ถ๊ฐ ์ฌ์ฉ | ⭐⭐⭐ |
๋ง์น๋ฉฐ: ํ ๋ฒ ์ค์นํ๋ฉด ํ์ ์ฐ๋ ๋๊ตฌ
ํ์๋ก ์๋ํ๋ ๋จ์ํ ์๊ฐ์ ์๋ผ๋ ๊ฒ ์ด์์ ๋๋ค. ํ ์คํธ๋ก ๋ณํ๋ ํ์ ๋ด์ฉ์ ๊ฒ์์ด ๋๊ณ , ๋ถ์์ด ๋๊ณ , AI๋ก ์์ฝ์ด ๋ฉ๋๋ค. Whisper๋ก ๋ง๋ ํ์๋ก์ ChatGPT๋ Claude๋ฅผ ์ฐ๊ฒฐํ๋ฉด "์ง๋๋ฌ ํ์์์ ๊ฒฐ์ ๋ ์ฌํญ๋ง ๋ฝ์์ค"๋ผ๋ ์ง๋ฌธ์ ์ฆ์ ๋ตํ ์ ์๋ ์์คํ ์ด ์์ฑ๋๊ฑฐ๋ ์.
whisper ํ๊ตญ์ด ์ค์ ํ๋๋ง ์ ๋๋ก ์ก์๋ ๊ตญ๋ด ํ์ ํ๊ฒฝ์์ ์ถฉ๋ถํ ์ค์ฉ์ ์ธ ๊ฒฐ๊ณผ๋ฅผ ์ป์ ์ ์๊ณ , ์์ฑ ํ ์คํธ ๋ณํ ๋ฌด๋ฃ ๋๊ตฌ ์ค ํ์ฌ ์ด ์ ๋ ์์ฑ๋๋ฅผ ๊ฐ์ง ๊ฑด Whisper๊ฐ ์ ์ผํฉ๋๋ค. openai whisper ์ค์น๊ฐ ์ฒ์์๋ ๋ฏ์ค์ด๋, ํ ๋ฒ ํ๊ฒฝ์ ๊ฐ์ถฐ๋๋ฉด ์ดํ์๋ ํ์ผ์ ํด๋์ ๋ฃ๋ ๊ฒ๋ง์ผ๋ก ์๋์ผ๋ก ํ์๋ก์ด ๋ง๋ค์ด์ง๋ ๊ฒฝํ์ ํ๊ฒ ๋ ๊ฑฐ์์.
์์์ ๊ฐ๋จํฉ๋๋ค. ์ง๊ธ ๋ฐ๋ก pip install openai-whisper๋ฅผ ์
๋ ฅํด๋ณด์ธ์.
๐ฌ ์ฌ๋ฌ๋ถ์ ๊ฒฝํ์ ๋๊ธ๋ก ์๋ ค์ฃผ์ธ์!
- ์ด๋ค ํ๊ฒฝ(Windows/Mac/Linux)์์ ์ค์นํ์
จ๋์?
- GPU ์์ด CPU๋ก ์คํํด๋ณด์ ๋ถ, ์ค์ ์ฒ๋ฆฌ ์๋๊ฐ ์ด๋ป๊ฒ ๋์๋์?
- ํ๊ตญ์ด ์ธ์์์ ํน๋ณํ ์ ์ ๋๋ ์ํฉ์ด ์์๋์? (์ฌํฌ๋ฆฌ, ํน์ ์ ๋ฌธ ์ฉ์ด ๋ฑ)
๋ค์ ๊ธ์์๋ Whisper + pyannote-audio๋ก ํ์ ๋ถ๋ฆฌ(๋๊ฐ ๋งํ๋์ง ์๋ ๊ตฌ๋ถ)๊น์ง ๊ตฌํํ๋ ๋ฐฉ๋ฒ์ ๋ค๋ฃฐ ์์ ์ ๋๋ค. ํ ํ์์์ "๊น ํ์ฅ: ...", "์ด ๋๋ฆฌ: ..." ํํ๋ก ์๋ ์ ๋ฆฌ๋๋ ํ์๋ก, ๊ธฐ๋ํด์ฃผ์ธ์!
๋๊ธ
๋๊ธ ์ฐ๊ธฐ