Асинхронное распознавание аудиофайлов в формате OggOpus в API v2
Ниже рассмотрены примеры асинхронного распознавания речи из аудиофайла с помощью API v2 SpeechKit. В примерах заданы параметры:
- язык — русский;
- формат аудиопотока — OggOpus с расширением файла OPUS;
- остальные параметры оставлены по умолчанию.
Вы можете сформировать и отправить запрос на распознавание речи с помощью утилиты cURL
Аутентификация происходит от имени сервисного аккаунта с помощью IAM-токена. Подробнее об аутентификации в API SpeechKit.
Перед началом работы
-
Создайте бакет и загрузите в него аудиофайл, который вы хотите распознать.
-
Создайте сервисный аккаунт.
Важно
Асинхронно распознать аудиофайлы можно только от имени сервисного аккаунта. Не используйте для этого другие аккаунты в Yandex Cloud.
-
Назначьте сервисному аккаунту роли
storage.uploader
иai.speechkit-stt.user
на каталог, в котором вы ранее создали бакет. -
Получите IAM-токен или API-ключ для созданного сервисного аккаунта.
Если у вас нет аудиофайла формата OggOpus, вы можете скачать пример файла
Выполните распознавание с помощью API
Важно
Для двухканальной OggOpus-записи не нужно указывать количество каналов с помощью параметра audioChannelCount
.
-
Получите ссылку на аудиофайл в Object Storage.
-
Создайте файл, например
body.json
, и добавьте в него код:{ "config": { "specification": { "languageCode": "ru-RU" } }, "audio": { "uri": "<ссылка_на_аудиофайл>" } }
Где:
-
languageCode
— язык, для которого будет выполнено распознавание. -
uri
— ссылка на аудиофайл в Object Storage. Пример ссылки:https://storage.yandexcloud.net/speechkit/speech.opus
.Для бакета с ограниченным доступом в ссылке присутствуют дополнительные query-параметры (после знака
?
). Эти параметры не нужно передавать в SpeechKit — они игнорируются.
Формат аудиопотока указывать не нужно, так как OggOpus — формат по умолчанию.
Примечание
Не передавайте параметр audioChannelCount, чтобы указать количество аудиоканалов. Файлы формата OggOpus уже содержат информацию о количестве каналов.
-
-
Выполните созданный файл:
export IAM_TOKEN=<IAM-токен_сервисного_аккаунта> && \ curl \ --request POST \ --header "Authorization: Bearer ${IAM_TOKEN}" \ --data "@body.json" \ https://transcribe.api.cloud.yandex.net/speech/stt/v2/longRunningRecognize
Где
IAM_TOKEN
— IAM-токен сервисного аккаунта.Пример результата:
{ "done": false, "id": "e03sup6d5h1q********", "createdAt": "2019-04-21T22:49:29Z", "createdBy": "ajes08feato8********", "modifiedAt": "2019-04-21T22:49:29Z" }
Сохраните идентификатор (
id
) операции распознавания, полученный в ответе. -
Подождите, пока закончится распознавание. Одна минута аудио распознается примерно за 10 секунд.
-
Отправьте запрос на получение информации об операции:
curl \ --header "Authorization: Bearer ${IAM_TOKEN}" \ https://operation.api.cloud.yandex.net/operations/<идентификатор_операции_распознавания>
Пример результата:
{ "done": true, "response": { "@type": "type.googleapis.com/yandex.cloud.ai.stt.v2.LongRunningRecognitionResponse", "chunks": [ { "alternatives": [ { "text": "твой номер 212-85-06", "confidence": 1 } ], "channelTag": "1" } ] }, "id": "e03sup6d5h1q********", "createdAt": "2019-04-21T22:49:29Z", "createdBy": "ajes08feato8********", "modifiedAt": "2019-04-21T22:49:36Z" }
-
Установите пакет
requests
с помощью менеджера пакетов pip :pip install requests
-
Создайте файл, например
test.py
, и добавьте в него код:# -*- coding: utf-8 -*- import requests import time import json # Укажите ваш IAM-токен и ссылку на аудиофайл в Object Storage. key = '<IAM-токен_сервисного_аккаунта>' filelink = '<ссылка_на_аудиофайл>' POST ='https://transcribe.api.cloud.yandex.net/speech/stt/v2/longRunningRecognize' body ={ "config": { "specification": { "languageCode": "ru-RU" } }, "audio": { "uri": filelink } } header = {'Authorization': 'Bearer {}'.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'])
Где:
key
— IAM-токен сервисного аккаунта;filelink
— ссылка на аудиофайл в Object Storage.
-
Выполните созданный файл:
python3 test.py
Решение проблем
Если в ответе возвращается пустота, пустой файл или ошибка Invalid audio received
, проверьте кодек, которым закодирован ваш аудиофайл. Чтобы файл был корректно распознан, недостаточно изменить его расширение.
Чтобы конвертировать файл с расширением OGG в поддерживаемый формат OggOpus, воспользуйтесь утилитой FFmpeg
ffmpeg -i audio.ogg -c:a libopus -b:a 65536 audio_new.ogg