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) |