Как мы сделали Telegram-бота для обмена стихотворениями путем голосового чтения

Всем привет! На связи Анна, и сегодня вы узнаете историю создания проекта «Поэтропия» и какие же функции можно будет увидеть в «Привет, поэт!».
В прошлом посте я рассказала о своем знакомстве с проектом, и что для меня в нем ценно. Прочитать его можно тут.

Для меня «Поэтропия» – это не чувствовать одиночество, не спешить, не читать по диагонали. Это про живого человека рядом, про умение замедлиться и услышать, что звучит в наушниках. Это про всех нас, про людей. Подробнее о проекте смотрите здесь.

Небольшие спойлеры!
Небольшие спойлеры!

Так что же такое эта загадочная Поэтропия?

Проект «Поэтропия» – это попытка найти баланс между бесконечным скроллингом и человечностью.

В рамках данного проекта под руководством Андрея Гунявина и Александра был создан Telegram-бот «Привет, поэт!», где вы можете:

  • Слушать живые чтения стихов (стихотворение писателей или собственного сочинения). Это помогает почувствовать рядом с собой не винтик в системе ИИ, а человека;
  • Оценивать не стройности слога и точности рифмы, а выразительность, эмоцию в голосе;
  • Делиться своими записями – даже если вы не поэт. Хотя мы считаем, что поэзия живет в каждом из нас!

Путь от идеи до работающего бота оказался сложнее, чем мы думали. Рассказываем как это сделано, и для чего.

Зачем наш Telegram-бот, если есть книги?

Мы верим, что поэзия – форма общения наших душ. Это не только текст, но и голос, вибрация. Стихотворения написаны, чтобы их произносили вслух, но в цифровую эпоху это почти исчезло. Разве что на уроках литературы в школе можно услышать родное «Мороз и солнце; день чудесный!».

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

Как работает «Привет, поэт»?

Механика бота проста и доступна всем:

  • Вы получаете случайное голосовое сообщение со стихом (из базы Yandex Cloud);
  • Оцениваете его с помощью понятной системы оценок и хэштегов (важна не правильность, а эмоция и дух);
  • После этого можете записать свое чтение (можно стихотворения авторов-классиков, так и собственного сочинения).
А вот и прекрасный помощник, в котором хранится ВСЁ: стихотворения, видео-отзывы, рейтинг.
А вот и прекрасный помощник, в котором хранится ВСЁ: стихотворения, видео-отзывы, рейтинг.

Техническая сторона:

  • Хранение аудио: Сначала думали о Google Drive, но выбрали Yandex Cloud (1 ТБ, быстрая загрузка, дешевле). Сейчас благодаря Yandex мы можем обработать около 10000 запросов;
  • Хранение и отправка видео-отзывов: Telegram → конвертация на нашем сервере (TimeWeb) → Yandex Cloud;
  • Хэштеги и метаданные: Хранятся отдельно, чтобы потом анализировать предпочтения пользователей. Атрибуты хэштегов позволяют отследить, когда был поставлен хэштег, кейс-контент и описание.
Сервис TimeWeb, для которого написали кастомный код. Он будет ниже)
Сервис TimeWeb, для которого написали кастомный код. Он будет ниже)

Проблемы, с которыми столкнулись.

  • Конвертация видео: Telegram отправляет их в своем формате, не принимаемом в Yandex Cloud. Написали кастомный код на собственном сервере в TimeWeb;
  • Способы оплаты: Не все международные сервисы по оплате доступны на территории РФ. Было принято решение создать 2 варианта подписок: для резидентов РФ, и других стран (сервис Stripe). Это позволит нам принимать способы оплаты из всех уголков планеты и объединить тысячи людей.

А вот и обещанный код.

В данном случае мы создали функцию сохранения видео.
В данном случае мы создали функцию сохранения видео.

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

‘async def save_video(user_id: int, message_id: int, data: dict, bot: Bot):’

Получаем путь к видео.

file_path = data.get("file_path")

Скачиваем файл с сервера telegram.

video_file = await bot.download_file(file_path)

Создаем временный файл.

async with aiofiles.tempfile.NamedTemporaryFile('wb', delete=False, suffix='.mp4') as tmp_file:
Цикл читает видео по 1мб, важно заметить, что tmp_file._file.name - небезопасный доступ к приватному полю, но в дальнейшем это будет исправлено 🙂
Цикл читает видео по 1мб, важно заметить, что tmp_file._file.name - небезопасный доступ к приватному полю, но в дальнейшем это будет исправлено 🙂

Формируем ключ для загрузки в s3 (объектно облачное хранилище).

s3_key = f"feedbacks/video_{user_id}_{message_id}.mp4"
Создаем асинхронный клиент s3 и загружаем видео на yandex cloud os.remove(tmp_path) - удаляем временный файл.
Создаем асинхронный клиент s3 и загружаем видео на yandex cloud os.remove(tmp_path) - удаляем временный файл.

Создаем путь к файлу в стиле s3, но не http-ссылка, а логический.

s3_url = f"s3://{YANDEX_VIDEOBACKET_NAME}/{s3_key}"

Сохраняем наш путь в бд.

await rq.set_feedback_video(tg_id=user_id, way_to_video=s3_url)

Планы на будущее.

  • «Рюкзачок стихотворений»: анализ оценок, полученных вами от других пользователей позволит узнать о себе больше. Мы отражаемся в других людях словно зеркала, и эта функция будет аккумулировать базу данных каждого пользователя;
  • Возврат к лекциям: Пока бот – первый шаг в мир технологий, но мы не забыли с чего начинался наш путь. Рассказ о нем будет позже, ведь всему свое время.

Поэзия – форма общения душ. «Привет, поэт!» – способ дать душе говорить.

Поддержите наш проект и попробуйте сами в Telegram: @Poetropy_bot. Первые два прослушивания бесплатны!

3
2 комментария