Распознавание длинных аудио
Распознавание длинных аудио подходит для многоканальных аудиофайлов до 1 ГБ.
Распознавание длинных аудио немного дешевле других способов распознавания, однако не подходит в сценариях распознавания речи онлайн — время ответа больше. Подробнее о стоимости в разделе Правила тарификации для SpeechKit.
Примечание
Сейчас вы можете распознавать длинные аудио только на русском языке.
Распознать длинное аудио
Чтобы распознать длинное аудио, необходимо выполнить 2 запроса:
Если вы отправляете файлы с помощью gRPC, дополнительно прочитайте раздел Особенности использования gRPC.
Перед началом
-
Запрос на распознавание необходимо отправлять от имени сервисного аккаунта с ролью
editor
на каталог, в котором он создан.Если необходимо, воспользуйтесь инструкциями:
- Создание сервисного аккаунта. В консоли управления вы можете назначить необходимые роли при создании сервисного аккаунта.
- Просмотр назначенных ролей.
- Назначение роли сервисному аккаунту.
-
Получите IAM-токен или API-ключ для вашего сервисного аккаунта. В примерах для аутентификации используется IAM-токен.
Чтобы использовать API-ключ, передайте его в заголовке
Authorization
в следующем формате:Authorization: Api-Key <API-ключ>
-
Загрузите аудиофайл в сервис Yandex Object Storage и получите ссылку на загруженный файл:
-
Если у вас еще нет бакета в Object Storage, создайте его.
-
Загрузите аудиофайл в ваш бакет. В терминах Object Storage загружаемые файлы называются объектами.
-
Получите ссылку на загруженный файл. Используйте эту ссылку в запросе на распознавание аудио.
Ссылка на загруженный файл имеет вид:
https://storage.yandexcloud.net/<имя-бакета>/<путь-к-файлу>
Для бакета с ограниченным доступом в ссылке будут дополнительные query-параметры (после знака
?
). В SpeechKit эти параметры не надо передавать — они игнорируются.
-
Отправить файл на распознавание
HTTP-Запрос
POST https://transcribe.api.cloud.yandex.net/speech/stt/v2/longRunningRecognize
Параметры в теле запроса
{
"config": {
"specification": {
"languageCode": "string",
"model": "string",
"profanityFilter": "string",
"audioEncoding": "string",
"sampleRateHertz": "integer",
"audioChannelCount": "integer"
}
},
"audio": {
"uri": "string"
}
}
Параметр | Описание |
---|---|
config | object Поле с настройками распознавания. |
config. specification |
object Настройки распознавания. |
config. specification. languageCode |
string Язык, для которого будет выполнено распознавание. Сейчас поддерживается только русский язык — ru-RU . |
config. specification. model |
string Языковая модель, которую следует использовать при распознавании. Чем точнее выбрана модель, тем лучше результат распознавания. В одном запросе можно указать только одну модель. Допустимые значения зависят от выбранного языка. Значение параметра по умолчанию: general . В зависимости от выбранной модели может измениться тарификация. |
config. specification. profanityFilter |
boolean Фильтр ненормативной лексики. Допустимые значения:
|
config. specification. audioEncoding |
string Формат передаваемого аудио. Допустимые значения:
|
config. specification. sampleRateHertz |
integer (int64) Частота дискретизации передаваемого аудио. Этот параметр обязателен, если значение format равно LINEAR16_PCM . Допустимые значения:
|
config. specification. audioChannelCount |
integer (int64) Количество каналов для файлов в формате LPCM. По умолчанию используется значение 1 .Не используйте это поле для файлов в формате OggOpus. |
config. specification. rawResults |
boolean Флаг, указывающий, как писать числа. true — писать прописью, false (по умолчанию) — писать цифрами. |
audio. uri |
string URI аудиофайла для распознавания. Поддерживаются только ссылки на файлы, которые хранятся в Yandex Object Storage. |
Ответ
Если запрос был составлен правильно, сервис возвращает объект Operation, в котором содержится идентификатор операции распознавания (id
):
{
"done": false,
"id": "e03sup6d5h7rq574ht8g",
"createdAt": "2019-04-21T22:49:29Z",
"createdBy": "ajes08feato88ehbbhqq",
"modifiedAt": "2019-04-21T22:49:29Z"
}
Используйте полученный идентификатор на следующем шаге.
Получить результаты распознавания
Проверяйте результаты распознавания, используя полученный идентификатор. Количество запросов на проверку результатов ограничено, поэтому учитывайте скорость распознавания: 1 минута одноканального аудио распознается примерно за 10 секунд.
Важно
Результаты распознавания хранятся на сервере 3 суток. После этого вы не сможете запросить результаты распознавания используя полученный идентификатор.
HTTP-запрос
GET https://operation.api.cloud.yandex.net/operations/{operationId}
Path-параметры
Параметр | Описание |
---|---|
operationId | Идентификатор операции, полученный при отправке запроса на распознавание. |
Ответ
Когда распознавание будет закончено, значение поля done
будет true
, а в поле response
будет список результатов распознавания chunks[]
.
Каждый результат в chunks[]
содержит поля:
alternatives[]
- список вариантов распознанного текста. Каждый вариант содержит поля:words[]
- список распознанных слов.startTime
— временная отметка начала слова на аудиозаписи. Возможна погрешность в пределах 1-2 секунд.endTime
— временная отметка конца слова. Возможна погрешность в пределах 1-2 секунд.word
— распознанное слово. Распознанные числа пишутся прописью, например не12
, адвенадцать
.confidence
- это поле сейчас не поддерживается, не используйте его.
text
- распознанный текст целиком. По умолчанию числа пишутся цифрами. Чтобы весь текст был прописью, укажитеtrue
в полеraw_results
.confidence
- это поле сейчас не поддерживается, не используйте его.
channelTag
- аудиоканал, для которого выполнено распознавание.
{
"done": true,
"response": {
"@type": "type.googleapis.com/yandex.cloud.ai.stt.v2.LongRunningRecognitionResponse",
"chunks": [
{
"alternatives": [
{
"words": [
{
"startTime": "0.879999999s",
"endTime": "1.159999992s",
"word": "при",
"confidence": 1
},
{
"startTime": "1.219999995s",
"endTime": "1.539999988s",
"word": "написании",
"confidence": 1
},
...
],
"text": "при написании хоббита толкин обращался к мотивам скандинавской мифологии древней английской поэмы беовульф",
"confidence": 1
}
],
"channelTag": "1"
},
...
]
},
"id": "e03sup6d5h7rq574ht8g",
"createdAt": "2019-04-21T22:49:29Z",
"createdBy": "ajes08feato88ehbbhqq",
"modifiedAt": "2019-04-21T22:49:36Z"
}
Особенности использования gRPC
Чтобы использовать сервис, создайте приложение, которое будет отправлять аудиофрагменты и обрабатывать ответ с результатами распознавания.
Чтобы приложение смогло отправлять запросы и запрашивать результат, необходимо сгенерировать код интерфейса клиента для используемого языка программирования. Сгенерируйте этот код из файлов stt_service.proto и operation_service.proto
из репозитория Yandex.Cloud API.
В документации gRPC вы можете найти подробные инструкции по генерации интерфейсов и реализации клиентских приложений для различных языков программирования.
Важно
При запросе результатов операции gRPC-клиенты по умолчанию ограничивают максимальный размер сообщения, который они могут принять в качестве ответа — не более 4 МБ. Если ответ с результатами распознавания будет больше этого размера, то вы получите ошибку.
Чтобы получить ответ целиком, повысьте ограничение на максимальный размер сообщения:
- для Go используйте функцию MaxCallRecvMsgSize.
- для C++ в методе call задайте значение
max_receive_message_size
.
Примеры
Распознать русскую речь в формате OggOpus
Чтобы распознать речь в формате OggOpus, достаточно указать в конфигурации язык распознавания в поле languageCode
. По умолчанию будет использована языковая модель general
.
-
Сформируйте тело запроса и сохраните его в файл, например
body.json
. Ссылку на аудиофайл в Object Storage укажите в полеuri
:{ "config": { "specification": { "languageCode": "ru-RU" } }, "audio": { "uri": "https://storage.yandexcloud.net/speechkit/speech.ogg" } }
-
Отправьте запрос на распознавание:
$ export IAM_TOKEN=CggaATEVAgA... $ curl -X POST \ -H "Authorization: Bearer ${IAM_TOKEN}" \ -d '@body.json' \ https://transcribe.api.cloud.yandex.net/speech/stt/v2/longRunningRecognize { "done": false, "id": "e03sup6d5h1qr574ht99", "createdAt": "2019-04-21T22:49:29Z", "createdBy": "ajes08feato88ehbbhqq", "modifiedAt": "2019-04-21T22:49:29Z" }
Сохраните идентификатор операции распознавания, полученный в ответе.
-
Подождите немного, пока закончится распознавание. 1 минута одноканального аудио распознается примерно за 10 секунд.
-
Отправьте запрос на получение информации об операции:
$ curl -H "Authorization: Bearer ${IAM_TOKEN}" \ https://operation.api.cloud.yandex.net/operations/e03sup6d5h1qr574ht99 { "done": true, "response": { "@type": "type.googleapis.com/yandex.cloud.ai.stt.v2.LongRunningRecognitionResponse", "chunks": [ { "alternatives": [ { "text": "твой номер 212-85-06", "confidence": 1 } ], "channelTag": "1" } ] }, "id": "e03sup6d5h1qr574ht99", "createdAt": "2019-04-21T22:49:29Z", "createdBy": "ajes08feato88ehbbhqq", "modifiedAt": "2019-04-21T22:49:36Z" }
-
Создайте API-ключ, используемый для аутентификации в этом примере. Чтобы использовать IAM-токен для аутентификации, исправьте заголовок в переменной
header
: заменитеApi-Key
наBearer
и добавьте код для получения IAM-токена вместо API-ключа. -
Создайте Python-файл, например
test.py
, и добавьте в него следующий код:# -*- coding: utf-8 -*- import requests import time import json # Укажите ваш API-ключ и ссылку на аудиофайл в Object Storage. key = '<API key>' filelink = 'https://storage.yandexcloud.net/speechkit/speech.ogg' POST = "https://transcribe.api.cloud.yandex.net/speech/stt/v2/longRunningRecognize" body ={ "config": { "specification": { "languageCode": "ru-RU" } }, "audio": { "uri": filelink } } # Если вы хотите использовать IAM-токен для аутентификации, замените Api-Key на Bearer. header = {'Authorization': 'Api-Key {}'.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'])
-
Выполните созданный файл:
$ python test.py
Распознать речь в формате LPCM
Чтобы распознать речь в формате LPCM, в настройках распознавания укажите частоту дискретизации файла и количество аудиоканалов. Язык распознавания укажите в поле languageCode
, языковую модель задайте в поле model
.
-
Сформируйте тело запроса и сохраните его в файл, например
body.json
:Примечание
Чтобы использовать языковую модель по умолчанию, не передавайте поле
model
в запросе.{ "config": { "specification": { "languageCode": "ru-RU", "model": "general:rc", "audioEncoding": "LINEAR16_PCM", "sampleRateHertz": 8000, "audioChannelCount": 1 } }, "audio": { "uri": "https://storage.yandexcloud.net/speechkit/speech.pcm" } }
-
Отправьте запрос на распознавание:
$ export IAM_TOKEN=CggaATEVAgA... $ curl -X POST \ -H "Authorization: Bearer ${IAM_TOKEN}" \ -d '@body.json' \ https://transcribe.api.cloud.yandex.net/speech/stt/v2/longRunningRecognize { "done": false, "id": "e03sup6d5h1qr574ht99", "createdAt": "2019-04-21T22:49:29Z", "createdBy": "ajes08feato88ehbbhqq", "modifiedAt": "2019-04-21T22:49:29Z" }
Сохраните идентификатор операции распознавания, полученный в ответе.
-
Подождите немного, пока закончится распознавание. 1 минута одноканального аудио распознается примерно за 10 секунд.
-
Отправьте запрос на получение информации об операции:
$ curl -H "Authorization: Bearer ${IAM_TOKEN}" \ https://operation.api.cloud.yandex.net/operations/e03sup6d5h1qr574ht99 { "done": true, "response": { "@type": "type.googleapis.com/yandex.cloud.ai.stt.v2.LongRunningRecognitionResponse", "chunks": [ { "alternatives": [ { "text": "привет мир", "confidence": 1 } ], "channelTag": "1" } ] }, "id": "e03sup6d5h1qr574ht99", "createdAt": "2019-04-21T22:49:29Z", "createdBy": "ajes08feato88ehbbhqq", "modifiedAt": "2019-04-21T22:49:36Z" }