Данный скрипт берет аудио-файлы из бакета 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, который выполняет обработку входящих файлов по расписанию.