# █ █ █ █▄▀ ▄▀█ █▀▄▀█ █▀█ █▀█ █ █
# █▀█ █ █ █ █▀█ █ ▀ █ █▄█ █▀▄ █▄█
# 🔒 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)