Реализация распознавания речи из аудиофайлов (Batch STT)
Batch STT обрабатывает заранее записанные файлы без требований к задержке — можно использовать самые качественные модели и выжать максимум точности. Типичная задача: архивная обработка записей колл-центра, транскрибация подкастов, создание субтитров к видеоконтенту.
Архитектура batch-пайплайна
Upload → S3/Local Storage → Queue (Celery/SQS) → Worker → STT → Post-Processing → Storage
Ключевые решения при проектировании:
- Нарезка длинных файлов на сегменты по 5–10 минут (улучшает точность)
- Параллельная обработка нескольких файлов
- Retry-логика для сбойных задач
- Хранение промежуточных результатов
Полный 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))
Поддерживаемые форматы
Через FFmpeg обрабатываем любой формат: MP3, WAV, FLAC, M4A, OGG, AAC, OPUS, MP4, MKV. Нормализуем в WAV 16kHz mono — оптимальный формат для ASR.
Производительность
| Оборудование | Модель | Скорость |
|---|---|---|
| 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 минут обработки.
Сроки реализации
- Скрипт для одиночных файлов: 1 день
- Пайплайн с очередью и API: 3–5 дней
- Полная система с дашбордом статусов: 1 неделя







