Найти в Дзене
Записки сисадмина

Python. Telegram bot. Расшифровка голосовых сообщений и кружков.

Пишет мне как-то знакомая: «У меня есть куча коротких аудиозаписей, мне нужно перевести их в текст. Проблема в том, что они на английском, а я его плохо знаю. Поможешь?». Язык то я знаю, но стенографисткой работать не очень хочется. Начинаем искать решение и приходим к библиотеке speech_recognition. Напишем простенький скрипт: import speech_recognition as sr recognizer = sr.Recognizer() with sr.AudioFile('audio.wav') as source: audio_data = recognizer.record(source) text = recognizer.recognize_google(audio_data, language='en-GB') print(text) Мы создаем объект Recognizer(), заливаем в него аудиодорожку из файла и с помощью api google расшифровываем в текст. Все здорово, закидываем наш кусок кода в цикл, прогоняем по всем файлам, что нам прислали и отдаем результат. Все довольны и счастливы. Как вы относитесь к голосовым сообщениям? Как к технологическому прогрессу, или как к лени человека напечатать пару слов? А если вы сидите без наушников в публичном месте и не хотите,
Оглавление

Лирическое отступление

Пишет мне как-то знакомая: «У меня есть куча коротких аудиозаписей, мне нужно перевести их в текст. Проблема в том, что они на английском, а я его плохо знаю. Поможешь?». Язык то я знаю, но стенографисткой работать не очень хочется.

Начинаем искать решение и приходим к библиотеке speech_recognition.

Напишем простенький скрипт:

-2
import speech_recognition as sr
recognizer = sr.Recognizer()
with sr.AudioFile('audio.wav') as source:
audio_data = recognizer.record(source)
text = recognizer.recognize_google(audio_data, language='en-GB')
print(text)

Мы создаем объект Recognizer(), заливаем в него аудиодорожку из файла и с помощью api google расшифровываем в текст.

Все здорово, закидываем наш кусок кода в цикл, прогоняем по всем файлам, что нам прислали и отдаем результат. Все довольны и счастливы.

А теперь к телеграмм ботам

Как вы относитесь к голосовым сообщениям? Как к технологическому прогрессу, или как к лени человека напечатать пару слов? А если вы сидите без наушников в публичном месте и не хотите, чтобы голосовое услышал кто-то кроме вас?

«Купи себе телеграмм премиум и переводи голосовые в текст» - скажете вы. «Во мне еще остался дух авантюризма и тяги к исследованиям» - отвечу я.

  • Разбираемся в типах данных

У каждого сообщения в телеграмме есть тип, он же content_type. У обычного сообщения это 'text', у изображения - 'photo' и т.д. Нас же интересуют голосовые сообщения (voice) и кружочки (video_note). Напишем обработчики для таких сообщений:

-3

При получении сообщения с соответствующим типом контента, будет отрабатывать одна их функций.

В полученном сообщении нас интересует поле file_id (идентификатор файла на сервере телеграмма). Для voice и video_note местоположение этого поля будут немного отличаться.

-4

Напишем отдельную функцию, которая будет скачивать нам эти файлы

-5
def get_content(file_id):
file = bot.get_file(file_id)
file_path = file.file_path
downloaded_file = bot.download_file(file_path)
return downloaded_file

Важно: в переменной downloaded_file будет бинарный поток данных, который нужно сохранить в файл.

Однако, voice хранится в формате .ogg, а video_note - в формате .mp4

Немного перепишем нашу функцию, в нее мы сразу будем передавать имя файла.

-6

Теперь при получении кружочка, или голосового сообщения, наш бот будет сохранять его к себе на сервер.

Вспоминаем, что наш скрипт расшифровывает только файлы формата .wav, так что нам нужно изменить формат скачанных файлов. В этом нам поможет библиотека moviepy.

-7

Проверяем, что все отрабатывает, текст выводится. Выводим это в отдельную функцию и добавляем нашему боту.

-8

Модуль AudioFileClip отлично работает со всеми аудио и видео файлами (mp3, mp4, ogg, webm и т.д.)

На вывод функции мы отдаем полученный текст.

Добавляем вызов нашей функции в каждый обработчик и прописываем ответ пользователю:

-9

Запускаем и проверяем:

-10

Расшифровка немного сыровата, не добавляет знаки препинания. Возможно, после перехода на api google v2, это исправится.

Как обычно, код выложил здесь