๐ Whisper๋ก STT(์์ฑ ํ ์คํธ ๋ณํ) ํ๊ธฐ โ Windows FFmpeg & GPU ์ค์ ๊ฐ์ด๋
Python + Whisper + FFmpeg + Scoop + GPU (์ ํ)๊น์ง ์๋ฒฝ ์ ๋ฆฌ!
โ ์ด ๊ธ์์ ๋ค๋ฃจ๋ ๊ฒ
- Whisper ์ค์น ๋ฐ ์คํ ๋ฐฉ๋ฒ
- FFmpeg ์ค์น (PowerShell + Scoop ํ์ฉ)
- GPU / CPU ํ๊ฒฝ ๋ชจ๋ ๋์
- Python ๊ฐ์ํ๊ฒฝ ๊ตฌ์ฑ
- ๋ณํ๋ ๊ฒฐ๊ณผ ์์ ๋ก ์ ์ฅํ๊ธฐ
๐ ์ค๋น๋ฌผ
| ํญ๋ชฉ | ์ค๋ช |
|---|---|
| Python 3.10 ๋๋ 3.11 | 3.12์ ํธํ์ฑ ์ด์ ์์ผ๋ฏ๋ก ๊ถ์ฅํ์ง ์์ |
| NVIDIA GPU (์ ํ) | GPU ๊ฐ์์ ์ํ ์ฅ์น (์: RTX 4070) |
| FFmpeg | ์ค๋์ค ์ ์ฒ๋ฆฌ ํ์ |
| PowerShell | Scoop ์ค์น์ ํ์ |
| pip | Python ํจํค์ง ๊ด๋ฆฌ์ (๊ธฐ๋ณธ ํฌํจ๋จ) |
๐งฑ STEP 1. Python ์ค์น (3.11 ๊ถ์ฅ)
Python 3.11 ๋ค์ด๋ก๋ ๋งํฌ
Python
python3 --version
py --version๐ฑ STEP 2. ๊ฐ์ํ๊ฒฝ ๋ง๋ค๊ธฐ
์๋ฌ ๋ฌธ๊ตฌ : activate ๋ช ๋ น์ด ํ์ฌ ์์น์ ์์ง๋ง ์ด ๋ช ๋ น์ ์ฐพ์ ์ ์์ต๋๋ค. Windows PowerShell์ ๊ธฐ๋ณธ์ ์ผ๋ก ํ์ฌ ์์น์์ ๋ช ๋ น์ ๋ก๋ํ์ง ์์ต๋๋ค.
powershell ๊ด๋ฆฌ์๋ชจ๋ ์คํ > Set-ExecutionPolicy Unrestricted ์ ๋ ฅ
Python
## ๊ฐ์ ํ๊ฒฝ ๋ง๋ค๊ธฐ
python -m venv myenv
- whisper-env ๋์ ์ ์๋ฌด๊ฑฐ๋ ์จ๋ ๋๋ค.
## ๊ฐ์ํ๊ฒฝ ๋ค์ด๊ฐ๋ ๋ฐฉ๋ฒ
1. ๊ฐ์ ํ๊ฒฝ์ ์์ฑํ Scripts ํด๋๋ก ์ด๋ํ๋ค.
-> cd myenvScripts
2. activate ๋ช
๋ น์ด๋ฅผ ์
๋ ฅํ๋ค.
-> .activate์
๋ ฅ ํ ํ๋กฌํํธ๊ฐ ์ด๋ ๊ฒ ๋ฐ๋:
(myenv) C:…>
โ ๊ทธ๋ฌ๋ฉด ์ฑ๊ณต์ ์ผ๋ก ๊ฐ์ํ๊ฒฝ์ ๋ค์ด๊ฐ ๊ฑฐ์ผ!

