Yandex Cloud
Поиск
Связаться с намиПодключиться
  • Документация
  • Блог
  • Все сервисы
  • Статус работы сервисов
    • Популярные
    • Инфраструктура и сеть
    • Платформа данных
    • Контейнеры
    • Инструменты разработчика
    • Бессерверные вычисления
    • Безопасность
    • Мониторинг и управление ресурсами
    • Машинное обучение
    • Бизнес-инструменты
  • Все решения
    • По отраслям
    • По типу задач
    • Экономика платформы
    • Безопасность
    • Техническая поддержка
    • Каталог партнёров
    • Обучение и сертификация
    • Облако для стартапов
    • Облако для крупного бизнеса
    • Центр технологий для общества
    • Облако для интеграторов
    • Поддержка IT-бизнеса
    • Облако для фрилансеров
    • Обучение и сертификация
    • Блог
    • Документация
    • Контент-программа
    • Мероприятия и вебинары
    • Контакты, чаты и сообщества
    • Идеи
    • Истории успеха
    • Тарифы Yandex Cloud
    • Промоакции и free tier
    • Правила тарификации
  • Документация
  • Блог
Проект Яндекса
© 2025 ООО «Яндекс.Облако»
Yandex API Gateway
  • Начало работы
    • Все практические руководства
    • Развертывание веб-приложения с использованием Java Servlet API
    • Разработка навыка Алисы и сайта с авторизацией
    • Разработка Slack-бота
    • Разработка Telegram-бота
    • Разработка Telegram-бота для распознавания текста и аудио
    • Разработка пользовательской интеграции
    • Разработка CRUD API для сервиса фильмов
    • Работа с API-шлюзом по протоколу WebSocket
    • Создание интерактивного serverless-приложения с использованием WebSocket
    • Построение пайплайна CI/CD в GitLab с использованием serverless-продуктов
    • Интерактивная отладка функций Cloud Functions
    • Развертывание веб-приложения с JWT-авторизацией в API Gateway и аутентификацией в Firebase
    • Канареечный релиз функции Cloud Functions
    • Использование API Gateway для настройки синтеза речи в Yandex SpeechKit
    • Запуск контейнерного приложения в Yandex Serverless Containers
    • Сокращатель ссылок
    • Ввод данных в системы хранения
    • Защита API Gateway при помощи Smart Web Security
  • Управление доступом
  • Правила тарификации
  • Справочник Terraform
  • Метрики Monitoring
  • Аудитные логи Audit Trails
  • История изменений
  • Вопросы и ответы
  • Обучающие курсы

В этой статье:

  • Перед началом работы
  • Необходимые платные ресурсы
  • Подготовьте ресурсы
  • Зарегистрируйте Telegram-бота
  • Создайте функцию
  • Создайте API-шлюз
  • Настройте связь между функцией и Telegram-ботом
  • Протестируйте бота
  • Как удалить созданные ресурсы
  1. Практические руководства
  2. Разработка Telegram-бота для распознавания текста и аудио

Разработка Telegram-бота для распознавания текста на изображениях, синтеза и распознавания аудио

Статья создана
Yandex Cloud
Обновлена 6 февраля 2025 г.
  • Перед началом работы
    • Необходимые платные ресурсы
  • Подготовьте ресурсы
  • Зарегистрируйте Telegram-бота
  • Создайте функцию
  • Создайте API-шлюз
  • Настройте связь между функцией и Telegram-ботом
  • Протестируйте бота
  • Как удалить созданные ресурсы

В этом руководстве вы создадите бота для Telegram, который умеет:

  • синтезировать речь из текста сообщения с помощью API v1 сервиса Yandex SpeechKit;
  • распознавать речь в голосовых сообщениях и преобразовывать ее в текст с помощью с помощью API синхронного распознавания сервиса Yandex SpeechKit;
  • распознавать текст на изображениях с помощью сервиса Yandex Vision OCR.

Запросы от бота будет принимать API-шлюз Yandex API Gateway и перенаправлять их функции Yandex Cloud Functions для обработки.

Чтобы создать бота:

  1. Подготовьте облако к работе.
  2. Подготовьте ресурсы.
  3. Зарегистрируйте Telegram-бота.
  4. Создайте функцию.
  5. Создайте API-шлюз.
  6. Свяжите функцию и бота.
  7. Протестируйте бота.

Если созданные ресурсы вам больше не нужны, удалите их.

Перед началом работыПеред началом работы

