import gradio as gr import json import os import shutil from kalbetojai_analize import analizuoti_kalbetojus from kalbos_nustatymas import transcribe_text, transcribe_text_wav2vec from ataskaita import sugeneruoti_ataskaita # ⚖️ Demo failų keliai DEMO_KALBETOJAI_PATH = "demo/demo_3kalbetojai.wav" DEMO_SLAPTAZODIS_PATH = "demo/slaptazodis.wav" # 🔐 Funkcija kalbėtojų analizei ir segmentų atvaizdavimui def analizuoti_ir_issaugoti(wav_failas, modelis): if wav_failas is None: return "⚠️ Prašome įkelti pagrindinį .wav failą." # 🔥 1. Kopijuojame į /tmp laikinas_kelias = "/tmp/ivestis.wav" shutil.copy(wav_failas, laikinas_kelias) # 🔥 2. Atliekame analizę tekstas_ataskaitai, _, segmentai = analizuoti_kalbetojus(modelis, failas=laikinas_kelias) # 🔥 3. Įrašome segmentus į JSON os.makedirs("rezultatai", exist_ok=True) failas = os.path.join("rezultatai", f"{modelis.lower()}.json") try: with open(failas, "r", encoding="utf-8") as f: esami_duomenys = json.load(f) except: esami_duomenys = {} esami_duomenys["segmentai"] = segmentai # Atnaujinam segmentus with open(failas, "w", encoding="utf-8") as f: json.dump(esami_duomenys, f, ensure_ascii=False, indent=2) # 🔥 4. Perskaitome analizės trukmę iš JSON try: with open(failas, "r", encoding="utf-8") as f: duomenys = json.load(f) laikas = duomenys.get("apdorojimo_laikas_tekstu", "?") except Exception: laikas = "?" # 🔥 5. Formuojame grąžinamą tekstą tekstas = f"⏱️ {modelis} analizės trukmė: {laikas}\n\n" for s in segmentai: tekstas += f"🧑 Kalbėtojas {s['kalbetojas']} – {s['kalba']}\n" tekstas += f"💬 '{s['tekstas']}'\n" tekstas += f"⏱️ Trukmė: {s['trukme']} s\n\n" tekstas += "\n" + tekstas_ataskaitai # Pridedame ataskaitos informaciją return tekstas # 🔐 Funkcija slaptažodžiui tikrinti iš įkelto WAV def tikrinti_slaptazodi(audio, slaptazodis, modelis): if audio is None or not slaptazodis: return "⚠️ Prašome įkelti slaptažodžio įrašą ir įvesti tekstą." slaptazodis = slaptazodis.strip().lower() if modelis == "Whisper": tekstas = transcribe_text(audio).lower().strip() elif modelis == "Wav2Vec2": tekstas = transcribe_text_wav2vec(audio, kalba="lt").lower().strip() else: return "❌ Nepalaikomas modelis." if slaptazodis in tekstas: return f"✅ Slaptažodis atpažintas! ({tekstas})" else: return f"❌ Slaptažodis neatpažintas. Gauta: ({tekstas})" # 🚀 Mygtukų funkcijos demo failams def naudoti_demo_kalbetojai(): return DEMO_KALBETOJAI_PATH def naudoti_demo_slaptazodis(): return DEMO_SLAPTAZODIS_PATH # 📥 Nauja funkcija: grąžinti json failą parsisiuntimui def gauti_json_faila(modelis): failo_kelias = os.path.join("rezultatai", f"{modelis.lower()}.json") if os.path.exists(failo_kelias): return failo_kelias else: return None # 💻 GUI komponentai with gr.Blocks() as demo: gr.Markdown("## 🎤 Kalbėtojų analizė + slaptažodžio tikrinimas + ataskaita") with gr.Tab("1. 📦 Kalbėtojų analizė"): with gr.Row(): kalbetojai_audio = gr.Audio(type="filepath", label="🔊 Įkelkite .wav su 3 kalbėtojais") model_selector1 = gr.Radio(["Whisper", "Wav2Vec2"], value="Whisper", label="📊 Modelis") demo_kalb_btn = gr.Button("🎧 Naudoti pavyzdinį kalbėtojų failą") analizės_output = gr.Textbox(label="📜 Rezultatai", lines=20) analizės_btn = gr.Button("▶️ Analizuoti kalbėtojus") demo_kalb_btn.click(fn=naudoti_demo_kalbetojai, outputs=kalbetojai_audio) analizės_btn.click(fn=analizuoti_ir_issaugoti, inputs=[kalbetojai_audio, model_selector1], outputs=analizės_output) with gr.Tab("2. 🔐 Slaptažodžio tikrinimas"): with gr.Row(): slapt_audio = gr.Audio(type="filepath", label="🔊 Įkelkite .wav su išsakytu slaptažodžiu") slapt_input = gr.Textbox(label="🔐 Įveskite slaptažodį") model_selector2 = gr.Radio(["Whisper", "Wav2Vec2"], value="Whisper", label="📊 Modelis") demo_slapt_btn = gr.Button("🔹 Naudoti pavyzdinį slaptažodžio failą") slapt_output = gr.Textbox(label="📋 Tikrinimo rezultatas", lines=4) slapt_btn = gr.Button("✅ Tikrinti slaptažodį") demo_slapt_btn.click(fn=naudoti_demo_slaptazodis, outputs=slapt_audio) slapt_btn.click(fn=tikrinti_slaptazodi, inputs=[slapt_audio, slapt_input, model_selector2], outputs=slapt_output) with gr.Tab("3. 📊 Ataskaita ir Atsisiuntimas"): with gr.Row(): report_output = gr.Textbox(label="📈 Bendra ataskaita", lines=30) report_btn = gr.Button("📊 Peržiūrėti ataskaitą") report_btn.click(fn=sugeneruoti_ataskaita, outputs=report_output) with gr.Row(): atsisiusti_modeli = gr.Radio(["Whisper", "Wav2Vec2"], value="Whisper", label="📁 Pasirinkite modelį JSON atsisiuntimui") atsisiuntimo_btn = gr.Button("📥 Atsisiųsti JSON") failas_output = gr.File(label="⬇️ Parsisiųsti JSON failą") atsisiuntimo_btn.click(fn=gauti_json_faila, inputs=[atsisiusti_modeli], outputs=failas_output) demo.launch()