Данный скрипт берет аудио-файлы из бакета Object Storage, отправляет их на распознавание в сервис SpeechKit, после чего – сохраняет результат распознавания обратно в бакет Object Storage.
Процесс распознавания длинных аудио – асинхронный, поэтому требуется, после первичной отправки аудио-файла сохранить его operation-id, и затем - периодически проверять статус задания.
Если задание выполнено – можно сохранить результат, и убрать файл из последующих проверок статуса задания.
Скрипт написан на Python поэтому может быть легко разобран, доработан и оптимизирован под ваш сценарий.
-
Пользователь загружает аудио-файлы в поддерживаемых форматах в бакет Object Storage, в директорию (префикс)
input. Также, может быть загружен файлconfig.json, чтобы задать язык распознавания речи (по умолчанию, и при отсутствии файлаconfig.json— будет использован русский язык[ru-RU]).config.jsonимеет простой формат, содержит только один параметр в формате JSON:{ 'lang': 'ru-RU' } -
Скрипт проверяет содержимое папки
inputв бакете, составляет список файлов, которые необходимо отправить на распознавание, исключая файлы неподдерживаемого формата, и исключает файлы, которые уже находятся в процессе распознавания (за счет проверки наличия файла в папкеlog). Также, проверяется наличие файлаconfig.jsonи применяется тот язык распознавания, который в нем указан. -
Скрипт отправляет в Transcribe API прямые ссылки на файлы из списка, составленного ранее.
-
Сервис SpeechKit получает файл из бакета по подписанной ссылке, создает задание
LongRunningRecognitionTask, возвращает ID операции распознавания. -
ID операции распознавания сохраняется в папке
log, для каждого из отправленных на обработку файлов. -
Периодически, в зависимости от расписания запуска скрипта, скрипт проверяет папку
logна предмет наличия аудио-файлов в процессе обработки. -
Если в файле содержится параметр
{'done': 'false'}– скрипт отправляет ID операции в сервис Operations API, чтобы проверить статус операции. -
Если операция завершена – результат операции сохраняется в папку
outв формате JSON, а аналогичный файл в папкеlogизменяется на файл с содержимым{'done': 'true'}, чтобы исключить его из дальнейших проверок статуса операции.
Скрипт может быть запущен локально, для этого необходимо указать следующие переменные окружения:
| Переменная | Описание |
|---|---|
| S3_BUCKET | Имя бакета в Object Storage |
| S3_PREFIX | Префикс (или директория) для входящих файлов, например, input |
| S3_PREFIX_LOG | Префикс (или директория) для файлов в процессе обработки, например, log |
| S3_PREFIX_OUT | Префикс (или директория) для результатов обработки, например, out |
| S3_KEY | ID статического ключа доступа |
| S3_SECRET | Секрет статического ключа доступа |
| API_SECRET | Секрет API-ключа |
Рекомендуется разделить обрабатываемые, обработанные и файлы для обработки при помощи разных префиксов (подпапок), иначе можно получить непредсказуемое поведение.
Для того, чтобы создать ключ для S3 и API-ключ – необходимо создать сервисную учетную запись, а также – назначить роли storage.editor и ai.speechkit-stt.user.
Можно воспользоваться готовым Terraform модулем, который создает все необходимые ресурсы для начала обработки длинных аудио-файлов.
Можно установить cronjob для Kubernetes, который выполняет обработку входящих файлов по расписанию.
