Seicas commited on
Commit
0513bad
·
verified ·
1 Parent(s): 41979e6

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +197 -1
app.py CHANGED
@@ -1 +1,197 @@
1
-
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import gradio as gr
2
+ import os
3
+ import tempfile
4
+ import json
5
+ import time
6
+ from fastapi import FastAPI, UploadFile, Depends, HTTPException, Security, status
7
+ from fastapi.security import OAuth2PasswordBearer
8
+ import uvicorn
9
+ from fastapi.middleware.cors import CORSMiddleware
10
+ from app.routes import transcribe_audio as transcribe_endpoint
11
+
12
+ # HuggingFace token'ını ayarla (kullanıcının kendi token'ını eklemesini sağla)
13
+ os.environ["HF_TOKEN"] = os.environ.get("HF_TOKEN", "")
14
+ os.environ["ENVIRONMENT"] = "production"
15
+
16
+ # Arayüz konfigürasyonu
17
+ THEME = gr.themes.Soft(
18
+ primary_hue="indigo",
19
+ secondary_hue="blue",
20
+ )
21
+ LOGO = "assets/pediatric_logo.png" # Logo ekleyin (opsiyonel)
22
+
23
+ # FastAPI uygulaması
24
+ app = FastAPI(title="Pediatrik Transkripsiyon API")
25
+
26
+ # Gradio arayüzü için fonksiyon
27
+ async def process_audio(audio_file, diarize, enhance, anonymize, progress=gr.Progress()):
28
+ if not audio_file:
29
+ return {"error": "Lütfen bir ses dosyası yükleyin."}, None
30
+
31
+ progress(0, desc="Ses dosyası hazırlanıyor...")
32
+
33
+ # Geçici dosya oluştur
34
+ with tempfile.NamedTemporaryFile(delete=False, suffix=".wav") as temp_audio:
35
+ temp_audio.write(audio_file)
36
+ temp_path = temp_audio.name
37
+
38
+ # FastAPI'nin beklediği UploadFile oluştur
39
+ try:
40
+ upload_file = UploadFile(filename="audio.wav", file=open(temp_path, "rb"))
41
+ except Exception as e:
42
+ os.unlink(temp_path)
43
+ return {"error": f"Dosya açılamadı: {str(e)}"}, None
44
+
45
+ # Endpoint'i çağır
46
+ try:
47
+ progress(0.1, desc="Ses iyileştiriliyor...")
48
+ result = await transcribe_endpoint(
49
+ file=upload_file,
50
+ diarize=diarize,
51
+ enhance_audio=enhance,
52
+ anonymize=anonymize
53
+ )
54
+
55
+ # JSON'a dönüştür
56
+ progress(0.9, desc="Sonuçlar hazırlanıyor...")
57
+ result_dict = json.loads(result.body)
58
+
59
+ # Dosyayı temizle
60
+ os.unlink(temp_path)
61
+
62
+ # Metin sonucunu ayıkla
63
+ full_text = result_dict.get("text", "")
64
+
65
+ # Diyarizasyon sonuçlarını formatlı metne dönüştür
66
+ formatted_text = ""
67
+ if diarize and "diarization" in result_dict:
68
+ for segment in result_dict["diarization"]:
69
+ speaker = segment["speaker"]
70
+ text = segment["text"]
71
+ start = segment["start"]
72
+ end = segment["end"]
73
+ formatted_text += f"[{speaker}] ({start:.1f}s - {end:.1f}s): {text}\n\n"
74
+
75
+ progress(1.0, desc="Tamamlandı!")
76
+ return result_dict, formatted_text or full_text
77
+
78
+ except Exception as e:
79
+ os.unlink(temp_path)
80
+ return {"error": f"İşlem sırasında hata: {str(e)}"}, None
81
+
82
+ # Onay kontrolü fonksiyonu
83
+ def check_agreement(agreement, *args):
84
+ if not agreement:
85
+ return {"error": "Devam etmek için gizlilik koşullarını kabul etmelisiniz."}, "Lütfen gizlilik koşullarını kabul edin."
86
+ return process_audio(*args)
87
+
88
+ # Yardım metni
89
+ usage_tips = """
90
+ ## Kullanım İpuçları
91
+
92
+ 1. **Dosya formatı**: WAV formatında ses dosyaları en iyi sonuçları verir.
93
+ 2. **Ses kalitesi**: Gürültüsüz ortamlarda kaydedilen sesler daha iyi sonuç verir.
94
+ 3. **Konuşmacı ayrımı**: Konuşmacı sayısı arttıkça tanıma doğruluğu düşebilir.
95
+ 4. **Hata durumlarında**: Sistem hata verirse, ses dosyasının formatını ve boyutunu kontrol edin.
96
+
97
+ ### Pediatrik Konuşma İçin Öneriler
98
+
99
+ - Muayene sırasında arka planda gürültü olmamasına dikkat edin
100
+ - Mikrofonu doğru konumlandırın
101
+ - Konuşmaların üst üste binmemesine özen gösterin
102
+ - 10 dakikadan uzun kayıtlarda sistem performansı düşebilir
103
+ """
104
+
105
+ # Gradio arayüzünü oluştur
106
+ with gr.Blocks(theme=THEME) as demo:
107
+ gr.HTML("""
108
+ <div style="text-align: center; margin-bottom: 1rem">
109
+ <h1>🩺 Türkçe Pediatrik Konuşma Tanıma</h1>
110
+ <p>Çocuk doktorları için geliştirilmiş, pediatri alanına özel tıbbi terminoloji tanıma özellikli transkripsiyon sistemi</p>
111
+ </div>
112
+ """)
113
+
114
+ with gr.Row():
115
+ with gr.Column(scale=1):
116
+ audio_input = gr.Audio(
117
+ label="Ses Dosyası Yükleyin veya Kaydedin",
118
+ type="filepath",
119
+ elem_classes="container"
120
+ )
121
+
122
+ with gr.Group():
123
+ with gr.Row():
124
+ diarize = gr.Checkbox(value=True, label="Konuşmacı Ayrımı")
125
+ enhance = gr.Checkbox(value=True, label="Ses İyileştirme")
126
+
127
+ with gr.Row():
128
+ anonymize = gr.Checkbox(value=True, label="Kişisel Verileri Anonimleştir")
129
+ clear_btn = gr.Button("Temizle", variant="secondary")
130
+
131
+ process_btn = gr.Button("Transkribe Et", variant="primary")
132
+ gr.HTML('<div class="tips"><b>💡 İpucu:</b> En iyi sonuçlar için gürültüsüz ortamlarda kayıt yapın.</div>')
133
+
134
+ with gr.Column(scale=2, elem_classes="container"):
135
+ with gr.Tabs():
136
+ with gr.TabItem("Konuşma Metni"):
137
+ result_text = gr.Markdown(label="Transkripsiyon Sonucu", elem_classes="result-text")
138
+
139
+ with gr.TabItem("JSON Sonucu"):
140
+ json_output = gr.JSON(label="API Yanıtı")
141
+
142
+ with gr.TabItem("Kullanım Kılavuzu"):
143
+ gr.Markdown(usage_tips)
144
+
145
+ status = gr.Markdown("Sistem hazır.")
146
+
147
+ # Uyarı mesajı ekleyin (HTML içine)
148
+ gr.HTML("""
149
+ <div style="background-color: #fff3cd; color: #856404; padding: 15px; margin: 15px 0; border-radius: 5px; border: 1px solid #ffeeba;">
150
+ <h3>⚠️ Önemli Gizlilik Uyarısı</h3>
151
+ <p>
152
+ Bu demo uygulaması <strong>yalnızca eğitim amaçlıdır</strong> ve gerçek hasta verilerinin işlenmesi için tasarlanmamıştır.
153
+ Lütfen hasta bilgisi içeren ses kayıtlarını yüklemeyin. Sistemde paylaşılan ses kayıtları üçüncü şahıslar tarafından erişilebilir
154
+ ve gizlilik/güvenlik garantisi yoktur.
155
+ </p>
156
+ <p>
157
+ Bu aracı kullanarak, yüklediğiniz verilerin <a href="https://huggingface.co/terms-of-service" target="_blank">Hugging Face Kullanım Koşulları</a>'na
158
+ uygun olduğunu kabul etmiş olursunuz.
159
+ </p>
160
+ </div>
161
+ """)
162
+
163
+ # İzin onayı ekleyin
164
+ with gr.Group():
165
+ privacy_agreement = gr.Checkbox(label="Gizlilik koşullarını okudum ve kabul ediyorum", value=False)
166
+
167
+ # Olayları bağla
168
+ process_btn.click(
169
+ fn=check_agreement,
170
+ inputs=[privacy_agreement, audio_input, diarize, enhance, anonymize],
171
+ outputs=[json_output, result_text]
172
+ )
173
+
174
+ clear_btn.click(
175
+ lambda: (None, None, "Sistem hazır."),
176
+ outputs=[audio_input, result_text, status]
177
+ )
178
+
179
+ gr.HTML("""
180
+ <div class="footer">
181
+ <p>© 2023 Türkçe Pediatrik Konuşma Tanıma Sistemi | Çocuk doktorları için geliştirilmiştir.</p>
182
+ </div>
183
+ """)
184
+
185
+ # FastAPI'yi Gradio ile bağla
186
+ app = gr.mount_gradio_app(app, demo, path="/")
187
+
188
+ # Hem FastAPI hem de Gradio'yu başlat
189
+ if __name__ == "__main__":
190
+ # Token var mı kontrol et
191
+ if not os.environ.get("HF_TOKEN"):
192
+ print("⚠️ UYARI: HF_TOKEN çevresel değişkeni ayarlanmamış! Diyarizasyon çalışmayabilir.")
193
+
194
+ try:
195
+ uvicorn.run(app, host="0.0.0.0", port=7860)
196
+ except Exception as e:
197
+ print(f"Başlatma hatası: {str(e)}")