TG_bot / app.py
KateProxa's picture
Rename TGBot.py to app.py
1566152 verified
raw
history blame contribute delete
No virus
11 kB
import telebot
import whisper
import os
import requests
import subprocess
import pytz
import yaml
import logging
logging.basicConfig(
level=logging.INFO,
filename="logfile.log",
filemode="w",
encoding='utf-8',
format="%(name)s %(asctime)s %(levelname)s %(message)s",
)
try:
with open(r"TGBot_config.yaml", "r") as f:
config = yaml.safe_load(f)
logging.info("Конфигурационный файл успешно загружен.")
except Exception as e:
logging.critical(
f"Конфигурационный файл не был загружен. Ошибка {e}", exc_info=True
)
try:
token = config["token"]
bot = telebot.TeleBot(token)
p_timezone = pytz.timezone(config["timezone"])
timezone_common_name = config["timezone_common_name"]
logging.info("Конфигурации успешно загружены")
except Exception as e:
logging.critical(f"Конфигерации не загружены. Ошибка {e}", exc_info=True)
@bot.message_handler(commands=["start"])
def start_message(message):
try:
bot.send_message(
message.chat.id,
"Привет ✌️ , отправь аудио/видео сообщение!\n"
"Hi ✌️, send me a voice/video message!",
)
logging.info("Отправлено приветственное сообщение.")
except Exception as e:
logging.error(
f"Приветственное сообщение не отправлено. Ошибка: {e}", exc_info=True
)
@bot.message_handler(commands=["help"])
def help_message(message):
try:
bot.send_message(
message.chat.id,
"Этот бот переводит голосовые/видео сообщения в текст\n"
"Бот создан в учебных целях\n\n"
"This bot translates voice/video messages into text\n"
"The bot was created for educational purposes",
)
logging.info("Отправлено информационное сообщение")
except Exception as e:
logging.error(
f"Произошла ошибка, инфоонмационное сообщение не отправлено. {e}",
exc_info=True,
)
@bot.message_handler(commands=["model"])
@bot.message_handler(commands=["lang"])
def help_message(message):
try:
bot.send_message(
message.chat.id,
"Бот понимает сообщения на многих языках,\nно пока не на всех\nВыберете язык\nBot can understand many languages\nChoose languages.",
)
keyboard = telebot.types.InlineKeyboardMarkup()
keyboard.row(
telebot.types.InlineKeyboardButton(
"Русский / Russian", callback_data="lang-rus"
)
)
keyboard.row(
telebot.types.InlineKeyboardButton(
"Английский / English", callback_data="lang-eng"
)
)
keyboard.row(
telebot.types.InlineKeyboardButton(
"Хинди / Hindi", callback_data="lang-hin"
)
)
bot.send_message(
message.chat.id,
"Выберите язык / Choose the language:",
reply_markup=keyboard,
)
logging.info("Отправлено информационное сообщение о выборе языка")
except Exception as e:
logging.error(
f"Сообщение о выборе языка не было отправлено. Ошибка {e}", exc_info=True
)
@bot.callback_query_handler(func=lambda call: True)
def callback_inline(call):
# Если сообщение из чата с ботом
try:
if call.message:
if call.data == "lang-rus":
bot.edit_message_text(
chat_id=call.message.chat.id,
message_id=call.message.message_id,
text="Вы выбрали Русский язык сообщения",
)
logging.info("Выбран язык: русский")
elif call.data == "lang-eng":
bot.edit_message_text(
chat_id=call.message.chat.id,
message_id=call.message.message_id,
text="You've chose English message language",
)
logging.info("Выбран язык: английский")
elif call.data == "lang-hin":
bot.edit_message_text(
chat_id=call.message.chat.id,
message_id=call.message.message_id,
text="आपने अंग्रेजी संदेश भाषा चुनी है",
)
logging.info("Выбран язык: хинди")
else:
bot.edit_message_text(
chat_id=call.message.chat.id,
message_id=call.message.message_id,
text="Я не знаю такой язык",
)
logging.warning("Неизвестный язык")
except Exception as e:
logging.error(f"Произошла неизвестная ошибка: {e}", exc_info=True)
@bot.message_handler(
content_types=[
"audio",
"photo",
"document",
"text",
"location",
"contact",
"sticker",
]
)
def exceptions(message):
try:
bot.send_message(
message.from_user.id,
"Ничего не понятно, но очень интересно!😳\nПопробуйте команду /help😳\n\n"
"Nothing is clear, but it is very interesting!😳 \nTry the /help command😳",
)
logging.warning("Не удалось что-либо распознать")
except Exception as e:
logging.error("Неизвестная ошибка: {e}", exc_info=True)
@bot.message_handler(content_types=["voice", "video", "video_note"])
def get_media_messages(message):
bot.send_message(message.from_user.id, "Started recognition...")
try:
bot.send_message(message.from_user.id, "Continue recognition...")
logging.info("Отправили сообщение о процессе распознавания")
if message.content_type == "voice":
file_id = message.voice.file_id
logging.info("Распознаём аудио сообщение")
elif message.content_type == "video_note":
file_id = message.video_note.file_id
logging.info("Распознаем видеео сообщение")
elif message.content_type == "video":
file_id = message.video.file_id
logging.info("Распоознаем видео сообщние")
else:
bot.send_message(message.from_user.id, "Такой формат я не знаю😳")
logging.error(
f"Не удалось распознать сообщение, неверный формат {message.content_type}"
)
return
try:
file_info = bot.get_file(file_id)
path = file_info.file_path
fname = os.path.basename(path)
doc = requests.get(
"https://api.telegram.org/file/bot{0}/{1}".format(
token, file_info.file_path
)
)
with open(fname, "wb") as f:
f.write(doc.content)
logging.info("Файл для распознавания успешно открыт")
except Exception as e:
logging.critical(f"Не удалось открыть файл. Ошибка {e}", exc_info=True)
try:
subprocess.run(["ffmpeg", "-i", fname, fname[:-4] + ".wav"], check=True)
logging.info("Конвертация произошла успешно")
except subprocess.CalledProcessError as e:
bot.send_message(
message.from_user.id, "c конвертацией файла что-то пошло не так... 😣"
)
os.remove(fname)
logging.critical(f"Ошибка в конвертации {e}", exc_info=True)
return
try:
model = whisper.load_model("small")
bot.send_message(message.from_user.id, "Model loaded")
logging.info("Модель успешно загружена")
except Exception as e:
logging.critical(f"Модель не загружена. Ошибка: {e}", exc_info=True)
try:
result = model.transcribe(
fname[:-4] + ".wav", fp16=False
) # распознаем аудио и переводим в текст
logging.info("Распознали аудио и перевели его в текст")
except Exception as e:
bot.send_message(
message.from_user.id, "Что-то пошло не так c распознованием😣"
)
os.remove(fname)
os.remove(fname[:-4] + ".wav")
logging.critical(
f"Не удалось перевести аудио в текст. Ошибка: {e}", exc_info=True
)
return
bot.send_message(message.from_user.id, "Finish recognition...")
if result["text"] == "":
bot.send_message(message.from_user.id, "Ничего не удалось распознать 😣")
logging.warning("Не удалось распознаттть текст")
else:
bot.send_message(message.from_user.id, result["text"])
logging.info("Сообщение распознано и переведенов текст")
except Exception as e:
bot.send_message(
message.from_user.id,
"Что-то пошло не так, но наши смелые инженеры уже трудятся над решением... 😣 \n"
"Something went wrong, but our brave engineers are already working on a solution... 😣",
)
logging.critical(f"Скрипт не отработал. Ошибка {e}", exc_info=True)
finally:
os.remove(fname)
os.remove(fname[:-4] + ".wav")
logging.info("Закончили выполнение скрипта")
bot.polling(none_stop=True, interval=0)