This commit is contained in:
Egor Deev 2023-10-19 13:24:47 +03:00 committed by GitHub
parent ba5aa85800
commit de5a86a133
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23

View file

@ -1,5 +1,7 @@
import logging, random, pymorphy2, requests import logging, random, pymorphy2, requests
import asyncio, base, re, os, enchant, sql import asyncio, base, re, os, enchant, sql
import speech_recognition as sr
import soundfile as sf
from gtts import gTTS from gtts import gTTS
from script import checker, translator, notice, lang_form, revers, upd_stat 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): async def author(call: types.CallbackQuery):
await call.message.answer(text='*| АВТОР |*\n\n*>>* Этот бот, как бы это не печально звучало, но одна из лучших' 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") @dp.callback_query_handler(text="fun")
@ -112,6 +114,7 @@ async def function(call: types.CallbackQuery):
@dp.callback_query_handler(text="com") @dp.callback_query_handler(text="com")
async def commands(call: types.CallbackQuery): async def commands(call: types.CallbackQuery):
await call.message.answer(text='<b>| КОМАНДЫ |</b>\n\n/all - упомянуть всех в чате\n/help - полный список функций\n' await call.message.answer(text='<b>| КОМАНДЫ |</b>\n\n/all - упомянуть всех в чате\n/help - полный список функций\n'
'/recognize - транскрипция отмеченного голосового сообщения в текст\n'
'/stat_group - полная статистика группы\n/stat_user - полная статистика ' '/stat_group - полная статистика группы\n/stat_user - полная статистика '
'отправителя\n/edit и /back_edit - первая команда даёт возможность ' 'отправителя\n/edit и /back_edit - первая команда даёт возможность '
'сменить имя для упоминаний на любое слово, а вторая для возврата динамического ' 'сменить имя для упоминаний на любое слово, а вторая для возврата динамического '
@ -145,6 +148,50 @@ async def every(message: types.Message):
await message.reply('Эта команда предназначена для вызова в чате!') 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']) @dp.message_handler(commands=['stat_group'])
async def stat_group(message: types.Message): async def stat_group(message: types.Message):
if message.chat.id < 0: if message.chat.id < 0:
@ -294,6 +341,49 @@ async def media(message: types.Message):
async def voice(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 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']) @dp.message_handler(content_types=['sticker'])
async def stick(message: types.Message): async def stick(message: types.Message):
@ -401,7 +491,7 @@ async def send_events(message: types.Message):
try: try:
await message.reply(notice(names, False, du.get_group_id(group_id), user_id), types.ParseMode.HTML) await message.reply(notice(names, False, du.get_group_id(group_id), user_id), types.ParseMode.HTML)
except Exception as e: except Exception as e:
return pass
""" """
await bot.send_message(chat_id=base.TEX_GROUP, text=f"<b>[ {str(dt.now())[:-10]} ]</b> " await bot.send_message(chat_id=base.TEX_GROUP, text=f"<b>[ {str(dt.now())[:-10]} ]</b> "
f"<b><i>=></i></b> <i>{repr(e)}</i> (уведомления по именам)", f"<b><i>=></i></b> <i>{repr(e)}</i> (уведомления по именам)",
@ -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 \ 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)}", await message.reply(f"[{message.from_user.first_name}](tg://user_id?id={user_id}) *>* {translator(words)}",
types.ParseMode.MARKDOWN) types.ParseMode.MARKDOWN)
return return