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:
- Kullanıcı Dostu Arayüz: PyQt5 ile geliştirilen temiz ve anlaşılır arayüz
- Güçlü Çeviri Motoru: Facebook’un NLLB-200 modeli kullanılarak yüksek kaliteli çeviriler
- GPU Desteği: CUDA destekli GPU’lar ile hızlandırılmış çeviri
- Büyük Dosya Desteği: Uzun metinleri otomatik olarak parçalara ayırma
- İ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?
- Kullanıcı arayüz üzerinden PDF dosyasını seçer
- Sistem PDF’den metni çıkarır
- Metin uygun boyutta parçalara ayrılır
- NLLB-200 modeli kullanılarak İngilizce’den Türkçe’ye çeviri yapılır
- Ç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:
- “PDF Seç” butonu ile çevirmek istediğiniz dosyayı seçin
- “Çevir” butonuna basarak işlemi başlatın
- Ç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:
- Birden fazla dil desteği eklenebilir
- OCR entegrasyonu ile taramalı PDF’ler çevrilebilir
- Toplu dosya çevirme özelliği eklenebilir
- Ç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_())