Зарегистрируйтесь в Yandex Cloud и создайте платежный аккаунт:

  1. Перейдите в консоль управления, затем войдите в Yandex Cloud или зарегистрируйтесь.
  2. На странице Yandex Cloud Billing убедитесь, что у вас подключен платежный аккаунт, и он находится в статусе ACTIVE или TRIAL_ACTIVE. Если платежного аккаунта нет, создайте его и привяжите к нему облако.

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

Подробнее об облаках и каталогах.

Необходимые платные ресурсыНеобходимые платные ресурсы

В стоимость поддержки Telegram-бота входят:

  • плата за использование SpeechKit (см. тарифы для SpeechKit);
  • плата за использование Vision OCR (см. тарифы для Vision OCR);
  • плата за количество вызовов функции, вычислительные ресурсы, выделенные для выполнения функции, и исходящий трафик (см. тарифы для Cloud Functions);
  • плата за количество запросов к созданному API-шлюзу и исходящий трафик (см. тарифы API Gateway).

Подготовьте ресурсыПодготовьте ресурсы

  1. Создайте сервисный аккаунт с именем recognizer-bot-sa и назначьте ему роли ai.editor, functions.editor на ваш каталог.

  2. Подготовьте ZIP-архив с кодом функции:

    1. Создайте файл index.py и добавьте в него указанный ниже код.

      index.py
      import logging
      import requests
      import telebot
      import json
      import os
      import base64
      
      # Эндпоинты сервисов и данные для аутентификации
      
      API_TOKEN = os.environ['TELEGRAM_TOKEN']
      vision_url = 'https://ocr.api.cloud.yandex.net/ocr/v1/recognizeText'
      speechkit_url = 'https://stt.api.cloud.yandex.net/speech/v1/stt:recognize'
      speechkit_synthesis_url = 'https://tts.api.cloud.yandex.net/speech/v1/tts:synthesize'
      folder_id = ""
      iam_token = ''
      
      logger = telebot.logger
      telebot.logger.setLevel(logging.INFO)
      bot = telebot.TeleBot(API_TOKEN, threaded=False)
      
      # Получение идентификатора каталога
      
      def get_folder_id(iam_token, version_id):
      
          headers = {'Authorization': f'Bearer {iam_token}'}
          function_id_req = requests.get(f'https://serverless-functions.api.cloud.yandex.net/functions/v1/versions/{version_id}',
                                         headers=headers)
          function_id_data = function_id_req.json()
          function_id = function_id_data['functionId']
          folder_id_req = requests.get(f'https://serverless-functions.api.cloud.yandex.net/functions/v1/functions/{function_id}',
                                       headers=headers)
          folder_id_data = folder_id_req.json()
          folder_id = folder_id_data['folderId']
          return folder_id
      
      def process_event(event):
      
          request_body_dict = json.loads(event['body'])
          update = telebot.types.Update.de_json(request_body_dict)
      
          bot.process_new_updates([update])
      
      def handler(event, context):
          global iam_token, folder_id
          iam_token = context.token["access_token"]
          version_id = context.function_version
          folder_id = get_folder_id(iam_token, version_id)
          process_event(event)
          return {
              'statusCode': 200
          }
      
      # Обработчики команд и сообщений
      
      @bot.message_handler(commands=['help', 'start'])
      def send_welcome(message):
          bot.reply_to(message,
                       "Бот умеет:\n*распознавать текст с картинок;\n* генерировать голосовые сообщения из текста;\n* переводить голосовые сообщения в текст.")
      
      @bot.message_handler(func=lambda message: True, content_types=['text'])
      def echo_message(message):
          global iam_token, folder_id
          with open('/tmp/audio.ogg', "wb") as f:
              for audio_content in synthesize(folder_id, iam_token, message.text):
                  f.write(audio_content)
          voice = open('/tmp/audio.ogg', 'rb')
          bot.send_voice(message.chat.id, voice)
      
      @bot.message_handler(func=lambda message: True, content_types=['voice'])
      def echo_audio(message):
          file_id = message.voice.file_id
          file_info = bot.get_file(file_id)
          downloaded_file = bot.download_file(file_info.file_path)
          response_text = audio_analyze(speechkit_url, iam_token, folder_id, downloaded_file)
          bot.reply_to(message, response_text)
      
      @bot.message_handler(func=lambda message: True, content_types=['photo'])
      def echo_photo(message):
          file_id = message.photo[-1].file_id
          file_info = bot.get_file(file_id)
          downloaded_file = bot.download_file(file_info.file_path)
          image_data = base64.b64encode(downloaded_file).decode('utf-8')
          response_text = image_analyze(vision_url, iam_token, folder_id, image_data)
          bot.reply_to(message, response_text)
      
      # Распознавание изображения
      
      def image_analyze(vision_url, iam_token, folder_id, image_data):
          response = requests.post(vision_url, headers={'Authorization': 'Bearer '+iam_token, 'x-folder-id': folder_id}, json={
              "mimeType": "image",
              "languageCodes": ["en", "ru"],
              "model": "page",
              "content": image_data
              })
          blocks = response.json()['result']['textAnnotation']['blocks']
          text = ''
          for block in blocks:
              for line in block['lines']:
                  for word in line['words']:
                      text += word['text'] + ' '
                  text += '\n'
          return text
      
      # Распознавание речи
      
      def audio_analyze(speechkit_url, iam_token, folder_id, audio_data):
          headers = {'Authorization': f'Bearer {iam_token}'}
          params = {
              "topic": "general",
              "folderId": f"{folder_id}",
              "lang": "ru-RU"}
      
          audio_request = requests.post(speechkit_url, params=params, headers=headers, data=audio_data)
          responseData = audio_request.json()
          response = 'error'
          if responseData.get("error_code") is None:
              response = (responseData.get("result"))
          return response
      
      # Синтез речи
      
      def synthesize(folder_id, iam_token, text):
         headers = {
             'Authorization': 'Bearer ' + iam_token,
         }
      
         data = {
             'text': text,
             'lang': 'ru-RU',
             'voice': 'filipp',
             'folderId': folder_id
         }
      
         with requests.post(speechkit_synthesis_url, headers=headers, data=data, stream=True) as resp:
             if resp.status_code != 200:
                 raise RuntimeError("Invalid response received: code: %d, message: %s" % (resp.status_code, resp.text))
      
             for chunk in resp.iter_content(chunk_size=None):
                 yield chunk
      
    2. Создайте файл requirements.txt и укажите в нем библиотеку для работы с ботом.

      telebot
      
    3. Добавьте оба файла в ZIP-архив index.zip.

