Реализация Batch STT: распознавание речи из аудиофайлов

2000 часов аудиозаписей колл-центра — задача, с которой real-time ASR не справится: задержки растут, качество падает. Real-time системы рассчитаны на поток речи с низкой задержкой, но при пакетной загрузке сотен файлов они либо встают в очередь, либо теряют точность из-за неоптимального управления п

Направления AI-разработки

Часто задаваемые вопросы

Последние работы

  • image_website-b2b-advance_0.webp
    Разработка сайта компании B2B ADVANCE
    1460
  • image_web-applications_feedme_466_0.webp
    Разработка веб-приложения для компании FEEDME
    1314
  • image_websites_belfingroup_462_0.webp
    Разработка веб-сайта для компании БЕЛФИНГРУПП
    1013
  • image_ecommerce_furnoro_435_0.webp
    Разработка интернет магазина для компании FURNORO
    1275
  • image_logo-advance_0.webp
    Разработка логотипа компании B2B Advance
    727
  • image_crm_enviok_479_0.webp
    Разработка веб-приложения для компании Enviok
    1019

2000 часов аудиозаписей колл-центра — задача, с которой real-time ASR не справится: задержки растут, качество падает. Real-time системы рассчитаны на поток речи с низкой задержкой, но при пакетной загрузке сотен файлов они либо встают в очередь, либо теряют точность из-за неоптимального управления памятью. Batch STT решает проблему иначе: файлы попадают в очередь (Celery/SQS), параллельно обрабатываются на GPU с int8 квантизацией, на выходе транскрипт с точностью >95%. Мы реализуем под ключ такое решение — от простого скрипта до прод-пайплайна с мониторингом в Prometheus и дашбордом в Grafana. За 3–5 дней вы получаете систему, переваривающую сотни часов без участия инженера. Экономия по сравнению с ручной расшифровкой достигает 5 раз, а с облачными ASR-сервисами — до 70%. Вложение окупается в среднем за 2–3 месяца за счёт сокращения ручного труда. Стоимость рассчитывается индивидуально под ваш объём и требования.

Как batch STT решает проблему масштабирования?

Batch STT использует очередь (Celery или SQS) для асинхронной обработки. Это позволяет горизонтально масштабироваться: добавлять воркеры под нагрузкой, не меняя код. В отличие от real-time ASR, где каждый новый поток требует отдельного инстанса модели, batch-режим эффективно использует GPU за счёт группировки задач. Мы наблюдали ускорение в 10 раз при переходе от последовательной обработки к очереди с 8 воркерами на кластере. Оптимизация загрузки GPU достигается int8 квантизацией и нарезкой длинных файлов.

Что делать с шумными и низкокачественными записями?

Whisper large-v3 устойчив к шуму, но на сильно зашумленных записях (улица, заводской цех) точность падает. Мы применяем предобработку: нормализацию громкости, фильтр низких частот, VAD для удаления тишины. Для сложных случаев подключаем дополнительный audio enhancement — спектральное вычитание или модели Denoiser (RNNoise). На практике это повышает WER на 5–15%.

Почему int8 квантизация стала стандартом для продакшена?

На Faster-Whisper с compute_type="int8_float16" мы получаем 4-кратное ускорение на GPU при потере точности менее 1% (по данным LibriSpeech benchmark). Потребление памяти снижается вдвое, что позволяет на одной RTX 4090 обрабатывать до 4 потоков параллельно (batch size=4). Для критичных проектов включаем VAD-фильтр и beam search с 5 лучами.

Архитектура batch-пайплайна

Upload → S3/Local Storage → Queue (Celery/SQS) → Worker → STT → Post-Processing → Storage Ключевые решения:

  • Нарезка длинных файлов на сегменты по 5–10 минут (улучшает точность)
  • Параллельная обработка нескольких файлов
  • Retry-логика для сбойных задач
  • Хранение промежуточных результатов

Как настроить pipeline для оптимальной производительности?

