Zatimm commited on
Commit
1009d55
·
verified ·
1 Parent(s): 018402c

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +110 -96
app.py CHANGED
@@ -1,120 +1,134 @@
1
- # Gerekli kütüphaneleri içe aktar
 
2
  import gradio as gr
3
  import torch
4
- import pypandoc
5
- from pathlib import Path
6
- from nougat import NougatModel
7
- from nougat.utils.device import move_to_device
8
- import os
9
-
10
- # Pandoc'un yolunu belirtmek, özellikle Hugging Face Spaces gibi ortamlarda önemlidir.
11
- # Genellikle /usr/bin/pandoc altında bulunur. Eğer yoksa pypandoc kendi kendine indirmeyi dener.
12
- # os.environ.setdefault('PYPANDOC_PANDOC', '/usr/bin/pandoc')
13
-
14
- # --- Model Yükleme ---
15
- # Model, uygulama başladığında yalnızca bir kez yüklenir.
16
- # Bu, her dönüştürme işleminde modeli tekrar yüklemenin önüne geçer.
17
- print("Nougat modeli yükleniyor...")
18
- # Kullanılabilir bir GPU varsa modeli GPU'ya, yoksa CPU'ya taşı
19
- device = "cuda" if torch.cuda.is_available() else "cpu"
20
- model = NougatModel.from_pretrained("facebook/nougat-base").to(device)
21
- model.eval()
22
- print(f"Model başarıyla '{device}' üzerine yüklendi.")
23
-
24
-
25
- def convert_pdf_to_epub(pdf_file):
26
- """
27
- Bu fonksiyon bir PDF dosyası alır, Nougat ile Markdown'a çevirir
28
- ve Pandoc ile EPUB formatına dönüştürür.
29
- """
30
- if pdf_file is None:
31
- raise gr.Error("Lütfen bir PDF dosyası yükleyin!")
32
-
33
- pdf_path = Path(pdf_file.name)
34
- print(f"İşlem başlıyor: {pdf_path.name}")
35
-
36
  try:
37
- # --- 1. Adım: PDF'i Nougat ile Markdown'a çevirme ---
38
- print("Nougat ile metin ve yapı analizi yapılıyor...")
39
- # `model.inference` metodu, PDF dosyasının yolunu alarak işlem yapar.
40
- # Bu işlem, PDF'in sayfa sayısına ve karmaşıklığına bağlı olarak zaman alabilir.
41
- result = model.inference(image_paths=[pdf_path])
42
 
43
- # Nougat çıktısı bir sözlüktür ve 'markdown' anahtarı metni içerir.
44
- markdown_content = result['markdown']
 
 
 
 
 
45
 
46
- if not markdown_content.strip():
47
- raise gr.Error("PDF'den metin çıkarılamadı. Dosya bozuk veya sadece resim içeriyor olabilir.")
48
-
49
- print("Markdown içeriği başarıyla oluşturuldu.")
50
-
51
- # --- 2. Adım: Markdown'ı Pandoc ile EPUB'a dönüştürme ---
52
- print("Pandoc ile EPUB dosyası oluşturuluyor...")
53
 
54
- # Çıktı dosyasının adını oluştur
55
- output_filename = pdf_path.stem + ".epub"
56
- # Geçici bir dizine kaydet
57
- output_path = Path("/tmp") / output_filename
58
-
59
- # pypandoc kullanarak dönüştürme işlemi
60
- # `extra_args` ile EPUB dosyasına başlık gibi metadata ekleyebiliriz.
61
- pypandoc.convert_text(
62
- source=markdown_content,
63
- to='epub',
64
- format='markdown',
65
- outputfile=str(output_path),
66
- extra_args=[f'--metadata=title:{pdf_path.stem}']
67
- )
68
-
69
- print(f"EPUB dosyası başarıyla oluşturuldu: {output_path}")
70
 
71
- # Oluşturulan dosyanın yolunu döndürerek Gradio'nun indirme linki sunmasını sağla
72
- return str(output_path)
 
 
73
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
74
  except Exception as e:
75
- print(f"Bir hata oluştu: {e}")
76
- # Kullanıcıya anlamlı bir hata mesajı göster
77
- raise gr.Error(f"Dönüştürme sırasında bir hata oluştu: {e}")
 
