- Дата публикации
Как дешево расшифровывать тысячи часов аудио: Parakeet-TDT на AWS Batch
Что нового
NVIDIA и AWS предлагают связку для массовой расшифровки аудио, где цена перестаёт быть главным ограничением.
Ключевые факты:
- Модель: NVIDIA Parakeet-TDT-0.6B-v3, август 2025.
- Тип: открытая мультиязычная ASR (распознавание речи) под лицензией CC-BY-4.0.
- Языки: 25 европейских языков, включая русский и украинский.
- Автоопределение языка — без ручного выбора.
- Заявленная точность от NVIDIA:
- 6,34% WER (ошибок слов) на чистом аудио.
- 11,66% WER при уровне шума 0 dB SNR.
- Длина аудио:
- До 24 минут с полной attention-моделью на 80 ГБ VRAM.
- До 3 часов с локальным attention на том же A100 80 ГБ.
- Архитектура Token-and-Duration Transducer (TDT):
- Модель одновременно предсказывает токены текста и длительность.
- Умеет "проскальзывать" тишину и повторяющиеся фрагменты.
- Скорость инференса: 0,24 секунды на 1 минуту аудио (сырое моделирование).
- В продакшн-пайплайне (с учётом загрузки модели, I/O и постобработки):
- Аудио 205 минут (3 часа 25 минут).
- Полное время джоба: 100 секунд.
- Эффективная скорость: 0,49 секунды на 1 минуту аудио.
Стоимость на AWS (регион us-east-1, инстанс g6.xlarge):
- On-Demand:
- Около $0,805 в час.
- ~$0,00011 за минуту аудио.
- Spot:
- Около $0,374 в час.
- ~$0,00005 за минуту аудио.
Это меньше одной десятой цента за час аудио при использовании Spot-инстансов.
Масштабирование:
- Архитектура обрабатывает файлы, загружаемые в Amazon S3, автоматически.
- Используются GPU-инстансы AWS (G6, G5, G4dn, P4, P5).
- Среда масштабируется до нуля, когда нет задач.
- Тест: 1000 файлов по 50 минут, параллельно на 100 g6.xlarge (по 10 файлов на инстанс).
Как это работает
Общая схема
- Вы загружаете аудиофайл в S3-бакет.
- Amazon EventBridge ловит событие
PutObject. - EventBridge создаёт задачу в AWS Batch.
- AWS Batch поднимает GPU-инстансы (например, g6.xlarge с NVIDIA L4).
- Инстансы тянут Docker-образ с моделью из Amazon ECR.
- Скрипт внутри контейнера:
- скачивает аудио из S3;
- прогоняет через Parakeet-TDT;
- сохраняет результат как JSON с тайм-кодами в выходной S3-бакет.
- Когда задач нет, кластер сворачивается до нуля — вы не платите за простаивающие GPU.
Модель и железо
Parakeet-TDT-0.6B-v3 — это мультиязычная ASR-модель с архитектурой Token-and-Duration Transducer и энкодером Fast Conformer.
Поддерживаемые языки (включая автоопределение):
- болгарский, хорватский, чешский, датский, нидерландский, английский, эстонский,
- финский, французский, немецкий, греческий, венгерский, итальянский,
- латышский, литовский, мальтийский, польский, португальский, румынский,
- словацкий, словенский, испанский, шведский, русский, украинский.
Требования к инстансам:
- Минимум 4 ГБ VRAM, лучше 8 ГБ и выше.
- Рекомендовано:
- G6 (NVIDIA L4) — лучший баланс цена/производительность по тестам AWS.
- Также подходят G5 (A10G), G4dn (T4).
- Для максимального throughput — P5 (H100) или P4 (A100).
Docker-образ с предзагруженной моделью
Контейнер собирается на базе Amazon Linux 2023, внутри — Python 3.12, ffmpeg, зависимости и предзагрузка модели, чтобы не ждать скачивание при каждом старте.
Полный Dockerfile из репозитория:
FROM public.ecr.aws/amazonlinux/amazonlinux:2023
WORKDIR /app
# Install system dependencies, Python 3.12, and ffmpeg
RUN dnf update -y && \
dnf install -y gcc-c++ python3.12-devel tar xz && \
ln -sf /usr/bin/python3.12 /usr/local/bin/python3 && \
python3 -m ensurepip && \
python3 -m pip install --no-cache-dir --upgrade pip && \
dnf clean all && rm -rf /var/cache/dnf
# Install Python dependencies and pre-cache the model
COPY ./requirements.txt requirements.txt
RUN pip install -U --no-cache-dir -r requirements.txt && \
rm -rf ~/.cache/pip /tmp/pip* && \
python3 -m compileall -q /usr/local/lib/python3.12/site-packages
COPY ./parakeet_transcribe.py parakeet_transcribe.py
# Cache model during build to eliminate runtime download
RUN python3 -c "from nemo.collections.asr.models import ASRModel; \
ASRModel.from_pretrained('nvidia/parakeet-tdt-0.6b-v3')"
CMD ["python3", "parakeet_transcribe.py"]
Сборка и публикация образа в ECR
Скрипт updateImage.sh автоматически:
- определяет окружение (CodeBuild или EC2),
- собирает контейнер,
- создаёт репозиторий в ECR (если его ещё нет),
- включает сканирование на уязвимости,
- пушит образ.
Запуск:
./updateImage.sh
Деплой инфраструктуры через CloudFormation
Инфраструктура описана в deployment.yaml. Скрипт buildArch.sh собирает данные по VPC, подсетям и security group и запускает деплой:
./buildArch.sh
Под капотом выполняется команда:
aws cloudformation deploy --stack-name batch-gpu-audio-transcription \
--template-file ./deployment.yaml \
--capabilities CAPABILITY_IAM \
--region ${AWS_REGION} \
--parameter-overrides VPCId=${VPC_ID} SubnetIds="${SUBNET_IDS}" \
SGIds="${SecurityGroup_IDS}" RTIds="${RouteTable_IDS}"
CloudFormation создаёт:
- AWS Batch Compute Environment с GPU-инстансами G6 и G5;
- очередь задач Batch и job definition, который ссылается на ваш ECR-образ;
- входной и выходной S3-бакеты с уведомлениями в EventBridge;
- правило EventBridge, запускающее Batch-задачу при загрузке файла в S3;
- конфигурацию CloudWatch Agent для мониторинга GPU/CPU/памяти;
- IAM-роли с минимально необходимыми правами.
Для выбора образа Amazon Linux 2023 с GPU AWS Batch использует:
ImageType: ECS_AL2023_NVIDIA
Можно также развернуть стек через консоль CloudFormation по ссылке из README репозитория.
Spot-инстансы для удешевления
Чтобы использовать EC2 Spot Instances, в deployment.yaml правят compute environment. Пример конфигурации:
DefaultComputeEnv:
Type: AWS::Batch::ComputeEnvironment
Properties:
Type: MANAGED
State: ENABLED
ComputeResources:
AllocationStrategy: SPOT_PRICE_CAPACITY_OPTIMIZED
Type: SPOT
BidPercentage: 100
InstanceTypes:
- "g6.xlarge"
- "g6.2xlarge"
- "g5.xlarge"
MinvCpus: !Ref DefaultCEMinvCpus
MaxvCpus: !Ref DefaultCEMaxvCpus
# ... remaining configuration unchanged
Включение Spot при деплое:
aws cloudformation deploy \
--stack-name batch-gpu-audio-transcription \
--template-file ./deployment.yaml \
--capabilities CAPABILITY_IAM \
--parameter-overrides UseSpotInstances=Yes \
VPCId=${VPC_ID} SubnetIds="${SUBNET_IDS}" SGIds="${SecurityGroup_IDS}" RTIds="${RouteTable_IDS}"
Стратегия SPOT_PRICE_CAPACITY_OPTIMIZED подбирает пулы Spot-инстансов с минимальной ценой и низкой вероятностью прерывания. Разнообразие типов (g6.xlarge, g6.2xlarge, g5.xlarge) повышает шанс, что ресурсы найдутся.
Если задать MinvCpus: 0, среда уходит в ноль, когда задач нет.
ASR-задачи здесь стейтлес и идемпотентны: если Spot-инстанс отбирают, AWS Batch просто перезапускает задачу (job definition настроен на до 2 повторных попыток).
Работа с длинным аудио и памятью
Память Parakeet-TDT растёт линейно с длительностью аудио. Энкодер Fast Conformer хранит представление всего сигнала, поэтому при удвоении длины аудио почти вдвое растёт потребление VRAM.
Согласно карточке модели:
- с полной attention-моделью на 80 ГБ VRAM можно обрабатывать до 24 минут;
- NVIDIA добавила режим локального внимания для длинных треков — до 3 часов на A100 80 ГБ.
Пример включения локального внимания:
# Enable local attention for long audio
asr_model.change_attention_model("rel_pos_local_attn", [128, 128])
asr_model.change_subsampling_conv_chunking_factor(1) # auto select
asr_model.transcribe(["input_audio.wav"])
Точность может немного просесть, это нужно проверять на своих данных.
Buffered streaming inference: длинное аудио на стандартном GPU
Если аудио больше 3 часов или вы хотите обрабатывать длинные записи на типичном g6.xlarge, помогает буферизованный стриминговый инференс.
Идея: обрабатывать аудио не целиком, а кусками с перекрытием, чтобы не держать весь контекст в памяти.
Настройки из примера:
- длина чанка: 20 секунд;
- левый контекст: 5 секунд;
- правый контекст: 3 секунды.
Это позволяет сгладить стыки между чанками. Если уменьшить длину чанка, возрастёт время обработки. Параметры нужно подбирать под свои данные.
Фрагмент кода стримингового цикла:
# Streaming inference loop
while left_sample < audio_batch.shape[1]:
# add samples to buffer
chunk_length = min(right_sample, audio_batch.shape[1]) - left_sample
# [Logic to manage buffer and flags omitted for brevity]
buffer.add_audio_batch_(...)
# Encode using full buffer [left-chunk-right]
encoder_output, encoder_output_len = asr_model(
input_signal=buffer.samples,
input_signal_length=buffer.context_size_batch.total(),
)
# Decode only chunk frames (constant memory usage)
chunk_batched_hyps, _, state = decoding_computer(...)
# Advance sliding window
left_sample = right_sample
right_sample = min(right_sample + context_samples.chunk, audio_batch.shape[1])
За счёт фиксированного размера чанка VRAM не зависит от общей длины аудио. Один g6.xlarge может обработать 10-часовой файл с тем же потреблением памяти, что и 10-минутный.
Чтобы включить streaming-режим при деплое CloudFormation:
aws cloudformation deploy \
–stack-name batch-gpu-audio-transcription \
–template-file ./deployment.yaml \
–capabilities CAPABILITY_IAM \
–parameter-overrides EnableStreaming=Yes \
VPCId=your-vpc-id SubnetIds=your-subnet-ids SGIds=your-sg-ids RTIds=your-rt-ids
(Обратите внимание на правильные дефисы в реальной команде — в некоторых шрифтах длинное тире и минус выглядят похоже.)
Тестирование и мониторинг
Для проверки масштабируемости авторы прогнали эксперимент:
- 1000 одинаковых аудиофайлов по 50 минут.
- 100 g6.xlarge инстансов.
- Каждый инстанс обрабатывал 10 файлов.
CloudWatch Agent в этой архитектуре собирает каждые 10 секунд:
- загрузку GPU,
- потребление энергии GPU,
- использование VRAM,
- загрузку CPU,
- использование оперативной памяти,
- использование диска.
Метрики попадают в namespace CWAgent, из них можно собрать дашборды для живого мониторинга.
Что это значит для вас
Кому это реально полезно
- Медиасервисы и архивы. Если у вас тысячи часов подкастов, интервью, лекций или новостей на европейских языках, эта связка превращает расшифровку из дорогой услуги в почти бесплатный бэкграунд-процесс.
- Контакт-центры и call-центры. Массовая транскрибация звонков для аналитики, поиска по разговорам, контроля качества.
- Обучающие платформы и университеты. Автоматические субтитры и расшифровки лекций на 25 языках, плюс возможность строить поиск по тексту.
- ML-команды. Дешёвое формирование датасетов для обучения своих моделей: ASR, диаризация, поиск по аудио.
- Медиапроекты с международной аудиторией. Один пайплайн для большинства европейских языков, без настройки под каждый язык.
Когда связка подходит хуже
- Если вам нужна поддержка языков вне списка 25 европейских — придётся искать другие модели.
- Если важна сверхточная транскрибация на уровне специализированных коммерческих моделей под один язык, придётся сравнивать качество на своих данных.
- Если у вас очень мало аудио (десятки минут в месяц), возможно, проще вызвать готовый managed-сервис, чем поднимать Batch, ECR и CloudFormation.
- Если у вас нет доступа к AWS (например, корпоративные ограничения или политика по региону), переносить эту архитектуру на другую инфраструктуру придётся руками.
Доступность из России
AWS официально не ориентируется на рынок России, и доступ к сервисам может потребовать:
- регистрацию аккаунта за пределами РФ;
- платёжные инструменты иностранных банков;
- возможное использование VPN для доступа к консоли и API.
Это нужно учитывать при планировании. Архитектуру при желании можно концептуально перенести на другие облака (GPU + объектное хранилище + оркестратор задач), но код и шаблоны в исходном виде заточены под AWS.
Практические советы по использованию
- Большие объёмы аудио. Чем длиннее файлы, тем выгоднее, потому что накладные расходы на загрузку модели и инициализацию размазываются по минутам.
- Используйте Spot, если можете терпеть редкие перезапуски задач — ASR здесь без состояния, а Batch сам перезапускает job.
- Включайте streaming-режим для аудио длиннее 3 часов или если вы ограничены по VRAM.
- Тестируйте локальное внимание: для треков до 3 часов на A100 оно даёт возможность не упираться в лимиты памяти.
- Следите за CloudWatch-метриками. Если GPU простаивает, можно уменьшить размер инстансов или увеличить параллелизм (больше файлов на один GPU).
Место на рынке
Прямых числовых сравнений с конкретными API-конкурентами в материале нет, но можно зафиксировать несколько ориентировочных точек.
- Модель. Parakeet-TDT-0.6B-v3 — открытая мультиязычная ASR с 25 европейскими языками и автоопределением языка. Это удобно, если вы обслуживаете несколько стран и не хотите держать отдельную модель на каждый язык.
- Стоимость. При цене ~$0,00005 за минуту аудио на Spot-инстансах g6.xlarge итоговая стоимость транскрибации крупных архивов оказывается значительно ниже типичных коммерческих API, которые обычно тарифицируются в центах за минуту.
- Производительность. Эффективная скорость 0,49 секунды на 1 минуту аудио даёт комфортный запас для пакетной обработки огромных массивов данных. В реальном пайплайне основная задержка — не модель, а I/O и оркестрация.
- Инфраструктурные требования. В отличие от полностью управляемых ASR-сервисов, здесь вы сами отвечаете за AWS Batch, CloudFormation, ECR и мониторинг. Это плюс для тех, кто хочет полный контроль и минимум переменных затрат на API, и минус для тех, кто не готов инвестировать в DevOps.
Если у вас уже есть инфраструктура на AWS и вы работаете с мультиязычным аудио в европейском регионе, эта связка даёт сильный аргумент в пользу self-hosted ASR.
Установка / Как запустить
Ниже — краткий чек-лист запуска по шагам с примером команд.
1. Подготовьте окружение AWS
- Аккаунт AWS с правами на создание ресурсов (CloudFormation, S3, Batch, ECR, IAM, CloudWatch).
- VPC, подсети и security group для запуска GPU-инстансов.
2. Соберите Docker-образ с моделью
Убедитесь, что в каталоге есть:
Dockerfile(см. выше);requirements.txtс зависимостями;parakeet_transcribe.py— скрипт инференса.
Соберите и запушьте образ в ECR:
./updateImage.sh
Скрипт сам:
- определит, где он запущен (CodeBuild/EC2),
- соберёт образ,
- создаст репозиторий в ECR (если его нет),
- включит сканирование на уязвимости,
- запушит образ.
3. Разверните инфраструктуру CloudFormation
Запустите автоматический скрипт:
./buildArch.sh
Он:
- определит регион AWS;
- запросит или найдёт VPC, SubnetIds, SGIds, RTIds;
- вызовет
aws cloudformation deployс нужными параметрами.
Если хотите выполнить команду вручную:
aws cloudformation deploy --stack-name batch-gpu-audio-transcription \
--template-file ./deployment.yaml \
--capabilities CAPABILITY_IAM \
--region ${AWS_REGION} \
--parameter-overrides VPCId=${VPC_ID} SubnetIds="${SUBNET_IDS}" \
SGIds="${SecurityGroup_IDS}" RTIds="${RouteTable_IDS}"
Чтобы включить Spot-инстансы, добавьте:
--parameter-overrides UseSpotInstances=Yes
Чтобы включить streaming-режим для длинного аудио:
--parameter-overrides EnableStreaming=Yes
(Параметры можно комбинировать в одной команде.)
4. Загрузите аудио и получите транскрипт
- Найдите в параметрах стека имя входного S3-бакета.
- Загрузите туда аудиофайл (через консоль или
aws s3 cp). - EventBridge запустит Batch-задачу автоматически.
- После завершения ищите JSON с тайм-кодами в выходном S3-бакете, имя которого также задаётся в стеке.
5. Мониторинг и отладка
- В AWS Batch смотрите статус задач и логи.
- В CloudWatch Logs — логи контейнера и CloudWatch Agent.
- В CloudWatch Metrics (namespace
CWAgent) — графики GPU/CPU/памяти.
Если задачи часто падают по памяти, включите streaming-режим или уменьшите параллелизм.
6. Очистка ресурсов
Чтобы не платить за простаивающие ресурсы:
- Очистите S3-бакеты (input, output, logs).
- Удалите CloudFormation-стек:
aws cloudformation delete-stack --stack-name batch-gpu-audio-transcription
- При желании удалите репозиторий ECR и образы.
После этого архитектура перестанет потреблять ресурсы и деньги.