File size: 8,765 Bytes
0513bad
 
 
02eb251
 
bb27d06
071b666
02eb251
071b666
 
 
0513bad
02eb251
 
 
 
0513bad
02eb251
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
0513bad
943023c
02eb251
bb27d06
02eb251
 
 
cd2255e
02eb251
 
 
 
cd2255e
02eb251
0513bad
02eb251
 
 
 
071b666
02eb251
 
 
 
 
 
 
 
 
 
 
071b666
02eb251
0513bad
02eb251
 
 
 
071b666
02eb251
 
 
 
 
 
 
 
 
 
 
0513bad
 
02eb251
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
0513bad
071b666
02eb251
 
071b666
02eb251
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
0513bad
02eb251
0513bad
02eb251
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
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
import os
import tempfile
import json
import time
import gradio as gr
import spacy
from preprocessing import clean_audio
from asr import transcribe_file
from diarization import diarize_segments
from privacy import MedicalPrivacyProcessor
from config import settings

# HuggingFace token'ını ayarla
HF_TOKEN = os.getenv("HF_TOKEN", "")
if not HF_TOKEN:
    print("Warning: HF_TOKEN not set!")

def load_spacy_model():
    """SpaCy modelini yükle veya indir"""
    try:
        # Önce mevcut modelleri kontrol et
        available_models = spacy.util.get_installed_models()
        if "tr_core_news_md" in available_models:
            print("Türkçe SpaCy modeli bulundu, yükleniyor...")
            return spacy.load("tr_core_news_md")
        elif "tr_core_news_sm" in available_models:
            print("Küçük Türkçe SpaCy modeli bulundu, yükleniyor...")
            return spacy.load("tr_core_news_sm")
        else:
            print("Türkçe SpaCy modeli bulunamadı, indiriliyor...")
            os.system("python -m spacy download tr_core_news_md")
            return spacy.load("tr_core_news_md")
    except Exception as e:
        print(f"SpaCy model yükleme hatası: {str(e)}")
        print("Boş Türkçe model oluşturuluyor...")
        return spacy.blank("tr")

# SpaCy modelini yükle
nlp = load_spacy_model()

# 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 Uzmanlar İçin

Sistem, çocuk hastalıkları, aşılar, ilaçlar ve muayene terimleri içeren 
geniş bir tıbbi terim sözlüğü kullanır. Bu sayede pediatri vizitelerindeki 
terminolojinin doğru transkribe edilmesini sağlar.
"""

# CSS stilleri
css = """
.container {padding: 20px; border-radius: 10px; box-shadow: 0 4px 8px rgba(0,0,0,0.1);}
.result-text {margin-top: 10px; padding: 15px; background: #f8f9fa; border-radius: 5px; white-space: pre-wrap;}
.speaker {font-weight: bold; color: #1a5fb4;}
.timestamp {color: #666; font-size: 0.9em;}
.success {color: green; font-weight: bold;}
.error {color: red; font-weight: bold;}
.footer {margin-top: 50px; text-align: center; color: #666; font-size: 0.9em;}
.tips {background: #e7f5ff; padding: 15px; border-radius: 5px; margin-top: 20px;}
"""

async def process_audio(audio_file, diarize=True, enhance=True, anonymize=True, progress=gr.Progress()):
    try:
        if audio_file is None:
            return {"error": "Lütfen bir ses dosyası yükleyin."}, None
        
        progress(0, desc="Ses dosyası hazırlanıyor...")
        
        # Ses dosyasını temizle
        if enhance:
            progress(0.1, desc="Ses iyileştiriliyor...")
            audio_file = clean_audio(audio_file)
            
        # Transkripsiyon yap
        progress(0.3, desc="Ses metne dönüştürülüyor...")
        result = transcribe_file(
            audio_file,
            language="tr",
            model_name=settings.ASR_MODEL
        )
        
        # Konuşmacı ayrımı
        if diarize:
            progress(0.6, desc="Konuşmacılar ayrıştırılıyor...")
            diarization_result = diarize_segments(result["segments"])
            result["diarization"] = diarization_result
            
        # Kişisel verileri anonimleştir
        if anonymize:
            progress(0.8, desc="Kişisel veriler anonimleştiriliyor...")
            privacy_processor = MedicalPrivacyProcessor()
            result["text"] = privacy_processor.anonymize_text(result["text"])
            result["anonymized"] = True
            
        # Sonucu formatla
        progress(0.9, desc="Sonuçlar hazırlanıyor...")
        formatted_text = ""
        if diarize and "diarization" in result:
            for segment in result["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"
        else:
            formatted_text = result["text"]
        
        if result.get("anonymized"):
            formatted_text += "\n🔒 Kişisel veriler anonimleştirildi."
            
        progress(1.0, desc="Tamamlandı!")
        return result, formatted_text
        
    except Exception as e:
        print(f"Error in process_audio: {str(e)}")
        return {"error": f"İşlem sırasında hata: {str(e)}"}, None

# Ana arayüz
with gr.Blocks(theme=gr.themes.Soft(primary_hue="indigo", secondary_hue="blue"), css=css) as demo:
    gr.HTML(f"""
        <div style="text-align: center; max-height: 150px; margin-bottom: 30px">
            <h1>Türkçe Pediatrik Konuşma Tanıma Sistemi</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ı
    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ı
    with gr.Group():
        privacy_agreement = gr.Checkbox(label="Gizlilik koşullarını okudum ve kabul ediyorum", value=False)

        # Onay olmadan işlem yapılmasını engelle
        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)
        
        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>
    """)

# Hugging Face Spaces için gerekli
if __name__ == "__main__":
    demo.queue().launch(server_name="0.0.0.0", server_port=7860, share=False)