๐ STEP 3. FFmpeg ์ค์น (Scoop ํ์ฉ)
Python
# PowerShell์์ ์คํฌ๋ฆฝํธ๋ฅผ ์คํํ ์ ์๋๋ก ํ์ฉํด์ฃผ๋ ๋ช
๋ น
Set-ExecutionPolicy RemoteSigned -scope CurrentUser
# ์ด๊ฑด Scoop์ด๋ผ๋ ์๋์ฐ์ฉ ํจํค์ง ๋งค๋์ ๋ฅผ ์ค์นํ๋ ๋ช
๋ น์ด์ผ.
irm get.scoop.sh | iex
scoop install ffmpeg
ffmpeg -version๐ง STEP 4. PyTorch ์ค์น
GPU:
Python
pip install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu121CPU:
Python
pip install torch torchvision torchaudioํ์ธ:
Python
import torch
print(torch.cuda.is_available())
print(torch.cuda.get_device_name(0))๐ฆ STEP 5. Whisper ์ค์น
Python
pip install openai-whisper๐งช STEP 6. Whisper CLI ์ฌ์ฉ ์์
Python
whisper "C:UsersYOUDesktopaudio.wav" --model medium --language Korean๐ STEP 7. Python ์ฝ๋๋ก STT + Excel ์ ์ฅ
Python
import whisper
import pandas as pd
import datetime
import os
def format_time(seconds):
return str(datetime.timedelta(seconds=int(seconds)))
# Whisper ๋ชจ๋ธ์ CPU์์ ๋ก๋
print("Loading Whisper model on CPU...")
model = whisper.load_model("medium", device="cpu")
# ์ค๋์ค ํ์ผ ํด๋ ๊ฒฝ๋ก (๋ฌธ์์ด ์์ r ๋ถ์ฌ์ ๊ฒฝ๋ก ์ค๋ฅ ๋ฐฉ์ง)
folder = r"audio"
results = []
# ํด๋ ๋ด ์ค๋์ค ํ์ผ ํ์ ๋ฐ ์ ์ฌ
for file in os.listdir(folder):
if file.endswith(('.wav', '.mp3', '.m4a')):
path = os.path.join(folder, file)
print(f"Transcribing: {file}")
result = model.transcribe(path, language="ko")
# ์๊ฐ ๊ตฌ๊ฐ๋ณ ํ
์คํธ ์ ๋ฆฌ
segments = []
for seg in result['segments']:
segments.append(f"[{format_time(seg['start'])} - {format_time(seg['end'])}] "{seg['text'].strip()}"")
results.append({
"filename": file,
"transcript": "n".join(segments)
})
# ํ์ฌ ๋ ์ง๋ฅผ YYYYMMDD ํ์์ผ๋ก ๊ฐ์ ธ์ค๊ธฐ
current_date = datetime.datetime.now().strftime("%Y%m%d")
# ํ์ผ ์ด๋ฆ ์์ฑ
file_name = f"{current_date}_results.csv"
output_path = os.path.join('.', file_name) # ์์ ํด๋๋ก ์ด๋
# DataFrame์ CSV๋ก ์ ์ฅ
df = pd.DataFrame(results)
df.to_csv(output_path, index=False, encoding='cp949')
print(f"nโ
์ ์ฌ ์๋ฃ! ๊ฒฐ๊ณผ ์ ์ฅ ์์น: {output_path}")โ ์์ฃผ ๋ฐ์ํ๋ ์ค๋ฅ & ํด๊ฒฐ๋ฒ
| ์ค๋ฅ ๋ฉ์์ง | ํด๊ฒฐ ๋ฐฉ๋ฒ |
|---|---|
| ‘ffmpeg’์(๋) ๋ด๋ถ ๋ช ๋ น์ด๊ฐ ์๋๋๋ค | Scoop ๋๋ ์๋ ์ค์น + ํ๊ฒฝ๋ณ์ ๋ฑ๋ก |
| torch.cuda.is_available() = False | GPU์ฉ PyTorch ๋ฏธ์ค์น. cu121 ๋ฒ์ ์ผ๋ก ์ฌ์ค์น |
| %1์ ์ฌ๋ฐ๋ฅธ Win32 ์์ฉ ํ๋ก๊ทธ๋จ์ด ์๋๋๋ค | Python 3.12์ PyTorch GPU ์ถฉ๋. 3.10~3.11 ๊ถ์ฅ |
| FileNotFoundError | ์ ์ฒด ๊ฒฝ๋ก ์ง์ ํ์ |
๐ ์ฐธ๊ณ ๋งํฌ
- Whisper GitHub
- Scoop ๊ณต์ ์ฌ์ดํธ
๐ ํ๊ตญ์ด ์์ฑ ์ํ
- ๐AI-Hub โ ํ๊ตญ์ด ๊ฐ์ ์์ฑ ๋ฐ์ดํฐEBS ๊ต์ก ์์ ๊ธฐ๋ฐ์ ๊ณ ํ์ง ๊ฐ์ ์์ฑ ๋ฐ์ดํฐ. AI ํ์ต์ด๋ ๊ต์ก ์ฝํ ์ธ ์ ์์ ์ ํฉ.