canksdi commited on
Commit
5405c8e
·
verified ·
1 Parent(s): b6f7f60

Upload app.py

Browse files
Files changed (1) hide show
  1. app.py +636 -55
app.py CHANGED
@@ -6,18 +6,174 @@ import time
6
  import asyncio
7
  import edge_tts
8
  import re
 
 
 
9
 
10
  # Daha az bellek kullanımı için
11
  torch.set_grad_enabled(False)
12
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
13
  # Duygu Analizi Modeli
 
14
  sentiment_model = pipeline(
15
  "sentiment-analysis",
16
  model="distilbert-base-uncased-finetuned-sst-2-english",
17
  device=-1 # CPU üzerinde çalıştır
18
  )
 
19
 
20
- # Türkçe Metin Üretme Modeli - YTÜ Cosmos modeli kullanıyoruz
21
  print("Metin üretme modeli yükleniyor...")
22
  tokenizer = AutoTokenizer.from_pretrained("ytu-ce-cosmos/turkish-gpt2")
23
  text_model = AutoModelForCausalLM.from_pretrained("ytu-ce-cosmos/turkish-gpt2")
@@ -26,55 +182,282 @@ print("Metin modeli yüklendi.")
26
  # Türkçe kadın sesi kullanacağız
27
  VOICE = "tr-TR-EmelNeural"
28
 
29
- def generate_turkish_text(prompt, max_length=250):
30
- """Türkçe metin üretme fonksiyonu"""
31
- inputs = tokenizer(prompt, return_tensors="pt")
32
- output = text_model.generate(
33
- inputs["input_ids"],
34
- max_length=max_length,
35
- num_return_sequences=1,
36
- do_sample=True,
37
- temperature=0.85, # Daha da yaratıcı yanıtlar için
38
- top_p=0.92, # Nucleus sampling
39
- repetition_penalty=1.2, # Tekrarları azaltmak için
40
- pad_token_id=tokenizer.eos_token_id
41
- )
42
- generated_text = tokenizer.decode(output[0], skip_special_tokens=True)
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
43
 
44
- # Başlangıç prompt'unu kaldır ve sadece yeni üretilen kısmı al
45
- if prompt in generated_text:
46
- generated_text = generated_text[len(prompt):].strip()
47
 
48
- # HTML/CSS etiketlerini temizle
49
- generated_text = re.sub(r'\[/?vc_\w+\]', '', generated_text)
 
 
 
 
50
 
51
- # Diğer potansiyel bozuk formatları temizle
52
- generated_text = re.sub(r'<.*?>', '', generated_text)
 
 
 
 
 
 
53
 
54
- # Çoklu boşlukları temizle
55
- generated_text = re.sub(r'\s+', ' ', generated_text).strip()
 
 
 
 
 
 
56
 
57
- return generated_text
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
58
 
59
  async def create_speech_async(text):
60
- """Edge TTS ile doğal insan sesi üret"""
61
  try:
 
 
 
 
62
  communicate = edge_tts.Communicate(text, VOICE)
63
  audio_path = "response.mp3"
 
 
 
 
 
64
  await communicate.save(audio_path)
65
- return audio_path
 
 
 
 
 
66
  except Exception as e:
67
  print(f"Ses oluşturma hatası: {str(e)}")
68
  return None
69
 
70
  def create_speech(text):
71
- """Ana thread'de async fonksiyonu çalıştır"""
72
  try:
 
 
 
 
 
 
 
 
73
  loop = asyncio.new_event_loop()
74
  asyncio.set_event_loop(loop)
75
  result = loop.run_until_complete(create_speech_async(text))
76
  loop.close()
77
- return result
 
 
 
 
 
 
 
 
 
78
  except Exception as e:
79
  print(f"Ses oluşturma hatası: {str(e)}")
80
  # Boş ses dosyası oluştur
@@ -82,44 +465,183 @@ def create_speech(text):
82
  f.write(b"")
83
  return "empty.mp3"
84
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
85
  def create_better_prompts(text, label, score):
86
- """Daha samimi, dostça ve arkadaşça promptlar oluştur"""
87
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
88
  if label == "NEGATIVE":
89
  if score > 0.85: # Çok olumsuz
90
- prompt = f"""Aşağıdaki kişi oldukça üzgün ve olumsuz hissediyor. Yakın bir arkadaşı olarak ona samimi ve içten bir şekilde destek vermelisin. Uzun ve detaylı bir motivasyon mesajı yaz. Sorunlarının üstesinden gelebileceğine dair güven ver, yalnız olmadığını hissettir. Bu zorlu zamanın geçici olduğunu anlat. İçten, samimi ve arkadaşça bir dille konuş:
91
 
92
- Kişinin mesajı: '{text}'
 
 
 
 
 
 
 
93
 
94
- Arkadaşça destek mesajı:"""
95
  else: # Orta derecede olumsuz
96
- prompt = f"""Aşağıdaki kişi biraz moral bozukluğu yaşıyor. Yakın bir dostu olarak ona sıcak ve içten bir destek mesajı yazmalısın. Yaşadığı zorluğu anlayışla karşıladığını hissettir. Sorunu nasıl çözebileceğine dair birkaç öneri sun. Arkadaşça, samimi ve yapıcı bir dil kullan:
97
 
98
- Kişinin mesajı: '{text}'
 
 
 
 
 
 
 
99
 
100
- Dostça destek mesajı:"""
101
  elif label == "POSITIVE" and score < 0.6: # Hafif olumlu
102
- prompt = f"""Aşağıdaki kişi biraz olumlu hissediyor ama daha fazla motive edilmeye ihtiyacı var. Yakın bir arkadaşı olarak ona cesaret veren, motive eden ve bu olumlu hislerini güçlendiren bir mesaj yaz. Başarılarını kutla ve daha iyisini yapabileceğini hatırlat. Heyecan verici ve motive edici, samimi bir dil kullan:
103
 
104
- Kişinin mesajı: '{text}'
 
 
 
 
 
 
 
105
 
106
- Motive edici arkadaş mesajı:"""
107
  else: # Çok olumlu
108
- prompt = f"""Aşağıdaki kişi çok mutlu ve coşkulu hissediyor. En yakın arkadaşı olarak bu mutluluğunu paylaş ve daha da artır. Bu güzel anın tadını çıkarmasını söyle, başarısını kutla. Sevinç dolu, coşkulu ve samimi bir dil kullan. Gelecek için daha güzel şeyler dilemeyi unutma:
109
 
110
- Kişinin mesajı: '{text}'
 
 
 
 
 
 
 
111
 
112
- Coşkulu ve arkadaşça yanıt:"""
113
 
