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

Проектуємо та впроваджуємо системи штучного інтелекту: від прототипу до production-ready рішення. Наша команда поєднує експертизу в машинному навчанні, дата-інжинірингу та MLOps, щоб AI працював не в лабораторії, а в реальному бізнесі.
Показано 1 з 1Усі 1564 послуг
Реалізація Batch STT: розпізнавання мови з аудіофайлів
Середній
від 1 дня до 3 днів
Часті запитання

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

Етапи розробки AI-рішення

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

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

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 успішних впроваджень.

Розпізнавання та синтез мовлення: перша лінія проблеми

Ми стикаємося із замовником, який має 40 000 годин записів кол-центру й хоче транскрибувати їх за тиждень — це типова задача розпізнавання мови ASR. Штатний хмарний ASR (Google Speech-to-Text) видає WER 28% на галузевій лексиці, а ціна при таких обсягах стає непідйомною. Завдання — знизити WER нижче 10% і перейти на self-hosted інференс. Така ситуація повторюється в кожному другому проєкті, і ми маємо напрацьований патерн рішення.

Типові технічні проблеми та їх усунення

WER не сходиться до потрібної метрики. Найчастіше винна не архітектура, а дані: шумні аудіо без нормалізації рівня (–23 LUFS замість стандарту), змішані мови в одному каналі, акцент, специфічна доменна лексика. Whisper large-v3 з коробки дає WER 8–12% на чистій українській і провалюється до 25–35% на записах з PSTN-артефактами та вузькосмуговим кодеком G.711.

Діаризація ламається при більш ніж двох спікерах. pyannote/speaker-diarization-3.1 працює стабільно при 2–3 мовцях, але DER (Diarization Error Rate) зростає з 6% до 18–22% при 5+ учасниках конференції. Проблема посилюється перехресними репліками: за замовчуванням min_duration_on=0.1 обрізає короткі вставки. Рішення — збільшити min_duration_on до 0.3 та додати overlap detection через pyannote-overlap-detection.

Клонування голосу — латентність чи якість. XTTS v2 (Coqui) дає натуральний голос, але при потоковій генерації stream_chunk_size=20 перший аудіочанк прилітає через 1.4–2.0 с — неприйнятно для інтерактивних сценаріїв. StyleTTS2 та Kokoro швидші, але вимагають точного підготовки референсного аудіо. Ми навчилися вирішувати цю дилему за допомогою гібридного підходу: на старті використовуємо Silero TTS (50–100 мс TTFB), а після отримання перших 3 секунд аудіо перемикаємо на XTTS для кращої натуральності.

Як вибрати ASR-модель під ваші дані?

Модель WER (українська, чистий запис) WER (PSTN, кодек G.711) Швидкість інференсу (фактор real-time) Вартість інференсу (1 год аудіо, A10G)
Whisper large-v3 8–10% 25–35% ~0.1x (55 с на 40 хв) ~$0.50
Whisper medium 12–15% 30–40% ~0.3x ~$0.15
Wav2Vec2 XLSR-53 15–18% 28–35% ~0.8x ~$0.08
Whisper large-v3 + fine-tune 4–7% 10–15% ~0.1x ~$0.50

faster-whisper (CTranslate2) швидший за оригінальний Whisper у 4 рази при однаковому WER. Для продакшену ми завжди використовуємо його.

Практичний приклад: fine-tuning Whisper на доменній лексиці

Фінтех-компанія з 12 000 дзвінків/день. Початковий WER на українській з банківською лексикою — 22% (Google STT). Після fine-tuning whisper-medium на 200 годинах розмічених записів через Hugging Face transformers + Seq2SeqTrainer з learning_rate=1e-5, warmup_steps=500 — WER впав до 7.3%. Інференс на одній A10G через faster-whisper з compute_type=float16 обробляє 40-хвилинний дзвінок за 55 секунд. Підсумкова вартість інференсу — $0.50 за годину аудіо, що в 6 разів дешевше за хмарне рішення. Проєкт виконано за 6 тижнів, включаючи підготовку даних і валідацію.

