Дешёвый пайплайн транскрипции аудио на Parakeet-TDT и AWS Batch | AiManual
AiManual Logo Ai / Manual.
22 Апр 2026 Гайд

Как построить масштабируемый и дешёвый пайплайн транскрипции аудио на Parakeet-TDT и AWS Batch

Пошаговое руководство по построению масштабируемого пайплайна транскрипции аудио с использованием Parakeet-TDT-0.6B-v3 и AWS Batch. Экономия до 90% с Spot Insta

Проблема: транскрипция аудио стоит как чугунный мост

У вас есть терабайты подкастов, интервью или лекций. Коммерческие ASR-сервисы берут от 1 до 3 долларов за час аудио. Для 10 000 часов это 30 000 долларов. Абсурд. Запускать Whisper или другую тяжёлую модель на своём GPU? Дорого, медленно и не масштабируется. Вы заложник цены и сложности.

💡
Ключ к решению - open-source модель, которая не уступает коммерческим по качеству, и облачная инфраструктура, которая считает каждую копейку. В 2026 году это Parakeet-TDT-0.6B-v3 и AWS Batch на Spot Instances.

Почему Parakeet-TDT-0.6B-v3, а не Whisper или что-то ещё?

Parakeet-TDT (Token-and-Duration Transducer) от NVIDIA - это не просто очередная ASR. Её архитектура предсказывает не только токены, но и их длительность. Это даёт два преимущества: высокая точность на перекрывающейся речи и естественные временные метки. Версия 0.6B-v3, вышедшая в начале 2026 года, поддерживает более 50 языков, включая русский, и работает в 2-3 раза быстрее, чем Whisper-large-v3, при сравнимом качестве.

Но главное - она легче. Модель помещается в 4 ГБ VRAM. Это значит, что для её запуска подойдут дешёвые инстансы с GPU типа g4dn.xlarge или даже T4. А это прямая экономия.

Не путайте Parakeet-TDT с Parakeet Multitalk. Multitalk - это для многопользовательской транскрипции с тайм-кодами, о чём мы писали в отдельном гайде. TDT - более универсальная и быстрая модель для пакетной обработки.

Архитектура: как заставить облако работать за копейки

Вся магия экономии строится на двух китах: AWS Batch и EC2 Spot Instances. Batch - это сервис для запуска тысяч контейнерных заданий без управления серверами. Spot Instances - это свободные вычислительные мощности AWS, которые продаются со скидкой до 90%. Их могут забрать в любой момент, но для пакетной обработки это идеально.

КомпонентРольПочему дёшево
S3 BucketХранилище для исходных аудио и готовых транскриптовПлата только за хранение и запросы
AWS Batch (Compute Environment)Оркестратор, запускающий контейнеры на Spot InstancesИспользует Spot, нет платы за сам сервис
Docker контейнер с Parakeet-TDTИзолированная среда для выполнения моделиЭффективное использование ресурсов GPU
EventBridge / S3 EventТриггер для запуска задания при загрузке нового аудиоАвтоматизация, нет простоя

Поток данных прост: аудиофайл падает в S3 → EventBridge ловит событие → запускает задание AWS Batch → Batch поднимает Spot Instance с GPU → контейнер загружает файл, транскрибирует его и кладёт результат обратно в S3 → инстанс завершает работу.

1Подготовка: S3, IAM и репозиторий моделей

Сначала создайте два S3 бакета: your-company-audio-input и your-company-transcripts-output. Это разделение упростит управление правами. Затем создайте IAM роль для AWS Batch. Ей понадобятся права на чтение из input-бакета, запись в output-бакет и доступ к ECR (если будете использовать свой контейнер).

Parakeet-TDT-0.6B-v3 весит около 4 ГБ. Тащить её из интернета при каждом запуске - тратить время и деньги на трафик. Правильный путь - залить модель в S3 в своём регионе и монтировать её в контейнер как volume. Или использовать кэширование через Hugging Face Hub. Мы выберем первый вариант, он надёжнее.

# Скачиваем модель и заливаем в S3
aws s3 sync ./parakeet-tdt-0.6b-v3 s3://your-company-models/parakeet-tdt-0.6b-v3/

2Docker-образ: упаковываем модель и код

Контейнер должен делать три вещи: скачать аудио из S3, запустить транскрипцию, загрузить результат. Используем базовый образ PyTorch с CUDA 12.4 (актуально на 2026 год).

FROM pytorch/pytorch:2.4.0-cuda12.4-cudnn9-runtime

WORKDIR /app

# Устанавливаем системные зависимости для аудио
RUN apt-get update && apt-get install -y ffmpeg libsndfile1

# Копируем requirements и устанавливаем Python-пакеты
COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt

# Копируем скрипт транскрипции
COPY transcribe.py .

