VoiceToWrite / app.py
Seicas's picture
Update app.py
a02c8c8 verified
raw
history blame
7.71 kB
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)}")