Перейти к основному содержимому

Телеграм бот для транскрибации голосовых сообщений с n8n и нодами Yandex Cloud

· 4 мин. чтения

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

к сведению

Для этого примера я использовал ноды версии 0.3.1, которые вы можете установить из пакета @nikolaymatrosov/n8n-nodes-yc.

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

Первый шаг - создание бота в Telegram

  1. До этого я тестировал пакет локально, но для работы с Telegram мне понадобился публичный URL, так как триггер Telegram в n8n использует вебхуки для получения сообщений. Для этого я развернул n8n на своем сервере в Yandex Cloud, используя COI и рецепт из предыдущего поста про доставку сертификатов.

  2. Затем я создал бота в Telegram, используя @BotFather. Он сгенерировал токен для моего бота, который я сохранил для использования в n8n.

  3. В настройках Credentials я создал новые учетные данные для Telegram, используя токен, полученный от @BotFather.

  1. Создал новый рабочий процесс в n8n и добавил триггер Telegram. Выбрал созданные учетные данные и настроил триггер на получение сообщений типа Message.

  1. Протестировал триггер, отправив сообщение боту, и убедился, что n8n получил сообщение.

Второй шаг - добавление нод Yandex Cloud для транскрибации

  1. Так как нода для Yandex Speech-to-Text использует асинхронный API для транскрибации, то первым делом нам нужно загрузить файл голосового сообщения в Yandex Cloud Object Storage. Для этого добавим ноды для этого.

  2. Добавил ноду Get File для получения файла голосового сообщения из Telegram. В настройках указал File ID, который приходит в сообщении от Telegram.

  1. Затем добавил ноду Upload an Object, выбрал созданные ранее учетные данные Yandex Cloud и настроил загрузку файла в бакет Object Storage. В качестве Object Key указал уникальное имя файла, используя {{ $json.result.file_unique_id }}. Также указал Content Type как {{ $json.result.mime_type }}.

Третий шаг - транскрибация голосового сообщения

  1. После загрузки файла, добавил ноду Yandex Cloud SpeechKit STT c опцией Start audio recognition для начала процесса транскрибации. В настройках указал ссылку на загруженный файл в Object Storage в формате https://storage.yandexcloud.net/{{$json.bucket}}/{{$json.key}}.

И тут я понял, что мне как пользователю не хотелось бы каждый раз вручную составлять этот URL из бакета и ключа. Поэтому я добавил в ноду Upload an Object возможность возвращать полный URL загруженного объекта в выходных данных ноды. Теперь я могу просто использовать {{ $json.objectUrl }}.

к сведению

Если и у вас есть идеи по улучшению нод, вы можете создать issue или PR в репозитории нод

Дальше я хотел динамически передавать MIME тип аудио файла, но столкнулся с проблемой, Telegram возвращает MIME тип в формате audio/ogg, а SpeechKit нода ожидала данные в том же формате, что и API. В итоге я добавил в ноду SpeechKit возможность автоматически конвертировать MIME типы в формат, который понимает API.

  1. Теперь пришло время получить результат транскрибации. Для этого будем использовать ноду Yandex Cloud SpeechKit STT с опцией Get recognition result. В настройках укажем Operation ID, который возвращается из предыдущей ноды.

Зачем это сделано отдельной нодой? Потому что асинхронная транскрибация может принимать файлы большого размера, а транскрибация одной минуты аудио может занимать 10 секунд. Таким образом, загружая длиннные аудио файлы, вы можете оценить время ожидания и отложить получение результата на потом. Так же это позволяет развязать процесс загрузки и транскрибации от получения результата. Вы можете сохранять Operation ID в базу данных и проверять статус транскрибации позже.

Четвертый шаг - отправка результата обратно в Telegram

  1. Наконец, добавил ноду Send Message для отправки результата транскрибации обратно пользователю в Telegram.

  2. В настройках указал Chat ID, из которого пришло голосовое сообщение, и в поле Text указал результат транскрибации {{ $json.finalResults[0].alternatives[0].text }}.

  1. Сохранил и активировал рабочий процесс.

Теперь, когда я отправляю голосовое сообщение боту в Telegram, n8n автоматически загружает его в Yandex Cloud, транскрибирует и отправляет текст обратно в чат.