Телеграм бот для транскрибации голосовых сообщений с n8n и нодами Yandex Cloud
Написав ноды для n8n для интеграции с Облаком, я решил проверить на сколько их удобно использовать, и сделал телеграм бота для транскрибации голосовых сообщений.
Для этого примера я использовал ноды версии 0.3.1, которые вы можете установить из пакета @nikolaymatrosov/n8n-nodes-yc.
Если вы пробуете выполнить этот пример и вы видите другой набор нод или отличающиеся настройки, имейте в виду, актуальна версия нод может отличаться от той, что использовалась в этом примере.
Первый шаг - создание бота в Telegram
-
До этого я тестировал пакет локально, но для работы с Telegram мне понадобился публичный URL, так как триггер Telegram в n8n использует вебхуки для получения сообщений. Для этого я развернул n8n на своем сервере в Yandex Cloud, используя COI и рецепт из предыдущего поста про доставку сертификатов.
-
Затем я создал бота в Telegram, используя
@BotFather. Он сгенерировал токен для моего бота, который я сохранил для использования в n8n. -
В настройках Credentials я создал новые учетные данные для Telegram, используя токен, полученный от
@BotFather.

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

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

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


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


Третий шаг - транскрибация голосового сообщения
- После загрузки файла, добавил ноду
Yandex Cloud SpeechKit STTc опцией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.

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

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

Четвертый шаг - отправка результата обратно в Telegram
-
Наконец, добавил ноду
Send Messageдля отправки результата транскрибации обратно пользователю в Telegram.
-
В настройках указал
Chat ID, из которого пришло голосовое сообщение, и в полеTextуказал результат транскрибации{{ $json.finalResults[0].alternatives[0].text }}.

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