python

Решаем проблему голосовых или создаем простого и полезного бота в Telegram

  • понедельник, 30 августа 2021 г. в 00:34:14
https://habr.com/ru/post/575158/
  • Python
  • *
  • API
  • *


Решаем проблему голосовых или создаем простого и полезного бота в Telegram

Python*API*
Из песочницы

Добрый день, думаю у каждого найдутся люди которые на сообщение с просьбой писать текстом отвечают голосовыми. В очередной раз получив голосовые я начал думать как же все-таки решить проблему, и в голову пришла простая идея, создать бота, который будет голосовое преобразовать в текст.

Так как задачу надо было решить максимально быстро в качестве языка программирования был выбран Python3 и несколько библиотек, которые упростили жизнь. Для работы с Telegram API был выбран pyTelegramBotAPI, а в качестве распознавания аудио в текст SpeechRecognition.

Создадим новую папку и откроем там терминал. Нам Нужно создать виртуальное окружение. Если у вас установлен virtualenv, то открываем терминал и вводим virualenv soundbot

Если нет вводим в терминал :

pip install virtualenv

Далее переходим в папку которая создалась то просто выбираем .cmd файл и кидаем его на окно терминала.

Далее по очереди выполняем установку двух модулей командами:

pip install SpeechRecognition
pip install pyTelegramBotAPI

Далее в любимом редакторе создаем главный файл бота с расширением .py В самом начале кода импортируем все библиотеки которые нам нужны.

import telebot
import uuid
import os 
import speech_recognition as sr

Модуль telebot нужен для создания Telegram ботов на Python3. Модуль uuid является встроенным в Python3 и используется в данном случае для генерации случайного имени файла. Модуль os используется для запуска конвертации файлов из .ogg в .wav и модуль speech_recognition распознает голос и выдает текст на выходе. Давайте сейчас создадим переменные и инициализируем распознавание голоса в текст и создадим объект бота;

language='ru_RU' 
TOKEN='xxxxxxxxxxxxxxxxxxxxxxxx' 
CHAT_ID='-100xxxxxxxxxxxxxxxxxxxxx')
bot = telebot.TeleBot(TOKEN)
 r = sr.Recognizer() 

Здесь объявлены самые главные переменные, language это переменная языка и отвечает за язык распознавания. Токен это токен бота который надо получить. Для этого открываем Telegram и ищем там @BotFather. Начинаем беседу с команды /new_bot и отвечаем на все вопросы бота. В самом последнем сообщении будет как раз токен который нам нужен. Дальше надо нам получить chat id. Самый способ это добавить @getitraw в группу в Telegram и через несколько секунд получить нужный параметр в сообщении.

def recognise(filename):
    with sr.AudioFile(filename) as source:
        audio_text = r.listen(source)
        try:
            text = r.recognize_google(audio_text,language=language)
            print('Converting audio transcripts into text ...')
            print(text)
            return text
        except:
            print('Sorry.. run again...')
            return "Sorry.. run again..."

В начале мы открываем наш аудиофайл, далее передаем это в r.recognize_google()
которая преобразует это в текст. Однако так как запись может быть низкого качества или просто файл может быть поврежден, Это будет означать что код может выдать исключение и как раз для вылавливания исключения здесь применен блок try/catch. А также обязательно в случае исключения выводится какое-то сообщение, так как мы получим ошибку если попытаемся отправить пустое сообщение.

Вот мы и добрались до основной функции бота которая срабатывает если есть кто-то отметивший бота и при этом сообщение является голосовым.

@bot.message_handler(content_types=['voice'])
def voice_processing(message):
    filename = str(uuid.uuid4())
    file_name_full="./voice/"+filename+".ogg"
    file_name_full_converted="./ready/"+filename+".wav"
    downloaded_file = bot.download_file(file_info.file_path)
    with open(file_name_full, 'wb') as new_file:
        new_file.write(downloaded_file)
    os.system("ffmpeg -i "+file_name_full+"  "+file_name_full_converted)
    text=recognise(file_name_full_converted)
    bot.reply_to(message, text)
    os.remove(file_name_full)
    os.remove(file_name_full_converted)

Стоит обратить ваше внимание еще раз на то что данная функция срабатывает только если есть упоминание бота, и содержит голосовое сообщение. В самом начале мы создаем уникальное имя файла и сохраняем его в переменную. Далее мы создаем путь где будет храниться сам файл, то есть к имени файла добавляем папку где оно будет храниться. Далее создаем имя, но уже сконвертированного в нормальный формат который понятен распознавался текста. Далее вы скачиваем файл и сохраняем по недавно сгенерированному пути. Следующем шагом вы вызываем ffmpeg из консоли* и передаем ему два параметра file_name_full это где лежит исходный файл, а также file_name_full_converted это уже куда сохранить конвертированный файл. После этого вызываем функцию recognise() которая преобразует наше аудио в текст. И остается дело за малым ответить на сообщение при помощи функции .reply_to() и удалить оба аудио-файла.

Поздравляю мы почти уже у цели. Осталось запустить бота при запуске нашего файла. Для этого в конце нашего файла напишем: bot.polling()

Все можем сохранить файл и запустить его из консоли командой python3 вашеимяфайла.py

Если все сделано правильно, то в вашей группе бот должен преобразовать голосовые которых он отмечен:

Теги:telegramtelegrambotголосовые сообщениятекст
Хабы: Python API
Всего голосов 4: ↑3 и ↓1+2
Комментарии 3