Opera8 commited on
Commit
f187a2f
·
verified ·
1 Parent(s): 55e1306

Update main.py

Browse files
Files changed (1) hide show
  1. main.py +66 -93
main.py CHANGED
@@ -6,14 +6,13 @@ import traceback
6
  import asyncio
7
  from flask import Flask
8
  from rubpy.bot import BotClient, filters
9
- from rubpy.types import InlineKeyboardMarkup, InlineKeyboardButton
10
 
11
  # --- تنظیمات وب سرور ---
12
  app = Flask(__name__)
13
 
14
  @app.route('/')
15
  def home():
16
- return "ربات روبیکا (نسخه دکمه‌های شیشه‌ای) روشن است! 🚀"
17
 
18
  def run_flask():
19
  app.run(host="0.0.0.0", port=7860)
@@ -32,41 +31,23 @@ WORKER_URLS =[
32
  "https://hamed744-ttspro9.hf.space/generate",
33
  ]
34
 
35
- # --- لیست کامل ۳۰ گوینده ---
36
- SPEAKERS =[
37
- ("شهاب (مرد)", "Charon"), ("آوا (زن)", "Zephyr"), ("نوید (مرد)", "Achird"),
38
- ("آرمان (مرد)", "Zubenelgenubi"), ("مهسا (زن)", "Vindemiatrix"), ("دانا (مرد)", "Rasalgethi"),
39
- ("سامان (مرد)", "Sadachbia"), ("آرش (مرد)", "Sadaltager"), ("شبنم (زن)", "Sulafat"),
40
- ("سحر (زن)", "Laomedeia"), ("مریم (زن)", "Achernar"), ("بهرام (مرد)", "Alnilam"),
41
- ("نیکان (مرد)", "Schedar"), ("فرناز (زن)", "Gacrux"), ("سارا (زن)", "Pulcherrima"),
42
- ("مانی (مرد)", "Umbriel"), ("آرتین (مرد)", "Algieba"), ("دلنواز (زن)", "Despina"),
43
- ("روژان (زن)", "Erinome"), ("امید (مرد)", "Algenib"), ("بردیا (مرد)", "Orus"),
44
- ("ترانه (زن)", "Aoede"), ("نیکو (زن)", "Callirrhoe"), ("هستی (زن)", "Autonoe"),
45
- ("کامیار (مرد)", "Enceladus"), ("کیانوش (مرد)", "Iapetus"), ("پویا (مرد)", "Puck"),
46
- ("مهتاب (زن)", "Kore"), ("سام (مرد)", "Fenrir"), ("لیدا (زن)", "Leda")
47
- ]
48
 
49
  # دیکشنری برای ذخیره موقت متن کاربر
50
  user_states = {}
51
 
52
- # تابع ساخت دکمه‌های شیشه‌ای (دو ستونه)
53
- def get_speakers_keyboard():
54
- keys = []
55
- row =[]
56
- for name, sp_id in SPEAKERS:
57
- row.append(InlineKeyboardButton(text=name, callback_data=f"sp_{sp_id}"))
58
- if len(row) == 2: # هر ردیف ۲ دکمه
59
- keys.append(row)
60
- row =[]
61
- if row: # اضافه کردن دکمه‌های باقی‌مانده
62
- keys.append(row)
63
-
64
- try:
65
- return InlineKeyboardMarkup(inline_keyboard=keys)
66
- except TypeError:
67
- return InlineKeyboardMarkup(keys)
68
-
69
-
70
  # --- پردازش و ساخت صدا در پس‌زمینه ---
71
  async def process_tts(client, chat_id, user_text, speaker_id, speaker_name):
72
  try:
@@ -136,46 +117,10 @@ if not bot_token:
136
  else:
137
  bot = BotClient(bot_token)
138
 
139
- # دریافت تمام آپدیت‌ها (هم پیام متنی و هم کلیک روی دکمه شیشه‌ای)
140
- @bot.on_update()
141
  async def main_handler(client, update):
142
  try:
