Реализация 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%. Вложение окупается в среднем за 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 успешных внедрений.

Распознавание и синтез речи: ASR, TTS, клонирование голоса

Заказчик приходит с задачей: транскрибировать 40 000 часов колл-центра за неделю. Штатный облачный 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 срезает короткие вставки.

Клонирование голоса — латентность или качество. XTTS v2 (Coqui) даёт натуральный голос, но при потоковой генерации stream_chunk_size=20 первый аудиочанк прилетает через 1.4–2.0 с — неприемлемо для интерактивных сценариев. StyleTTS2 и Kokoro быстрее, но требуют точной подготовки референсного аудио.

Как это решается на практике

Базовый стек для production-пайплайна:

  • ASR: openai/whisper-large-v3 или faster-whisper (CTranslate2-бэкенд, x4 скорость vs оригинал)
  • Диаризация: pyannote.audio 3.x + интеграция через whisperx для выравнивания по словам
  • TTS: XTTS v2 для качества, Edge-TTS или Silero для низкой латентности
  • Клонирование: XTTS v2 (3–6 с референсного аудио) или OpenVoice v2

Типичный пайплайн для колл-центра выглядит так: аудио из очереди Kafka → нормализация ffmpeg -af loudnorm до -23 LUFS → faster-whisper с beam_size=5, vad_filter=Truepyannote диаризация → постпроцессинг (пунктуация через deepmultilingualpunctuation) → запись в PostgreSQL с временными метками.

Кейс из практики. Финтех-компания с 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.0008/мин против $0.016/мин у облачного провайдера.

Дообучение 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 Whisper нужно замораживать 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.

Процесс работы

Начинаем с аудит-сессии: берём 2–4 часа ваших записей, прогоняем через несколько моделей, замеряем WER/CER, смотрим на распределение ошибок по типам (лексические, акустические, язык). Это занимает 1–2 дня и сразу показывает, нужен ли fine-tuning или достаточно пост-обработки.

Далее — выбор архитектуры под ваш throughput: один GPU для 1000 мин/день или кластер с балансировщиком для 100 000+ мин/день. Деплой через Docker-контейнер с FastAPI или Triton Inference Server для батчированного инференса.

Сроки зависят от сложности: базовая интеграция готовой модели — 1–2 недели. Fine-tuning с подготовкой данных и валидацией — 4–8 недель. Полная разработка голосового пайплайна (ASR + диаризация + TTS + мониторинг) — 2–4 месяца.