Ana içeriğe geç
Kategoriye Dön

Whisper Kurulumu: Self-Hosted Ses Tanıma ve Transkripsiyon

OpenAI Whisper kurulumu, faster-whisper ile hızlı transkripsiyon, çoklu dil desteği, API sunucusu, Docker deployment ve ses tanıma optimizasyonu rehberi.

Okuma süresi: 13 dk AI & ML Self-Hosting
whisperses tanımatranskripsiyonyapay zekaself-hostingdocker

İçindekiler

Whisper Kurulumu: Self-Hosted Ses Tanıma ve Transkripsiyon

OpenAI Whisper, 99 dilde ses tanıma ve transkripsiyon yapabilen güçlü bir yapay zeka modelidir. Kendi sunucunuzda çalıştırarak sınırsız transkripsiyon yapabilir, gizliliğinizi koruyabilir ve API maliyetlerinden kurtulabilirsiniz. Bu rehberde Whisper ve faster-whisper kurulumunu, API sunucusu oluşturmayı ve Docker ile deployment'ı ele alacağız.

Whisper Nedir?

Whisper, OpenAI tarafından geliştirilen otomatik konuşma tanıma (ASR) modelidir. 680.000 saat çoklu dil verisinde eğitilmiştir. Temel özellikleri:

  • 99 Dil Desteği: Türkçe dahil 99 dilde transkripsiyon
  • Çeviri: Herhangi bir dilden İngilizce'ye otomatik çeviri
  • Zaman Damgası: Kelime ve cümle bazında zaman damgası
  • Gürültü Dayanıklılığı: Arka plan gürültüsüne karşı yüksek doğruluk
  • Çoklu Format: MP3, WAV, M4A, FLAC, OGG ve daha fazlası
  • Açık Kaynak: MIT lisansı ile ücretsiz kullanım

Model Boyutları

ModelParametreVRAMHızDoğruluk
tiny39 M~1 GBÇok hızlıDüşük
base74 M~1 GBHızlıOrta
small244 M~2 GBOrtaİyi
medium769 M~5 GBYavaşÇok iyi
large-v31.55 B~10 GBEn yavaşEn iyi

Whisper Kurulumu (Python)

Temel Kurulum

hljs bash
# Python sanal ortam
python3 -m venv whisper-env
source whisper-env/bin/activate

# Whisper kurulumu
pip install openai-whisper

# FFmpeg kurulumu (ses işleme için)
sudo apt-get install -y ffmpeg

Komut Satırı Kullanımı

hljs bash
# Temel transkripsiyon
whisper audio.mp3 --model medium --language Turkish

# İngilizce'ye çeviri
whisper audio.mp3 --model medium --task translate

# SRT altyazı formatında çıktı
whisper audio.mp3 --model medium --language Turkish --output_format srt

# Kelime bazında zaman damgası
whisper audio.mp3 --model medium --language Turkish --word_timestamps True

Python ile Kullanım

hljs python
import whisper

# Model yükleme
model = whisper.load_model("medium")

# Transkripsiyon
result = model.transcribe(
    "audio.mp3",
    language="tr",
    task="transcribe",
    word_timestamps=True
)

print(result["text"])

# Segment bazında çıktı
for segment in result["segments"]:
    start = segment["start"]
    end = segment["end"]
    text = segment["text"]
    print(f"[{start:.2f} - {end:.2f}] {text}")

Faster-Whisper Kurulumu

Faster-whisper, CTranslate2 tabanlı bir Whisper implementasyonudur. Orijinal Whisper'dan 4 kata kadar hızlı çalışır ve daha az bellek kullanır.

hljs bash
# Faster-whisper kurulumu
pip install faster-whisper

Python ile Faster-Whisper

hljs python
from faster_whisper import WhisperModel

# Model yükleme (GPU)
model = WhisperModel(
    "large-v3",
    device="cuda",
    compute_type="float16"
)

# CPU modu için
# model = WhisperModel("large-v3", device="cpu", compute_type="int8")

# Transkripsiyon
segments, info = model.transcribe(
    "audio.mp3",
    language="tr",
    beam_size=5,
    word_timestamps=True,
    vad_filter=True  # Sessiz bölümleri atla
)

print(f"Algılanan dil: {info.language} (olasılık: {info.language_probability:.2f})")

for segment in segments:
    print(f"[{segment.start:.2f}s -> {segment.end:.2f}s] {segment.text}")

API Sunucusu Oluşturma

FastAPI ile Whisper API

hljs python
from fastapi import FastAPI, UploadFile, File
from faster_whisper import WhisperModel
import tempfile
import os

app = FastAPI(title="Whisper API")
model = WhisperModel("large-v3", device="cuda", compute_type="float16")

@app.post("/v1/audio/transcriptions")
async def transcribe(
    file: UploadFile = File(...),
    language: str = None,
    response_format: str = "json"
):
    # Geçici dosyaya kaydet
    with tempfile.NamedTemporaryFile(delete=False, suffix=os.path.splitext(file.filename)[1]) as tmp:
        content = await file.read()
        tmp.write(content)
        tmp_path = tmp.name
    
    try:
        segments, info = model.transcribe(
            tmp_path,
            language=language,
            beam_size=5,
            vad_filter=True
        )
        
        segments_list = list(segments)
        full_text = " ".join([s.text.strip() for s in segments_list])
        
        if response_format == "text":
            return full_text
        
        return {
            "text": full_text,
            "language": info.language,
            "duration": info.duration,
            "segments": [
                {
                    "start": s.start,
                    "end": s.end,
                    "text": s.text.strip()
                } for s in segments_list
            ]
        }
    finally:
        os.unlink(tmp_path)