143
- # ۱. بررسی کلیک روی دکمه شیشه‌ای (Callback Query)
144
- call_data = getattr(update, "data", None)
145
- if not call_data and hasattr(update, "callback_query"):
146
- call_data = getattr(update.callback_query, "data", None)
147
-
148
- if call_data and isinstance(call_data, str) and call_data.startswith("sp_"):
149
- speaker_id = call_data.split("sp_")[1]
150
-
151
- # پیدا کردن اسم گوینده انتخاب شده
152
- speaker_name = "ناشناس"
153
- for name, sp in SPEAKERS:
154
- if sp == speaker_id:
155
- speaker_name = name
156
- break
157
-
158
- # پیدا کردن آیدی کاربر
159
- chat_id = getattr(update, "chat_id", None) or getattr(update, "author_guid", None) or getattr(update, "object_guid", None)
160
- if not chat_id and hasattr(update, "callback_query"):
161
- chat_id = getattr(update.callback_query, "chat_id", None) or getattr(update.callback_query, "author_guid", None)
162
- if not chat_id and hasattr(update, "message"):
163
- chat_id = getattr(update.message, "chat_id", None) or getattr(update.message, "author_guid", None)
164
-
165
- if not chat_id:
166
- return
167
-
168
- # دریافت متنی که کاربر قبلاً فرستاده بود
169
- user_text = user_states.get(chat_id)
170
- if not user_text:
171
- await client.send_message(chat_id, "❌ متن شما پیدا نشد یا زمان زیادی از آن گذشته است. لطفاً متن خود را دوباره ارسال کنید.")
172
- return
173
-
174
- # ارسال پروسه ساخت صدا به پس‌زمینه (تا ربات هنگ نکند)
175
- asyncio.create_task(process_tts(client, chat_id, user_text, speaker_id, speaker_name))
176
- return
177
-
178
- # ۲. بررسی دریافت پیام متنی
179
  user_text = ""
180
  if hasattr(update, "text") and update.text:
181
  user_text = update.text
@@ -184,34 +129,62 @@ else:
184
  elif hasattr(update, "new_message") and hasattr(update.new_message, "text") and update.new_message.text:
185
  user_text = update.new_message.text
186
 
187
- if user_text:
188
- chat_id = getattr(update, "chat_id", None) or getattr(update, "author_guid", None) or getattr(update, "object_guid", None)
189
- if not chat_id:
190
- return
191
 
192
- # پیام خوشامدگویی
193
- if user_text == "/start" or user_text == "سلام":
194
- welcome_text = "سلام! 🎙️\nمن ربات هوش مصنوعی تبدیل متن به صدا هستم.\n\nهر متنی که دوست داری رو برام بفرست تا با گوینده‌های حرفه‌ای برات بخونمش!"
195
- await client.send_message(chat_id, welcome_text)
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
196
  return
197
-
198
- # محدودیت کاراکتر
199
- if len(user_text) > 500:
200
- await client.send_message(chat_id, "⚠️ کاربر گرامی، لطفاً متنی کوتاه‌تر از ۵۰۰ کاراکتر بفرستید.")
201
  return
202
 
203
- # ذخیره متن کاربر در حافظه ربات
204
- user_states[chat_id] = user_text
205
-
206
- # ساخت و ارسال دکمه‌های شیشه‌ای گویندگان
207
- kb = get_speakers_keyboard()
208
- try:
209
- await client.send_message(chat_id, "🎙️ لطفاً از لیست زیر گوینده مورد نظر خود را برای خواندن این متن انتخاب کنید:", reply_markup=kb)
210
- except Exception as e:
211
- print(f"خطا در ارسال دکمه: {e}")
212
- await client.send_message(chat_id, "خطا در نمایش دکمه‌ها. ربات ر��بیکا در حال حاضر از دکمه شیشه‌ای پشتیبانی نمی‌کند.")
213
  return
214
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
215
  except Exception as e:
216
  print(f"خطای کلی سیستم: {e}")
217
  traceback.print_exc()
 
6
  import asyncio
7
  from flask import Flask
8
  from rubpy.bot import BotClient, filters
 
9
 
10
  # --- تنظیمات وب سرور ---
11
  app = Flask(__name__)
12
 
13
  @app.route('/')
14
  def home():
15
+ return "ربات روبیکا (منوی هوشمند) روشن است! 🚀"
16
 
17
  def run_flask():
18
  app.run(host="0.0.0.0", port=7860)
 
31
  "https://hamed744-ttspro9.hf.space/generate",
32
  ]
33
 
34
+ # --- دیکشنری ۳۰ گوینده ---
35
+ SPEAKERS = {
36
+ "1": ("شهاب (مرد)", "Charon"), "2": ("آوا (زن)", "Zephyr"), "3": ("نوید (مرد)", "Achird"),
37
+ "4": ("آرمان (مرد)", "Zubenelgenubi"), "5": ("مهسا (زن)", "Vindemiatrix"), "6": ("دانا (مرد)", "Rasalgethi"),
38
+ "7": ("سامان (مرد)", "Sadachbia"), "8": ("آرش (مرد)", "Sadaltager"), "9": ("شبنم (زن)", "Sulafat"),
39
+ "10": ("سحر (زن)", "Laomedeia"), "11": ("مریم (زن)", "Achernar"), "12": ("بهرام (مرد)", "Alnilam"),
40
+ "13": ("نیکان (مرد)", "Schedar"), "14": ("فرناز (زن)", "Gacrux"), "15": ("سارا (زن)", "Pulcherrima"),
41
+ "16": ("مانی (مرد)", "Umbriel"), "17": ("آرتین (مرد)", "Algieba"), "18": ("دلنواز (زن)", "Despina"),
42
+ "19": ("روژان (زن)", "Erinome"), "20": ("امید (مرد)", "Algenib"), "21": ("بردیا (مرد)", "Orus"),
43
+ "22": ("ترانه (زن)", "Aoede"), "23": ("نیکو (زن)", "Callirrhoe"), "24": ("هستی (زن)", "Autonoe"),
44
+ "25": ("کامیار (مرد)", "Enceladus"), "26": ("کیانوش (مرد)", "Iapetus"), "27": ("پویا (مرد)", "Puck"),
45
+ "28": ("مهتاب (زن)", "Kore"), "29": ("سام (مرد)", "Fenrir"), "30": ("لیدا (زن)", "Leda")
46
+ }
47
 
