yunuseduran commited on
Commit
2df36c8
·
verified ·
1 Parent(s): d99b493

Upload 2 files

Browse files
Files changed (2) hide show
  1. app.py +110 -0
  2. reqirements.txt +3 -0
app.py ADDED
@@ -0,0 +1,110 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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()
reqirements.txt ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ openai-whisper
2
+ gradio
3
+ torch