Каждый воркер запускает модель с int8 квантизацией. При переполнении очереди автоматически поднимаются дополнительные воркеры через Kubernetes HPA. Мониторинг — Prometheus + метрики длины очереди, времени выполнения p99, загрузки GPU.

Оборудование Модель Скорость
RTX 3080 medium (int8) 6–8x RT
RTX 4090 large-v3 (int8) 3–4x RT
A10G large-v3 (int8) 4–5x RT
CPU (16 cores) medium 0.3–0.5x RT

1 час аудио на RTX 4090 с large-v3: ~15–20 минут обработки — в 3–4 раза быстрее реального времени.

Полный pipeline обработки

import os from pathlib import Path from faster_whisper import WhisperModel from celery import Celery import ffmpeg app = Celery('batch_stt', broker='redis://localhost:6379/0', backend='redis://localhost:6379/1') model = WhisperModel("large-v3", device="cuda", compute_type="int8_float16") def convert_to_wav(input_path: str) -> str: output_path = input_path.rsplit('.', 1)[0] + '_converted.wav' ffmpeg.input(input_path).output( output_path, ar=16000, ac=1, acodec='pcm_s16le' ).overwrite_output().run(quiet=True) return output_path @app.task(bind=True, max_retries=3, time_limit=3600) def process_audio_file(self, file_path: str, options: dict = None): options = options or {} try: wav_path = convert_to_wav(file_path) segments, info = model.transcribe( wav_path, language=options.get('language'), vad_filter=True, word_timestamps=options.get('word_timestamps', False), beam_size=5 ) result = { "file": file_path, "language": info.language, "language_probability": info.language_probability, "duration": info.duration, "segments": [] } for seg in segments: segment_data = { "start": round(seg.start, 3), "end": round(seg.end, 3), "text": seg.text.strip() } if options.get('word_timestamps'): segment_data["words"] = [ {"word": w.word, "start": w.start, "end": w.end, "probability": w.probability} for w in (seg.words or []) ] result["segments"].append(segment_data) os.unlink(wav_path) return result except Exception as exc: raise self.retry(exc=exc, countdown=60 * (self.request.retries + 1)) 

Обработка сбоев в пайплайне

Система автоматически повторяет упавшие задачи (max_retries=3) с экспоненциальной задержкой. Для критичных файлов настраиваем dead-letter очередь и алерты в Telegram/Slack. Все этапы логируются — от загрузки до выдачи результата.

Поддерживаемые форматы

Формат Конвертация
MP3, WAV, FLAC Прозрачная — нормализуем до WAV 16kHz,16 бит, моно
M4A, AAC, OGG, OPUS Через FFmpeg с пересэмплингом
MP4, MKV Извлечение аудиодорожки, затем конвертация

Как запустить batch STT на своих данных

  1. Установите зависимости: pip install faster-whisper celery redis ffmpeg-python.
  2. Запустите Redis и Celery worker.
  3. Загрузите файлы в указанную директорию или S3.
  4. Запустите скрипт отправки задач в очередь.
  5. Получите результаты в JSON или субтитрах (SRT).

Что входит в работу

  • Скрипт для одиночных файлов — протестированный локально, готовый к запуску.
  • Пайплайн с очередью — на Celery или SQS, с retry и логированием.
  • API для загрузки и получения результатов — REST/gRPC, документация Swagger.
  • Дашборд статусов — Grafana + дашборд с метриками очереди и точности.
  • Интеграция с вашим хранилищем — S3, MinIO, локальная ФС.
  • Обучение команды — 2 часа воркшопа по эксплуатации.

Сроки реализации

  • Скрипт для одиночных файлов: 1 день
  • Пайплайн с очередью и API: 3–5 дней
  • Полная система с дашбордом статусов: 1 неделя

Оценим ваш проект: свяжитесь с нами, чтобы обсудить объём, требуемую точность и инфраструктуру. Закажите внедрение batch STT — получите консультацию инженера. Опыт — более 5 лет в ASR, свыше 30 успешных внедрений.