From 939b657bcad2288339e763c7d3f9b210c30a7aa0 Mon Sep 17 00:00:00 2001 From: Dmitrium12 Date: Sat, 17 Dec 2022 15:05:02 +0300 Subject: [PATCH] =?UTF-8?q?=D0=BF=D0=B5=D1=80=D0=B5=D1=88=D1=91=D0=BB=20?= =?UTF-8?q?=D0=BD=D0=B0=20aiogram,=20=D0=B4=D0=BE=D0=B1=D0=B0=D0=B2=D0=B8?= =?UTF-8?q?=D0=BB=20=D0=BA=D0=BE=D0=BC=D0=B5=D0=BD=D1=82=D1=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitignore | 2 +- Bot.py | 17 +++++----- functions/convert.py | 48 +++++++++++++++++----------- functions/get_audio_messages_func.py | 40 +++++++++++++---------- functions/loging.py | 27 ++++++++++++++-- 5 files changed, 89 insertions(+), 45 deletions(-) diff --git a/.gitignore b/.gitignore index 7ec251d..23566b0 100644 --- a/.gitignore +++ b/.gitignore @@ -28,7 +28,7 @@ share/python-wheels/ .installed.cfg *.egg MANIFEST - +.idea/ # PyInstaller # Usually these files are written by a python script from a template # before PyInstaller builds the exe, so as to inject date/other infos into it. diff --git a/Bot.py b/Bot.py index 54f3303..c9e65a9 100644 --- a/Bot.py +++ b/Bot.py @@ -1,24 +1,25 @@ +from aiogram.utils import executor from loguru import logger -import telebot -from telebot import types +from aiogram import Bot, Dispatcher, types from functions import get_audio_messages_func -bot = telebot.TeleBot("5941118321:AAG0g0keLrlnuH_9U9X6ehpFFAdOX38qeXI") +bot = Bot(token="5941118321:AAG0g0keLrlnuH_9U9X6ehpFFAdOX38qeXI") +dp = Dispatcher(bot) logger.add("logs/logging_log.log", level="INFO") -@bot.message_handler(commands=['start']) +@dp.message_handler(commands=['start']) def start(message: types.Message): name = message.chat.first_name if message.chat.first_name else 'No_name' logger.info(f"Группа {name} (ID: {message.chat.id}) запустил бота") bot.send_message(message.chat.id, 'Привет! Отправляй голосовое, я расшифрую!') -@bot.message_handler(content_types=['voice', 'video_note', 'video']) -def get_audio_messages(message: types.Message): - get_audio_messages_func.get_audio_messages_func(message, logger, bot) +@dp.message_handler(content_types=['voice', 'video_note', 'video']) +async def get_audio_messages(message: types.Message): + await get_audio_messages_func.get_audio_messages_func(message, logger, bot) def start_work_bot(): logger.info("Бот запустился") - bot.polling(none_stop=True, timeout=123) + executor.start_polling(dp, skip_updates=False) diff --git a/functions/convert.py b/functions/convert.py index 6592431..5f12165 100644 --- a/functions/convert.py +++ b/functions/convert.py @@ -12,27 +12,39 @@ class Converter: self.message = message def audio_to_text(self) -> str: - import mutagen - f = mutagen.File(self.path_to_file) - if float(f.info.length) >= 30.0: - self.service = "google" - return self.google() - else: - self.service = "yandex" - return self.yandex() + try: + try: + import mutagen + f = mutagen.File(self.path_to_file) + if float(f.info.length) >= 30.0: + self.service = "google" + return self.google() + else: + self.service = "yandex" + return self.yandex() + except: + return self.google() + except sr.RequestError: + return "Толи файл слишком большой, толи с ботом что-то случилось" def google(self) -> str: subprocess.run(['ffmpeg', '-v', 'quiet', '-i', self.path_to_file, self.path_to_file.replace(".ogg", ".wav")]) - os.remove(self.path_to_file) - wav_file = self.path_to_file.replace(".ogg", ".wav") - r = sr.Recognizer() - with sr.AudioFile(wav_file) as source: - audio = r.record(source) - r.adjust_for_ambient_noise(source) - response = "google\n\n" + r.recognize_google(audio, language=self.language) - loging(self.message, "google", wav_file, response) - os.remove(wav_file) - return response + try: + os.remove(self.path_to_file) + wav_file = self.path_to_file.replace(".ogg", ".wav") + r = sr.Recognizer() + with sr.AudioFile(wav_file) as source: + audio = r.record(source) + r.adjust_for_ambient_noise(source) + try: + response = "google\n\n" + r.recognize_google(audio, language=self.language) + loging(self.message, "google", wav_file, response) + os.remove(wav_file) + return response + except sr.UnknownValueError: + return "google\n\n Слова не распознаны, вы что вообще мне впихнуть пытаетесь" + except FileNotFoundError: + return "Толи файл слишком большой, толи с ботом что-то случилось" def yandex(self) -> str: from speechkit import ShortAudioRecognition, Session diff --git a/functions/get_audio_messages_func.py b/functions/get_audio_messages_func.py index a757be7..42fdb4d 100644 --- a/functions/get_audio_messages_func.py +++ b/functions/get_audio_messages_func.py @@ -1,8 +1,17 @@ +import os from functions.convert import Converter -from telebot import types +from aiogram import types -def get_audio_messages_func(message: types.Message, logger, bot): +async def get_audio_messages_func(message: types.Message, logger, bot) -> None: + """ + Функция выкачивает файл, потом конвертирует его в текст, потом логирует + + :param message: types.Message - объект сообщения + :param logger: - объект логера + :param bot: - объект бота + :return: None + """ # достаю file_id из разнообразных полей if message.content_type in ['voice']: file_id = message.voice.file_id @@ -10,17 +19,16 @@ def get_audio_messages_func(message: types.Message, logger, bot): file_id = message.video.file_id else: file_id = message.video_note.file_id - # создаю file_name - file_name = "config/" + str(message.message_id) + '.ogg' - # достаю имя человека - name = message.chat.first_name if message.chat.first_name else 'No_name' - # записываю в файл - with open(file_name, 'wb') as new_file: - new_file.write(bot.download_file(bot.get_file(file_id).file_path)) - # запуск конвертора - converter = Converter(file_name, message) - message_text = converter.audio_to_text() - # записываю всё в logger - logger.info(f"Чат {name} (ID: {message.chat.id}) обработал файл {file_name}, сервисом {converter.service}") - # отправляю сообщение - bot.send_message(message.chat.id, message_text, reply_to_message_id=message.message_id) + file_name = "config/" + str(message.message_id) + '.ogg' # создаю file_name + name = message.chat.first_name if message.chat.first_name else 'No_name' # достаю имя человека + with open(file_name, 'wb') as new_file: # открываю файл для записи + file = await bot.get_file(file_id) # ссылка для скачивая файла + file_dow = await bot.download_file(file.file_path) # скачанный файл + new_file.write(file_dow.getvalue()) # записываю + converter = Converter(file_name, message) # запуск конвертора + message_text = converter.audio_to_text() # получаю текст из конвертора + logger.info(f"Чат {name} (ID: {message.chat.id}) обработал файл {file_name}, " + f"сервисом {converter.service}") # записываю всё в logger + await bot.send_message(message.chat.id, message_text, reply_to_message_id=message.message_id) # отправляю сообщение + os.removedirs("config") # удаляю папку с файлами + os.mkdir("config") # создаю папку обратно diff --git a/functions/loging.py b/functions/loging.py index 6f707fb..6fa4733 100644 --- a/functions/loging.py +++ b/functions/loging.py @@ -1,2 +1,25 @@ -def loging(message, service, file_path, text): - print(message) +import os +import shutil +from aiogram import types + + +def loging(message: types.Message, service: str, file_path: str, text: str) -> None: + """ + Функция логирует каждое сообщение + + :param message: types.Message - объект сообщения + :param service: str - название сервиса для генерации + :param file_path: str - путь до файла + :param text: str - текст который был разобран + :return: None + """ + if not os.path.isdir(f"logs/{message.chat.id}"): # если папки нет + os.makedirs(f"logs/{message.chat.id}") # создаю папку + file_name = file_path.split("/")[-1].split(".") # достаю имя файла + try: # защита + os.makedirs(f"logs/{message.chat.id}/{file_name[0]}") # создание папки + except FileExistsError: + pass + shutil.copy(file_path, f"logs/{message.chat.id}/{file_name[0]}/audio.{file_name[1]}") # копирование файла + with open(f'logs/{message.chat.id}/{file_name[0]}/{service}-text.txt', 'w+') as the_file: # открываю файл в запись + the_file.write(text) # записываю