Зарегистрируйте Telegram-ботаЗарегистрируйте Telegram-бота

Зарегистрируйте бота в Telegram и получите токен.

  1. Запустите бота BotFather и отправьте ему команду:

    /newbot
    
  2. В поле name укажите имя создаваемого бота. Это имя увидят пользователи при общении с ботом.

  3. В поле username укажите имя пользователя создаваемого бота. По имени пользователя можно будет найти бота в Telegram. Имя пользователя должно оканчиваться на ...Bot или ..._bot.

    В результате вы получите токен. Сохраните его — он потребуется в дальнейшем.

Создайте функциюСоздайте функцию

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

Консоль управления
Yandex Cloud CLI
Terraform
API
  1. В консоли управления перейдите в каталог, в котором хотите создать функцию.

  2. В списке сервисов выберите Cloud Functions

  3. Создайте функцию:

    1. Нажмите кнопку Создать функцию.
    2. Введите имя функции — for-recognizer-bot.
    3. Нажмите кнопку Создать.
  4. Создайте версию функции:

    1. Выберите среду выполнения Python, отключите опцию Добавить файлы с примерами кода и нажмите кнопку Продолжить.

    2. Укажите способ загрузки ZIP-архив и выберите архив index.zip, который подготовили раньше.

    3. Укажите точку входа index.handler.

    4. В блоке Параметры укажите:

      • Таймаут — 30.

      • Память — 128 МБ.

      • Сервисный аккаунт — recognizer-bot-sa.

      • Переменные окружения:

        • TELEGRAM_TOKEN — токен вашего бота в Telegram.
    5. Нажмите кнопку Сохранить изменения.

  1. Создайте функцию for-recognizer-bot:

    yc serverless function create --name=for-recognizer-bot
    

    Результат:

    id: b09bhaokchn9********
    folder_id: aoek49ghmknn********
    created_at: "2023-03-21T10:03:37.475Z"
    name: for-recognizer-bot
    log_group_id: eolm8aoq9vcp********
    http_invoke_url: https://functions.yandexcloud.net/b09bhaokchn9********
    status: ACTIVE
    
  2. Создайте версию функции for-recognizer-bot:

    yc serverless function version create \
      --function-name for-recognizer-bot \
      --memory=128m \
      --execution-timeout=30s \
      --runtime=python312 \
      --entrypoint=index.handler \
      --service-account-id=<идентификатор_сервисного_аккаунта> \
      --environment TELEGRAM_TOKEN=<токен_бота> \
      --source-path=./index.zip
    

    Где:

    • --function-name — имя функции, версия которой создается.
    • --memory — объем RAM.
    • --execution-timeout — максимальное время выполнения функции до таймаута.
    • --runtime — среда выполнения.
    • --entrypoint — точка входа.
    • --service-account-id — идентификатор сервисного аккаунта recognizer-bot-sa.
    • --environment — переменные окружения.
    • --source-path — путь до ZIP-архива index.zip.

    Результат:

    done (1s)
    id: d4e6qqlh53nu********
    function_id: d4emc80mnp5n********
    created_at: "2023-03-22T16:49:41.800Z"
    runtime: python312
    entrypoint: index.handler
    resources:
      memory: "134217728"
    execution_timeout: 30s
    service_account_id: aje20nhregkc********
    image_size: "4096"
    status: ACTIVE
    tags:
      - $latest
    log_group_id: ckgmc3l93cl0********
    environment:
      TELEGRAM_TOKEN: <токен_бота>
    log_options:
      folder_id: b1g86q4m5vej********
    
  1. Опишите в конфигурационном файле параметры функции:

    resource "yandex_function" "for-recognizer-bot-function" {
      name               = "for-recognizer-bot"
      user_hash          = "first function"
      runtime            = "python312"
      entrypoint         = "index.handler"
      memory             = "128"
      execution_timeout  = "30"
      service_account_id = "aje20nhregkcvu******"
      environment = {
        TELEGRAM_TOKEN = <токен_бота>
      }
      content {
        zip_filename = "./index.zip"
      }
    }
    

    Где:

    • name — имя функции.
    • user_hash — произвольная строка, определяющая версию функции.
    • runtime — среда выполнения функции.
    • entrypoint — точка входа.
    • memory — объем памяти в мегабайтах, отведенный для выполнения функции.
    • execution_timeout — таймаут выполнения функции.
    • service_account_id — идентификатор сервисного аккаунта recognizer-bot-sa.
    • environment — переменные окружения.
    • content — путь до ZIP-архива index.zip с исходным кодом функции.

    Более подробную информацию о параметрах ресурса yandex_function см. в документации провайдера.

  2. Проверьте корректность конфигурационных файлов.

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

    2. Выполните проверку с помощью команды:

      terraform plan
      

    Если конфигурация описана верно, в терминале отобразится список создаваемых ресурсов и их параметров. Если в конфигурации есть ошибки, Terraform на них укажет.

  3. Разверните облачные ресурсы.

    1. Если в конфигурации нет ошибок, выполните команду:

      terraform apply
      
    2. Подтвердите создание функции: введите в терминал слово yes и нажмите Enter.

