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

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

Напрямки AI-розробки

Часті запитання

Останні роботи

  • image_website-b2b-advance_0.webp
    Розробка сайту компанії B2B ADVANCE
    1440
  • image_web-applications_feedme_466_0.webp
    Розробка веб-додатків для компанії FEEDME
    1301
  • image_websites_belfingroup_462_0.webp
    Розробка веб-сайту для компанії БЕЛФІНГРУП
    997
  • image_ecommerce_furnoro_435_0.webp
    Розробка інтернет магазину для компанії FURNORO
    1264
  • image_logo-advance_0.webp
    Розробка логотипу компанії B2B Advance
    712
  • image_crm_enviok_479_0.webp
    Розробка веб-додатків для компанії Enviok
    1002

2000 годин аудіозаписів кол-центру — задача, з якою real-time ASR не впорається: затримки зростають, якість падає. Real-time системи розраховані на потік мови з низькою затримкою, але при пакетному завантаженні сотень файлів вони або стають у чергу, або втрачають точність через неоптимальне управління пам'яттю. Batch STT вирішує проблему інакше: файли потрапляють у чергу (Celery/SQS), паралельно обробляються на GPU з int8 квантуванням, на виході транскрипт з точністю >95%. Ми реалізуємо під ключ таке рішення — від простого скрипта до прод-пайплайну з моніторингом у Prometheus і дашбордом у Grafana. За 3–5 днів ви отримуєте систему, що перетравлює сотні годин без участі інженера. Економія порівняно з ручним розшифруванням сягає 5 разів, а з хмарними ASR-сервісами — до 70%. Наприклад, обробка 500 годин аудіо на місяць коштує від $300 при використанні нашого рішення замість $1000 у хмарі. Вкладення окупається в середньому за 2–3 місяці за рахунок скорочення ручної праці. Наш досвід — понад 5 років у ASR, більше 30 успішних впроваджень, гарантія якості на кожен проект.

Як 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 обробки

Код прикладу (Faster-Whisper + Celery)
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 успішних впроваджень.