File size: 3,643 Bytes
d714e20
77d53e0
 
d714e20
77d53e0
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
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")

@st.cache_resource
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}")