78
 
79
 
80
  # --- Gradio Arayüzü ---
81
- # `gr.Blocks()` ile daha esnek ve özelleştirilebilir bir arayüz oluşturuyoruz.
82
  with gr.Blocks(theme=gr.themes.Soft()) as demo:
83
  gr.Markdown(
84
  """
85
- # 📖 PDF'den EPUB'a Dönüştürücü
86
- Facebook'un **Nougat** modelini kullanarak akademik makaleler ve diğer PDF dosyalarınızı
87
- kolayca okunabilir EPUB formatına dönüştürün.
88
  """
89
  )
90
- with gr.Row():
91
- with gr.Column(scale=1):
92
- pdf_input = gr.File(
93
- label="PDF Dosyası Yükle",
94
- file_types=[".pdf"]
95
- )
96
- convert_button = gr.Button("Dönüştür", variant="primary")
97
- with gr.Column(scale=1):
98
- epub_output = gr.File(
99
- label="İndirilebilir EPUB Dosyası",
100
- interactive=False # Kullanıcının buraya dosya yüklemesini engelle
101
- )
102
 
103
- # Butona tıklandığında `convert_pdf_to_epub` fonksiyonunu çalıştır
104
- # Girdi olarak `pdf_input` bileşenini, çıktı olarak `epub_output` bileşenini kullan
105
- convert_button.click(
106
- fn=convert_pdf_to_epub,
107
- inputs=pdf_input,
108
- outputs=epub_output,
109
- api_name="pdf_to_epub" # API üzerinden erişim için bir isim
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
110
  )
111
 
112
  gr.Examples(
113
- [["ornek_makale.pdf"]],
114
- inputs=[pdf_input],
115
- label="Örnek Dosyalar (Space'e bir örnek PDF yüklediyseniz buraya ekleyebilirsiniz)"
 
 
 
116
  )
117
 
118
- # Arayüzü başlat
119
  if __name__ == "__main__":
120
- demo.launch()
 
1
+ # app.py
2
+
3
  import gradio as gr
4
  import torch
5
+ from transformers import NougatProcessor, VisionEncoderDecoderModel
6
+ from PIL import Image
7
+ import fitz # PyMuPDF
8
+ from typing import List
9
+
10
+ # --- Model ve İşlemci Yükleme ---
11
+ # Modelin yalnızca bir kez yüklenmesini sağlamak için global olarak tanımlıyoruz.
12
+ MODEL_ID = "facebook/nougat-base"
13
+
14
+ try:
15
+ processor = NougatProcessor.from_pretrained(MODEL_ID)
16
+ model = VisionEncoderDecoderModel.from_pretrained(MODEL_ID)
17
+
18
+ # Modeli uygun cihaza taşıma (GPU varsa GPU, yoksa CPU)
19
+ device = "cuda" if torch.cuda.is_available() else "cpu"
20
+ model.to(device)
21
+ print(f"Model '{MODEL_ID}' başarıyla yüklendi ve '{device.upper()}' cihazına taşındı.")
22
+ MODEL_LOADED = True
23
+ except Exception as e:
24
+ print(f"Model yüklenirken bir hata oluştu: {e}")
25
+ MODEL_LOADED = False
26
+ model = None
27
+ processor = None
28
+
29
+ # --- Çekirdek İşleme Fonksiyonları ---
30
+
31
+ def process_single_image(image: Image.Image) -> str:
32
+ """Tek bir PIL görüntüsünü işler ve Markdown metnini döndürür."""
33
+ if not MODEL_LOADED or image is None:
34
+ return "Model yüklenemedi veya geçersiz görüntü."
35
+
 
36
  try:
37
+ # Görüntüyü modelin beklediği formata dönüştürme [1]
38
+ pixel_values = processor(images=image, return_tensors="pt").pixel_values
 
 
 
39
 
40
+ # Metin üretimi [1]
41
+ outputs = model.generate(
42
+ pixel_values.to(device),
43
+ min_length=1,
44
+ max_new_tokens=4096, # Sayfa içeriğine göre ayarlanabilir
45
+ bad_words_ids=[[processor.tokenizer.unk_token_id]],
46
+ )
47
 