114
  return prompt
115
 
116
- def process_input(text):
 
 
 
117
  try:
 
118
  if not text or text.strip() == "":
119
  return "Lütfen bir metin girin.", None
120
 
 
 
 
121
  print(f"İstek alındı: {text[:50]}...")
122
- start_time = time.time()
 
 
 
 
123
 
124
  # Duygu analizi yap
125
  sentiment_result = sentiment_model(text)[0]
@@ -128,14 +650,28 @@ def process_input(text):
128
 
129
  print(f"Duygu analizi sonucu: {label} ({score:.2f})")
130
 
 
 
 
 
 
 
 
 
 
 
 
131
  # Geliştirilmiş promptlar oluştur
132
  prompt = create_better_prompts(text, label, score)
133
 
134
- # Türkçe metin üret
135
  print("Metin üretiliyor...")
136
- # Daha uzun maksimum uzunluk sağla
137
  response = generate_turkish_text(prompt, max_length=300)
138
 
 
 
 
 
139
  # Cevap çok uzunsa kısalt, ama anlamlı bir şekilde
140
  if len(response) > 350:
141
  sentences = re.split(r'(?<=[.!?])\s+', response)
@@ -147,20 +683,33 @@ def process_input(text):
147
  break
148
  response = shortened_response.strip()
149
 
 
 
 
 
 
 
 
 
 
 
 
 
150
  print(f"Üretilen yanıt: {response[:50]}...")
151
 
152
- # Yüksek kaliteli doğal ses üret
153
  print("Doğal ses üretiliyor...")
154
  audio_path = create_speech(response)
155
 
156
- print(f"İşlem tamamlandı ({time.time() - start_time:.2f} saniye)")
 
157
 
158
  return response, audio_path
159
 
160
  except Exception as e:
161
  error_msg = f"İşlem sırasında bir hata oluştu: {str(e)}"
162
  print(error_msg)
163
- return error_msg, None
164
 
165
  # Demo başlığ�� ve açıklaması
166
  title = "MoodF - Duygusal Destek Asistanı"
@@ -171,8 +720,9 @@ Bu uygulama yapay zeka kullanarak duygularınızı analiz eder ve size destekley
171
 
172
  **Nasıl kullanılır:**
173
  1. Nasıl hissettiğinizi yazın
174
- 2. "Gönder" düğmesine tıklayın
175
- 3. MoodF'in yazılı ve doğal sesli yanıtını alın
 