# Точка входа
ENTRYPOINT [\"python\", \"transcribe.py\"]

А вот сам скрипт transcribe.py. Он использует библиотеку nemo от NVIDIA для загрузки модели.

import argparse
import boto3
import torch
import nemo.collections.asr as nemo_asr
from omegaconf import OmegaConf
import os
import tempfile

s3_client = boto3.client('s3')

def download_from_s3(bucket, key, local_path):
    s3_client.download_file(bucket, key, local_path)

def upload_to_s3(bucket, key, local_path):
    s3_client.upload_file(local_path, bucket, key)

def transcribe_audio(model, audio_path):
    # Конфигурация для транскрипции
    config = OmegaConf.create({
        'audio_dir': os.path.dirname(audio_path),
        'batch_size': 1,
        'device': 'cuda' if torch.cuda.is_available() else 'cpu',
        'output_filename': 'transcript.json',
    })
    transcript = model.transcribe([audio_path], batch_size=1, return_hypotheses=False)
    return transcript[0]

if __name__ == \"__main__\":
    parser = argparse.ArgumentParser()
    parser.add_argument('--input_bucket', required=True)
    parser.add_argument('--input_key', required=True)
    parser.add_argument('--output_bucket', required=True)
    parser.add_argument('--model_path', default='/model/parakeet_tdt_0.6b_v3.nemo')
    args = parser.parse_args()

    # Загружаем модель (предполагается, что она уже лежит по пути model_path)
    # В реальности лучше использовать кэш или S3 mount
    model = nemo_asr.models.ASRModel.from_pretrained(model_name='parakeet-tdt-0.6b-v3', map_location='cuda')
    model.eval()

    with tempfile.NamedTemporaryFile(suffix='.wav', delete=False) as tmp_audio:
        audio_tmp_path = tmp_audio.name
        # Скачиваем аудио из S3
        download_from_s3(args.input_bucket, args.input_key, audio_tmp_path)
        
        # Транскрибируем
        transcript_text = transcribe_audio(model, audio_tmp_path)
        
        # Формируем имя выходного файла
        output_key = args.input_key.replace('.wav', '.txt').replace('.mp3', '.txt')
        
        # Сохраняем транскрипт во временный файл
        with tempfile.NamedTemporaryFile(mode='w', suffix='.txt', delete=False) as tmp_txt:
            tmp_txt.write(transcript_text)
            tmp_txt_path = tmp_txt.name
        
        # Загружаем результат в S3
        upload_to_s3(args.output_bucket, output_key, tmp_txt_path)
        
        # Удаляем временные файлы
        os.unlink(audio_tmp_path)
        os.unlink(tmp_txt_path)
    print(f\"Transcription complete: {output_key}\")

Не делайте так: скачивать модель из интернета при каждом запуске контейнера. Вы потратите время на загрузку 4 ГБ, а Spot Instance может быть отозван до завершения. Всегда предзагружайте модель в образ или монтируйте из S3.

3Настройка AWS Batch: Compute Environment и Job Queue

Здесь начинается магия экономии. В консоли AWS или через CLI создаём Compute Environment. Критически важные параметры:

  • Тип: MANAGED (чтобы AWS сам управлял инстансами).
  • Инстансы: Выберите семейство с GPU (g4dn, g5). Для Parakeet-TDT-0.6B-v3 хватит g4dn.xlarge (1 GPU T4, 4 vCPU, 16 ГБ RAM).
  • Spot Instances: Обязательно отметьте использование Spot. Установите максимальную цену (bid price) в 70% от on-demand цены. Этого обычно хватает.
  • Min vCPUs: 0. Мы не хотим платить за простой.
  • Max vCPUs: 256 или больше, в зависимости от аппетитов.
# Пример создания Compute Environment через AWS CLI (упрощённо)
aws batch create-compute-environment \
    --compute-environment-name parakeet-tdt-spot \
    --type MANAGED \
    --state ENABLED \
    --service-role arn:aws:iam::123456789012:role/AWSBatchServiceRole \
    --compute-resources \
        type=EC2 \
        minvCpus=0 \
        maxvCpus=256 \
        desiredvCpus=0 \
        instanceTypes=g4dn.xlarge \
        subnets=subnet-xxx \
        securityGroupIds=sg-yyy \
        instanceRole=ecsInstanceRole \
        allocationStrategy=SPOT_CAPACITY_OPTIMIZED \
        bidPercentage=70

Затем создайте Job Queue, связанную с этим Compute Environment. Очередь будет принимать задания и отправлять их на Spot Instances.

4Регистрация Job Definition: говорим Batch, что запускать

Job Definition - это описание контейнера: какой образ, сколько ресурсов, переменные окружения. Зарегистрируйте свой Docker-образ в ECR и укажите его здесь.

{
  \"jobDefinitionName\": \"parakeet-tdt-job\",
  \"type\": \"container\",
  \"containerProperties\": {
    \"image\": \"123456789012.dkr.ecr.us-east-1.amazonaws.com/parakeet-tdt:latest\",
    \"vcpus\": 4,
    \"memory\": 16000,
    \"resourceRequirements\": [
      { \"type\": \"GPU\", \"value\": \"1\" }
    ],
    \"environment\": [
      { \"name\": \"MODEL_PATH\", \"value\": \"/model/parakeet_tdt_0.6b_v3.nemo\" }
    ],
    \"command\": [
      \"--input_bucket\", \"your-company-audio-input\",
      \"--input_key\", \"Ref::inputKey\",
      \"--output_bucket\", \"your-company-transcripts-output\"
    ]
  },
  \"platformCapabilities\": [\"EC2\"]
}

