File size: 7,711 Bytes
a02c8c8
0513bad
 
 
 
 
 
 
 
a02c8c8
0513bad
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
import gradio as gr
import os
import tempfile
import json
import time
from fastapi import FastAPI, UploadFile, Depends, HTTPException, Security, status
from fastapi.security import OAuth2PasswordBearer
import uvicorn
from fastapi.middleware.cors import CORSMiddleware
from routes import transcribe_audio as transcribe_endpoint

# HuggingFace token'ını ayarla (kullanıcının kendi token'ını eklemesini sağla)
os.environ["HF_TOKEN"] = os.environ.get("HF_TOKEN", "")
os.environ["ENVIRONMENT"] = "production"

# Arayüz konfigürasyonu
THEME = gr.themes.Soft(
    primary_hue="indigo",
    secondary_hue="blue",
)
LOGO = "assets/pediatric_logo.png"  # Logo ekleyin (opsiyonel)

# FastAPI uygulaması
app = FastAPI(title="Pediatrik Transkripsiyon API")

# Gradio arayüzü için fonksiyon
async def process_audio(audio_file, diarize, enhance, anonymize, progress=gr.Progress()):
    if not audio_file:
        return {"error": "Lütfen bir ses dosyası yükleyin."}, None
    
    progress(0, desc="Ses dosyası hazırlanıyor...")
    
    # Geçici dosya oluştur
    with tempfile.NamedTemporaryFile(delete=False, suffix=".wav") as temp_audio:
        temp_audio.write(audio_file)
        temp_path = temp_audio.name
    
    # FastAPI'nin beklediği UploadFile oluştur
    try:
        upload_file = UploadFile(filename="audio.wav", file=open(temp_path, "rb"))
    except Exception as e:
        os.unlink(temp_path)
        return {"error": f"Dosya açılamadı: {str(e)}"}, None
    
    # Endpoint'i çağır
    try:
        progress(0.1, desc="Ses iyileştiriliyor...")
        result = await transcribe_endpoint(
            file=upload_file,
            diarize=diarize,
            enhance_audio=enhance,
            anonymize=anonymize
        )
        
        # JSON'a dönüştür
        progress(0.9, desc="Sonuçlar hazırlanıyor...")
        result_dict = json.loads(result.body)
        
        # Dosyayı temizle
        os.unlink(temp_path)
        
        # Metin sonucunu ayıkla
        full_text = result_dict.get("text", "")
        
        # Diyarizasyon sonuçlarını formatlı metne dönüştür
        formatted_text = ""
        if diarize and "diarization" in result_dict:
            for segment in result_dict["diarization"]:
                speaker = segment["speaker"]
                text = segment["text"]
                start = segment["start"]
                end = segment["end"]
                formatted_text += f"[{speaker}] ({start:.1f}s - {end:.1f}s): {text}\n\n"
        
        progress(1.0, desc="Tamamlandı!")
        return result_dict, formatted_text or full_text
        
    except Exception as e:
        os.unlink(temp_path)
        return {"error": f"İşlem sırasında hata: {str(e)}"}, None

# Onay kontrolü fonksiyonu
def check_agreement(agreement, *args):
    if not agreement:
        return {"error": "Devam etmek için gizlilik koşullarını kabul etmelisiniz."}, "Lütfen gizlilik koşullarını kabul edin."
    return process_audio(*args)

# Yardım metni
usage_tips = """
## Kullanım İpuçları

1. **Dosya formatı**: WAV formatında ses dosyaları en iyi sonuçları verir.
2. **Ses kalitesi**: Gürültüsüz ortamlarda kaydedilen sesler daha iyi sonuç verir.
3. **Konuşmacı ayrımı**: Konuşmacı sayısı arttıkça tanıma doğruluğu düşebilir.
4. **Hata durumlarında**: Sistem hata verirse, ses dosyasının formatını ve boyutunu kontrol edin.

### Pediatrik Konuşma İçin Öneriler

- Muayene sırasında arka planda gürültü olmamasına dikkat edin
- Mikrofonu doğru konumlandırın 
- Konuşmaların üst üste binmemesine özen gösterin
- 10 dakikadan uzun kayıtlarda sistem performansı düşebilir
"""

# Gradio arayüzünü oluştur
with gr.Blocks(theme=THEME) as demo:
    gr.HTML("""
        <div style="text-align: center; margin-bottom: 1rem">
            <h1>🩺 Türkçe Pediatrik Konuşma Tanıma</h1>
            <p>Çocuk doktorları için geliştirilmiş, pediatri alanına özel tıbbi terminoloji tanıma özellikli transkripsiyon sistemi</p>
        </div>
    """)
    
    with gr.Row():
        with gr.Column(scale=1):
            audio_input = gr.Audio(
                label="Ses Dosyası Yükleyin veya Kaydedin", 
                type="filepath", 
                elem_classes="container"
            )
            
            with gr.Group():
                with gr.Row():
                    diarize = gr.Checkbox(value=True, label="Konuşmacı Ayrımı")
                    enhance = gr.Checkbox(value=True, label="Ses İyileştirme")
                
                with gr.Row():
                    anonymize = gr.Checkbox(value=True, label="Kişisel Verileri Anonimleştir")
                    clear_btn = gr.Button("Temizle", variant="secondary")
            
            process_btn = gr.Button("Transkribe Et", variant="primary")
            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>')
        
        with gr.Column(scale=2, elem_classes="container"):
            with gr.Tabs():
                with gr.TabItem("Konuşma Metni"):
                    result_text = gr.Markdown(label="Transkripsiyon Sonucu", elem_classes="result-text")
                
                with gr.TabItem("JSON Sonucu"):
                    json_output = gr.JSON(label="API Yanıtı")
                
                with gr.TabItem("Kullanım Kılavuzu"):
                    gr.Markdown(usage_tips)
            
            status = gr.Markdown("Sistem hazır.")
    
    # Uyarı mesajı ekleyin (HTML içine)
    gr.HTML("""
        <div style="background-color: #fff3cd; color: #856404; padding: 15px; margin: 15px 0; border-radius: 5px; border: 1px solid #ffeeba;">
            <h3>⚠️ Önemli Gizlilik Uyarısı</h3>
            <p>
                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.
                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
                ve gizlilik/güvenlik garantisi yoktur.
            </p>
            <p>
                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
                uygun olduğunu kabul etmiş olursunuz.
            </p>
        </div>
    """)

    # İzin onayı ekleyin
    with gr.Group():
        privacy_agreement = gr.Checkbox(label="Gizlilik koşullarını okudum ve kabul ediyorum", value=False)
        
        # Olayları bağla
        process_btn.click(
            fn=check_agreement,
            inputs=[privacy_agreement, audio_input, diarize, enhance, anonymize],
            outputs=[json_output, result_text]
        )
    
    clear_btn.click(
        lambda: (None, None, "Sistem hazır."),
        outputs=[audio_input, result_text, status]
    )
    
    gr.HTML("""
        <div class="footer">
            <p>© 2023 Türkçe Pediatrik Konuşma Tanıma Sistemi | Çocuk doktorları için geliştirilmiştir.</p>
        </div>
    """)

# FastAPI'yi Gradio ile bağla
app = gr.mount_gradio_app(app, demo, path="/")

# Hem FastAPI hem de Gradio'yu başlat
if __name__ == "__main__":
    # Token var mı kontrol et
    if not os.environ.get("HF_TOKEN"):
        print("⚠️ UYARI: HF_TOKEN çevresel değişkeni ayarlanmamış! Diyarizasyon çalışmayabilir.")
    
    try:
        uvicorn.run(app, host="0.0.0.0", port=7860)
    except Exception as e:
        print(f"Başlatma hatası: {str(e)}")