176
  """
177
 
178
  # Arayüz tasarımı
@@ -186,29 +736,60 @@ with gr.Blocks(title=title) as demo:
186
  label="Duygularınız",
187
  lines=4
188
  )
 
 
 
 
 
 
 
 
 
189
  submit_btn = gr.Button("Gönder", variant="primary")
190
 
191
  with gr.Column():
192
  text_output = gr.Textbox(label="MoodF'in yanıtı", lines=4)
193
  audio_output = gr.Audio(label="Sesli yanıt", type="filepath")
194
 
 
 
 
 
 
 
 
 
 
195
  # Örnek girdiler
196
  gr.Examples(
197
  [
198
  ["Bugün kendimi gerçekten kötü hissediyorum, her şey ters gidiyor."],
199
  ["İş yerinde çok stres altındayım ve kendimi değersiz hissediyorum."],
200
- ["Harika bir gün geçirdim, her şey yolunda gidiyor!"]
 
 
201
  ],
202
  inputs=text_input,
203
  outputs=[text_output, audio_output],
204
- fn=process_input,
205
  cache_examples=False,
206
  )
207
 
 
 
 
 
 
 
 
 
 
 
 
208
  # İşlem düğmesine tıklama olayı
209
  submit_btn.click(
210
- fn=process_input,
211
- inputs=text_input,
212
  outputs=[text_output, audio_output],
213
  api_name="predict"
214
  )
 
6
  import asyncio
7
  import edge_tts
8
  import re
9
+ import random
10
+ import html
11
+ from functools import lru_cache
12
 
13
  # Daha az bellek kullanımı için
14
  torch.set_grad_enabled(False)
15
 
16
+ # Türkçe emoji sözlüğü - daha doğal yanıtlar için
17
+ TURKISH_EMOJIS = {
18
+ "mutluluk": ["😊", "😄", "🙂", "😃", "🥰", "😍", "😁", "😀"],
19
+ "sevgi": ["❤️", "💕", "💖", "💗", "💓", "💞", "💘", "🫶"],
20
+ "üzüntü": ["😔", "😢", "😥", "😞", "🥺", "😟", "😓", "😩"],
21
+ "şaşkınlık": ["😮", "😲", "😯", "😦", "😧", "🤯", "😱", "😵"],
22
+ "destek": ["💪", "👍", "👊", "🤗", "🙌", "✨", "🌟", "⭐"],
23
+ "başarı": ["🏆", "🎯", "🎉", "🎊", "🎖️", "🥇", "🌈", "💯"],
24
+ "kötü durum": ["🤕", "😷", "🤒", "🤧", "🤔", "😕", "🫤", "😬"],
25
+ "güç": ["💪", "🦾", "🚀", "⚡", "🔥", "✊", "🦸", "🛡️"],
26
+ "doğa": ["🌿", "🌱", "🌺", "🌼", "🌸", "🍀", "🌳", "🌲"],
27
+ "eğlence": ["🎮", "🎬", "🎵", "🎶", "🎭", "🎨", "🎧", "📚"],
28
+ }
29
+
30
+ # KİŞİLİK PROFİLLERİ - Farklı yanıt tarzları
31
+ PERSONALITY_PROFILES = {
32
+ "motive_edici_koc": {
33
+ "name": "Motive Edici Koç",
34
+ "description": "Dinamik, enerjik bir koç gibi davranarak motivasyon veren kişilik",
35
+ "temperature": 0.9,
36
+ "prompt_prefix": "Bir kişisel gelişim ve motivasyon koçu olarak, enerjik ve motive edici bir şekilde yanıt ver. ",
37
+ "voice": "tr-TR-EmelNeural",
38
+ "qualities": ["canlandırıcı", "proaktif", "enerji dolu", "direktif"],
39
+ "example": "Hedefine ulaşmak için her gün küçük adımlar atman yeterli! Kendine inanmayı unutma ve her zorlukta daha da güçleneceğini bil. Senden daha önce kimsenin başaramadığı şeyleri başarabilirsin!"
40
+ },
41
+ "anlayisli_dost": {
42
+ "name": "Anlayışlı Dost",
43
+ "description": "Sakin, anlayışlı ve empatik bir dinleyici gibi davranarak duygusal destek sağlayan kişilik",
44
+ "temperature": 0.7,
45
+ "prompt_prefix": "Anlayışlı ve empatik bir dost olarak, sakin ve içten bir şekilde yanıt ver. ",
46
+ "voice": "tr-TR-EmelNeural",
47
+ "qualities": ["empatik", "dinleyen", "anlayışlı", "sakinleştirici"],
48
+ "example": "Yaşadığın zorlukları anlıyorum ve bu durumda hissettiğin her duygu tamamen normal. Seni yargılamadan dinliyorum ve yanındayım. Beraber bu zorluğun üstesinden geleceğiz."
49
+ },
50
+ "bilge_danisman": {
51
+ "name": "Bilge Danışman",
52
+ "description": "Deneyimli, bilge ve sakin bir danışman gibi davranarak derinlemesine içgörüler sunan kişilik",
53
+ "temperature": 0.6,
54
+ "prompt_prefix": "Bilge ve tecrübeli bir danışman olarak, düşünceli ve derin bir perspektifle yanıt ver. ",
55
+ "voice": "tr-TR-AhmetNeural",
56
+ "qualities": ["bilge", "düşünceli", "dengeli", "özlü"],
57
+ "example": "Hayatın bu evresinde yaşadığın deneyim, aslında içsel gelişimin için bir fırsat sunuyor. Zorluklarla karşılaşmak, kişisel bilgeliğimizi derinleştirmenin ve gerçek benliğimizi keşfetmenin bir yoludur."
58
+ },
59
+ "pozitif_arkadas": {
60
+ "name": "Pozitif Arkadaş",
61
+ "description": "Her zaman olumlu yönleri gören, neşeli ve eğlenceli kişilik",
62
+ "temperature": 0.85,
63
+ "prompt_prefix": "Pozitif ve neşeli bir arkadaş olarak, keyifli ve umut dolu bir şekilde yanıt ver. ",
64
+ "voice": "tr-TR-EmelNeural",
65
+ "qualities": ["neşeli", "iyimser", "eğlenceli", "umut dolu"],
66
+ "example": "Harika olacak her şey! Hayat güzel sürprizlerle dolu ve bu dönem de geçecek. Birlikte eğlenecek ve güzel anılar biriktirecek çok zamanımız var!"
67
+ }
68
+ }
69
+
70
+ # Varsayılan kişilik
71
+ DEFAULT_PERSONALITY = "anlayisli_dost"
72
+
73
+ # UZMAN ÖNERİLERİ - Farklı durumlar için öneriler
74
+ EXPERT_RECOMMENDATIONS = {
75
+ "stress_yonetimi": [
76
+ {
77
+ "title": "Nefes Egzersizi: 4-7-8 Tekniği",
78
+ "description": "4 saniye nefes al, 7 saniye tut, 8 saniye boyunca yavaşça ver. Bu egzersiz, sempatik sinir sistemini sakinleştirir ve stres hormonlarını düzenler.",
79
+ "benefit": "Anında rahatlama ve sakinleşme",
80
+ "when_to_use": "Stres ve kaygı anlarında"
81
+ },
82
+ {
83
+ "title": "Zihinsel Tarama Meditasyonu",
84
+ "description": "Vücudunu baştan ayağa kadar zihinsel olarak tara ve her bölgedeki gerginliği fark et. Her nefes verişinde, o bölgedeki gerginliği bırakmaya odaklan.",
85
+ "benefit": "Fiziksel gerginliği azaltma",
86
+ "when_to_use": "Uyumadan önce veya molalarda"
87
+ },
88
+ {
89
+ "title": "5-4-3-2-1 Farkındalık Tekniği",
90
+ "description": "Şu anda görebildiğin 5 şey, duyabildiğin 4 ses, dokunabildiğin 3 şey, koklayabildiğin 2 koku ve tadabildiğin 1 tat bul.",
91
+ "benefit": "Anksiyete durumlarından çıkma",
92
+ "when_to_use": "Panik atak veya aşırı kaygı anlarında"
93
+ }
94
+ ],
95
+ "uyku_problemleri": [
96
+ {
97
+ "title": "Progresif Kas Gevşetme",
98
+ "description": "Ayak parmaklarından başlayarak, her kas grubunu sırayla gerip sonra gevşet. Her grup için 5 saniye ger, 10 saniye gevşet.",
99
+ "benefit": "Uykuya dalmayı kolaylaştırma",
100
+ "when_to_use": "Yatmadan 20-30 dakika önce"
101
+ },
102
+ {
103
+ "title": "Uyku Hijyeni Rutini",
104
+ "description": "Her gece aynı saatte yat, mavi ışık yayan cihazları yatmadan 1 saat önce kapat, yatak odanı serin ve karanlık tut.",
105
+ "benefit": "Uyku düzenini iyileştirme",
106
+ "when_to_use": "Her gün düzenli olarak"
107
+ }
108
+ ],
109
+ "motivasyon_eksikligi": [
110
+ {
111
+ "title": "5 Dakika Kuralı",
112
+ "description": "Sadece 5 dakika boyunca o işi yapmaya başlayacağına dair kendine söz ver. Genellikle başladıktan sonra devam etmek kolaylaşır.",
113
+ "benefit": "Ertelemeyi yenme",
114
+ "when_to_use": "Bir işe başlamakta zorlandığında"
115
+ },
116
+ {
117
+ "title": "Küçük Hedefler Belirleme",
118
+ "description": "Büyük hedefi küçük, ulaşılabilir adımlara böl ve her birini tamamladıkça kendini ödüllendir.",
119
+ "benefit": "İlerleme hissi ve motivasyon",
120
+ "when_to_use": "Büyük ve zorlu görevlerde"
121
+ }
122
+ ],
123
+ "kaygi_ve_panik": [
124
+ {
125
+ "title": "STOP Tekniği",
126
+ "description": "S (Stop): Dur. T (Take a breath): Nefes al. O (Observe): Duygularını gözlemle. P (Proceed): Devam et.",
127
+ "benefit": "Olumsuz düşünce döngüsünü kırma",
128
+ "when_to_use": "Kontrolden çıkmış hissettiğinde"
129
+ },
130
+ {
131
+ "title": "Soğuk Su Tekniği",
132
+ "description": "Yüzüne soğuk su çarp veya bileğinin iç kısmına soğuk bir nesne (buz, soğuk su) temas ettir.",
133
+ "benefit": "Parasempatik sinir sistemini aktive etme",
134
+ "when_to_use": "Şiddetli kaygı veya panik anında"
135
+ }
136
+ ],
137
+ "duygusal_acı": [
138
+ {
139
+ "title": "Üç Dakika Kabul Etme",
140
+ "description": "Üç dakika boyunca, yargılamadan şu anki duygularını kabul et. Hissettiğin duyguya 'Evet, şu an bunu hissediyorum ve bu normal' de.",
141
+ "benefit": "Duygusal direnç yerine kabul etme",
142
+ "when_to_use": "Yoğun duygusal acı yaşarken"
143
+ },
144
+ {
145
+ "title": "Duygu Günlüğü",
146
+ "description": "Günün belirli zamanlarında duygularını ve bu duyguları tetikleyen düşünceleri not et.",
147
+ "benefit": "Duygusal farkındalık ve örüntüleri tanıma",
148
+ "when_to_use": "Duygusal dalgalanmalar yaşadığın dönemlerde"
149
+ }
150
+ ],
151
+ "sosyal_kaygi": [
152
+ {
153
+ "title": "Önceden Hazırlık",
154
+ "description": "Sosyal ortamlara girmeden önce konuşabileceğin birkaç genel konu veya soru hazırla.",
155
+ "benefit": "Özgüven artışı ve kaygı azalması",
156
+ "when_to_use": "Sosyal etkinliklerden önce"
157
+ },
158
+ {
159
+ "title": "Kademeli Maruz Kalma",
160
+ "description": "Önce daha az kaygı verici sosyal durumlarla başlayıp, yavaş yavaş daha zorlu ortamlara geç.",
161
+ "benefit": "Sosyal becerileri geliştirme",
162
+ "when_to_use": "Sosyal fobiye karşı uzun vadeli çalışma"
163
+ }
164
+ ]
165
+ }
166
+
167
  # Duygu Analizi Modeli
168
+ print("Duygu analizi modeli yükleniyor...")
169
  sentiment_model = pipeline(
170
  "sentiment-analysis",
171
  model="distilbert-base-uncased-finetuned-sst-2-english",
172
  device=-1 # CPU üzerinde çalıştır
173
  )
174
+ print("Duygu analizi modeli yüklendi.")
175
 
176
+ # Türkçe Metin Üretme Modeli
177
  print("Metin üretme modeli yükleniyor...")
178
  tokenizer = AutoTokenizer.from_pretrained("ytu-ce-cosmos/turkish-gpt2")
179
  text_model = AutoModelForCausalLM.from_pretrained("ytu-ce-cosmos/turkish-gpt2")
 
182
  # Türkçe kadın sesi kullanacağız
183
  VOICE = "tr-TR-EmelNeural"
184
 
185
+ # Kaçınılması gereken kelimeler - toksik veya olumsuz ifadeler
186
+ NEGATIVE_WORDS = [
187
+ "öl", "gebert", "öldür", "intihar", "zarar ver", "acı çek", "lanet",
188
+ "aptal", "salak", "gerizekalı", "ahmak", "saçma", "beş para etmez",
189
+ "başarısız", "beceriksiz", "yetersiz", "berbat", "rezil", "iğrenç",
190
+ "boşver", "vazgeç", "umurumda değil", "imkansız", "boşuna", "nafile",
191
+ "asla", "kesinlikle olmaz", "faydasız", "işe yaramaz", "siktir", "sikerim",
192
+ "piç", "orospu", "şerefsiz", "bok", "yarrak", "amk"
193
+ ]
194
+
195
+ # Isınma mesajları - soğuk başlangıçları önlemek için
196
+ WARMUP_PROMPTS = [
197
+ "Bana moral ver, çok üzgünüm.",
198
+ "Bugün çok mutluyum, harika bir gün geçirdim!",
199
+ "İşimi kaybettim ve ne yapacağımı bilmiyorum.",
200
+ "Yeni bir iş teklifi aldım, çok heyecanlıyım!",
201
+ "Hayatımda hiçbir şey yolunda gitmiyor gibi hissediyorum."
202
+ ]
203
+
204
+ def init_models():
205
+ """Modelleri ısındır"""
206
+ for prompt in WARMUP_PROMPTS[:2]: # Sadece 2 prompt kullan, zaman kazanmak için
207
+ sentiment_result = sentiment_model(prompt)[0]
208
+ label = sentiment_result['label']
209
+ score = sentiment_result['score']
210
+
211
+ prompt_obj = create_better_prompts(prompt, label, score)
212
+
213
+ inputs = tokenizer(prompt_obj, return_tensors="pt")
214
+ text_model.generate(
215
+ inputs["input_ids"],
216
+ max_length=100,
217
+ num_return_sequences=1,
218
+ do_sample=True,
219
+ temperature=0.7,
220
+ pad_token_id=tokenizer.eos_token_id
221
+ )
222
+ print("Modeller ısındırıldı ve çalışmaya hazır.")
223
+
224
+ # Uygulama başlangıcında modelleri ısındır
225
+ init_models()
226
+
227
+ def add_emojis(text, emotion, count=1):
228
+ """Duygu durumuna göre metne emoji ekler"""
229
+ if emotion in TURKISH_EMOJIS:
230
+ emoji_list = TURKISH_EMOJIS[emotion]
231
+ selected_emojis = random.sample(emoji_list, min(count, len(emoji_list)))
232
+
233
+ # %50 ihtimalle metnin başına, %50 ihtimalle sonuna emoji ekle
234
+ if random.random() < 0.5:
235
+ result = " ".join(selected_emojis) + " " + text
236
+ else:
237
+ result = text + " " + " ".join(selected_emojis)
238
+ return result
239
+ return text
240
+
241
+ def detect_emotion_from_text(text, label, score):
242
+ """Metinden duygu durumunu tespit eder"""
243
+ text_lower = text.lower()
244
+
245
+ # Pozitif duygular
246
+ if label == "POSITIVE" or score > 0.9:
247
+ if any(word in text_lower for word in ["harika", "muhteşem", "mükemmel", "süper", "olağanüstü"]):
248
+ return "mutluluk", 2 # Daha fazla emoji
249
+ elif any(word in text_lower for word in ["seviyorum", "aşk", "sevgi", "kalp", "özledim"]):
250
+ return "sevgi", 1
251
+ elif any(word in text_lower for word in ["başardım", "kazandım", "başarı", "tamamladım"]):
252
+ return "başarı", 2
253
+ else:
254
+ return "mutluluk", 1
255
+
256
+ # Negatif duygular
257
+ elif label == "NEGATIVE":
258
+ if any(word in text_lower for word in ["üzgün", "kederli", "mutsuz", "hüzün", "ağlıyorum"]):
259
+ return "üzüntü", 1
260
+ elif any(word in text_lower for word in ["hasta", "ağrı", "acı", "kötü hissediyorum"]):
261
+ return "kötü durum", 1
262
+ else:
263
+ return "destek", 1
264
+
265
+ # Varsayılan
266
+ return "destek", 0
267
+
268
+ def is_inappropriate(text):
269
+ """Uygunsuz veya zararlı içerik kontrolü yapar"""
270
+ text_lower = text.lower()
271
+
272
+ # Olumsuz kelimeler
273
+ for word in NEGATIVE_WORDS:
274
+ if word in text_lower:
275
+ return True, f"Üzgünüm, mesajınızda uygunsuz içerik tespit edildi. Lütfen daha olumlu bir dille tekrar deneyin."
276
+
277
+ # Çok uzun veya çok kısa metinler
278
+ if len(text) > 500:
279
+ return True, "Mesajınız çok uzun. Lütfen daha kısa bir mesaj yazın (maksimum 500 karakter)."
280
+ elif len(text.strip()) < 3:
281
+ return True, "Mesajınız çok kısa. Lütfen nasıl hissettiğinizi biraz daha detaylı anlatın."
282
+
283
+ return False, ""
284
+
285
+ @lru_cache(maxsize=32)
286
+ def is_question_or_command(text):
287
+ """Metnin bir soru veya komut olup olmadığını kontrol eder - performans için önbellekleniyor"""
288
+ # Metin boşsa veya çok kısaysa
289
+ if not text or len(text.strip()) < 3:
290
+ return False
291
+
292
+ # HTML özel karakterlerini temizle
293
+ text = html.unescape(text)
294
 
295
+ # Soru işareti içeriyor mu?
296
+ if "?" in text:
297
+ return True
298
 
299
+ # Türkçe soru kelimeleri ile başlıyor mu?
300
+ question_starters = [
301
+ "nasıl", "neden", "ne zaman", "nerede", "kim", "hangi", "kaç", "ne", "niye",
302
+ "niçin", "nedir", "mı", "mi", "mu", "mü", "nereden", "neresi", "kime", "kimde"
303
+ ]
304
+ text_lower = text.lower()
305
 
306
+ # Daha kapsamlı kontrol - kelimenin başında, ortasında veya sonunda olabilir
307
+ for starter in question_starters:
308
+ if (text_lower.startswith(starter) or
309
+ f" {starter} " in text_lower or
310
+ f" {starter}?" in text_lower or
311
+ f" {starter}." in text_lower or
312
+ text_lower.endswith(f" {starter}")):
313
+ return True
314
 
315
+ # Emir kipi veya rica kipi var mı?
316
+ command_patterns = [
317
+ r'\b(yap|söyle|anlat|göster|ver|aç|kapat|git|gel|bul|ara|başla|bitir|dur|oku|yaz|dinle)\b',
318
+ r'lütfen', r'rica', r'yapar mısın', r'mümkün mü', r'edebilir misin'
319
+ ]
320
+ for pattern in command_patterns:
321
+ if re.search(pattern, text_lower):
322
+ return True
323
 
324
+ return False
325
+
326
+ def normalize_text(text):
327
+ """Metni normalize eder"""
328
+ # HTML özel karakterlerini temizle
329
+ text = html.unescape(text)
330
+
331
+ # Fazla boşlukları temizle
332
+ text = re.sub(r'\s+', ' ', text).strip()
333
+
334
+ # Türkçe karakterleri düzeltme
335
+ replacements = {
336
+ 'İ': 'i', 'I': 'ı', 'i̇': 'i',
337
+ 'ğ': 'ğ', 'Ğ': 'Ğ', 'ş': 'ş', 'Ş': 'Ş',
338
+ 'ç': 'ç', 'Ç': 'Ç', 'ö': 'ö', 'Ö': 'Ö',
339
+ 'ü': 'ü', 'Ü': 'Ü'
340
+ }
341
+
342
+ for old, new in replacements.items():
343
+ text = text.replace(old, new)
344
+
345
+ return text
346
+
347
+ def generate_turkish_text(prompt, max_length=250):
348
+ """Türkçe metin üretme fonksiyonu - geliştirilmiş versiyon"""
349
+ try:
350
+ inputs = tokenizer(prompt, return_tensors="pt")
351
+
352
+ # Üretim parametreleri: daha üretken ve tutarlı yanıtlar için ayarlandı
353
+ output = text_model.generate(
354
+ inputs["input_ids"],
355
+ max_length=max_length,
356
+ num_return_sequences=1,
357
+ do_sample=True,
358
+ temperature=0.85, # Yaratıcılık için yüksek
359
+ top_p=0.92, # Geniş kelime dağarcığı
360
+ top_k=70, # Daha çeşitli kelimeler
361
+ repetition_penalty=1.2, # Tekrarları azaltma
362
+ no_repeat_ngram_size=3, # 3 kelimelik grupların tekrarını engelle
363
+ pad_token_id=tokenizer.eos_token_id
364
+ )
365
+
366
+ generated_text = tokenizer.decode(output[0], skip_special_tokens=True)
367
+
368
+ # Başlangıç prompt'unu kaldır ve sadece yeni üretilen kısmı al
369
+ if prompt in generated_text:
370
+ generated_text = generated_text[len(prompt):].strip()
371
+
372
+ # Çeşitli temizleme işlemleri
373
+ # HTML/CSS etiketlerini temizle
374
+ generated_text = re.sub(r'\[/?vc_\w+\]', '', generated_text)
375
+
376
+ # Diğer potansiyel bozuk formatları temizle
377
+ generated_text = re.sub(r'<.*?>', '', generated_text)
378
+
379
+ # Çoklu boşlukları temizle
380
+ generated_text = re.sub(r'\s+', ' ', generated_text).strip()
381
+
382
+ # Sistem talimatlarını temizle - genişletilmiş liste
383
+ patterns_to_clean = [
384
+ r'arkadaşça destek mesajı:', r'dostça destek mesajı:',
385
+ r'motive edici arkadaş mesajı:', r'coşkulu ve arkadaşça yanıt:',
386
+ r'yanıt:', r'cevap:', r'cevabında şunları yap:',
387
+ r'[0-9]\. .*', r'yanıtı:', r'kişinin mesajı:'
388
+ ]
389
+
390
+ for pattern in patterns_to_clean:
391
+ generated_text = re.sub(pattern, '', generated_text, flags=re.IGNORECASE)
392
+
393
+ # Son temizleme
394
+ generated_text = re.sub(r'\s+', ' ', generated_text).strip()
395
+
396
+ # İlk harfi büyük, son noktalama işareti kontrolü
397
+ if generated_text:
398
+ # İlk harf büyük
399
+ generated_text = generated_text[0].upper() + generated_text[1:]
400
+
401
+ # Son karakter noktalama işareti değilse, nokta ekle
402
+ if not generated_text[-1] in ['.', '!', '?']:
403
+ generated_text += '.'
404
+
405
+ return generated_text
406
+
407
+ except Exception as e:
408
+ print(f"Metin üretme hatası: {str(e)}")
409
+ return "Şu anda yanıt üretirken bir sorun oluştu. Lütfen daha sonra tekrar deneyin."
410
 
411
  async def create_speech_async(text):
412
+ """Edge TTS ile doğal insan sesi üret - iyileştirilmiş hata yönetimi"""
413
  try:
414
+ if not text or len(text.strip()) < 1:
415
+ return None
416
+
417
+ # Ses parametrelerini ayarla - daha doğal bir konuşma için
418
  communicate = edge_tts.Communicate(text, VOICE)
419
  audio_path = "response.mp3"
420
+
421
+ # Dosya zaten varsa sil
422
+ if os.path.exists(audio_path):
423
+ os.remove(audio_path)
424
+
425
  await communicate.save(audio_path)
426
+
427
+ # Dosyanın başarıyla oluşturulduğunu kontrol et
428
+ if os.path.exists(audio_path) and os.path.getsize(audio_path) > 0:
429
+ return audio_path
430
+ return None
431
+
432
  except Exception as e:
433
  print(f"Ses oluşturma hatası: {str(e)}")
434
  return None
435
 
436
  def create_speech(text):
437
+ """Ana thread'de async fonksiyonu çalıştır - hata yönetimi eklenmiş"""
438
  try:
