Mobil Menü

PDF Çeviri Uygulaması: YZ ile İngilizce’den Türkçe’ye Çeviri

Günümüzde İngilizce PDF belgelerini hızlı ve doğru bir şekilde Türkçe’ye çevirmek için kullanabileceğiniz açık kaynaklı bir Python uygulaması geliştirdik. Bu yazıda, PyQt5 kullanılarak oluşturulan kullanıcı dostu arayüzü ve Facebook’un NLLB-200 modeliyle entegrasyonunu detaylıca ele alacağız.

Uygulamanın Öne Çıkan Özellikleri

Bu PDF çeviri uygulaması birçok kullanışlı özellik sunar:

  1. Kullanıcı Dostu Arayüz: PyQt5 ile geliştirilen temiz ve anlaşılır arayüz
  2. Güçlü Çeviri Motoru: Facebook’un NLLB-200 modeli kullanılarak yüksek kaliteli çeviriler
  3. GPU Desteği: CUDA destekli GPU’lar ile hızlandırılmış çeviri
  4. Büyük Dosya Desteği: Uzun metinleri otomatik olarak parçalara ayırma
  5. İlerleme Takibi: Çeviri sürecini gösteren canlı ilerleme çubuğu

Teknoloji Stack’i

Uygulama şu modern teknolojileri kullanmaktadır:

  • PyQt5: Profesyonel arayüz oluşturmak için
  • Transformers Kütüphanesi: Hugging Face’in yapay zeka modellerine erişim için
  • PyPDF2: PDF’lerden metin çıkarmak için
  • Torch: Derin öğrenme için gerekli altyapı

Nasıl Çalışır?

  1. Kullanıcı arayüz üzerinden PDF dosyasını seçer
  2. Sistem PDF’den metni çıkarır
  3. Metin uygun boyutta parçalara ayrılır
  4. NLLB-200 modeli kullanılarak İngilizce’den Türkçe’ye çeviri yapılır
  5. Çevrilen metinler birleştirilerek kullanıcıya sunulur

Kurulum ve Kullanım

Uygulamayı çalıştırmak için aşağıdaki Python kütüphanelerinin yüklü olması gerekir:

pip install PyQt5 transformers torch PyPDF2

Kod çalıştırıldığında karşınıza gelen arayüzde:

  1. “PDF Seç” butonu ile çevirmek istediğiniz dosyayı seçin
  2. “Çevir” butonuna basarak işlemi başlatın
  3. Çeviri tamamlandığında metni kopyalayabilir veya temizleyebilirsiniz

Performans Optimizasyonları

Uygulama büyük metinlerle çalışırken şu optimizasyonları uygular:

  • Metinleri modelin işleyebileceği boyutta parçalara ayırma
  • GPU kullanımı ile hızlandırma
  • Asenkron çalışma ile arayüzün donmasını engelleme

Kullanım Senaryoları

Bu açık kaynaklı PDF çevirici ile:

  • Akademik makaleleri çevirebilirsiniz
  • Teknik dokümanları anadilinize kazandırabilirsiniz
  • Yabancı dildeki kitapları Türkçe’ye çevirebilirsiniz
  • İş belgelerini hızlıca anlayabilirsiniz

Geliştirme Potansiyeli

Bu temel uygulamanın geliştirilmesi için:

  1. Birden fazla dil desteği eklenebilir
  2. OCR entegrasyonu ile taramalı PDF’ler çevrilebilir
  3. Toplu dosya çevirme özelliği eklenebilir
  4. Çeviri hafızası oluşturulabilir

Sonuç

Bu açık kaynaklı yapay zeka projesi, İngilizce PDF’leri Türkçe’ye çevirmek için güçlü ve kullanımı kolay bir çözüm sunar. Kodlar tamamen özelleştirilebilir olduğundan, ihtiyaçlarınıza göre geliştirebilirsiniz.

Uygulamanın tüm kaynak kodları yukarıda paylaşılmıştır. Kendi bilgisayarınızda denemek için gerekli tüm bağımlılıkları yüklediğinizden emin olun. Yapay zeka tabanlı bu çeviri aracı sayesinde artık yabancı dildeki dokümanlarla çalışmak çok daha kolay!

