Как распознать длинные аудиофайлы в SpeechKit
Сервис позволяет распознавать речь различными способами. В примере аудиофайл распознается с помощью асинхронного распознавания. Асинхронное распознавание доступно в API v3 и API v2. Для асинхронного распознавания действуют ограничения:
- максимальная длительность аудио — 4 часа;
- максимальный размер файла — 1 ГБ.
Для работы с API в примере используется утилита cURL
Перед началом работы
-
Создайте бакет и загрузите в него аудиофайл, который вы хотите распознать.
-
Создайте сервисный аккаунт.
Важно
Асинхронно распознать аудиофайлы можно только от имени сервисного аккаунта. Не используйте для этого другие аккаунты в Yandex Cloud.
-
Назначьте сервисному аккаунту роли
storage.uploader
иai.speechkit-stt.user
на каталог, в котором вы ранее создали бакет. -
Получите API-ключ или IAM-токен для созданного сервисного аккаунта.
-
Скачайте пример аудиофайла:
Распознавание речи
-
Получите ссылку на аудиофайл в Object Storage.
-
Создайте файл, например
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
— тип аудиоконтейнера.
-
-
Выполните запрос, используя один из способов аутентификации через сервисный аккаунт:
-
С помощью IAM-токена:
export IAM_TOKEN=<IAM-токен_сервисного_аккаунта> && \ curl \ --insecure \ --header "Authorization: Bearer ${IAM_TOKEN}" \ --data @request.json https://stt.api.cloud.yandex.net:443/stt/v3/recognizeFileAsync
Где
IAM_TOKEN
— IAM-токен сервисного аккаунта. -
С помощью API-ключей.
Используйте API-ключи, если у вас нет возможности автоматически запрашивать IAM-токен.
export API_KEY=<API-ключ_сервисного_аккаунта> && \ curl \ --insecure \ --header "Authorization: Api-Key ${API_KEY}" \ --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
) операции распознавания, полученный в ответе. -
-
Подождите, пока закончится распознавание. Одна минута аудио распознается примерно за 10 секунд.
-
Запросите информацию об операции:
-
С авторизацией через IAM-токен:
curl \ --insecure \ --request GET \ --header "Authorization: Bearer ${IAM_TOKEN}" \ https://operation.api.cloud.yandex.net/operations/<идентификатор_операции_распознавания>
-
С авторизацией через API-ключ:
curl \ --insecure \ --request GET \ --header "Authorization: Api-key ${API_KEY}" \ 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" }
-
-
Запросите результат операции:
-
С авторизацией через IAM-токен:
curl \ --insecure \ --request GET \ --header "Authorization: Bearer ${IAM_TOKEN}" \ https://stt.api.cloud.yandex.net:443/stt/v3/getRecognition?operation_id=<идентификатор_операции_распознавания>
-
С авторизацией через API-ключ:
curl \ --insecure \ --request GET \ --header "Authorization: Api-key ${API_KEY}" \ 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" } }
-
-
Получите ссылку на аудиофайл в Object Storage.
-
Создайте файл
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 — они игнорируются.
-
-
Выполните созданный файл:
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
) операции распознавания, полученный в ответе. -
Подождите, пока закончится распознавание. Одна минута одноканального аудио распознается примерно за 10 секунд.
-
Отправьте запрос на получение информации об операции:
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" }