439
+ if not text or len(text.strip()) < 1:
440
+ print("Ses oluşturulamadı: Metin boş")
441
+ return None
442
+
443
+ # Metni normalize et
444
+ text = normalize_text(text)
445
+
446
+ # Async işlemi çalıştır
447
  loop = asyncio.new_event_loop()
448
  asyncio.set_event_loop(loop)
449
  result = loop.run_until_complete(create_speech_async(text))
450
  loop.close()
451
+
452
+ if result:
453
+ return result
454
+
455
+ # Ses oluşturulamazsa boş ses dosyası oluştur
456
+ print("Ses dosyası oluşturulamadı, boş dosya döndürülüyor")
457
+ with open("empty.mp3", "wb") as f:
458
+ f.write(b"")
459
+ return "empty.mp3"
460
+
461
  except Exception as e:
462
  print(f"Ses oluşturma hatası: {str(e)}")
463
  # Boş ses dosyası oluştur
 
465
  f.write(b"")
466
  return "empty.mp3"
467
 
468
+ def get_appropriate_expert_recommendations(text, emotion, score):
469
+ """Kullanıcının durumuna uygun uzman önerileri seçer"""
470
+ text_lower = text.lower()
471
+
472
+ # Uygun öneri kategorisini seç
473
+ if "uyuyam" in text_lower or "uykus" in text_lower or "uyku" in text_lower:
474
+ category = "uyku_problemleri"
475
+ elif "stress" in text_lower or "stres" in text_lower or "gergin" in text_lower or "baskı" in text_lower:
476
+ category = "stress_yonetimi"
477
+ elif "korku" in text_lower or "panik" in text_lower or "endişe" in text_lower or "kaygı" in text_lower:
478
+ category = "kaygi_ve_panik"
479
+ elif "motivasyon" in text_lower or "istek" in text_lower or "yapmak istemiyorum" in text_lower or "enerjim yok" in text_lower:
480
+ category = "motivasyon_eksikligi"
481
+ elif "acı" in text_lower or "keder" in text_lower or "üzüntü" in text_lower or "kayıp" in text_lower:
482
+ category = "duygusal_acı"
483
+ elif "utanç" in text_lower or "sosyal" in text_lower or "insanlar" in text_lower or "topluluk" in text_lower:
484
+ category = "sosyal_kaygi"
485
+ else:
486
+ # Duygu analizi sonucuna göre en uygun kategoriyi seç
487
+ if emotion == "üzüntü":
488
+ category = "duygusal_acı"
489
+ elif emotion == "kötü durum" and score > 0.8:
490
+ category = "stress_yonetimi"
491
+ else:
492
+ # Varsayılan olarak stres yönetimi öneri ver
493
+ category = "stress_yonetimi"
494
+
495
+ # Seçilen kategoriden 1-2 öneri seç
496
+ if category in EXPERT_RECOMMENDATIONS:
497
+ recommendations = EXPERT_RECOMMENDATIONS[category]
498
+ # Eğer birden fazla öneri varsa, rastgele 1-2 tane seç
499
+ if len(recommendations) > 1:
500
+ return random.sample(recommendations, min(2, len(recommendations)))
501
+ return recommendations
502
+
503
+ # Uygun bir kategori bulunamazsa boş liste döndür
504
+ return []
505
+
506
+ def format_recommendations(recommendations):
507
+ """Önerileri okunabilir formatta biçimlendirir"""
508
+ if not recommendations:
509
+ return ""
510
+
511
+ result = "\n\n**İşte sana yardımcı olabilecek birkaç öneri:**\n\n"
512
+
513
+ for i, rec in enumerate(recommendations, 1):
514
+ result += f"**{i}. {rec['title']}**\n"
515
+ result += f"{rec['description']}\n"
516
+ result += f"*Ne zaman kullanmalı:* {rec['when_to_use']}\n"
517
+ result += f"*Faydası:* {rec['benefit']}\n\n"
518
+
519
+ return result
520
+
521
+ def get_personality_profile(text=None, emotion=None):
522
+ """Kullanıcının durum ve ifadesine göre en uygun kişilik profilini seç"""
523
+
524
+ # Eğer metin veya duygu belirtilmediyse varsayılan kişilik kullan
525
+ if not text or not emotion:
526
+ return PERSONALITY_PROFILES[DEFAULT_PERSONALITY]
527
+
528
+ text_lower = text.lower()
529
+
530
+ # Kişilik seçimi için ipuçları ara
531
+ if any(word in text_lower for word in ["motivasyon", "isteksiz", "enerjim yok", "yapamıyorum", "başaramıyorum"]):
532
+ return PERSONALITY_PROFILES["motive_edici_koc"]
533
+ elif any(word in text_lower for word in ["anlamıyorum", "karmaşık", "kafam karıştı", "ne yapmam gerekiyor", "tavsiye"]):
534
+ return PERSONALITY_PROFILES["bilge_danisman"]
535
+ elif any(word in text_lower for word in ["üzgün", "mutsuz", "kötü", "yalnız", "anlaşılmıyorum"]):
536
+ return PERSONALITY_PROFILES["anlayisli_dost"]
537
+ elif any(word in text_lower for word in ["mutlu", "sevinçli", "heyecanlı", "neşeli"]):
538
+ return PERSONALITY_PROFILES["pozitif_arkadas"]
539
+
540
+ # Duygulara göre en uygun kişiliği seç
541
+ if emotion == "üzüntü":
542
+ return PERSONALITY_PROFILES["anlayisli_dost"]
543
+ elif emotion == "mutluluk":
544
+ return PERSONALITY_PROFILES["pozitif_arkadas"]
545
+ elif emotion == "kötü durum":
546
+ # Kötü durum için bilge veya motivasyon arasında rastgele seç
547
+ return random.choice([PERSONALITY_PROFILES["bilge_danisman"], PERSONALITY_PROFILES["motive_edici_koc"]])
548
+
549
+ # Varsayılan olarak anlayışlı dost modelini kullan
550
+ return PERSONALITY_PROFILES[DEFAULT_PERSONALITY]
551
+
552
  def create_better_prompts(text, label, score):
