API асинхронного распознавания речи (gRPC)
Асинхронное распознавание по протоколу gRPC проходит в несколько шагов:
- Создание клиентского приложения.
- Загрузка файла для распознавания.
- Создание задачи на асинхронное распознавание.
- Проверка статуса задачи.
- Скачивание результата.
Запросы к API передаются на адрес:
smartspeech.sber.ru
Заголовки запросов и ответов для всех шагов одинаковы:
Заголовки запроса
Информация об аутентификации с помощью Access Token, переданная через OAuth 2.0.
Пример: Bearer eyJhbGciOi.cCI6IkpXVCJ9.eyJzd.1hcnRzcG.KUkw
Заголовки ответа
Уникальный идентификатор запроса, генерируемый сервером. 36 символов.
Пример: 22345200-abe8-4f60-90c8-0d43c5f6c0f6
Создание приложения
Для работы с сервисом распознавания речи SaluteSpeech создайте клиентское приложение. Вы можете использовать любой язык программирования, который есть в библиотеке для работы с gRPC.
При написании приложения используйте proto-файл.
Подробную инструкцию по написанию клиентских приложений для gRPC с примерами вы найдете в официальной документации gRPC (на английском языке).
Загрузка файла
При обращении по gRPC-протоколу клиентское приложение отправляет аудиофайл с помощью метода Upload
. Аудиофайл отправляется в виде чанков в сообщении UploadRequest.file_chunk
типа bytes
.
Сервис вернет сообщение UploadResponse
с идентификатором загруженного файла в параметре request_file_id
.
Протокол взаимодействия смотрите по ссылке.
Создание задачи
С помощью метода AsyncRecognize
клиентское приложение передает идентификатор загруженного файла и параметры распознавания. В ответе сервис вернет уникальный идентификатор задачи на распознавание.
При написании приложения используйте proto-файл.
Получение статуса задачи
Клиентское приложение передает идентификатор задачи на распознавание с помощью метода Task
. Если задача готова, в ответе придет объект Task
со статусом DONE
и идентификатор файла с результатом распознавания в параметре response_file_id
. При статусе ERROR
описание ошибки будет отображаться в параметре error
.
Пример структуры Task для gRPC можно посмотреть по ссылке.
Отмена задачи
Если при проверке статуса сервис вернул объект Task
со статусом NEW
, задачу можно отменить. Клиентское приложение передает идентификатор задачи с помощью метода CancelTask
. В ответе сервис вернет объект Task
со статусом CANCELED
.
Пример структуры Task
для gRPC можно посмотреть по ссылке.
Скачивание результата
Клиентское приложение передает идентификатор файла с результатом распознавания с помощью метода Download
. Значение передается в параметре response_file_id
сообщения DownloadRequest
. Сервис вернет результат распознавания в виде чанков в сообщении DownloadResponse
.
Параметры ответа
- –1 — результат с речью обоих спикеров,
- 1 — результат с речью одного спикера,
- 2 — результат с речью другого спикера
UNSPECIFIED
— нет чанка.ORGANIC
— чанк закончился.NO_SPEECH_TIMEOUT
— в чанке не было речи в течение времени, указанного в параметреno_speech_timeout
.MAX_SPEECH_TIMEOUT
— речь в чанке шла непрерывно в течение времени, указанного в параметреmax_speech_timeout
Список гипотез распознавания речи. Гипотезы отсортированы по убыванию вероятности
Не нормализованный результат распознавания (например, сто двадцать три)
Нормализованный результат распознавания (например, 123)
Время от начала аудиозаписи до начала данной гипотезы в ней
Время от начала аудиозаписи до конца данной гипотезы в ней
Время начала и окончания каждого слова
Слово
Время от начала аудиозаписи до начала произнесения слова
Время от начала аудиозаписи до конца произнесения слова
Признак окончания распознанного предложения.
Если true
, то данный результат распознавания можно считать финальным.
Если false
, то возможно уточнение распознавания в следующих сообщениях
Список эмоций в речи. Значения эмоциональной окраски речи приходят в виде коэффициентов в диапазоне от 0 до 1, где 1 — наиболее вероятная эмоция ответа, а 0 — наименее вероятная
Вероятность позитивной эмоциональной окраски речи — диапазон от 0 до 1
Вероятность нейтральной эмоциональной окраски речи — диапазон от 0 до 1
Вероятность негативной эмоциональной окраски речи — диапазон от 0 до 1
Время начала обработанного аудио
Время конца обработанного аудио
Модель ASR
Название модели
Версия модели
Версия сервера
Номер канала в двухканальных аудио. Для Insights надо, чтоб оператор был 0, а клиент — 1
Параметры разделения спикеров
Идентификатор результата распознавания:
Маркер главного спикера
Причина окончания чанка. Возможные значения:
Результаты анализа Insights модели
Результаты анализа модели CSI
Вероятность позитивной эмоциональной окраски речи — диапазон от 0 до 1
Вероятность негативной эмоциональной окраски речи — диапазон от 0 до 1
Предсказанная эмоция
Результаты анализа модели call_features. Описание параметров — в разделах Статистика по одному каналу и Сравнительная статистика
Примеры ответа
- Стандартный ответ
- Разделение спикеров
- 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
},
{
"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.018223174,
"neutral": 0.76795995,
"negative": 0.2138168
},
"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": 1
}
]
[
{
"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]
}
Коды ошибок
Сервис SaluteSpeech сообщает об ошибках стандартными gRPC-статусами.
Некоторые коды и описание ошибок:
Код | Описание |
---|---|
|
Клиент неправильно заполнил параметры запроса |
|
Не определена модель из запроса |
|
Клиенту недоступно API |
|
Клиент превысил квоту |
|
Слишком много запросов |
|
Ошибка в работе сервиса |
|
Клиент не предоставил или предоставил истекший/невалидный токен в заголовке Authorization |