@app.get("/health")
async def health():
    return {"status": "ok", "model": "large-v3"}

Başlatma

hljs bash
pip install fastapi uvicorn python-multipart
uvicorn whisper_api:app --host 0.0.0.0 --port 9000

Docker ile Deployment

Dockerfile

hljs dockerfile
FROM nvidia/cuda:12.4.0-runtime-ubuntu22.04

RUN apt-get update && apt-get install -y \
    python3 python3-pip ffmpeg \
    && rm -rf /var/lib/apt/lists/*

WORKDIR /app

COPY requirements.txt .
RUN pip3 install --no-cache-dir -r requirements.txt

COPY whisper_api.py .

EXPOSE 9000

CMD ["uvicorn", "whisper_api:app", "--host", "0.0.0.0", "--port", "9000"]

requirements.txt

faster-whisper>=1.0.0
fastapi>=0.104.0
uvicorn>=0.24.0
python-multipart>=0.0.6

Docker Compose

hljs yaml
version: '3.8'
services:
  whisper:
    build: .
    container_name: whisper-api
    ports:
      - "9000:9000"
    volumes:
      - whisper_cache:/root/.cache
    deploy:
      resources:
        reservations:
          devices:
            - driver: nvidia
              count: 1
              capabilities: [gpu]
    restart: unless-stopped
    healthcheck:
      test: ["CMD", "curl", "-f", "http://localhost:9000/health"]
      interval: 30s
      timeout: 10s
      retries: 3

volumes:
  whisper_cache:

API Kullanım Örnekleri

cURL ile Transkripsiyon

hljs bash
# Dosya yükleme ile transkripsiyon
curl -X POST http://localhost:9000/v1/audio/transcriptions \
  -F "file=@meeting.mp3" \
  -F "language=tr"

# Otomatik dil algılama
curl -X POST http://localhost:9000/v1/audio/transcriptions \
  -F "file=@audio.wav"

Python ile API Kullanımı

hljs python
import requests

def transcribe_audio(file_path, language=None):
    url = "http://localhost:9000/v1/audio/transcriptions"
    
    with open(file_path, "rb") as f:
        files = {"file": f}
        data = {}
        if language:
            data["language"] = language
        
        response = requests.post(url, files=files, data=data)
    
    return response.json()

# Kullanım
result = transcribe_audio("meeting.mp3", language="tr")
print(f"Metin: {result['text']}")
print(f"Süre: {result['duration']:.1f} saniye")

for seg in result["segments"]:
    print(f"  [{seg['start']:.1f}s] {seg['text']}")

Batch Transkripsiyon

hljs python
import os
import glob
from faster_whisper import WhisperModel

model = WhisperModel("large-v3", device="cuda", compute_type="float16")

# Dizindeki tüm ses dosyalarını transkribe et
audio_files = glob.glob("audio_files/*.mp3") + glob.glob("audio_files/*.wav")

for audio_file in audio_files:
    print(f"İşleniyor: {audio_file}")
    segments, info = model.transcribe(audio_file, language="tr", vad_filter=True)
    
    output_file = os.path.splitext(audio_file)[0] + ".txt"
    with open(output_file, "w", encoding="utf-8") as f:
        for segment in segments:
            f.write(f"[{segment.start:.2f} - {segment.end:.2f}] {segment.text}\n")
    
    print(f"  Kaydedildi: {output_file}")

SRT Altyazı Oluşturma

hljs python
def generate_srt(segments, output_path):
    with open(output_path, "w", encoding="utf-8") as f:
        for i, segment in enumerate(segments, 1):
            start = format_timestamp(segment.start)
            end = format_timestamp(segment.end)
            f.write(f"{i}\n{start} --> {end}\n{segment.text.strip()}\n\n")

def format_timestamp(seconds):
    hours = int(seconds // 3600)
    minutes = int((seconds % 3600) // 60)
    secs = int(seconds % 60)
    millis = int((seconds % 1) * 1000)
    return f"{hours:02d}:{minutes:02d}:{secs:02d},{millis:03d}"

# Kullanım
segments, info = model.transcribe("video.mp4", language="tr")
generate_srt(list(segments), "subtitles.srt")

Performans Optimizasyonu

hljs bash
# VAD filtresi ile sessiz bölümleri atlama
segments, _ = model.transcribe("audio.mp3", vad_filter=True, vad_parameters=dict(min_silence_duration_ms=500))

# INT8 quantization (CPU modunda hız artışı)
model = WhisperModel("large-v3", device="cpu", compute_type="int8")

# Float16 (GPU modunda optimal)
model = WhisperModel("large-v3", device="cuda", compute_type="float16")

REXE GPU sunucularında Whisper ile yüksek hızda ses tanıma ve transkripsiyon yapabilirsiniz. Large-v3 modeli ile Türkçe dahil 99 dilde yüksek doğrulukta sonuçlar elde edin.