Update main.py
Browse files
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 |
-
#
|
| 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 |
-
|
| 189 |
-
if not chat_id:
|
| 190 |
-
return
|
| 191 |
|
| 192 |
-
|
| 193 |
-
|
| 194 |
-
|
| 195 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 196 |
return
|
| 197 |
-
|
| 198 |
-
|
| 199 |
-
if len(user_text) > 500:
|
| 200 |
-
await client.send_message(chat_id, "⚠️ کاربر گرامی، لطفاً متنی کوتاهتر از ۵۰۰ کاراکتر بفرستید.")
|
| 201 |
return
|
| 202 |
|
| 203 |
-
|
| 204 |
-
|
| 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()
|