File size: 3,255 Bytes
f79b859
7604960
 
 
f79b859
7604960
f79b859
7604960
f79b859
7604960
f79b859
111c249
7604960
111c249
f79b859
7604960
111c249
f79b859
7604960
f79b859
111c249
7604960
f79b859
111c249
f79b859
7604960
111c249
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
7604960
f79b859
7604960
f79b859
7604960
 
 
 
 
111c249
f79b859
 
 
7604960
111c249
 
f79b859
 
 
111c249
 
7604960
 
111c249
de961e6
 
f79b859
7604960
111c249
7604960
111c249
 
 
 
 
 
 
f79b859
 
111c249
f79b859
 
111c249
f79b859
 
111c249
7604960
111c249
 
 
 
 
 
 
 
 
 
 
 
 
f79b859
7604960
 
 
f79b859
7604960
 
 
f79b859
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
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()

# --- MODELLERİ YÜKLEME ---
print("⏳ Modeller yükleniyor...")

# 1. Uygulama Modeli (Small - Promptlu)
model_small = WhisperModel("small", device="cpu", compute_type="int8")

# 2. Kontrol Modeli (Large v2 - Saf)
model_large = WhisperModel("large-v2", device="cpu", compute_type="int8")

motor = FonolojikVaryasyonMotoru()
print("✅ Modeller Hazır!")

# --- YARDIMCI FONKSİYON ---
def detayli_analiz_yap(hedef, gelen):
    matcher = difflib.SequenceMatcher(None, hedef.lower(), gelen.lower())
    skor = int(matcher.ratio() * 100)
    
    # Basit bir hata mesajı mantığı (Senin eski kodundaki gibi)
    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
    }

# --- API ENDPOINT ---
@app.post("/analiz")
async def analiz(
    file: UploadFile = File(...), 
    hedef_kelime: str = Form(...)
):
    temp_filename = f"temp_{uuid.uuid4()}.wav"
    
    # Dosyayı kaydet
    with open(temp_filename, "wb") as buffer:
        shutil.copyfileobj(file.file, buffer)

    try:
        # --- KUTU 1: SMALL MODEL İŞLEMLERİ ---
        # Varyasyon üret
        varyasyonlar = motor.varyasyonlari_uret(hedef_kelime)
        prompt_metni = f"Şu kelimelerden birini seç: {', '.join(varyasyonlar)}"

        # Transcribe (Small)
        segments_s, _ = model_small.transcribe(
            temp_filename, 
            language="tr",
            initial_prompt=prompt_metni,
            #beam_size=1,
            #best_of=1,
            vad_filter=False
        )
        small_text = " ".join([s.text for s in segments_s]).strip()
        
        # Analiz (Small sonucuna göre)
        analiz_sonucu = detayli_analiz_yap(hedef_kelime, small_text)


        # --- KUTU 2: LARGE MODEL İŞLEMLERİ ---
        # Transcribe (Large - Promptsuz)
        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()


        # --- FİNAL JSON CEVABI (Senin İstediğin Format) ---
        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)