Обратите внимание на Ref::inputKey. Это параметр, который мы передадим при запуске задания. Так мы можем обрабатывать разные файлы одним определением.

5Автоматизация: триггер на загрузку в S3

Чтобы не запускать задания вручную, настройте правило EventBridge. При появлении нового объекта в input-бакете оно будет запускать задание AWS Batch, передавая ключ файла как параметр.

# Пример правила EventBridge через AWS CLI
aws events put-rule \
    --name \"s3-audio-upload-trigger\" \
    --event-pattern '{\"source\":[\"aws.s3\"],\"detail-type\":[\"Object Created\"],\"detail\":{\"bucket\":{\"name\":[\"your-company-audio-input\"]}}}' \
    --state ENABLED

Затем создайте цель (target), которая указывает на вашу Job Queue и передаёт параметры.

Сколько это стоит? Цифры, от которых вы упадёте

Давайте посчитаем на апрель 2026 года. Spot Instance g4dn.xlarge в регионе us-east-1 стоит около 0.15$ в час. Parakeet-TDT-0.6B-v3 транскрибирует 1 час аудио примерно за 2 минуты (30x реального времени). Значит, за час работы инстанса мы обработаем 30 часов аудио.

КомпонентСтоимостьНа 1000 часов аудио
EC2 Spot (g4dn.xlarge)~0.15$/час(1000/30) * 0.15 = 5$
S3 Хранение (исходное аудио)0.023$/ГБ/мес~1.15$ (из расчёта 50 ГБ)
S3 Запросы (GET/PUT)0.0004$ за 1000 запросов~0.01$
Итого за 1000 часов~6.16$

Получается около 0.006$ за час аудио. Против 1-3$ у коммерческих сервисов. Экономия в 150-500 раз. Даже если Spot Instance отзовут и задание перезапустится, вы всё равно в огромном плюсе.

Где собака зарыта: ошибки, которые всё сломают

В теории всё гладко. На практике вы наступите на эти грабли.

  • Ошибка 1: Неправильный формат аудио. Parakeet-TDT ждёт 16 кГц, моно. Если кинуть стерео mp3 44.1 кГц, результат будет тишина. Решение: в контейнере добавьте шаг конвертации через ffmpeg перед транскрипцией.
  • Ошибка 2: Длинные файлы. Модель имеет ограничение на длину контекста. Для файлов длиннее 10 минут используйте чанкинг с наложением (overlap) 1-2 секунды, чтобы не потерять слова на стыках.
  • Ошибка 3: Spot Instance отозвали. Задание упадёт. Решение: настройте в Job Definition attempts > 1. AWS Batch автоматически перезапустит задание с того же места (если ваш код идемпотентен).
  • Ошибка 4: Модель не помещается в память. Parakeet-TDT-0.6B-v3 требует 4 ГБ VRAM. Если возьмёте инстанс с меньшим GPU, контейнер упадёт. Всегда проверяйте resourceRequirements в Job Definition.

Что дальше? Транскрипция - только начало

У вас теперь есть поток текста. Это сырая руда. Можно делать семантический поиск по транскриптам, искать упоминания продуктов или людей. Можно подключить LLM для суммаризации каждого подкаста. Или, если аудио многопользовательское, добавить диаразацию поверх транскрипции.

Неочевидный совет: используйте этот же пайплайн для транскрипции в реальном времени. Как? Разбивайте live-стрим на чанки по 30 секунд и отправляйте их в S3. Задержка будет 1-2 минуты, но стоимость останется копеечной. Для многих сценариев это приемлемо.

И последнее: не зацикливайтесь на одной модели. К 2027 году выйдет Parakeet-TDT-1B, которая будет ещё точнее. С вашей архитектурой на AWS Batch обновление модели - это просто замена Docker-образа. Вы уже построили фундамент. Теперь можно строить что угодно.

Подписаться на канал