553
+ """Daha samimi, dostça ve arkadaşça promptlar oluştur - Genişletilmiş versiyon"""
554
 
555
+ # Metni normalize et
556
+ text = normalize_text(text)
557
+
558
+ # Kişilik profilini belirle
559
+ emotion, _ = detect_emotion_from_text(text, label, score)
560
+ personality = get_personality_profile(text, emotion)
561
+
562
+ # Soru veya komut kontrol et
563
+ if is_question_or_command(text):
564
+ return f"""{personality['prompt_prefix']}Bu kişiye bir {', '.join(personality['qualities'])} olarak yanıt ver.
565
+
566
+ Kişinin mesajı: '{text}'
567
+
568
+ Yanıt:"""
569
+
570
+ # Duygu durumuna göre prompt oluştur - daha detaylı şekilde ve kişilik özelliklerine göre
571
  if label == "NEGATIVE":
572
  if score > 0.85: # Çok olumsuz
573
+ prompt = f"""{personality['prompt_prefix']}Kişi çok üzgün ve olumsuz bir durumda: '{text}'
574
 
575
+ Ona bir {', '.join(personality['qualities'])} olarak, içten bir şekilde destek ol. Cevabında:
576
+ - Önce derin bir empati göster, nasıl hissettiğini gerçekten anladığını hissettir
577
+ - Kendi hayatından benzer bir zorluktan nasıl geçtiğini kısaca paylaş (veya başkalarının benzer durumları nasıl aştığından bahset)
578
+ - Ona özel birkaç somut öneri sun, ama dayatmadan yap
579
+ - Bu zorlu dönemin geçici olduğunu hatırlat
580
+ - Yanında olduğunu ve birlikte üstesinden geleceğinizi vurgula
581
+ - {personality['qualities'][0]} ve {personality['qualities'][2]} bir yaklaşım sergile
582
+ - Olumlu bir notla bitir, ona olan güvenini belirt
583
 
584
+ Yanıt:"""
585
  else: # Orta derecede olumsuz
