API асинхронного распознавания речи (HTTP)
Асинхронное распознавание по протоколу HTTP проходит в несколько шагов:
- Загрузка файла для распознавания.
- Создание задачи на асинхронное распознавание.
- Проверка статуса задачи.
- Скачивание результата.
Заголовки запросов и ответов для всех шагов одинаковы:
Заголовки запроса
Заголовки ответа
Загрузка файла
Описание форматов аудиофайлов, которые можно загружать для распозначания речи, — в разделе Доступные форматы аудио.
Запрос
Чтобы загрузить файл для распознавания в облачное хранилище SaluteSpeech, отправьте HTTP-запрос методом POST на следующий URL:
https://smartspeech.sber.ru/rest/v1/data:upload
В теле запроса передается аудио-файл.
Пример запроса на загрузку файла с компьютера:
curl -X POST \
-H "Authorization: Bearer {{token}}" \
--data-binary @./audio.pcm \
https://smartspeech.sber.ru/rest/v1/data:upload
Пример запроса на загрузку файла из интернета:
curl -fsSL -o - https://raw.githubusercontent.com/sberdevices/golos/master/examples/data/001ce26c07c20eaa0d666b824c6c6924.wav | \
curl -X POST \
-H "Authorization: Bearer {{token}}" \
--data-binary @- \
https://smartspeech.sber.ru/rest/v1/data:upload
Ответ
В случае успешного POST-запроса в ответ придет идентификатор файла.
При успешном запросе придет HTTP-код 200
.
Пример тела ответа:
{
"status": 200,
"result": {
"request_file_id": "2345200-abe8-4f60-90c8-0d43c5f6c0f6"
}
}
Если запрос не выполнен, придут код и описание ошибки в формате JSON.
Создание задачи
Запрос
Отправьте HTTP-запрос методом POST на следующий URL:
https://smartspeech.sber.ru/rest/v1/speech:async_recognize
В запросе передайте идентификатор загруженного файла, а также параметры распознавания.
Параметры запроса
Пример запроса
curl -X POST \
-H "Authorization: Bearer {{token}}" \
-H "Content-Type: application/json" \
--data '
{
"options": {
"language": "ru-RU",
"audio_encoding": "PCM_S16LE",
"sample_rate": 16000,
"hypotheses_count": 1,
"enable_profanity_filter": false,
"max_speech_timeout": "20s",
"channels_count": 2,
"no_speech_timeout": "7s",
"hints": {
"words": ["карту", "гуакамоле"],
"enable_letters": true,
"eou_timeout": "2s"
},
"insight_models": ["csi"],
"speaker_separation_options": {
"enable": true,
"enable_only_main_speaker": false,
"count": 2
}
},
"request_file_id": "file_id"
}' \
https://smartspeech.sber.ru/rest/v1/speech:async_recognize
Ответ
В ответе сервис вернет уникальный идентификатор и основные параметры задачи на распознавание.
Пример тела ответа:
{
"status": 200,
"result": {
"id": "dafaf982-a32a-4e26-ae40-2bb9444906e1",
"created_at": "2021-07-15T17:35:17.182454861+03:00",
"updated_at": "2021-07-15T17:35:17.18245504+03:00",
"status": "NEW"
}
}
Если запрос не выполнен, придут код и описание ошибки в формате JSON.
Получение статуса задачи
Запрос
Отправьте HTTP-запрос методом GET на следующий URL:
https://smartspeech.sber.ru/rest/v1/task:get
В запросе передайте идентификатор задачи.
Пример запроса:
curl \
-H "Authorization: Bearer {{token}}" \
"https://smartspeech.sber.ru/rest/v1/task:get?id={{task_id}}"
Ответ
Если задача готова, в ответе сервис вернет статус DONE
и идентификатор файла с результатом распознавания в параметре response_file_id
. Если в ответе придет статус ERROR
, описание ошибки будет отображаться в параметре error
.
Пример тела ответа:
{
"status": 200,
"result": {
"id": "dafaf982-a32a-4e26-ae40-2bb9444906e1",
"created_at": "2021-07-15T17:35:17.182454861+03:00",
"updated_at": "2021-07-15T17:35:57.18245504+03:00",
"status": "DONE",
"response_file_id": "2d45b5dc-73fe-40b1-9c89-0eea703036e5"
}
}
Пример тела ответа с ошибкой:
{
"status": 200,
"result": {
"id": "dafaf982-a32a-4e26-ae40-2bb9444906e1",
"created_at": "2021-07-15T17:35:17.182454+03:00",
"updated_at": "2021-07-15T17:35:21.209015+03:00",
"status": "ERROR",
"error": "internal error"
}
}
Отмена задачи
Если при проверке статуса сервис вернул значение NEW
, задачу можно отменить.
Запрос
Отправьте HTTP-запрос методом POST на следующий URL:
https://smartspeech.sber.ru/rest/v1/task:cancel
Пример запроса:
curl -X POST \
-H "Authorization: Bearer {{token}}" \
"https: //smartspeech.sber.ru/rest/v1/task:cancel?id={{task_id}}"
Ответ
В ответе сервис вернет статус CANCELED
.
Пример тела ответа:
{
"status": 200,
"result": {
"id": "dafaf982-a32a-4e26-ae40-2bb9444906e1",
"created_at": "2021-07-15T17:35:17.182454861+03:00",
"updated_at": "2021-07-15T17:35:57.18245504+03:00",
"status": "CANCELED"
}
}
Скачивание результата
Запрос
Отправьте HTTP-запрос методом GET на следующий URL:
https://smartspeech.sber.ru/rest/v1/data:download
Параметры запроса
Пример запроса:
curl \
-H "Authorization: Bearer {{token}}" \
"https://smartspeech.sber.ru/rest/v1/data:download?response_file_id={{response_file_id}}"
Ответ
В случае успешного GET-запроса в ответ вернется JSON-файл.
Если запрос не выполнен, придут код и описание ошибки в формате JSON.
Параметры ответа
Примеры ответа
- Стандартный ответ
- Разделение спикеров
- Insight-модели
[
{
"results": [
{
"text": "раз два три",
"normalized_text": "1 2 3",
"start": "0.760s",
"end": "2s",
"word_alignments": [
{
"word": "раз",
"start": "0.760s",
"end": "0.880s"
},
{
"word": "два",
"start": "1.340s",
"end": "1.460s"
},
{
"word": "три",
"start": "1.880s",
"end": "2s"
}
]
}
],
"eou": true,
"emotions_result": {
"positive": 0.017408885,
"neutral": 0.7625851,
"negative": 0.22000594
},
"processed_audio_start": "0s",
"processed_audio_end": "2.447375104s",
"backend_info": {
"model_name": "general",
"model_version": "M-01.018.00-general-01",
"server_version": "01.017.00-04"
},
"channel": 0,
"speaker_info": {
"speaker_id": -1,
"main_speaker_confidence": 1
},
"eou_reason": "ORGANIC",
"insight": ""
},
]
[
{
"results": [
{
"text": "один два",
"normalized_text": "1 2",
"start": "0.320s",
"end": "0.960s",
"word_alignments": [
{
"word": "один",
"start": "0.320s",
"end": "0.519999968s"
},
{
"word": "два",
"start": "0.640s",
"end": "0.960s"
}
]
}
],
"eou": false,
"emotions_result": {
"positive": 0.22309092,
"neutral": 0.39286476,
"negative": 0.38404432
},
"processed_audio_start": "0s",
"processed_audio_end": "2.444875008s",
"backend_info": {
"model_name": "general",
"model_version": "M-02.002.00-general-01",
"server_version": "02.004.00-rh8-trt-02"
},
"channel": 0,
"speaker_info": {
"speaker_id": 2,
"main_speaker_confidence": 0.31004992
}
},
{
"results": [
{
"text": "один два четыре пять шесть",
"normalized_text": "1, 3, 4, 5 6.",
"start": "0.320s",
"end": "1.880s",
"word_alignments": [
{
"word": "один",
"start": "0.320s",
"end": "0.500s"
},
{
"word": "два",
"start": "0.780s",
"end": "0.880s"
},
{
"word": "четыре",
"start": "1.160s",
"end": "1.380s"
},
{
"word": "пять",
"start": "1.480s",
"end": "1.620s"
},
{
"word": "шесть",
"start": "1.700s",
"end": "1.880s"
}
]
}
],
"eou": false,
"emotions_result": {
"positive": 0.0006413624,
"neutral": 0.9987526,
"negative": 0.000606051
},
"processed_audio_start": "0s",
"processed_audio_end": "2.444875008s",
"backend_info": {
"model_name": "general",
"model_version": "M-02.002.00-general-01",
"server_version": "02.004.00-rh8-trt-02"
},
"channel": 0,
"speaker_info": {
"speaker_id": -1,
"main_speaker_confidence": 0.31374687
}
},
{
"results": [
{
"text": "четыре пять шесть",
"normalized_text": "4, 5 6.",
"start": "1.140s",
"end": "1.900s",
"word_alignments": [
{
"word": "четыре",
"start": "1.140s",
"end": "1.400s"
},
{
"word": "пять",
"start": "1.480s",
"end": "1.620s"
},
{
"word": "шесть",
"start": "1.680s",
"end": "1.900s"
}
]
}
],
"eou": true,
"emotions_result": {
"positive": 0.11293165,
"neutral": 0.6017238,
"negative": 0.28534454
},
"processed_audio_start": "0s",
"processed_audio_end": "2.444875008s",
"backend_info": {
"model_name": "general",
"model_version": "M-02.002.00-general-01",
"server_version": "02.004.00-rh8-trt-02"
},
"channel": 0,
"speaker_info": {
"speaker_id": 1,
"main_speaker_confidence": 0.3762032
}
}
]
{
"insight_result": {
"csi": {
"positive": 0.6,
"negative": 0.4,
"prediction": 1
}
},
"result": [см. в примере результата без оценки CSI]
}
Коды ошибок
Код | Описание |
---|---|
400 | Ошибка в параметрах запроса. Пример {"status": 400, "message": "Id must not be empty"} |
401 | Не предоставлен токен для аутентификации. Пример {"status": 401, "message": "Unauthorized"} |
402 | Требуется оплатить сервис. Пример {"status": 402, "message": "Payment Required"} |
413 | Превышен максимальный размер входных данных. Пример {"status": 413, "message": "Payload too large"} |
429 | Слишком много запросов. Пример {"status": 429, "message": "Too Many Requests"} |
500 | Внутренняя ошибка сервиса. Пример {"status": 500, "message": "Internal Server Error"} |