# █ █ █ █▄▀ ▄▀█ █▀▄▀█ █▀█ █▀█ █ █ # █▀█ █ █ █ █▀█ █ ▀ █ █▄█ █▀▄ █▄█ # 🔒 Licensed under the GNU GPLv3 # 🌐 https://www.gnu.org/licenses/agpl-3.0.html # 👤 https://t.me/hikamoru # scope: ffmpeg # requires: pydub speechrecognition python-ffmpeg # meta developer: @hikamorumods # meta banner: https://github.com/AmoreForever/assets/blob/master/Speech.jpg?raw=true import os import logging import speech_recognition as sr from pydub import AudioSegment from .. import loader, utils logger = logging.getLogger(__name__) recognizer = sr.Recognizer() @loader.tds class SpeechMod(loader.Module): """Simple speech recognition module.""" strings = { "name": "Speech", "only_voice": "🚫 Reply to a voice message!", "downloading": "🔽 Downloading...", "recognizing": "👂 Recognizing...", "not_recognized": "🚫 Not recognized", "request_error": "🚫 Request error occured.\n{}", "recognized": "🚛 Recognized: {}", } strings_ru = { "only_voice": "🚫 Ответь на голосовое сообщение!", "downloading": "🔽 Загрузка...", "recognizing": "👂 Распознавание...", "not_recognized": "🚫 Не распознано", "request_error": "🚫 Произошла ошибка запроса.\n{}", "recognized": "🚛 Распознано: {}", } strings_uz = { "only_voice": "🚫 Ovozli xabarga javob bering!", "downloading": "🔽 Yuklanmoqda...", "recognizing": "👂 Eshitilmoqda...", "not_recognized": "🚫 Tanilmadi", "request_error": "🚫 So'rovda xatolik yuz berdi.\n{}", "recognized": "🚛 Text: {}", } def __init__(self): self.config = loader.ModuleConfig( loader.ConfigValue( "language", "ru-RU", lambda: "Language for recognition.", validator=loader.validators.RegExp(r"^[a-z]{2}-[A-Z]{2}$"), ), ) @loader.command() async def spech(self, message): """Recognize voice message. Usage: .spech """ reply = await message.get_reply_message() if not reply or not reply.voice: await utils.answer(message, self.strings("only_voice")) return await utils.answer(message, self.strings("downloading")) voice = await message.client.download_media(reply.voice) wav_voice = voice.replace(voice.split(".")[-1], "wav") ogg_audio = AudioSegment.from_ogg(voice) ogg_audio.export(wav_voice, format="wav") audio = sr.AudioFile(wav_voice) with audio as source: try: audio = recognizer.record(source) await utils.answer(message, self.strings("recognizing")) recognized = recognizer.recognize_google(audio, language=self.config["language"]) except sr.UnknownValueError: await utils.answer(message, self.strings("not_recognized")) return except sr.RequestError as e: await utils.answer(message, self.strings("request_error").format(e)) return await utils.answer(message, self.strings("recognized").format(recognized)) os.remove(voice) os.remove(wav_voice)