Как распознать длинные аудиофайлы в SpeechKit

Сервис позволяет распознавать речь различными способами. В примере аудиофайл распознается с помощью асинхронного распознавания. Асинхронное распознавание доступно в API v3 и API v2. Для асинхронного распознавания действуют ограничения:

  • максимальная длительность аудио — 4 часа;
  • максимальный размер файла — 1 ГБ.

Для работы с API в примере используется утилита cURL. Если вы хотите использовать Python-скрипт для работы с API, обратитесь к разделу с пошаговыми инструкциями.

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

  1. Создайте бакет и загрузите в него аудиофайл, который вы хотите распознать.

  2. Создайте сервисный аккаунт.

    Важно

    Асинхронно распознать аудиофайлы можно только от имени сервисного аккаунта. Не используйте для этого другие аккаунты в Yandex Cloud.

  3. Назначьте сервисному аккаунту роли storage.uploader и ai.speechkit-stt.user на каталог, в котором вы ранее создали бакет.

  4. Получите API-ключ или IAM-токен для созданного сервисного аккаунта.

  5. Скачайте пример аудиофайла:

Распознавание речи

  1. Получите ссылку на аудиофайл в Object Storage.

  2. Создайте файл, например request.json, и добавьте в него код:

    {
              "uri": "https://storage.yandexcloud.net/<название_бакета>/<путь_к_WAV-файлу_в_бакете>",
              "recognition_model": {
                "model": "general",
                "audio_format": {
                  "container_audio": {
                    "container_audio_type": "WAV"
                  }
                }
              }
            }
            

    Где:

    • uri — ссылка на аудиофайл в Object Storage. Пример ссылки: https://storage.yandexcloud.net/speechkit/speech.wav.

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

    • model — модель распознавания речи.

    • container_audio_type — тип аудиоконтейнера.

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

    • С помощью IAM-токена:

      export FOLDER_ID=<идентификатор_каталога>
              export IAM_TOKEN=<IAM-токен_сервисного_аккаунта> && \
              curl \
                --insecure \
                --header "Authorization: Bearer ${IAM_TOKEN}" \
                --header "x-folder-id: ${FOLDER_ID}" \
                --data @request.json https://stt.api.cloud.yandex.net:443/stt/v3/recognizeFileAsync
              

      Где:

      • FOLDER_ID— идентификатор каталога, в котором создан ваш сервисный аккаунт.
      • IAM_TOKEN — IAM-токен сервисного аккаунта.
    • С помощью API-ключа.

      Используйте API-ключи, если у вас нет возможности автоматически запрашивать IAM-токен.

      export FOLDER_ID=<идентификатор_каталога>
              export API_KEY=<API-ключ_сервисного_аккаунта> && \
              curl \
                --insecure \
                --header "Authorization: Api-Key ${API_KEY}" \
                --header "x-folder-id: ${FOLDER_ID}" \
                --data @request.json https://stt.api.cloud.yandex.net:443/stt/v3/recognizeFileAsync
              

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

    {
               "id":"f8ddr61b30fk********",
               "description":"STT v3 async recognition",
               "createdAt":"2024-07-15T07:39:36Z",
               "createdBy":"ajehumcuv38h********",
               "modifiedAt":"2024-07-15T07:39:36Z",
               "done":false,
               "metadata":null
            }
            

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

  4. Дождитесь, когда завершится распознавание. Одна минута аудио распознается примерно за 10 секунд.

  5. Запросите информацию об операции:

    • С аутентификацией с помощью IAM-токена:

      curl \
                --insecure \
                --request GET \
                --header "Authorization: Bearer ${IAM_TOKEN}" \
                --header "x-folder-id: ${FOLDER_ID}" \
                https://operation.api.cloud.yandex.net/operations/<идентификатор_операции_распознавания>
              
    • С аутентификацией с помощью API-ключа:

      curl \
                --insecure \
                --request GET \
                --header "Authorization: Api-key ${API_KEY}" \
                --header "x-folder-id: ${FOLDER_ID}" \
                https://operation.api.cloud.yandex.net/operations/<идентификатор_операции_распознавания>
              

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

    {
               "done": true,
               "id": "f8ddr61b30fk********",
               "description": "STT v3 async recognition",
               "createdAt": "2024-07-15T07:39:36Z",
               "createdBy": "ajehumcuv38h********",
               "modifiedAt": "2024-07-15T07:39:37Z"
            }
            
  6. Запросите результат операции:

    • С аутентификацией с помощью IAM-токена:

      curl \
                --insecure \
                --request GET \
                --header "Authorization: Bearer ${IAM_TOKEN}" \
                --header "x-folder-id: ${FOLDER_ID}" \
                https://stt.api.cloud.yandex.net:443/stt/v3/getRecognition?operation_id=<идентификатор_операции_распознавания>
              
    • С аутентификацией с помощью API-ключа:

      curl \
                --insecure \
                --request GET \
                --header "Authorization: Api-key ${API_KEY}" \
                --header "x-folder-id: ${FOLDER_ID}" \
                https://stt.api.cloud.yandex.net:443/stt/v3/getRecognition?operation_id=<идентификатор_операции_распознавания>
              
    Пример результата
    {
             "result": {
                "sessionUuid": {
                   "uuid": "24935f24-2c1f62dc-8dd49006-********",
                   "userRequestId": "f8d2h7m07t4i********"
                },
                "audioCursors": {
                   "receivedDataMs": "7400",
                   "resetTimeMs": "0",
                   "partialTimeMs": "7400",
                   "finalTimeMs": "7400",
                   "finalIndex": "0",
                   "eouTimeMs": "0"
                },
                "responseWallTimeMs": "189",
                "final": {
                   "alternatives": [
                      {
                         "words": [
                            {
                               "text": "я",
                               "startTimeMs": "459",
                               "endTimeMs": "520"
                            },
                            {
                               "text": "яндекс",
                               "startTimeMs": "640",
                               "endTimeMs": "1060"
                            },
                            {
                               "text": "спичкит",
                               "startTimeMs": "1120",
                               "endTimeMs": "1959"
                            },
                            {
                               "text": "я",
                               "startTimeMs": "2480",
                               "endTimeMs": "2520"
                            },
                            {
                               "text": "могу",
                               "startTimeMs": "2580",
                               "endTimeMs": "2800"
                            },
                            {
                               "text": "превратить",
                               "startTimeMs": "2860",
                               "endTimeMs": "3360"
                            },
                            {
                               "text": "любой",
                               "startTimeMs": "3439",
                               "endTimeMs": "3709"
                            },
                            {
                               "text": "текст",
                               "startTimeMs": "3800",
                               "endTimeMs": "4140"
                            },
                            {
                               "text": "в",
                               "startTimeMs": "4200",
                               "endTimeMs": "4220"
                            },
                            {
                               "text": "речь",
                               "startTimeMs": "4279",
                               "endTimeMs": "4740"
                            },
                            {
                               "text": "теперь",
                               "startTimeMs": "5140",
                               "endTimeMs": "5759"
                            },
                            {
                               "text": "и",
                               "startTimeMs": "5859",
                               "endTimeMs": "5900"
                            },
                            {
                               "text": "вы",
                               "startTimeMs": "5980",
                               "endTimeMs": "6399"
                            },
                            {
                               "text": "можете",
                               "startTimeMs": "6660",
                               "endTimeMs": "7180"
                            }
                         ],
                         "text": "я яндекс спичкит я могу превратить любой текст в речь теперь и вы можете",
                         "startTimeMs": "0",
                         "endTimeMs": "7400",
                         "confidence": 0,
                         "languages": []
                      }
                   ],
                   "channelTag": "0"
                },
                "channelTag": "0"
             }
            }
            {
             "result": {
                "sessionUuid": {
                   "uuid": "24935f24-2c1f62dc-8dd49006-********",
                   "userRequestId": "f8d2h7m07t4i********"
                },
                "audioCursors": {
                   "receivedDataMs": "7400",
                   "resetTimeMs": "0",
                   "partialTimeMs": "7400",
                   "finalTimeMs": "7400",
                   "finalIndex": "0",
                   "eouTimeMs": "0"
                },
                "responseWallTimeMs": "189",
                "finalRefinement": {
                   "finalIndex": "0",
                   "normalizedText": {
                      "alternatives": [
                         {
                            "words": [
                               {
                                  "text": "я",
                                  "startTimeMs": "459",
                                  "endTimeMs": "520"
                               },
                               {
                                  "text": "яндекс",
                                  "startTimeMs": "640",
                                  "endTimeMs": "1060"
                               },
                               {
                                  "text": "спичкит",
                                  "startTimeMs": "1120",
                                  "endTimeMs": "1959"
                               },
                               {
                                  "text": "я",
                                  "startTimeMs": "2480",
                                  "endTimeMs": "2520"
                               },
                               {
                                  "text": "могу",
                                  "startTimeMs": "2580",
                                  "endTimeMs": "2800"
                               },
                               {
                                  "text": "превратить",
                                  "startTimeMs": "2860",
                                  "endTimeMs": "3360"
                               },
                               {
                                  "text": "любой",
                                  "startTimeMs": "3439",
                                  "endTimeMs": "3709"
                               },
                               {
                                  "text": "текст",
                                  "startTimeMs": "3800",
                                  "endTimeMs": "4140"
                               },
                               {
                                  "text": "в",
                                  "startTimeMs": "4200",
                                  "endTimeMs": "4220"
                               },
                               {
                                  "text": "речь",
                                  "startTimeMs": "4279",
                                  "endTimeMs": "4740"
                               },
                               {
                                  "text": "теперь",
                                  "startTimeMs": "5140",
                                  "endTimeMs": "5759"
                               },
                               {
                                  "text": "и",
                                  "startTimeMs": "5859",
                                  "endTimeMs": "5900"
                               },
                               {
                                  "text": "вы",
                                  "startTimeMs": "5980",
                                  "endTimeMs": "6399"
                               },
                               {
                                  "text": "можете",
                                  "startTimeMs": "6660",
                                  "endTimeMs": "7180"
                               }
                            ],
                            "text": "Я яндекс спичкит я могу превратить любой текст в речь теперь и вы можете",
                            "startTimeMs": "0",
                            "endTimeMs": "7400",
                            "confidence": 0,
                            "languages": []
                         }
                      ],
                      "channelTag": "0"
                   }
                },
                "channelTag": "0"
             }
            }
            {
             "result": {
                "sessionUuid": {
                   "uuid": "24935f24-2c1f62dc-8dd49006-********",
                   "userRequestId": "f8d2h7m07t4i********"
                },
                "audioCursors": {
                   "receivedDataMs": "7400",
                   "resetTimeMs": "0",
                   "partialTimeMs": "7400",
                   "finalTimeMs": "7400",
                   "finalIndex": "0",
                   "eouTimeMs": "7400"
                },
                "responseWallTimeMs": "190",
                "eouUpdate": {
                   "timeMs": "7400"
                },
                "channelTag": "0"
             }
            }
            
  1. Получите ссылку на аудиофайл в Object Storage.

  2. Создайте файл body.json и добавьте в него код:

    {
               "config": {
                  "specification": {
                     "languageCode": "ru-RU",
                     "model": "general",
                     "audioEncoding": "LINEAR16_PCM",
                     "sampleRateHertz": 8000,
                     "audioChannelCount": 1
                  }
               },
               "audio": {
                  "uri": "<ссылка_на_аудиофайл>"
               }
            }
            

    Где:

    • languageCodeязык, для которого будет выполнено распознавание.

    • modelмодель распознавания речи.

    • audioEncodingформат передаваемого аудиофайла.

    • sampleRateHertz — частота дискретизации аудиофайла в Гц.

    • audioChannelCount — количество аудиоканалов.

    • uri — ссылка на аудиофайл в Object Storage. Пример ссылки: https://storage.yandexcloud.net/speechkit/speech.pcm.

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

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

    export API_KEY=<API-ключ_сервисного_аккаунта> && \
            curl \
              --insecure \
              --header "Authorization: Api-Key ${API_KEY}" \
              --data "@body.json"\
              https://transcribe.api.cloud.yandex.net/speech/stt/v2/longRunningRecognize
            

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

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

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

  4. Дождитесь, когда завершится распознавание. Одна минута одноканального аудио распознается примерно за 10 секунд.

  5. Отправьте запрос на получение информации об операции:

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

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

    {
               "done": true,
               "response": {
                  "@type": "type.googleapis.com/yandex.cloud.ai.stt.v2.LongRunningRecognitionResponse",
                  "chunks": [
                     {
                        "alternatives": [
                           {
                              "words": [
                                 {
                                    "startTime": "0.160s",
                                    "endTime": "0.500s",
                                    "word": "привет",
                                    "confidence": 1
                                 },
                                 {
                                    "startTime": "0.580s",
                                    "endTime": "0.800s",
                                    "word": "мир",
                                    "confidence": 1
                                 }
                              ],
                              "text": "Привет мир",
                              "confidence": 1
                           }
                        ],
                        "channelTag": "1"
                     }
                  ]
               },
               "id": "e03jjenu23uc********",
               "createdAt": "2024-08-22T11:39:22Z",
               "createdBy": "aje3bg430agh********",
               "modifiedAt": "2024-08-22T11:39:23Z"
            }
            

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

См. также