586
+ prompt = f"""{personality['prompt_prefix']}Kişi biraz moral bozukluğu yaşıyor: '{text}'
587
 
588
+ Ona bir {', '.join(personality['qualities'])} olarak:
589
+ - Duygularını anladığını ve değer verdiğini göster
590
+ - Yaşadığı zorluğu küçümsemeden anlayışla karşıla
591
+ - Bu durumun üstesinden nasıl gelebileceğine dair kişiselleştirilmiş öneriler sun
592
+ - Umut ve motivasyon ver
593
+ - Birlikte bir şeyler yapmayı teklif et veya somut çözümler öner
594
+ - Konuşmaya devam etmesini teşvik et
595
+ - {personality['qualities'][0]} ve {personality['qualities'][1]} bir yaklaşım sergile
596
 
597
+ Yanıt:"""
598
  elif label == "POSITIVE" and score < 0.6: # Hafif olumlu
599
+ prompt = f"""{personality['prompt_prefix']}Kişi olumlu ama motivasyona ihtiyacı var: '{text}'
600
 
601
+ Ona bir {', '.join(personality['qualities'])} olarak:
602
+ - Olumlu duygularını takdir et ve daha da güçlendir
603
+ - Başarılarını kutla ve bunları nasıl sürdürebileceğine dair ipuçları ver
604
+ - Gelecek için heyecan verici olasılıklardan bahset
605
+ - Potansiyelini hatırlat ve ona olan inancını belirt
606
+ - Beraber yapabileceğiniz keyifli aktiviteler öner veya bu enerjiyi nasıl koruyacağına dair tavsiyeler ver
607
+ - {personality['qualities'][2]} ve {personality['qualities'][3]} bir yaklaşım sergile
608
+ - Sohbete devam etmeye teşvik et
609
 
610
+ Yanıt:"""
611
  else: # Çok olumlu
