Kanka-Bot / app.py
CananD's picture
Create app.py
95dbb9a verified
import streamlit as st
import google.generativeai as genai
import os
from gtts import gTTS # <--- YENİ: Seslendirme için
from langdetect import detect # <--- YENİ: Dil algılama için
import io # <--- YENİ: Sesi hafızada tutmak için
# --- Sistem Talimatı (System Prompt) ---
SYSTEM_PROMPT = """
You are Kanka-Bot, a friendly and supportive chatbot.
Your personality is like a close buddy or 'kanka'.
You are easy-going, informal, and always ready to help with a positive and relaxed attitude.
You can use friendly slang or emojis where appropriate, but always remain helpful and respectful.
IMPORTANT: Respond in the exact same language the user is speaking to you (e.g., if they speak Turkish, you MUST respond in Turkish).
"""
# --- Sayfa Yapılandırması ---
st.set_page_config(
page_title="Kanka-Bot (Sesli)",
page_icon="🗣️", # İkonu güncelledim
layout="wide"
)
# --- Yan Çubuk (Sidebar) ---
with st.sidebar:
st.title("👋 Kanka-Bot'a Hoş Geldin!")
st.info(
"Bu bot, senin dijital kankan olmak için burada. "
"Aklına ne geliyorsa sor, cevaplarını sesli dinle!"
)
st.success(
"**Unutma:** Bu uygulamanın çalışması için Hugging Face Space "
"ayarlarındaki 'Secrets' kısmına `GEMINI_API_KEY`'ini eklemiş olman gerekiyor."
)
# --- Ana Başlık ---
st.title("🗣️ Kanka-Bot: Senin Sesli Dijital Dostun")
st.caption("Gemini 2.5 Flash ile güçlendirilmiştir.")
# <--- YENİ: Metni Sese Çeviren Yardımcı Fonksiyon ---
@st.cache_data # Streamlit bu fonksiyonun sonucunu önbelleğe alır, performans artar
def text_to_audio(text_to_read):
"""
Verilen metni analiz eder, dilini algılar ve sesi MP3 formatında
byte olarak döndürür.
"""
try:
# 1. Adım: Metnin dilini algıla (örn: 'tr', 'en')
lang = detect(text_to_read)
# 2. Adım: gTTS ile sesi oluştur
tts = gTTS(text=text_to_read, lang=lang, slow=False)
# 3. Adım: Sesi diske değil, hafızadaki bir byte dosyasına kaydet
audio_fp = io.BytesIO()
tts.write_to_fp(audio_fp)
audio_fp.seek(0) # Dosya imlecini başa sar
return audio_fp.read()
except Exception as e:
st.warning(f"Seslendirme sırasında bir hata oluştu: {e}")
return None
# <--- YENİ Fonksiyon Bitişi ---
try:
# --- API Anahtarını Güvenli Şekilde Alma ---
api_key = st.secrets["GEMINI_API_KEY"]
if not api_key:
st.error("GEMINI_API_KEY bulunamadı. Lütfen Hugging Face Space Secrets'a ekleyin.")
st.stop()
genai.configure(api_key=api_key)
# --- Model ve Geçmiş (History) ---
if "chat" not in st.session_state:
model = genai.GenerativeModel(
'gemini-2.5-flash',
system_instruction=SYSTEM_PROMPT
)
st.session_state.chat = model.start_chat(history=[])
# --- Sohbet Arayüzü ---
# Önceki mesajları göster (Not: Eski mesajlar için ses oynatıcı eklemiyoruz,
# bu, her yenilemede tüm geçmişi seslendirmeye çalışıp yavaşlatmasın diye.)
for message in st.session_state.chat.history:
avatar_icon = "👤" if message.role == "user" else "🤖"
with st.chat_message(name=message.role, avatar=avatar_icon):
st.markdown(message.parts[0].text)
# Kullanıcıdan yeni girdi al
prompt = st.chat_input("Naber kanka? Aklından ne geçiyor?")
if prompt:
# Kullanıcının mesajını ekrana bas
with st.chat_message("user", avatar="👤"):
st.markdown(prompt)
# Modeli çalıştır ve cevabı al
with st.spinner("Kanka bi' saniye, bakıyorum..."):
try:
response = st.session_state.chat.send_message(prompt)
# Modelin cevabını ekrana bas
with st.chat_message("assistant", avatar="🤖"):
st.markdown(response.text)
# --- YENİ EKLENTİ: Sesi Oluştur ve Oynat ---
with st.spinner("Cevap seslendiriliyor..."):
audio_data = text_to_audio(response.text)
if audio_data:
st.audio(audio_data, format='audio/mp3')
# <--- YENİ EKLENTİ Bitişi ---
except Exception as e:
st.error(f"Eyvah, bir sorun çıktı kanka: {e}")
except KeyError:
st.error("API Anahtarı bulunamadı! Lütfen Hugging Face Space'inizin 'Settings' > 'Secrets' bölümüne 'GEMINI_API_KEY' olarak ekleyin.")
except Exception as e:
st.error(f"Genel bir hata oluştu: {e}")