Spaces:
Sleeping
Sleeping
| import streamlit as st | |
| import os | |
| from main import get_english_tutor_agent, sesi_metne_cevir, metni_sese_cevir | |
| st.set_page_config(page_title="AI English Tutor", page_icon="🇬🇧", layout="centered") | |
| def ajan_yukle(): | |
| return get_english_tutor_agent() | |
| ajan, sistem_komutu = ajan_yukle() | |
| # --- YAN MENÜ (SIDEBAR) AYARLARI --- | |
| st.sidebar.title("⚙️ Eğitim Ayarları") | |
| st.sidebar.markdown("**Sen Hangi Dilde Konuşacaksın?**") | |
| ogrenci_dili = st.sidebar.radio( | |
| "Mikrofon Algılama Dili", | |
| ["İngilizce", "Türkçe"], | |
| help="İngilizce pratik yaparken 'İngilizce' seçili kalsın. Öğretmene Türkçe bir şey sormak istersen 'Türkçe'ye alabilirsin." | |
| ) | |
| # Seçime göre kod belirle | |
| stt_lang = "en-US" if ogrenci_dili == "İngilizce" else "tr-TR" | |
| st.sidebar.markdown("---") | |
| st.sidebar.markdown("**Öğretmen Aksanı**") | |
| ogretmen_sesi = st.sidebar.radio( | |
| "AI Öğretmenin Sesi", | |
| ["Amerikalı (Aria)", "Türk (Emel)"], | |
| help="Amerikalı Aria sadece İngilizceyi kusursuz okur, Türkçeyi bozarak okur. Türk Emel ise Türkçeyi kusursuz okur, İngilizceyi Türk aksanıyla okur." | |
| ) | |
| # Seçime göre model belirle | |
| tts_voice = "en-US-AriaNeural" if ogretmen_sesi == "Amerikalı (Aria)" else "tr-TR-EmelNeural" | |
| # --- ARAYÜZ (UI) --- | |
| st.title("🎙️ AI English Tutor") | |
| st.markdown("Hello! İster yazarak ister konuşarak pratik yapabiliriz.") | |
| if "mesaj_gecmisi" not in st.session_state: | |
| st.session_state.mesaj_gecmisi = [] | |
| for mesaj in st.session_state.mesaj_gecmisi: | |
| with st.chat_message(mesaj["role"]): | |
| st.markdown(mesaj["content"]) | |
| col1, col2 = st.columns([1, 1]) | |
| with col1: | |
| yazili_girdi = st.chat_input("Yazarak cevap ver...") | |
| with col2: | |
| sesli_girdi = st.audio_input("Veya konuşarak cevap ver") | |
| kullanici_girdisi = None | |
| if sesli_girdi is not None: | |
| with open("gecici_ses.wav", "wb") as f: | |
| f.write(sesli_girdi.getvalue()) | |
| with st.spinner(f"Sesin {ogrenci_dili} olarak dinleniyor..."): | |
| # Seçilen dil kodunu fonksiyona gönderiyoruz | |
| kullanici_girdisi = sesi_metne_cevir("gecici_ses.wav", dil_kodu=stt_lang) | |
| elif yazili_girdi: | |
| kullanici_girdisi = yazili_girdi | |
| if kullanici_girdisi: | |
| with st.chat_message("user"): | |
| st.markdown(kullanici_girdisi) | |
| st.session_state.mesaj_gecmisi.append({"role": "user", "content": kullanici_girdisi}) | |
| with st.chat_message("assistant"): | |
| with st.spinner("Öğretmen cevap hazırlıyor..."): | |
| try: | |
| langgraph_mesajlari = [("system", sistem_komutu)] | |
| for m in st.session_state.mesaj_gecmisi: | |
| langgraph_mesajlari.append((m["role"], m["content"])) | |
| cevap = ajan.invoke({"messages": langgraph_mesajlari}) | |
| ham_icerik = cevap["messages"][-1].content | |
| if isinstance(ham_icerik, list): | |
| son_mesaj = "".join([blok.get("text", "") for blok in ham_icerik if isinstance(blok, dict) and "text" in blok]) | |
| else: | |
| son_mesaj = ham_icerik | |
| st.markdown(son_mesaj) | |
| st.session_state.mesaj_gecmisi.append({"role": "assistant", "content": son_mesaj}) | |
| with st.spinner("Seslendiriliyor..."): | |
| # Seçilen öğretmen sesini fonksiyona gönderiyoruz | |
| ses_dosyasi = metni_sese_cevir(son_mesaj, ses_modeli=tts_voice) | |
| st.audio(ses_dosyasi, autoplay=True) | |
| except Exception as e: | |
| st.error(f"Sistem Hatası: {e}") |