612
+ prompt = f"""{personality['prompt_prefix']}Kişi çok mutlu ve coşkulu: '{text}'
613
 
614
+ Ona bir {', '.join(personality['qualities'])} olarak:
615
+ - Mutluluğunu kutla ve bu sevinci paylaş
616
+ - Bu güzel anın tadını nasıl çıkarabileceğine dair öneriler sun
617
+ - Başarısını veya mutluluğunu öv, bu başarıyı nasıl elde ettiğini sorup daha da derinleştir
618
+ - Bu olumlu duyguları nasıl sürdürebileceğine dair ipuçları ver
619
+ - Gelecekteki diğer güzel olasılıklardan bahset
620
+ - {personality['qualities'][0]} ve {personality['qualities'][3]} bir yaklaşım sergile
621
+ - Bu mutluluğu birlikte kutlamayı teklif et veya bu mutlulukla neler yapabileceğine dair fikirler paylaş
622
 
623
+ Yanıt:"""
624
 
625
  return prompt
626
 
627
+ def process_input(text, personality_choice=None):
628
+ """Kullanıcı girdisini işle - geliştirilmiş, kapsamlı versiyon"""
629
+ start_time = time.time()
630
+
631
  try:
632
+ # Ön kontroller
633
  if not text or text.strip() == "":
634
  return "Lütfen bir metin girin.", None
635
 
636
+ # Metni normalize et
637
+ text = normalize_text(text)
638
+
639
  print(f"İstek alındı: {text[:50]}...")
