Технологии
«Кто это сказал и на какой секунде»: AWS упаковала WhisperX в GPU-контейнер и развела его по двум эндпоинтам SageMaker AI
AWS WhisperX Deep Learning Container кладёт Whisper, выравнивание wav2vec2 и диаризацию говорящих в готовый GPU-образ: короткие клипы идут на real-time-эндпоинт в пределах 60 секунд, длинные записи — на асинхронный, через S3.

Две проблемы, на которых спотыкается обычная расшифровка
Любая команда, работающая с речью — записи контакт-центра, общие встречи, подкасты, стенограммы допросов, эфирные медиа, — упирается в одно и то же ограничение обычного speech-to-text: метки времени приходят на уровне фразы и врут на несколько секунд, а внятного ответа на вопрос «кто что сказал» просто нет. Из-за этого расшифровки трудно искать по словам, подписывать как субтитры, чистить перед публикацией или анализировать в масштабе: отсутствие метки говорящего ломает проверку на соответствие требованиям, а неточная метка времени — субтитр или редактирование.
WhisperX закрывает оба пробела: он оборачивает Whisper от OpenAI пакетным инференсом (batched inference), добавляет принудительное выравнивание wav2vec2 для точных меток времени по словам и диаризацию, то есть разметку говорящих. В AWS это упаковано в WhisperX Deep Learning Container (DLC) — GPU-образ, в котором уже лежат Whisper, модели выравнивания и веса диаризации, без необходимости в токене Hugging Face.
Кому это нужно и откуда взялась серия
Сценарии расписаны по отраслям: контакт-центры измеряют время разговора, проверяют соблюдение скрипта и считают тональность, команды превращают встречи в поисковые заметки, медиа и образовательные проекты генерируют точные субтитры в форматах SRT и WebVTT для больших библиотек контента. В регулируемых сферах — здравоохранении, юриспруденции, финансах — расшифровки с метками говорящих поддерживают аудит и legal discovery.
Материал — часть серии про специализированные DLC для мультимодальных задач: три контейнера AWS на четыре сценария, среди которых vLLM-Omni для синтеза речи, vLLM-Omni для изображений и видео, WhisperX для распознавания речи (эта публикация) и llama.cpp.
Контракт контейнера: порт, multipart и форматы вывода
Контейнер следует стандартному контракту обслуживания Amazon SageMaker AI, так что разворачивается как любая другая модель: слушает порт 8080, принимает инференс через POST /invocations и отдаёт проверку работоспособности через GET /ping. Запрос — multipart/form-data: аудио уходит частью file, рядом идут необязательные текстовые поля вроде language, diarize и response_format, причём SageMaker AI передаёт заголовок ContentType вместе с границей multipart в контейнер без изменений.
Сам контейнер, по примеру из поста, берётся из Amazon ECR: 763104351884.dkr.ecr.<region>.amazonaws.com/whisperx:3.8.6-cu128-amzn2023-sagemaker — это Python 3.12, CUDA 12.8 и Amazon Linux 2023, а модель large-v2 выбрана по умолчанию. Вывод отдаётся в четырёх форматах — json, verbose_json, srt и vtt, так что один и тот же эндпоинт кормит и аналитический конвейер, и видеоредактор.
Real-time или асинхронный эндпоинт
Один и тот же DLC можно подать двумя способами, и выбор сводится к длине клипа и интерактивности. Синхронный real-time-эндпоинт годится для коротких клипов, которые гарантированно укладываются в 60-секундный потолок ответа Amazon SageMaker AI: вызов InvokeEndpoint передаёт тело запроса целиком, а ответ возвращается сразу.
Для длинного аудио AWS рекомендует асинхронный эндпоинт: клиент выгружает multipart-тело в Amazon S3 и вызывает InvokeEndpointAsync со ссылкой на объект, немедленно получая OutputLocation и FailureLocation вместо транскрипта. Дальше SageMaker AI читает вход из S3, контейнер выполняет тот же конвейер — детекцию голосовой активности, пакетное распознавание, выравнивание и диаризацию — и записывает результат в выходной путь S3 или документ об ошибке в путь отказа; клиент опрашивает выход и проверяет путь отказа, поэтому сбойный запрос возвращает ошибку, а не зависает. Структурно конфигурация отличается только блоком AsyncInferenceConfig с S3OutputPath и S3FailurePath.
Масштабирование в обоих режимах — только добавлением инстансов, а не параллелизмом: инференс сериализуется в один запрос на контейнер, поэтому для асинхронного эндпоинта выставляется MaxConcurrentInvocationsPerInstance=1, а при простое его можно масштабировать до нуля инстансов и получать уведомления о завершении через Amazon SNS вместо плотного опроса.
Пин AMI, холодный старт и проверка на живом аудио
Одна деталь ломает развёртывание чаще всего: на каждом GPU-варианте обязательно задаётся InferenceAmiVersion=al2-ami-sagemaker-inference-gpu-3-1. Без этого пина эндпоинт не поднимается с пустой в логах ошибкой CannotStartContainerError, потому что драйверы хостового AMI не подходят для образа с CUDA 12.8. Заодно авторы советуют закладывать щедрый таймаут проверки работоспособности при старте (900 секунд для real-time и 1200 для асинхронного), так как веса загружаются лениво.
Из этого же следует поведение холодного вызова: первый запрос догружает large-v2 и модель выравнивания и может превысить 60 секунд — перед показом стоит «прогреть» эндпоинт или сразу выбрать асинхронный путь. По железу выбор простой: ml.g4dn.xlarge (T4) ради стоимости, ml.g5.2xlarge (A10G) с запасом на будущее. Для асинхронного режима нужен бакет S3, в имени которого есть «sagemaker», иначе стандартная политика AmazonSageMakerFullAccess не даст доступ.
Проверяли всё на публичной записи переговоров авиадиспетчеров с рейсом US Airways Flight 1549 — том самом приводнении на Гудзон в 2009 году: реальный многосторонний радиообмен с шумом, компрессией и быстрым проговариванием позывных. Сорокасекундный фрагмент отправили на real-time-эндпоинт и получили расшифровку с метками говорящих, например: «[00:02] SPEAKER_01: Cactus 1549, turn left heading 270». Полную запись длительностью около трёх минут отдали асинхронному эндпоинту — в ответе, среди прочего, «[00:28] Check, it's 1529, which engines?» и «[03:01] You can fly 4718, climb and maintain 1-2-thousand».
Что советуют для продакшена
Список рекомендаций в посте предельно прикладной: пиновать GPU-AMI, масштабировать инстансами, а не параллелизмом, автоматически сжимать асинхронный эндпоинт до нуля в простое и переходить на SNS-уведомления вместо частого опроса. Чтобы не ловить ошибки нехватки ёмкости, в пул инстансов Amazon SageMaker AI стоит перечислять до пяти типов — платформа берёт приоритетный, а при отсутствии ёмкости падает на следующий.
Артефакты в S3 предлагается защищать по умолчанию: включить Block Public Access, шифрование SSE-S3 или SSE-KMS, режим владения BucketOwnerEnforced и ограничить роль исполнения конкретными бакетами и ключами. Транскрипты звонков и встреч могут содержать персональные данные, поэтому артефакты нужно шифровать, доступ ограничивать, а редактирование делать ниже по потоку — как раз с опорой на метки времени по словам. Для наблюдаемости — Amazon CloudWatch с алармами на сбои и повторами вокруг холодного старта, а для глубокой видимости по GPU включаются детальные метрики Amazon SageMaker AI и дашборд Insights.
Авторы оговаривают, что материал — техническое руководство, а не отчёт о замерах: сравнительных бенчмарков точности в посте нет, а запись с диспетчерами приведена как показательный пример сложного аудио. Готовый исполняемый ноутбук лежит в репозитории AWS Samples и запускается в Amazon SageMaker AI Studio на своих записях; после экспериментов GPU-эндпоинты нужно удалять — они биллятся, пока живут, вместе с конфигурацией эндпоинта и моделью.