Spaces:
Running
Running
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)}") |