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