Прежде чем перейти к статье, хочу вам представить, экономическую онлайн игру Brave Knights, в которой вы можете играть и зарабатывать. Регистируйтесь, играйте и зарабатывайте!
Добрый день, думаю у каждого найдутся люди которые на сообщение с просьбой писать текстом отвечают голосовыми. В очередной раз получив голосовые я начал думать как же все-таки решить проблему, и в голову пришла простая идея, создать бота, который будет голосовое преобразовать в текст.
Так как задачу надо было решить максимально быстро в качестве языка программирования был выбран 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
Если все сделано правильно, то в вашей группе бот должен преобразовать голосовые которых он отмечен: