AI_English_Practice_Agent / src /streamlit_app.py
Fatser's picture
Update src/streamlit_app.py
77d53e0 verified
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}")