48
  # دیکشنری برای ذخیره موقت متن کاربر
49
  user_states = {}
50
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
51
  # --- پردازش و ساخت صدا در پس‌زمینه ---
52
  async def process_tts(client, chat_id, user_text, speaker_id, speaker_name):
53
  try:
 
117
  else:
118
  bot = BotClient(bot_token)
119
 
120
+ @bot.on_update(filters.private)
 
121
  async def main_handler(client, update):
122
  try:
123
+ # استخراج متن پیام
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
124
  user_text = ""
125
  if hasattr(update, "text") and update.text:
126
  user_text = update.text
 
129
  elif hasattr(update, "new_message") and hasattr(update.new_message, "text") and update.new_message.text:
130
  user_text = update.new_message.text
131
 
132
+ if not user_text:
133
+ return
 
 
134
 
135
+ chat_id = getattr(update, "chat_id", None) or getattr(update, "author_guid", None) or getattr(update, "object_guid", None)
136
+ if not chat_id:
137
+ return
138
+
139
+ user_text_str = str(user_text).strip()
140
+
141
+ # پیام خوشامدگویی
142
+ if user_text_str in ["/start", "سلام"]:
143
+ welcome_text = "سلام! 🎙️\nمن ربات هوش مصنوعی تبدیل متن به صدا هستم.\n\nهر متنی که دوست داری رو برام بفرست تا با ده‌ها گوینده مختلف برات بخونمش!"
144
+ await update.reply(welcome_text)
145
+ return
146
+
147
+ # بررسی اینکه آیا کاربر در حال انتخاب گوینده است (ارسال عدد)
148
+ if chat_id in user_states:
149
+ if user_text_str.isdigit() and user_text_str in SPEAKERS:
150
+ speaker_name, speaker_id = SPEAKERS[user_text_str]
151
+ saved_text = user_states[chat_id]
152
+
153
+ # پاک کردن متن از حافظه پس از انتخاب گوینده
154
+ del user_states[chat_id]
155
+
156
+ # ارسال پروسه ساخت صدا به پس‌زمینه
157
+ asyncio.create_task(process_tts(client, chat_id, saved_text, speaker_id, speaker_name))
158
  return
159
+ elif user_text_str.isdigit():
160
+ await update.reply("❌ شماره وارد شده نامعتبر است! لطفاً یک عدد بین ۱ تا ۳۰ بفرستید.")
 
 
161
  return
162
 
163
+ # اگر پیام عدد نبود، یعنی کاربر یک متن جدید برای تبدیل فرستاده است
164
+ if len(user_text_str) > 500:
165
+ await update.reply("⚠️ کاربر گرامی، لطفاً متنی کوتاه‌تر از ۵۰۰ کاراکتر بفرستید.")
 
 
 
 
 
 
 
166
  return
167
 
168
+ # ذخیره متن در حافظه
169
+ user_states[chat_id] = user_text_str
170
+
171
+ # ارسال منوی عددی گویندگان
172
+ menu_text = """📝 متن شما با موفقیت ذخیره شد!
173
+ لطفاً فقط **شماره** گوینده مورد نظر خود را از لیست زیر بفرستید (مثلا بفرستید: 1):
174
+
175
+ 1. شهاب (مرد) | 2. آوا (زن) | 3. نوید (مرد)
176
+ 4. آرمان (مرد) | 5. مهسا (زن) | 6. دانا (مرد)
177
+ 7. سامان (مرد) | 8. آرش (مرد) | 9. شبنم (زن)
178
+ 10. سحر (زن) | 11. مریم (زن) | 12. بهرام (مرد)
179
+ 13. نیکان (مرد)| 14. فرناز (زن) | 15. سارا (زن)
180
+ 16. مانی (مرد) | 17. آرتین (مرد) | 18. دلنواز (زن)
181
+ 19. روژان (زن) | 20. امید (مرد) | 21. بردیا (مرد)
182
+ 22. ترانه (زن) | 23. نیکو (زن) | 24. هستی (زن)
183
+ 25. کامیار (مرد)| 26. کیانوش (مرد)| 27. پویا (مرد)
184
+ 28. مهتاب (زن) | 29. سام (مرد) | 30. لیدا (زن)"""
185
+
186
+ await update.reply(menu_text)
187
+
188
  except Exception as e:
189
  print(f"خطای کلی سیستم: {e}")
190
  traceback.print_exc()