Not: İlk çalıştırmada büyük boyutlu model dosyalarının indirilmesi gerekebilir. Bu nedenle iyi bir internet bağlantısı ve yeterli depolama alanı gerekmektedir.

import os
import sys
from PyQt5.QtWidgets import (QApplication, QMainWindow, QVBoxLayout, QHBoxLayout, QPushButton,
                             QTextEdit, QLabel, QFileDialog, QWidget, QMessageBox, QProgressBar)
from PyQt5.QtCore import Qt, QThread, pyqtSignal
from PyQt5.QtGui import QTextCursor
from transformers import AutoTokenizer, AutoModelForSeq2SeqLM, pipeline
from PyPDF2 import PdfReader
import torch


class TranslationThread(QThread):
    update_signal = pyqtSignal(str)
    progress_signal = pyqtSignal(int)
    finished_signal = pyqtSignal()

    def __init__(self, text_to_translate):
        super().__init__()
        self.text_to_translate = text_to_translate

    def run(self):
        try:
            # Model ve tokenizer yükleniyor (ilk çalışmada internetten indirilecek)
            model_name = "facebook/nllb-200-distilled-600M"
            tokenizer = AutoTokenizer.from_pretrained(model_name)
            model = AutoModelForSeq2SeqLM.from_pretrained(model_name)

            # Pipeline oluşturma (İngilizce -> Türkçe)
            translator = pipeline(
                'translation',
                model=model,
                tokenizer=tokenizer,
                src_lang='eng_Latn',
                tgt_lang='tur_Latn',
                device=0 if torch.cuda.is_available() else -1  # GPU varsa kullan
            )

            # Metni parçalara böl (model sınırlamaları nedeniyle)
            chunk_size = 500  # Token sayısı
            chunks = [self.text_to_translate[i:i + chunk_size] for i in
                      range(0, len(self.text_to_translate), chunk_size)]

            translated_text = ""
            total_chunks = len(chunks)

            for i, chunk in enumerate(chunks):
                result = translator(chunk, max_length=1000)
                translated_chunk = result[0]['translation_text']
                translated_text += translated_chunk + "\n\n"

                # İlerlemeyi güncelle
                progress = int((i + 1) / total_chunks * 100)
                self.progress_signal.emit(progress)
                self.update_signal.emit(translated_text)

            self.finished_signal.emit()

        except Exception as e:
            self.update_signal.emit(f"Hata oluştu: {str(e)}")
            self.finished_signal.emit()


