Download app.py from KateProxa/TG_bot: direct link, hf CLI and curl.
- Browser
- Download file 11 kB
-
https://huggingface.co/spaces/KateProxa/TG_bot/resolve/main/app.py
- Command line
-
hf download hf://spaces/KateProxa/TG_bot/app.py
-
curl -L -o app.py https://huggingface.co/spaces/KateProxa/TG_bot/resolve/main/app.py
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) | |
| 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 | |
| ) | |
| 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, | |
| ) | |
| 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 | |
| ) | |
| 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) | |
| 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) | |
| 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) | |