fix: таймаут на TTS-запрос, чтобы зависший edge-tts не вешал бота навсегда
All checks were successful
CI/CD Pipeline / build-and-deploy (push) Successful in 2m53s

При concurrent_updates=False (дефолт PTB) зависший без таймаута вызов
edge_tts.save() блокировал всю очередь апдейтов — бот переставал отвечать
до ручного перезапуска контейнера. Особенно проявлялось на проде при
пачке из нескольких сообщений подряд.
This commit is contained in:
vrubel 2026-08-27 20:07:32 +00:00
parent 4b79899967
commit 8d51373ec4

View file

@ -21,6 +21,7 @@ logger = logging.getLogger(__name__)
USER_TOKEN = os.environ['USER_BOT_TOKEN']
ADMIN_TOKEN = os.environ['ADMIN_BOT_TOKEN']
TTS_VOICE = os.environ.get('TTS_VOICE', 'ru-RU-DmitryNeural')
TTS_TIMEOUT = int(os.environ.get('TTS_TIMEOUT', '30'))
DATA_DIR = os.environ.get('DATA_DIR', '/app/data')
os.makedirs(DATA_DIR, exist_ok=True)
@ -160,7 +161,14 @@ async def handle_user_message(update: Update, context):
try:
communicate = edge_tts.Communicate(text, voice=TTS_VOICE)
await communicate.save(tmp_path)
try:
await asyncio.wait_for(communicate.save(tmp_path), timeout=TTS_TIMEOUT)
except asyncio.TimeoutError:
logger.error(f"TTS timed out after {TTS_TIMEOUT}s for user {user.id}")
await update.message.reply_text(
'⚠️ Сервис озвучки не отвечает. Попробуй ещё раз через минуту.'
)
return
# ── 1. Send voice back to user ──
duration = get_ogg_duration(tmp_path)