From de5a86a133340661a6ed475c2caa75621042e290 Mon Sep 17 00:00:00 2001
From: Egor Deev <67710823+IGlek@users.noreply.github.com>
Date: Thu, 19 Oct 2023 13:24:47 +0300
Subject: [PATCH] v. 2.2
---
code/bot.py | 96 +++++++++++++++++++++++++++++++++++++++++++++++++++--
1 file changed, 93 insertions(+), 3 deletions(-)
diff --git a/code/bot.py b/code/bot.py
index 5125fc3..6598e98 100644
--- a/code/bot.py
+++ b/code/bot.py
@@ -1,5 +1,7 @@
import logging, random, pymorphy2, requests
import asyncio, base, re, os, enchant, sql
+import speech_recognition as sr
+import soundfile as sf
from gtts import gTTS
from script import checker, translator, notice, lang_form, revers, upd_stat
@@ -98,7 +100,7 @@ async def helps(message: types.Message):
async def author(call: types.CallbackQuery):
await call.message.answer(text='*| АВТОР |*\n\n*>>* Этот бот, как бы это не печально звучало, но одна из лучших'
' моих работ и если кого-нибудь у меня получится действительно достойный продукт,'
- ' вы сможете о нём узнать в моём телеграм канале *@itsproger*', parse_mode=types.ParseMode.MARKDOWN)
+ ' вы сможете о нём узнать в моём телеграм канале *@programium*', parse_mode=types.ParseMode.MARKDOWN)
@dp.callback_query_handler(text="fun")
@@ -112,6 +114,7 @@ async def function(call: types.CallbackQuery):
@dp.callback_query_handler(text="com")
async def commands(call: types.CallbackQuery):
await call.message.answer(text='| КОМАНДЫ |\n\n/all - упомянуть всех в чате\n/help - полный список функций\n'
+ '/recognize - транскрипция отмеченного голосового сообщения в текст\n'
'/stat_group - полная статистика группы\n/stat_user - полная статистика '
'отправителя\n/edit и /back_edit - первая команда даёт возможность '
'сменить имя для упоминаний на любое слово, а вторая для возврата динамического '
@@ -145,6 +148,50 @@ async def every(message: types.Message):
await message.reply('Эта команда предназначена для вызова в чате!')
+@dp.message_handler(commands=["recognize"])
+async def recognise(message: types.Message):
+ user_id = du.get_user_id(message.from_user.id)
+
+ if "reply_to_message" in message:
+ if "voice" in message.reply_to_message:
+
+ num = random.randint(1000, 9999)
+ audio = f"../data/voices/{user_id}_{num}.oga"
+
+ file_id = message.reply_to_message.voice.file_id
+ file = await bot.get_file(file_id)
+ file_path = file.file_path
+ await bot.download_file(file_path, audio)
+
+ data, samplerate = sf.read(audio)
+ os.remove(audio)
+ audio = f"../data/voices/{user_id}_{num}.wav"
+ sf.write(audio, data, samplerate)
+
+ af = sr.AudioFile(audio)
+ r = sr.Recognizer()
+ with af as source:
+ r.pause_threshold = 100
+ source = r.listen(source)
+
+ try:
+ mes = await bot.send_message(chat_id=message.chat.id, text=f"Распознавание.....",
+ parse_mode=types.ParseMode.MARKDOWN, reply_to_message_id=message.reply_to_message.message_id)
+ try:
+ query = r.recognize_google(source, language='ru-RU')
+ os.remove(audio)
+ await mes.edit_text(f'*{message.reply_to_message.from_user.first_name} сказал(a)* "{query}"', types.ParseMode.MARKDOWN)
+ except Exception as e:
+ try: os.remove(audio)
+ except Exception as e: pass
+
+ await mes.edit_text("Распознать сообщение не удалось!", types.ParseMode.MARKDOWN)
+ except Exception as e:
+ print(repr(e))
+ pass
+ return
+
+
@dp.message_handler(commands=['stat_group'])
async def stat_group(message: types.Message):
if message.chat.id < 0:
@@ -294,6 +341,49 @@ async def media(message: types.Message):
async def voice(message: types.Message):
if message.chat.id < 0: upd_stat(message.from_user.id, message.chat.id, 7, message.from_user.first_name, True)
+ if "voice" in message and message.chat.id < 0:
+ if message.voice.duration <= 60:
+ user_id = du.get_user_id(message.from_user.id)
+
+ num = random.randint(1000, 9999)
+ audio = f"../data/voices/{user_id}_{num}.oga"
+
+ file_id = message.voice.file_id
+ file = await bot.get_file(file_id)
+ file_path = file.file_path
+ await bot.download_file(file_path, audio)
+
+ data, samplerate = sf.read(audio)
+ os.remove(audio)
+ audio = f"../data/voices/{user_id}_{num}.wav"
+ sf.write(audio, data, samplerate)
+
+ af = sr.AudioFile(audio)
+ r = sr.Recognizer()
+ with af as source:
+ r.pause_threshold = 100
+ source = r.listen(source)
+
+ try:
+ query = r.recognize_google(source, language='ru-RU')
+ os.remove(audio)
+
+ # ПЕРЕМЕННЫЕ
+ group_id = message.chat.id
+ unsigned = re.sub(r'[^\w\s]', '', query.lower()).split() # СПИСОК СЛОВ БЕЗ ПУНКТУАЦИИ
+ first_form = [morph.parse(i)[0].normal_form for i in unsigned] # СПИСОК СЛОВ В ПЕРВОЙ ФОРМЕ
+ names = [_ for _ in first_form if _ in list(map(lambda x: x[0], dg.all_names(du.get_group_id(group_id))))]
+
+ if names:
+ await message.reply(notice(names, False, du.get_group_id(group_id), message.from_user.id), types.ParseMode.HTML)
+ return
+
+ except Exception as e:
+ try: os.remove(audio)
+ except Exception as e: pass
+
+ return
+
@dp.message_handler(content_types=['sticker'])
async def stick(message: types.Message):
@@ -401,7 +491,7 @@ async def send_events(message: types.Message):
try:
await message.reply(notice(names, False, du.get_group_id(group_id), user_id), types.ParseMode.HTML)
except Exception as e:
- return
+ pass
"""
await bot.send_message(chat_id=base.TEX_GROUP, text=f"[ {str(dt.now())[:-10]} ] "
f"=> {repr(e)} (уведомления по именам)",
@@ -411,7 +501,7 @@ async def send_events(message: types.Message):
# ПЕРЕВОДЧИК СЛОВ
if checker([i for i in low_mes], words, group_id, user_id, name.lower()) == len(low_mes) and \
- not any([engl_dict.check(i) for i in unsigned]):
+ not any([engl_dict.check(i) for i in unsigned if len(i) > 1]):
await message.reply(f"[{message.from_user.first_name}](tg://user_id?id={user_id}) *>* {translator(words)}",
types.ParseMode.MARKDOWN)
return