640
+
641
+ # Uygunsuz içerik kontrolü
642
+ is_bad, error_msg = is_inappropriate(text)
643
+ if is_bad:
644
+ return error_msg, None
645
 
646
  # Duygu analizi yap
647
  sentiment_result = sentiment_model(text)[0]
 
650
 
651
  print(f"Duygu analizi sonucu: {label} ({score:.2f})")
652
 
653
+ # Eğer kullanıcı kişilik seçimi yaptıysa onu kullan, yoksa otomatik belirle
654
+ emotion, emoji_count = detect_emotion_from_text(text, label, score)
655
+ if personality_choice and personality_choice in PERSONALITY_PROFILES:
656
+ personality = PERSONALITY_PROFILES[personality_choice]
657
+ VOICE = personality["voice"] # Kişiliğe uygun sesi seç
658
+ else:
659
+ personality = get_personality_profile(text, emotion)
660
+ VOICE = personality["voice"]
661
+
662
+ print(f"Kullanılacak kişilik: {personality['name']}")
663
+
664
  # Geliştirilmiş promptlar oluştur
665
  prompt = create_better_prompts(text, label, score)
666
 
667
+ # Türkçe metin üret - kişiliğe göre ayarlanmış parametrelerle
668
  print("Metin üretiliyor...")
 
669
  response = generate_turkish_text(prompt, max_length=300)
670
 
671
+ # Eğer yanıt üretilemediyse
672
+ if not response or len(response) < 5:
673
+ response = "Üzgünüm, şu anda yanıt üretirken bir sorun yaşadım. Lütfen daha sonra tekrar deneyin."
674
+
675
  # Cevap çok uzunsa kısalt, ama anlamlı bir şekilde
676
  if len(response) > 350:
677
  sentences = re.split(r'(?<=[.!?])\s+', response)
 
683
  break
684
  response = shortened_response.strip()
685
 
686
+ # Uzman önerileri ekle - belirli şartlara göre
687
+ if label == "NEGATIVE" and score > 0.7 and random.random() < 0.7: # %70 ihtimalle olumsuz durumlarda öneri ekle
688
+ recommendations = get_appropriate_expert_recommendations(text, emotion, score)
689
+ if recommendations:
690
+ formatted_recs = format_recommendations(recommendations)
691
+ if len(response) + len(formatted_recs) <= 600: # Çok uzun olmamasına dikkat et
692
+ response += formatted_recs
693
+
694
+ # Emoji ekle - duygu durumuna göre
695
+ if random.random() < 0.7: # %70 ihtimalle emoji ekle
696
+ response = add_emojis(response, emotion, emoji_count)
697
+
698
  print(f"Üretilen yanıt: {response[:50]}...")
699
 
700
+ # Yüksek kaliteli doğal ses üret - kişiliğe uygun sesle
701
  print("Doğal ses üretiliyor...")
702
  audio_path = create_speech(response)
703
 
704
+ process_time = time.time() - start_time
705
+ print(f"İşlem tamamlandı ({process_time:.2f} saniye)")
706
 
707
  return response, audio_path
708
 
709
  except Exception as e:
710
  error_msg = f"İşlem sırasında bir hata oluştu: {str(e)}"
711
  print(error_msg)
712
+ return "Üzgünüm, bir sorun oluştu. Lütfen tekrar deneyin.", None
713
 
714
  # Demo başlığ�� ve açıklaması
715
  title = "MoodF - Duygusal Destek Asistanı"
 
720
 
721
  **Nasıl kullanılır:**
722
  1. Nasıl hissettiğinizi yazın
723
+ 2. İsterseniz kişilik tercihinizi yapın
724
+ 3. "Gönder" düğmesine tıklayın
725
+ 4. MoodF'in yazılı ve doğal sesli yanıtını alın
726
  """
727
 
728
  # Arayüz tasarımı
 
736
  label="Duygularınız",
737
  lines=4
738
  )
739
+
740
+ # KİŞİLİK SEÇİMİ
741
+ personality_dropdown = gr.Dropdown(
742
+ choices=[p["name"] for p in PERSONALITY_PROFILES.values()],
743
+ value=PERSONALITY_PROFILES[DEFAULT_PERSONALITY]["name"],
744
+ label="Kişilik tercihi (isteğe bağlı)",
745
+ info="Size nasıl yanıt vermemi istersiniz?"
746
+ )
747
+
748
  submit_btn = gr.Button("Gönder", variant="primary")
749
 
750
  with gr.Column():
751
  text_output = gr.Textbox(label="MoodF'in yanıtı", lines=4)
752
  audio_output = gr.Audio(label="Sesli yanıt", type="filepath")
753
 
754
+ # Kişilik açıklaması
755
+ personality_info = gr.Markdown("""
756
+ **Kişilik Profilleri:**
757
+ - **Anlayışlı Dost:** Sakin, empatik ve duygusal destek sağlayan bir dost gibi davranır.
758
+ - **Motive Edici Koç:** Enerjik, istekli ve motive edici bir koç gibi davranır.
759
+ - **Bilge Danışman:** Deneyimli, bilge ve dengeli bir danışman gibi davranır.
760
+ - **Pozitif Arkadaş:** Neşeli, eğlenceli ve iyimser bir arkadaş gibi davranır.
761
+ """)
762
+
763
  # Örnek girdiler
764
  gr.Examples(
765
  [
766
  ["Bugün kendimi gerçekten kötü hissediyorum, her şey ters gidiyor."],
767
  ["İş yerinde çok stres altındayım ve kendimi değersiz hissediyorum."],
768
+ ["Harika bir gün geçirdim, her şey yolunda gidiyor!"],
769
+ ["Ailem beni anlamıyor ve yalnız hissediyorum."],
770
+ ["Yeni bir başarı elde ettim ve çok gururluyum!"]
771
  ],
772
  inputs=text_input,
773
  outputs=[text_output, audio_output],
774
+ fn=lambda text: process_input(text),
775
  cache_examples=False,
776
  )
777
 
778
+ # Kişilik seçimi fonksiyonu
779
+ def process_with_personality(text, personality_name):
780
+ # Kişilik adını kimliğe çevir
781
+ personality_id = None
782
+ for pid, p in PERSONALITY_PROFILES.items():
783
+ if p["name"] == personality_name:
784
+ personality_id = pid
785
+ break
786
+
787
+ return process_input(text, personality_id)
788
+
789
  # İşlem düğmesine tıklama olayı
790
  submit_btn.click(
791
+ fn=process_with_personality,
792
+ inputs=[text_input, personality_dropdown],
793
  outputs=[text_output, audio_output],
794
  api_name="predict"
795
  )