[Документация Yandex Cloud](../../../index.md) > [speechkit](../../index.md) > Пошаговые инструкции > Распознавание > Асинхронное распознавание формата OggOpus — API v2

# Асинхронное распознавание аудиофайлов в формате OggOpus в API v2


{% note warning %}

Функциональность доступна только в [регионе Россия](../../../overview/concepts/region.md).

{% endnote %}


Ниже рассмотрены примеры [асинхронного распознавания речи](../transcribation.md) из аудиофайла с помощью [API v2](transcribation-api.md) SpeechKit. В примерах заданы параметры:

* [язык](../models.md#languages) — русский;
* формат аудиопотока — [OggOpus](../../formats.md#OggOpus) с расширением файла OPUS;
* остальные параметры оставлены по умолчанию.

Вы можете сформировать и отправить запрос на распознавание речи с помощью утилиты [cURL](https://curl.haxx.se) или Python-скрипта.

Аутентификация происходит от имени сервисного аккаунта с помощью [IAM-токена](../../../iam/concepts/authorization/iam-token.md). Подробнее об [аутентификации в API SpeechKit](../../concepts/auth.md).

## Перед началом работы {#before-you-begin}

1. [Создайте](../../../storage/operations/buckets/create.md) бакет и [загрузите](../../../storage/operations/objects/upload.md) в него аудиофайл, который вы хотите распознать.
1. [Создайте](../../../iam/operations/sa/create.md) сервисный аккаунт.

   {% note warning %}

   Асинхронно распознать аудиофайлы можно только от имени сервисного аккаунта. Не используйте для этого [другие аккаунты в Yandex Cloud](../../../iam/concepts/users/accounts.md).

   {% endnote %}

1. [Назначьте](../../../iam/operations/sa/assign-role-for-sa.md) сервисному аккаунту роли `storage.uploader` и `ai.speechkit-stt.user` на каталог, в котором вы ранее создали бакет.
1. Получите [IAM-токен](../../../iam/operations/iam-token/create-for-sa.md) или [API-ключ](../../../iam/operations/authentication/manage-api-keys.md#create-api-key) для созданного сервисного аккаунта.

Если у вас нет аудиофайла формата OggOpus, вы можете скачать [пример файла](https://storage.yandexcloud.kz/doc-files/speechkit-ogg.ogg).

## Выполните распознавание с помощью API {#recognize-using-api}

{% note warning %}

Для двухканальной OggOpus-записи не нужно указывать количество каналов с помощью параметра `audioChannelCount`.

{% endnote %}

{% list tabs group=programming_language %}

- cURL {#curl}

  1. [Получите ссылку на аудиофайл](../../../storage/operations/objects/link-for-download.md) в Object Storage.
  1. Создайте файл, например `body.json`, и добавьте в него код:

      ```json
      {
          "config": {
              "specification": {
                  "languageCode": "ru-RU"
              }
          },
          "audio": {
              "uri": "<ссылка_на_аудиофайл>"
          }
      }
      ```

      Где:

      * `languageCode` — [язык](../models.md#languages), для которого будет выполнено распознавание.
      * `uri` — ссылка на аудиофайл в Object Storage. Пример ссылки: `https://storage.yandexcloud.net/speechkit/speech.opus`.

         Для бакета с ограниченным доступом в ссылке присутствуют дополнительные query-параметры (после знака `?`). Эти параметры не нужно передавать в SpeechKit — они игнорируются.

      Формат аудиопотока указывать не нужно, так как OggOpus — формат по умолчанию.

      {% note info %}

      Не передавайте параметр [audioChannelCount](transcribation-api.md#sendfile-params), чтобы указать количество аудиоканалов. Файлы формата OggOpus уже содержат информацию о количестве каналов.

      {% endnote %}

  1. Выполните созданный файл:

      ```bash
      export IAM_TOKEN=<IAM-токен_сервисного_аккаунта> && \
      curl \
        --request POST \
        --header "Authorization: Bearer ${IAM_TOKEN}" \
        --data "@body.json" \
        https://transcribe.api.cloud.yandex.net/speech/stt/v2/longRunningRecognize
      ```

      Где `IAM_TOKEN` — IAM-токен сервисного аккаунта.

      Пример результата:

      ```text
      {
          "done": false,
          "id": "e03sup6d5h1q********",
          "createdAt": "2019-04-21T22:49:29Z",
          "createdBy": "ajes08feato8********",
          "modifiedAt": "2019-04-21T22:49:29Z"
      }
      ```

      Сохраните идентификатор (`id`) операции распознавания, полученный в ответе.

  1. Подождите, пока закончится распознавание. Одна минута аудио распознается примерно за 10 секунд.
  1. Отправьте запрос на [получение информации об операции](../../../api-design-guide/concepts/operation.md#monitoring):

      ```bash
      curl \
        --header "Authorization: Bearer ${IAM_TOKEN}" \
        https://operation.api.cloud.yandex.net/operations/<идентификатор_операции_распознавания>
      ```

      Пример результата:

      ```text
      {
       "done": true,
       "response": {
        "@type": "type.googleapis.com/yandex.cloud.ai.stt.v2.LongRunningRecognitionResponse",
        "chunks": [
         {
          "alternatives": [
           {
            "text": "твой номер 212-85-06",
            "confidence": 1
           }
          ],
          "channelTag": "1"
         }
        ]
       },
       "id": "e03sup6d5h1q********",
       "createdAt": "2019-04-21T22:49:29Z",
       "createdBy": "ajes08feato8********",
       "modifiedAt": "2019-04-21T22:49:36Z"
      }
      ```

      Если распознать речь в переданном файле не удалось, секция `response.chunks` может отсутствовать в ответе.

- Python 3 {#python}

  1. Установите пакет `requests` с помощью менеджера пакетов [pip](https://pip.pypa.io/en/stable/):

     ```bash
     pip install requests
     ```

  1. Создайте файл, например `test.py`, и добавьте в него код:

      ```python
      # -*- coding: utf-8 -*-

      import requests
      import time
      import json

      # Укажите ваш IAM-токен и ссылку на аудиофайл в Object Storage.
      key = '<IAM-токен_сервисного_аккаунта>'
      filelink = '<ссылка_на_аудиофайл>'

      POST ='https://transcribe.api.cloud.yandex.net/speech/stt/v2/longRunningRecognize'

      body ={
          "config": {
              "specification": {
                  "languageCode": "ru-RU"
              }
          },
          "audio": {
              "uri": filelink
          }
      }

      header = {'Authorization': 'Bearer {}'.format(key)}

      # Отправьте запрос на распознавание.
      req = requests.post(POST, headers=header, json=body)
      data = req.json()
      print(data)

      id = data['id']

      # Запрашивайте на сервере статус операции, пока распознавание не будет завершено.
      while True:

          time.sleep(1)

          GET = "https://operation.api.cloud.yandex.net/operations/{id}"
          req = requests.get(GET.format(id=id), headers=header)
          req = req.json()

          if req['done']: break
          print("Not ready")

      # Покажите полный ответ сервера в формате JSON.
      print("Response:")
      print(json.dumps(req, ensure_ascii=False, indent=2))

      # Покажите только текст из результатов распознавания.
      print("Text chunks:")
      for chunk in req['response']['chunks']:
          print(chunk['alternatives'][0]['text'])
      ```

      Где:

      * `key` — IAM-токен сервисного аккаунта;
      * `filelink` — ссылка на аудиофайл в Object Storage.

  1. Выполните созданный файл:

      ```bash
      python3 test.py
      ```

{% endlist %}

## Решение проблем {#troubleshooting}

Если в ответе возвращается пустота, пустой файл или ошибка `Invalid audio received`, проверьте кодек, которым закодирован ваш аудиофайл. Чтобы файл был корректно распознан, недостаточно изменить его расширение.

Чтобы конвертировать файл с расширением OGG в поддерживаемый формат OggOpus, воспользуйтесь утилитой [FFmpeg](https://ffmpeg.org/):

```bash
ffmpeg -i audio.ogg -c:a libopus -b:a 65536 audio_new.ogg
```

#### Полезные ссылки {#see-also}

* [API v2 асинхронного распознавания](transcribation-api.md)
* [Асинхронное распознавание аудиофайлов в формате LPCM в API v2](transcribation-lpcm.md)
* [Регулярное асинхронное распознавание аудиофайлов из Yandex Object Storage](batch-transcribation.md)
* [Аутентификация в API SpeechKit](../../concepts/auth.md)