class PDFTranslatorApp(QMainWindow):
    def __init__(self):
        super().__init__()
        self.setWindowTitle("PDF Çeviri Uygulaması (Açık Kaynaklı Yapay Zeka)")
        self.setGeometry(100, 100, 800, 600)

        self.initUI()
        self.translation_thread = None

    def initUI(self):
        # Ana widget ve layout
        central_widget = QWidget()
        self.setCentralWidget(central_widget)
        main_layout = QVBoxLayout()
        central_widget.setLayout(main_layout)

        # PDF seçme butonu
        self.btn_select_pdf = QPushButton("PDF Seç")
        self.btn_select_pdf.clicked.connect(self.select_pdf)
        main_layout.addWidget(self.btn_select_pdf)

        # Orijinal metin etiketi
        self.lbl_original = QLabel("Orijinal Metin (İngilizce):")
        main_layout.addWidget(self.lbl_original)

        # Orijinal metin gösterimi
        self.text_original = QTextEdit()
        self.text_original.setReadOnly(True)
        main_layout.addWidget(self.text_original)

        # Çeviri butonu
        self.btn_translate = QPushButton("Çevir (İngilizce → Türkçe)")
        self.btn_translate.clicked.connect(self.start_translation)
        self.btn_translate.setEnabled(False)
        main_layout.addWidget(self.btn_translate)

        # İlerleme çubuğu
        self.progress_bar = QProgressBar()
        self.progress_bar.setVisible(False)
        main_layout.addWidget(self.progress_bar)

        # Çeviri etiketi
        self.lbl_translation = QLabel("Çeviri (Türkçe):")
        main_layout.addWidget(self.lbl_translation)

        # Çeviri metni gösterimi
        self.text_translation = QTextEdit()
        self.text_translation.setReadOnly(False)
        main_layout.addWidget(self.text_translation)

        # Kopyala ve temizle butonları
        button_layout = QHBoxLayout()

        self.btn_copy = QPushButton("Çeviriyi Kopyala")
        self.btn_copy.clicked.connect(self.copy_translation)
        self.btn_copy.setEnabled(False)
        button_layout.addWidget(self.btn_copy)

        self.btn_clear = QPushButton("Temizle")
        self.btn_clear.clicked.connect(self.clear_all)
        button_layout.addWidget(self.btn_clear)

        main_layout.addLayout(button_layout)

    def select_pdf(self):
        file_path, _ = QFileDialog.getOpenFileName(self, "PDF Seç", "", "PDF Dosyaları (*.pdf)")

        if file_path:
            try:
                # PDF'den metin çıkarma
                text = ""
                with open(file_path, 'rb') as file:
                    pdf_reader = PdfReader(file)
                    for page in pdf_reader.pages:
                        text += page.extract_text()

                self.text_original.setPlainText(text)
                self.btn_translate.setEnabled(True)
                self.current_pdf_text = text

            except Exception as e:
                QMessageBox.critical(self, "Hata", f"PDF okunurken hata oluştu: {str(e)}")

    def start_translation(self):
        if not hasattr(self, 'current_pdf_text') or not self.current_pdf_text:
            QMessageBox.warning(self, "Uyarı", "Önce bir PDF seçmelisiniz.")
            return

        self.btn_translate.setEnabled(False)
        self.btn_select_pdf.setEnabled(False)
        self.progress_bar.setVisible(True)
        self.progress_bar.setValue(0)
        self.text_translation.clear()

        # Model yükleme uyarısı (ilk seferde büyük model indirilecek)
        QMessageBox.information(self, "Bilgi",
                                "Model ilk kez yükleniyor, bu biraz zaman alabilir. "
                                "Lütfen bekleyin... (İnternet bağlantısı gerekli)")

        # Çeviri thread'ini başlat
        self.translation_thread = TranslationThread(self.current_pdf_text)
        self.translation_thread.update_signal.connect(self.update_translation)
        self.translation_thread.progress_signal.connect(self.update_progress)
        self.translation_thread.finished_signal.connect(self.translation_finished)
        self.translation_thread.start()

    def update_translation(self, text):
        self.text_translation.setPlainText(text)
        # Otomatik kaydırma
        cursor = self.text_translation.textCursor()
        cursor.movePosition(QTextCursor.End)
        self.text_translation.setTextCursor(cursor)

    def update_progress(self, value):
        self.progress_bar.setValue(value)

    def translation_finished(self):
        self.btn_translate.setEnabled(True)
        self.btn_select_pdf.setEnabled(True)
        self.btn_copy.setEnabled(True)
        QMessageBox.information(self, "Bilgi", "Çeviri tamamlandı!")

    def copy_translation(self):
        clipboard = QApplication.clipboard()
        clipboard.setText(self.text_translation.toPlainText())
        QMessageBox.information(self, "Bilgi", "Çeviri panoya kopyalandı!")

    def clear_all(self):
        self.text_original.clear()
        self.text_translation.clear()
        self.progress_bar.setValue(0)
        self.progress_bar.setVisible(False)
        self.btn_copy.setEnabled(False)
        if hasattr(self, 'current_pdf_text'):
            del self.current_pdf_text

    def closeEvent(self, event):
        # Pencere kapanırken çalışan thread varsa beklet
        if self.translation_thread and self.translation_thread.isRunning():
            reply = QMessageBox.question(
                self, 'Uyarı',
                "Çeviri devam ediyor. Çıkmak istediğinizden emin misiniz?",
                QMessageBox.Yes | QMessageBox.No, QMessageBox.No
            )

            if reply == QMessageBox.Yes:
                self.translation_thread.terminate()
                event.accept()
            else:
                event.ignore()
        else:
            event.accept()


if __name__ == "__main__":
    app = QApplication(sys.argv)
    window = PDFTranslatorApp()
    window.show()
    sys.exit(app.exec_())
Osman Bayrak
Osman Bayrak

Yazılım Mühendisiyim. Teknoloji ve yazılıma meraklıyım.

Articles: 334