Seicas commited on
Commit
071b666
·
verified ·
1 Parent(s): 6037623

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +111 -156
app.py CHANGED
@@ -1,13 +1,16 @@
 
 
 
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 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", "")
@@ -21,177 +24,129 @@ THEME = gr.themes.Soft(
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)}")
 
1
+ from fastapi import FastAPI, Depends, HTTPException, Security, status, UploadFile, File
2
+ from fastapi.security import OAuth2PasswordBearer, OAuth2PasswordRequestForm
3
+ from fastapi.middleware.cors import CORSMiddleware
4
  import gradio as gr
5
  import os
6
  import tempfile
7
  import json
8
+ from typing import Optional
9
+ from preprocessing import clean_audio
10
+ from asr import transcribe_file, MedicalASR
11
+ from diarization import diarize_segments
12
+ from privacy import MedicalPrivacyProcessor
13
+ from config import settings
14
 
15
  # HuggingFace token'ını ayarla (kullanıcının kendi token'ını eklemesini sağla)
16
  os.environ["HF_TOKEN"] = os.environ.get("HF_TOKEN", "")
 
24
  LOGO = "assets/pediatric_logo.png" # Logo ekleyin (opsiyonel)
25
 
26
  # FastAPI uygulaması
27
+ app = FastAPI(title="Pediatrik ASR API")
28
 
29
+ # CORS ayarları
30
+ app.add_middleware(
31
+ CORSMiddleware,
32
+ allow_origins=["*"],
33
+ allow_credentials=True,
34
+ allow_methods=["*"],
35
+ allow_headers=["*"],
36
+ )
37
+
38
+ # ASR modeli için bağımlılık
39
+ def get_asr_model():
40
+ config = {
41
+ "language": "tr",
42
+ "model": settings.ASR_MODEL,
43
+ "domain": "medical"
44
+ }
45
+ return MedicalASR(config)
46
+
47
+ # API endpoint'i
48
+ @app.post("/api/v1/transcribe")
49
+ async def transcribe_audio_api(
50
+ file: UploadFile = File(...),
51
+ diarize: bool = True,
52
+ enhance_audio: bool = True,
53
+ anonymize: Optional[bool] = None,
54
+ asr_model: MedicalASR = Depends(get_asr_model)
55
+ ):
56
  try:
57
+ # Geçici dosya oluştur
58
+ with tempfile.NamedTemporaryFile(delete=False, suffix=".wav") as temp_file:
59
+ temp_file.write(await file.read())
60
+ temp_file_path = temp_file.name
61
+
62
+ # Transkripsiyon yap
63
+ result = asr_model.transcribe(
64
+ temp_file_path,
65
+ speaker_diarization=diarize,
66
+ enhance_audio=enhance_audio
67
  )
68
 
69
+ # Geçici dosyayı temizle
70
+ os.unlink(temp_file_path)
 
71
 
72
+ return result
 
73
 
74
+ except Exception as e:
75
+ raise HTTPException(status_code=500, detail=str(e))
76
+
77
+ # Gradio arayüzü
78
+ def transcribe_audio(audio_file, diarize=True, enhance_audio=True, anonymize=True):
79
+ """Ses dosyasını transkribe eder"""
80
+ try:
81
+ if audio_file is None:
82
+ return "Lütfen bir ses dosyası yükleyin."
83
+
84
+ # ASR modelini oluştur
85
+ asr_model = get_asr_model()
86
+
87
+ # Transkripsiyon yap
88
+ result = asr_model.transcribe(
89
+ audio_file,
90
+ speaker_diarization=diarize,
91
+ enhance_audio=enhance_audio
92
+ )
93
 
94
+ # Sonuçları formatla
95
+ output = "📝 Transkripsiyon:\n\n"
 
 
 
 
 
 
 
96
 
97
+ if "diarization" in result:
98
+ # Konuşmacı bazlı transkripsiyon
99
+ for segment in result["diarization"]:
100
+ output += f"🗣️ {segment['speaker']} ({segment['start']:.1f}s - {segment['end']:.1f}s):\n"
101
+ output += f"{segment['text']}\n\n"
102
+ else:
103
+ # Düz transkripsiyon
104
+ output += result["text"]
105
 
106
+ if result.get("anonymized"):
107
+ output += "\n🔒 Kişisel veriler anonimleştirildi."
108
+
109
+ return output
110
  except Exception as e:
111
+ return f"Bir hata oluştu: {str(e)}"
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
112
 
113
  # Gradio arayüzünü oluştur
114
+ with gr.Blocks(title="Tıbbi Konuşma Transkripsiyon Servisi") as demo:
115
+ gr.Markdown("""
116
+ # 🏥 Tıbbi Konuşma Transkripsiyon Servisi
117
+
118
+ Bu servis, doktor vizitelerindeki konuşmaları yazıya döker ve konuşmacıları ayırt eder.
 
119
  """)
120
 
121
  with gr.Row():
122
+ with gr.Column():
123
  audio_input = gr.Audio(
124
+ label="Ses Dosyası",
125
+ type="filepath",
126
+ source="upload"
127
  )
128
 
129
+ with gr.Row():
130
+ diarize = gr.Checkbox(label="Konuşmacı Ayrımı", value=True)
131
+ enhance = gr.Checkbox(label="Ses İyileştirme", value=True)
132
+ anonymize = gr.Checkbox(label="Kişisel Verileri Anonimleştir", value=True)
 
 
 
 
133
 
134
+ submit_btn = gr.Button("Transkribe Et", variant="primary")
 
135
 
136
+ with gr.Column():
137
+ output_text = gr.Textbox(
138
+ label="Transkripsiyon Sonucu",
139
+ lines=10
140
+ )
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
141
 
142
+ # Buton tıklama olayı
143
+ submit_btn.click(
144
+ fn=transcribe_audio,
145
+ inputs=[audio_input, diarize, enhance, anonymize],
146
+ outputs=output_text
147
  )
 
 
 
 
 
 
148
 
149
+ # Uygulamayı başlat
 
 
 
150
  if __name__ == "__main__":
151
+ import uvicorn
152
+ uvicorn.run(app, host="0.0.0.0", port=7860)