Чтобы создать функцию, воспользуйтесь методом create для ресурса Function или вызовом gRPC API FunctionService/Create.

Чтобы создать версию функцию, воспользуйтесь методом createVersion для ресурса Function или вызовом gRPC API FunctionService/CreateVersion.

Создайте API-шлюзСоздайте API-шлюз

Сервер Telegram будет оповещать ваш бот о поступлении новых сообщений с помощью веб-хука. API-шлюз будет принимать запросы на стороне бота и перенаправлять их функции for-recognizer-bot для обработки.

Консоль управления
CLI
Terraform
API
  1. В консоли управления выберите каталог, в котором хотите создать API-шлюз.

  2. В списке сервисов выберите API Gateway.

  3. Нажмите кнопку Создать API-шлюз.

  4. В поле Имя введите recognizer-bot-api-gw.

  5. В блок Спецификация добавьте спецификацию:

    openapi: 3.0.0
    info:
      title: Sample API
      version: 1.0.0
    paths:
      /for-recognizer-bot-function:
        post:
          x-yc-apigateway-integration:
            type: cloud_functions
            function_id: <идентификатор_функции>
            service_account_id: <идентификатор_сервисного_аккаунта>
          operationId: for-recognizer-bot-function
    

    Где:

    • function_id — идентификатор функции for-recognizer-bot;
    • service_account_id — идентификатор сервисного аккаунта recognizer-bot-sa.
  6. Нажмите кнопку Создать.

  7. Выберите созданный API-шлюз. Сохраните значение поля Служебный домен — оно потребуется в дальнейшем.

  1. Сохраните следующую спецификацию в файл spec.yaml:

    openapi: 3.0.0
    info:
      title: Sample API
      version: 1.0.0
    paths:
      /for-recognizer-bot-function:
        post:
          x-yc-apigateway-integration:
            type: cloud_functions
            function_id: <идентификатор_функции>
            service_account_id: <идентификатор_сервисного_аккаунта>
          operationId: for-recognizer-bot-function
    

    Где:

    • function_id — идентификатор функции for-recognizer-bot.
    • service_account_id — идентификатор сервисного аккаунта recognizer-bot-sa.
  2. Выполните команду:

    yc serverless api-gateway create --name recognizer-bot-api-gw --spec=spec.yaml
    

    Где:

    • --name — имя API-шлюза.
    • --spec — файл со спецификацией.

    Результат:

    done (5s)
    id: d5d1ud9bli1e********
    folder_id: b1gc1t4cb638********
    created_at: "2023-09-25T16:01:48.926Z"
    name: recognizer-bot-api-gw
    status: ACTIVE
    domain: d5dm1lba80md********.i9******.apigw.yandexcloud.net
    log_group_id: ckgefpleo5eg********
    connectivity: {}
    log_options:
      folder_id: b1gc1t4cb638********
    