Техніка fine-tuning описана в офіційній документації Whisper на Hugging Face.

Як донавчити Whisper на доменних даних?

Коли загальна модель не справляється, fine-tuning — перший інструмент. Мінімальний датасет для помітного покращення — 20–30 годин розміченого аудіо в цільовому домені. Розмітку можна отримати через ітеративний процес: прогнати через базову модель → вручну виправити 10–15% помилок → перенавчити → повторити.

training_args = Seq2SeqTrainingArguments(
    per_device_train_batch_size=16,
    gradient_accumulation_steps=2,
    learning_rate=1e-5,
    warmup_steps=500,
    max_steps=5000,
    fp16=True,
    predict_with_generate=True,
    generation_max_length=225,
)

При fine-tuning обов’язково заморожуйте encoder перші 1000 кроків (model.freeze_encoder()), інакше акустичні ознаки роз’їдуться раніше, ніж decoder адаптується до нової лексики.

Синтез мовлення: що обрати для вашого сценарію?

Модель Латентність (TTFB) Натуральність MOS Клонування Мови
XTTS v2 1.2–2.0 с 4.1–4.3 Так, 3 с референсу 17
StyleTTS2 0.3–0.6 с 4.0–4.2 Так, вимагає адаптації en, + fine-tune
Kokoro-82M 0.08–0.15 с 3.7–3.9 Ні en, ja
Silero TTS 0.05–0.1 с 3.4–3.6 Ні ru, en, de, та ін.
Edge-TTS ~0.4 с (cloud) 4.0 Ні 100+

Для інтерактивних ботів з вимогою TTFB < 300 мс — Silero або Kokoro. Для озвучення контенту, де важлива натуральність — XTTS v2 з потоковою віддачею через WebSocket. Ми гарантуємо, що підібрана модель відповідатиме вашим вимогам до латентності та якості — це підтверджено на 50+ реалізованих проєктах.

Наш досвід та гарантії

10+ років досвіду в NLP та speech processing. 50+ успішних проєктів для fintech, telecom, медицини. Сертифіковані моделі (Model Card + bias audit). Ми гарантуємо зниження WER до цільового рівня, інакше повертаємо кошти.

Що входить у роботу з нами?

Клієнт отримує:

  • Документацію: model card, інструкцію з розгортання, API-специфікацію (OpenAPI 3.0)
  • Код: готові скрипти для інференсу, пайплайни обробки (Docker Compose + Kubernetes маніфести за потреби)
  • Доступи: до self-hosted інстансів, графіки моніторингу (Grafana + Prometheus)
  • Навчання: 2 сесії для вашої команди (налаштування, експлуатація, troubleshooting)

Ми також надаємо сертифікат відповідності моделі (Model Card + bias report), що підсилює довіру до рішення.

Процес роботи та терміни

  1. Аудит-сесія – беремо 2–4 години ваших записів, проганяємо через кілька моделей, вимірюємо WER/CER, дивимося на розподіл помилок (лексичні, акустичні, мова). Займає 1–2 дні.
  2. Вибір архітектури – під ваш throughput: один GPU для 1000 хв/день або кластер з балансувальником для 100 000+ хв/день.
  3. Реалізація – Docker-контейнер з FastAPI або Triton Inference Server для батчованого інференсу. Інтеграція з чергою Kafka.
  4. Тестування – A/B тест на продакшн-даних, порівняння з baseline (Google/Azure STT).
  5. Деплой – CI/CD (GitHub Actions + ArgoCD), моніторинг (Grafana + WER/CER алерти).

Терміни:

  • Базова інтеграція готової моделі – 1–2 тижні.
  • Fine-tuning з підготовкою даних та валідацією – 4–8 тижнів.
  • Повна розробка голосового пайплайну (ASR + діаризація + TTS + моніторинг) – 2–4 місяці.

Зв'яжіться з нами для безкоштовної консультації — оцінимо ваш проєкт за 2 дні. Або замовте пілотний fine-tuning на 20 годинах ваших даних і отримайте перші результати вже за 2 тижні.