|
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)
|
|
|