@noname_pythonovskiy

Как вызвать функцию, чтобы код (бот) продолжал работу?

import soundfile, os
import speech_recognition as sr

from aiogram import Bot, Dispatcher, executor, md, types
from aiogram.contrib.fsm_storage.memory import MemoryStorage
from aiogram.dispatcher import FSMContext
from aiogram.dispatcher.filters.state import State, StatesGroup

from config import TOKEN

bot = Bot(TOKEN parse_mode='HTML')
dp = Dispatcher(bot, storage=MemoryStorage())

@dp.message_handler(content_types=['audio', 'voice', 'video_note'])
async def speech(message: types.Message):
	filename = f'{message.chat.id}_{message.message_id}.wav'

	if message.audio:await message.audio.download(filename)
	if message.voice:await message.voice.download(filename)
	if message.video_note:await message.video_note.download(filename)

	data, samplerate = soundfile.read(filename)
	soundfile.write(filename, data, samplerate, subtype='PCM_16')

	r = sr.Recognizer()
	with sr.AudioFile(filename) as source:
		audio = r.record(source)

	command = r.recognize_google(audio, language='ru-RU')

	await message.reply(command)
	os.remove(filename)

executor.start_polling(dp, skip_updates=False)


Всё работает, но во время работы функции
r.recognize_google(audio, language='ru-RU')
бот перестает отвечать на другие сообщения, ждет окончание этой функции. Как можно ее запустить, чтобы бот продолжал работать?
  • Вопрос задан
  • 163 просмотра
Решения вопроса 1
Vindicar
@Vindicar
RTFM!
Загони код распознвания речи в отдельный поток с помощью asyncio.get_event_loop().run_in_executor()
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
@codingoleg
Пример работы на aiogram 2.25. После нажатия /long_task можно нажимать как /start, так и /long_task (запустится еще одна корутина). Также в параметрах executor.start_polling() есть loop, куда можно добавить задачи по крайней мере при старте бота, например, планировщик.
import asyncio
import os
from aiogram import Bot, Dispatcher
from aiogram.types import Message
from aiogram.utils import executor

bot = Bot(token=os.environ['token'])
dp = Dispatcher(bot)

async def long_task():
    for i in range(10):
        print(i)
        await asyncio.sleep(1)

@dp.message_handler(commands=['start'])
async def dp_start(message: Message):
    await message.answer('Test')

@dp.message_handler(commands=['long_task'])
async def run_long_task(message: Message):
    print('Старт')
    await long_task()  # Функция, которая долго исполняется
    print('Финиш')

if __name__ == '__main__':
    executor.start_polling(dp, skip_updates=True)
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы