TG_bot / TGBot.py
KateProxa's picture
Initial commit
0b41292 verified
raw
history blame
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)