|
|
from fastapi import FastAPI, UploadFile, File, Form |
|
|
from faster_whisper import WhisperModel |
|
|
from phonology_engine import FonolojikVaryasyonMotoru |
|
|
import shutil |
|
|
import os |
|
|
import uuid |
|
|
import difflib |
|
|
|
|
|
app = FastAPI() |
|
|
|
|
|
|
|
|
print("⏳ Modeller yükleniyor...") |
|
|
|
|
|
|
|
|
model_small = WhisperModel("small", device="cpu", compute_type="int8") |
|
|
|
|
|
|
|
|
model_large = WhisperModel("large-v2", device="cpu", compute_type="int8") |
|
|
|
|
|
motor = FonolojikVaryasyonMotoru() |
|
|
print("✅ Modeller Hazır!") |
|
|
|
|
|
|
|
|
def detayli_analiz_yap(hedef, gelen): |
|
|
matcher = difflib.SequenceMatcher(None, hedef.lower(), gelen.lower()) |
|
|
skor = int(matcher.ratio() * 100) |
|
|
|
|
|
|
|
|
if skor == 100: |
|
|
durum = "mukemmel" |
|
|
mesaj = "Harika! Tam doğru söyledin." |
|
|
elif skor >= 80: |
|
|
durum = "basarili" |
|
|
mesaj = "Gayet iyi, ama ufak pürüzler var." |
|
|
else: |
|
|
durum = "hatali" |
|
|
mesaj = "Tekrar denemelisin, tam anlaşılmadı." |
|
|
|
|
|
return { |
|
|
"skor": skor, |
|
|
"durum": durum, |
|
|
"mesaj": mesaj |
|
|
} |
|
|
|
|
|
|
|
|
@app.post("/analiz") |
|
|
async def analiz( |
|
|
file: UploadFile = File(...), |
|
|
hedef_kelime: str = Form(...) |
|
|
): |
|
|
temp_filename = f"temp_{uuid.uuid4()}.wav" |
|
|
|
|
|
|
|
|
with open(temp_filename, "wb") as buffer: |
|
|
shutil.copyfileobj(file.file, buffer) |
|
|
|
|
|
try: |
|
|
|
|
|
|
|
|
varyasyonlar = motor.varyasyonlari_uret(hedef_kelime) |
|
|
prompt_metni = f"Şu kelimelerden birini seç: {', '.join(varyasyonlar)}" |
|
|
|
|
|
|
|
|
segments_s, _ = model_small.transcribe( |
|
|
temp_filename, |
|
|
language="tr", |
|
|
initial_prompt=prompt_metni, |
|
|
|
|
|
|
|
|
vad_filter=False |
|
|
) |
|
|
small_text = " ".join([s.text for s in segments_s]).strip() |
|
|
|
|
|
|
|
|
analiz_sonucu = detayli_analiz_yap(hedef_kelime, small_text) |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
segments_l, _ = model_large.transcribe( |
|
|
temp_filename, |
|
|
language="tr", |
|
|
beam_size=5, |
|
|
vad_filter=False |
|
|
) |
|
|
large_text = " ".join([s.text for s in segments_l]).strip() |
|
|
|
|
|
|
|
|
|
|
|
return { |
|
|
"genel_bilgi": { |
|
|
"hedef_kelime": hedef_kelime |
|
|
}, |
|
|
|
|
|
"small_model_cikti": { |
|
|
"algilanan_metin": small_text, |
|
|
"analiz_detaylari": analiz_sonucu, |
|
|
"kullanilan_prompt_listesi": varyasyonlar |
|
|
}, |
|
|
|
|
|
"large_model_cikti": { |
|
|
"algilanan_metin": large_text, |
|
|
"not": "Bu veri modele hiç ipucu verilmeden (saf) elde edildi." |
|
|
} |
|
|
} |
|
|
|
|
|
except Exception as e: |
|
|
return {"error": str(e)} |
|
|
|
|
|
finally: |
|
|
if os.path.exists(temp_filename): |
|
|
os.remove(temp_filename) |