import subprocess import speech_recognition as sr import os from functions.loging import loging import requests class Converter: """ Этот класс выполняет главную функцию, конвертирует голос в текст """ def __init__(self, path_to_file: str, message, model, language: str = "ru-RU"): self.language = language self.path_to_file = path_to_file self.service = None self.message = message self.model = model def audio_to_text(self) -> str: """ Основная функция :return: str - текст + служебная информация """ # f = -1.0 try: r = requests.get("http://192.168.0.108:5000/ping") if r.status_code == 200: response = requests.post("http://192.168.0.108:5000/decrypt_audio", files={"file": open(self.path_to_file, "rb").read()}) if response.status_code == 200: return f"От компа:\n{response.text.replace('"', '')}" else: return 'Не удалось получить текст.' else: result = self.model.transcribe(self.path_to_file) return result["text"] # try: # import mutagen # f = mutagen.File(self.path_to_file) # получение данных mutagen # f = float(f.info.length) # if f >= 30.0: # если длинна больше 30 секунд # self.service = "google" # устанавливаю сервис google # return self.google(f) # запуск функции google # else: # self.service = "yandex" # устанавливаем сервис yandex # return self.yandex(f) # запуск функции yandex # except Exception as e: # если какая-то проблема # print(e) # return self.google(f) # запуск функции google except sr.RequestError: # обработка ошибки размера файлов return "Толи файл слишком большой, толи с ботом что-то случилось" # возвращение ошибки def google(self, f) -> 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") # замена в ссылке на файл 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, f) # записываю логи os.remove(wav_file) # удаляю лишние файлы return response # возвращаю текст except sr.UnknownValueError: # ошибка распознавания текста return "google\n\n Слова не распознаны, вы что вообще мне впихнуть пытаетесь" # возвращаю ошибочное # сообщение except FileNotFoundError: # ошибка файла(из-за веса telegram не пускает) return "Толи файл слишком большой, толи с ботом что-то случилось" # возвращение ошибки def yandex(self, f) -> str: """ Функция работающая с 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, f) # записываю логи os.remove(self.path_to_file) # удаляю лишние файлы return response # возвращаю ответ