yunuseduran commited on
Commit
4d47729
·
verified ·
1 Parent(s): 8183e5e

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +113 -110
app.py CHANGED
@@ -1,110 +1,113 @@
1
- import gradio as gr
2
- import whisper
3
- import os
4
- import asyncio
5
- import shutil
6
- import tempfile
7
- import uuid
8
- import torch
9
-
10
- # Whisper modeli yükleme
11
- MODEL_SIZE = os.getenv("MODEL_SIZE", "small")
12
- device = "cuda" if torch.cuda.is_available() else "cpu"
13
- print(f"Kullanılan cihaz: {device}") # Cihaz bilgisi
14
- model = whisper.load_model(MODEL_SIZE).to(device)
15
-
16
- # Dosya sınırları
17
- MAX_FILE_SIZE_MB = int(os.getenv("MAX_FILE_SIZE_MB", 25)) # Maksimum 25MB
18
- ALLOWED_FORMATS = {"mp3", "wav", "m4a", "ogg"}
19
-
20
- def delete_audio_file(file_path, retries=3, wait_time=1):
21
- """
22
- Ses dosyasını silme işlemi (tekrar deneme mekanizmalı)
23
- """
24
- for attempt in range(retries):
25
- try:
26
- if file_path and os.path.exists(file_path):
27
- os.remove(file_path)
28
- print(f"Dosya başarıyla silindi: {file_path}")
29
- return True
30
- except Exception as e:
31
- print(f"Dosya silme başarısız (Deneme {attempt + 1}/{retries}): {file_path} - {e}")
32
- return False
33
-
34
- def format_text(text: str) -> str:
35
- """Cümleleri satır satır düzenler"""
36
- noktalama_isaretleri = [".", "?", "!", ""]
37
- for nokta in noktalama_isaretleri:
38
- text = text.replace(nokta, nokta + "\n")
39
- return "\n".join(filter(bool, text.split("\n")))
40
-
41
- async def process_and_transcribe(audio_path):
42
- """
43
- Ses dosyasını işleyip metne çevirir.
44
- """
45
- if not audio_path or not os.path.exists(audio_path):
46
- return "", "❌ Ses dosyası yüklenmedi."
47
-
48
- file_extension = os.path.splitext(audio_path)[-1].lower().lstrip(".")
49
- if file_extension not in ALLOWED_FORMATS:
50
- return "", f"❌ Desteklenen formatlar: {', '.join(ALLOWED_FORMATS)} (Yüklenen: {file_extension})."
51
-
52
- temp_audio_path = os.path.join(tempfile.gettempdir(), f"{uuid.uuid4()}.{file_extension}")
53
- shutil.copy(audio_path, temp_audio_path)
54
-
55
- try:
56
- file_size_mb = os.path.getsize(temp_audio_path) / (1024 * 1024)
57
- if file_size_mb > MAX_FILE_SIZE_MB:
58
- delete_audio_file(temp_audio_path)
59
- return "", f"❌ Dosya boyutu {MAX_FILE_SIZE_MB}MB'ı geçemez (Yüklenen: {file_size_mb:.2f}MB)."
60
-
61
- text = await transcribe_audio(temp_audio_path)
62
- formatted = format_text(text)
63
- return formatted, "✅ Transkript başarıyla oluşturuldu."
64
-
65
- except Exception as e:
66
- return "", f"⚠️ Hata oluştu: {str(e)}"
67
-
68
- finally:
69
- delete_audio_file(temp_audio_path)
70
-
71
- async def transcribe_audio(audio_path):
72
- """
73
- Whisper ile transkript oluşturma
74
- """
75
- result = await asyncio.to_thread(
76
- model.transcribe,
77
- audio_path,
78
- language="tr",
79
- temperature=0.0,
80
- beam_size=5,
81
- fp16=False # CPU kullanımında hata önlemek için
82
- )
83
- return result["text"]
84
-
85
- with gr.Blocks() as demo:
86
- gr.Markdown("## 🎤 Türkçe Ses Transkript Aracı")
87
- gr.Markdown("""
88
- **Türkçe sesleri yazıya döken araç**. **Maksimum 25MB** boyutunda ses dosyaları yükleyebilirsiniz.
89
- """)
90
-
91
- with gr.Row():
92
- audio_input = gr.Audio(
93
- label="Ses dosyasını yükleyin veya kaydedin",
94
- type="filepath",
95
- autoplay=False,
96
- )
97
-
98
- transcribe_btn = gr.Button("Transkript oluştur")
99
- status_text = gr.Textbox(label="Durum", interactive=False)
100
-
101
- with gr.Row():
102
- output_text = gr.Textbox(label="Transkript Sonucu")
103
-
104
- transcribe_btn.click(
105
- fn=process_and_transcribe,
106
- inputs=[audio_input],
107
- outputs=[output_text, status_text],
108
- )
109
-
110
- demo.launch()
 
 
 
 
1
+ import gradio as gr
2
+ import whisper
3
+ import os
4
+ import asyncio
5
+ import shutil
6
+ import tempfile
7
+ import uuid
8
+ import torch
9
+
10
+ # Whisper modeli yükleme
11
+ MODEL_SIZE = os.getenv("MODEL_SIZE", "small")
12
+ device = "cuda" if torch.cuda.is_available() else "cpu"
13
+ print(f"Kullanılan cihaz: {device}") # Cihaz bilgisi
14
+ yerel_model = whisper.load_model(MODEL_SIZE).to(device)
15
+
16
+ # Kısıtlamalar
17
+ MAX_DOSYA_BOYUTU_MB = int(os.getenv("MAX_FILE_SIZE_MB", 25)) # 25MB sınırı
18
+ DESTEKLENEN_FORMATLAR = {"mp3", "wav", "m4a", "ogg"}
19
+
20
+ def dosya_sil(dosya_yolu, deneme=3, bekleme=1):
21
+ """
22
+ Ses dosyasını güvenli bir şekilde silme fonksiyonu.
23
+ """
24
+ for i in range(deneme):
25
+ try:
26
+ if dosya_yolu and os.path.exists(dosya_yolu):
27
+ os.remove(dosya_yolu)
28
+ print(f"Dosya başarıyla silindi: {dosya_yolu}")
29
+ return True
30
+ except Exception as e:
31
+ print(f"Dosya silme hatası (Deneme {i+1}/{deneme}): {e}")
32
+ return False
33
+
34
+ def metin_formatla(metin: str) -> str:
35
+ """Metni okunaklı hale getirme"""
36
+ noktalama_isaretleri = [".", "?", "!", "", ".", "?", "!"]
37
+ for isaret in noktalama_isaretleri:
38
+ metin = metin.replace(isaret, isaret + "\n")
39
+ return "\n".join(filter(bool, metin.split("\n")))
40
+
41
+ async def ses_cozasync(ses_dosyasi, dil):
42
+ """
43
+ Ses kaydını asenkron olarak yazıya döken fonksiyon
44
+ """
45
+ return await ses_isle_ve_coz(ses_dosyasi, dil)
46
+
47
+ async def ses_isle_ve_coz(ses_yolu, dil):
48
+ """
49
+ Ses dosyasını işleyip yazıya dökme
50
+ """
51
+ if not ses_yolu or not os.path.exists(ses_yolu):
52
+ return "", "❌ Ses dosyası yüklenmedi."
53
+
54
+ dosya_uzantisi = os.path.splitext(ses_yolu)[-1].lower().lstrip(".")
55
+ if dosya_uzantisi not in DESTEKLENEN_FORMATLAR:
56
+ return "", f"❌ Desteklenen formatlar: {', '.join(DESTEKLENEN_FORMATLAR)} (Mevcut: {dosya_uzantisi})"
57
+
58
+ gecici_ses_yolu = os.path.join(tempfile.gettempdir(), f"{uuid.uuid4()}.{dosya_uzantisi}")
59
+ shutil.copy(ses_yolu, gecici_ses_yolu)
60
+
61
+ try:
62
+ dosya_boyutu_mb = os.path.getsize(gecici_ses_yolu) / (1024 * 1024)
63
+ if dosya_boyutu_mb > MAX_DOSYA_BOYUTU_MB:
64
+ dosya_sil(gecici_ses_yolu)
65
+ return "", f"❌ Dosya boyutu sınırı {MAX_DOSYA_BOYUTU_MB} MB (Mevcut: {dosya_boyutu_mb:.2f} MB)"
66
+
67
+ metin = await ses_yazıya_dok(gecici_ses_yolu, dil)
68
+ duzenlenmis_metin = metin_formatla(metin)
69
+ return duzenlenmis_metin, "✅ Yazıya dökme tamamlandı."
70
+
71
+ except Exception as e:
72
+ return "", f"⚠️ Hata oluştu: {str(e)}"
73
+
74
+ finally:
75
+ if gecici_ses_yolu and os.path.exists(gecici_ses_yolu):
76
+ dosya_sil(gecici_ses_yolu)
77
+
78
+ async def ses_yazıya_dok(ses_yolu, dil):
79
+ """
80
+ Whisper kullanarak sesi yazıya döken fonksiyon
81
+ """
82
+ ayarlar = {"Türkçe": {"language": "tr", "temperature": 0.0, "beam_size": 5, "best_of": 5}}
83
+ secilen_ayar = ayarlar.get(dil, ayarlar["Türkçe"])
84
+
85
+ sonuc = await asyncio.to_thread(
86
+ yerel_model.transcribe,
87
+ ses_yolu,
88
+ language=secilen_ayar["language"],
89
+ temperature=secilen_ayar["temperature"],
90
+ beam_size=secilen_ayar["beam_size"],
91
+ fp16=False
92
+ )
93
+ return sonuc["text"]
94
+
95
+ with gr.Blocks() as uygulama:
96
+ gr.Markdown("## 🎤 Türkçe Ses Kayıtlarını Yazıya Dökme Aracı")
97
+ gr.Markdown("""
98
+ Ses kaydı yükleyin veya mikrofon ile kaydedin. **25MB'tan büyük dosyalar desteklenmez.**
99
+ """)
100
+
101
+ with gr.Row():
102
+ ses_girdisi = gr.Audio(label="Ses kaydı yükleyin veya kaydedin", type="filepath")
103
+ with gr.Row():
104
+ dil_girdisi = gr.Radio(choices=["Türkçe"], label="Dil", value="Türkçe")
105
+
106
+ cevir_buton = gr.Button("Çevir")
107
+ durum_yazisi = gr.Textbox(label="Durum", interactive=False)
108
+ with gr.Row():
109
+ sonuc_metin = gr.Textbox(label="Çıktı")
110
+
111
+ cevir_buton.click(fn=ses_isle_ve_coz, inputs=[ses_girdisi, dil_girdisi], outputs=[sonuc_metin, durum_yazisi])
112
+
113
+ uygulama.launch()