From b99a826c05c2e83f9b9fb77d7538217c67b51ca6 Mon Sep 17 00:00:00 2001 From: Dmitrium12 Date: Sat, 24 Dec 2022 15:02:54 +0300 Subject: [PATCH] =?UTF-8?q?=D0=B4=D0=BE=D0=B1=D0=B0=D0=B2=D0=B8=D0=BB=20?= =?UTF-8?q?=D0=BA=D0=BE=D0=BC=D0=BC=D0=B5=D0=BD=D1=82=D1=8B=20=D0=B8=20?= =?UTF-8?q?=D1=83=D0=B1=D1=80=D0=B0=D0=BB=20=D1=81=D1=82=D0=B0=D0=BD=D0=B4?= =?UTF-8?q?=D0=B0=D1=80=D1=82=D0=BD=D1=8B=D0=B9=20=D0=BB=D0=BE=D0=B3=D0=B5?= =?UTF-8?q?=D1=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Bot.py | 25 +++++++------- functions/convert.py | 81 ++++++++++++++++++++++++++++---------------- 2 files changed, 64 insertions(+), 42 deletions(-) diff --git a/Bot.py b/Bot.py index c9e65a9..305cb3d 100644 --- a/Bot.py +++ b/Bot.py @@ -3,23 +3,24 @@ from loguru import logger from aiogram import Bot, Dispatcher, types from functions import get_audio_messages_func -bot = Bot(token="5941118321:AAG0g0keLrlnuH_9U9X6ehpFFAdOX38qeXI") -dp = Dispatcher(bot) -logger.add("logs/logging_log.log", level="INFO") +bot = Bot(token="5941118321:AAG0g0keLrlnuH_9U9X6ehpFFAdOX38qeXI") # создаю объект бота +dp = Dispatcher(bot) # создаю объект слушателя +logger.remove() # удаляю стандартный логер +logger.add("logs/logging_log.log", level="INFO") # создаю логер -@dp.message_handler(commands=['start']) +@dp.message_handler(commands=['start']) # обрабатываю команду 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, 'Привет! Отправляй голосовое, я расшифрую!') + 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, 'Привет! Отправляй голосовое, я расшифрую!') # отправляю ответное сообщение -@dp.message_handler(content_types=['voice', 'video_note', 'video']) +@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) + await get_audio_messages_func.get_audio_messages_func(message, logger, bot) # вызываю функцию -def start_work_bot(): - logger.info("Бот запустился") - executor.start_polling(dp, skip_updates=False) +def start_work_bot(): # функция запуска бота + logger.info("Бот запустился") # записываю логи + executor.start_polling(dp, skip_updates=False) # запускаю pooling без пропуска пропущенных сообщений diff --git a/functions/convert.py b/functions/convert.py index 5f12165..2c8f1fa 100644 --- a/functions/convert.py +++ b/functions/convert.py @@ -5,6 +5,9 @@ from functions.loging import loging class Converter: + """ + Этот класс выполняет главную функцию, конвертирует голос в текст + """ def __init__(self, path_to_file: str, message, language: str = "ru-RU"): self.language = language self.path_to_file = path_to_file @@ -12,44 +15,62 @@ class Converter: self.message = message def audio_to_text(self) -> str: + """ + Основная функция + + :return: str - текст + служебная информация + """ try: try: import mutagen - f = mutagen.File(self.path_to_file) - if float(f.info.length) >= 30.0: - self.service = "google" - return self.google() + f = mutagen.File(self.path_to_file) # получение данных mutagen + if float(f.info.length) >= 30.0: # если длинна больше 30 секунд + self.service = "google" # устанавливаю сервис google + return self.google() # запуск функции google else: - self.service = "yandex" - return self.yandex() - except: - return self.google() - except sr.RequestError: - return "Толи файл слишком большой, толи с ботом что-то случилось" + self.service = "yandex" # устанавливаем сервис yandex + return self.yandex() # запуск функции yandex + except: # если какая-то проблема + return self.google() # запуск функции google + except sr.RequestError: # обработка ошибки размера файлов + return "Толи файл слишком большой, толи с ботом что-то случилось" # возвращение ошибки def google(self) -> str: + """ + Функция работающая с stt google + + :return: str - текст + служебная информация + """ subprocess.run(['ffmpeg', '-v', 'quiet', '-i', self.path_to_file, self.path_to_file.replace(".ogg", ".wav")]) + # перевод ogg в wav 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) + os.remove(self.path_to_file) # удаляю файл + wav_file = self.path_to_file.replace(".ogg", ".wav") # замена в ссылке на файл ogg в wav + r = sr.Recognizer() # создаю объект google stt + with sr.AudioFile(wav_file) as source: # получаю байты из файла + audio = r.record(source) # получаю файл в нужном google stt формате байт + 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 "Толи файл слишком большой, толи с ботом что-то случилось" + 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: # ошибка файла(из-за веса telegram не пускает) + return "Толи файл слишком большой, толи с ботом что-то случилось" # возвращение ошибки def yandex(self) -> str: - from speechkit import ShortAudioRecognition, Session - reg = ShortAudioRecognition(Session.from_api_key("AQVN3xNJamAFP4_FS6Gis0Uud0vONFk24umBSXvh")) - response = "yandex\n\n" + reg.recognize(open(str(self.path_to_file), str('rb')).read()) - loging(self.message, "yandex", self.path_to_file, response) - os.remove(self.path_to_file) - return response + """ + Функция работающая с stt yandex + + :return: str - текст + служебная информация + """ + from speechkit import ShortAudioRecognition, Session # импортирую сесию и объект для stt + reg = ShortAudioRecognition(Session.from_api_key("AQVN3xNJamAFP4_FS6Gis0Uud0vONFk24umBSXvh")) # получаю + # объект для расшифровки + response = "yandex\n\n" + reg.recognize(open(str(self.path_to_file), str('rb')).read()) # получаю весь текст + loging(self.message, "yandex", self.path_to_file, response) # записываю логи + os.remove(self.path_to_file) # удаляю лишние файлы + return response # возвращаю ответ