Дата публикации
ai_products

Как дешево расшифровывать тысячи часов аудио: 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 файлов на инстанс).

Как это работает

Общая схема

  1. Вы загружаете аудиофайл в S3-бакет.
  2. Amazon EventBridge ловит событие PutObject.
  3. EventBridge создаёт задачу в AWS Batch.
  4. AWS Batch поднимает GPU-инстансы (например, g6.xlarge с NVIDIA L4).
  5. Инстансы тянут Docker-образ с моделью из Amazon ECR.
  6. Скрипт внутри контейнера:
    • скачивает аудио из S3;
    • прогоняет через Parakeet-TDT;
    • сохраняет результат как JSON с тайм-кодами в выходной S3-бакет.
  7. Когда задач нет, кластер сворачивается до нуля — вы не платите за простаивающие 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. Загрузите аудио и получите транскрипт

  1. Найдите в параметрах стека имя входного S3-бакета.
  2. Загрузите туда аудиофайл (через консоль или aws s3 cp).
  3. EventBridge запустит Batch-задачу автоматически.
  4. После завершения ищите JSON с тайм-кодами в выходном S3-бакете, имя которого также задаётся в стеке.

5. Мониторинг и отладка

  • В AWS Batch смотрите статус задач и логи.
  • В CloudWatch Logs — логи контейнера и CloudWatch Agent.
  • В CloudWatch Metrics (namespace CWAgent) — графики GPU/CPU/памяти.

Если задачи часто падают по памяти, включите streaming-режим или уменьшите параллелизм.

6. Очистка ресурсов

Чтобы не платить за простаивающие ресурсы:

  1. Очистите S3-бакеты (input, output, logs).
  2. Удалите CloudFormation-стек:
aws cloudformation delete-stack --stack-name batch-gpu-audio-transcription
  1. При желании удалите репозиторий ECR и образы.

После этого архитектура перестанет потреблять ресурсы и деньги.


Читайте также