48
+ # Çıktıyı okunabilir metne dönüştürme ve son işleme
49
+ sequence = processor.batch_decode(outputs, skip_special_tokens=True)
50
+ sequence = processor.post_process_generation(sequence, fix_markdown=False)
 
 
 
 
51
 
52
+ return sequence
53
+ except Exception as e:
54
+ return f"Görüntü işlenirken bir hata oluştu: {e}"
 
 
 
 
 
 
 
 
 
 
 
 
 
55
 
56
+ def process_pdf_file(pdf_file) -> str:
57
+ """Yüklenen bir PDF dosyasını işler, her sayfasını dönüştürür ve birleştirir."""
58
+ if not MODEL_LOADED or pdf_file is None:
59
+ return "Model yüklenemedi veya PDF dosyası yüklenmedi."
60
 
61
+ full_markdown_content =
62
+ try:
63
+ doc = fitz.open(stream=pdf_file.read(), filetype="pdf")
64
+
65
+ for page_num in range(len(doc)):
66
+ page = doc.load_page(page_num)
67
+
68
+ # Sayfayı yüksek çözünürlüklü bir görüntüye dönüştürme
69
+ pix = page.get_pixmap(dpi=150)
70
+ image = Image.frombytes("RGB", [pix.width, pix.height], pix.samples).convert("RGB")
71
+
72
+ # Her sayfayı tekil görüntü olarak işleme
73
+ page_markdown = process_single_image(image)
74
+ full_markdown_content.append(f"## Sayfa {page_num + 1}\n\n{page_markdown}")
75
+
76
+ return "\n\n---\n\n".join(full_markdown_content)
77
  except Exception as e:
78
+ return f"PDF işlenirken bir hata oluştu: {e}"
79
+ finally:
80
+ if 'doc' in locals() and doc:
81
+ doc.close()
82
 
83
 
84
  # --- Gradio Arayüzü ---
 
85
  with gr.Blocks(theme=gr.themes.Soft()) as demo:
86
  gr.Markdown(
87
  """
88
+ # 📄 Facebook Nougat Belge Dönüştürücü
89
+ Bu arayüz, Meta AI tarafından geliştirilen **facebook/nougat-base** modelini kullanarak belgelerinizi (PDF veya resim) yapılandırılmış Markdown metnine dönüştürmenizi sağlar.
90
+ Lütfen bir PDF dosyası veya bir belge sayfası görüntüsü yükleyin.
91
  """
92
  )
 
 
 
 
 
 
 
 
 
 
 
 
93
 
94
+ with gr.Tabs():
95
+ # PDF İşleme Sekmesi
96
+ with gr.TabItem("PDF Dosyasını İşle"):
97
+ with gr.Row():
98
+ pdf_input = gr.File(label="PDF Dosyası Yükle", file_types=[".pdf"])
99
+ pdf_process_button = gr.Button("PDF'i Dönüştür", variant="primary")
100
+ pdf_output = gr.Markdown(label="Dönüştürülen Metin (Markdown)")
101
+
102
+ # Tek Görüntü İşleme Sekmesi
103
+ with gr.TabItem("Tek Görüntü İşle"):
104
+ with gr.Row():
105
+ image_input = gr.Image(label="Belge Sayfası Görüntüsü Yükle", type="pil")
106
+ image_process_button = gr.Button("Görüntüyü Dönüştür", variant="primary")
107
+ image_output = gr.Markdown(label="Dönüştürülen Metin (Markdown)")
108
+
109
+ # Buton tıklama olaylarını ilgili fonksiyonlara bağlama
110
+ pdf_process_button.click(
111
+ fn=process_pdf_file,
112
+ inputs=[pdf_input],
113
+ outputs=[pdf_output],
114
+ api_name="process_pdf"
115
+ )
116
+
117
+ image_process_button.click(
118
+ fn=process_single_image,
119
+ inputs=[image_input],
120
+ outputs=[image_output],
121
+ api_name="process_image"
122
  )
123
 
124
  gr.Examples(
125
+ examples=["nougat_paper_example.png"],
126
+ inputs=image_input,
127
+ outputs=image_output,
128
+ fn=process_single_image,
129
+ cache_examples=True,
130
+ label="Örnek Görüntü"
131
  )
132
 
 
133
  if __name__ == "__main__":
134
+ demo.launch(debug=True)