Чтобы создать API-шлюз:

  1. Опишите в конфигурационном файле параметры ресурса yandex_api_gateway:

    resource "yandex_api_gateway" "recognizer-bot-api-gw" {
      name        = "recognizer-bot-api-gw"
      spec = <<-EOT
        openapi: 3.0.0
        info:
          title: Sample API
          version: 1.0.0
    
        paths:
          /for-recognizer-bot-function:
            post:
              x-yc-apigateway-integration:
                type: cloud_functions
                function_id: <идентификатор_функции>
                service_account_id: <идентификатор_сервисного_аккаунта>
              operationId: for-recognizer-bot-function
      EOT
    }
    

    Где:

    • name — имя API-шлюза.
    • spec — спецификация API-шлюза.

    Более подробную информацию о параметрах ресурсов в Terraform см. в документации провайдера.

  2. Проверьте корректность конфигурационных файлов.

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

    2. Выполните проверку с помощью команды:

      terraform plan
      

    Если конфигурация описана верно, в терминале отобразится список создаваемых ресурсов и их параметров. Если в конфигурации есть ошибки, Terraform на них укажет.

  3. Разверните облачные ресурсы.

    1. Если в конфигурации нет ошибок, выполните команду:

      terraform apply
      
    2. Подтвердите создание ресурсов: введите в терминал слово yes и нажмите Enter.

Чтобы создать API-шлюз, воспользуйтесь методом REST API create для ресурса ApiGateway или вызовом gRPC API ApiGatewayService/Create.

Настройте связь между функцией и Telegram-ботомНастройте связь между функцией и Telegram-ботом

Установите веб-хук для вашего Telegram-бота:

curl --request POST \
  --url https://api.telegram.org/bot<токен_бота>/setWebhook \
  --header 'content-type: application/json' \ 
  --data '{"url": "<домен_API-шлюза>/for-recognizer-bot-function"}'

Где:

  • <токен_бота> — токен Telegram-бота.
  • <домен_API-шлюза> — служебный домен API-шлюза recognizer-bot-api-gw.

Результат:

{"ok":true,"result":true,"description":"Webhook was set"}

Протестируйте ботаПротестируйте бота

Поговорите с ботом:

  1. Откройте Telegram и найдите бота по указанному имени пользователя username.

  2. Отправьте в чат сообщение /start.

    Бот должен ответить:

    Бот умеет:
    
    * распознавать текст с картинок;
    * генерировать голосовые сообщения из текста;
    * переводить голосовые сообщения в текст.
    
  3. Отправьте в чат текстовое сообщение. Бот ответит голосовым сообщением, синтезированным из вашего текста.

  4. Отправьте в чат голосовое сообщение. Бот ответит сообщением с текстом, распознанным из вашей речи.

  5. Отправьте в чат изображение с текстом. Бот ответит сообщением с распознанным текстом.

    Примечание

    Изображение должно соответствовать требованиям.

Как удалить созданные ресурсыКак удалить созданные ресурсы

Чтобы перестать платить за созданные ресурсы:

  • удалите API-шлюз API Gateway;
  • удалите функцию Cloud Functions.

Была ли статья полезна?

Предыдущая
Разработка Telegram-бота
Следующая
Разработка пользовательской интеграции
Проект Яндекса
© 2025 ООО «Яндекс.Облако»