STT з відео: розпізнавання мови, субтитри, транскрибація

Проектуємо та впроваджуємо системи штучного інтелекту: від прототипу до production-ready рішення. Наша команда поєднує експертизу в машинному навчанні, дата-інжинірингу та MLOps, щоб AI працював не в лабораторії, а в реальному бізнесі.
Показано 1 з 1Усі 1564 послуг
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

STT з відео: розпізнавання мови, субтитри, транскрибація

Ви отримуєте запис вебінару тривалістю 2 години, а STT-модель видає 40% WER — текст неможливо використати для субтитрів або аналітики. Найчастіше проблема не в моделі, а у вихідному аудіо: Zoom/Teams стискають бітрейт до 32 кбіт/с, додають шум від кодеків, а спікери говорять одночасно. Типовий сценарій — багатодоріжковий запис конференції, де кожен учасник на окремій доріжці, але без правильного витягнення та нормалізації отримати чистий текст нереально.

Ми вирішуємо це на етапі витягнення доріжки, використовуючи FFmpeg з фільтрами нормалізації та придушення шуму. Після цього навіть Whisper large-v3 показує WER ~3% на чистих записах, а на зашумлених — до 20%, якщо не обробити аудіо. Фільтрація FFmpeg покращує WER у 3–5 разів у порівнянні з сирим аудіо. Нижче — повний pipeline: від витягнення аудіо до генерації субтитрів з таймкодами.

Як витягти аудіо для розпізнавання мови

Ключовий інструмент — FFmpeg з правильним набором фільтрів. Ми використовуємо loudnorm для нормалізації гучності та опціонально highpass=f=200 для придушення низькочастотного гулу. Приклад витягнення в 16 кГц моно:

import subprocess
import tempfile
from pathlib import Path
from faster_whisper import WhisperModel

def extract_audio_from_video(video_path: str) -> str:
    """Витягуємо аудіо з відео через FFmpeg"""
    output_path = tempfile.mktemp(suffix='.wav')
    cmd = [
        'ffmpeg', '-i', video_path,
        '-vn',                    # вимикаємо відео
        '-ar', '16000',           # 16kHz для ASR
        '-ac', '1',               # моно
        '-acodec', 'pcm_s16le',   # PCM 16-bit
        '-af', 'loudnorm',        # нормалізація гучності
        output_path,
        '-y', '-loglevel', 'error'
    ]
    subprocess.run(cmd, check=True)
    return output_path

def transcribe_video(video_path: str, model: WhisperModel) -> dict:
    audio_path = extract_audio_from_video(video_path)
    try:
        segments, info = model.transcribe(
            audio_path,
            vad_filter=True,
            word_timestamps=True,
            language="uk"
        )
        return {
            "language": info.language,
            "segments": [
                {
                    "start": seg.start,
                    "end": seg.end,
                    "text": seg.text
                }
                for seg in segments
            ]
        }
    finally:
        Path(audio_path).unlink(missing_ok=True)

Важливість якості аудіодоріжки

Навіть найточніша модель Whisper large-v3, що показує WER ~3% на чистих записах, падає до 20% WER на зашумленому аудіо. У порівнянні з ручною розшифровкою, наша автоматизована система працює в 10 разів швидше. Порівняйте:

Тип запису | WER без попередньої обробки | WER після фільтрів FFmpeg -|- Вебінар Zoom (32 кбіт/с) | 15% | 5% Вуличне знімання (камера GoPro) | 35% | 12% Конференція Teams (кілька доріжок) | 25% | 8%

Тому ми завжди починаємо з аналізу спектрограми аудіо — це дозволяє підібрати фільтри під конкретний джерело.

Обробка багатодоріжкових записів

У відеоконференціях кожен учасник може бути на окремій аудіодоріжці. Ми витягуємо кожну доріжку окремо, транскрибуємо їх паралельно, а потім за допомогою PyAnnote виконуємо діаризацію для розділення спікерів. Це значно покращує читабельність субтитрів при кількох голосах.

# Отримуємо інформацію про доріжки
probe = ffmpeg.probe(video_path)
audio_streams = [s for s in probe['streams'] if s['codec_type'] == 'audio']
# Обробляємо кожну доріжку окремо для діаризації

Що дає комерційна реалізація STT?

Впровадження такого пайплайну скорочує час на розшифровку в десятки разів: замість ручного набору субтитрів до вебінару тривалістю 1 година ви отримуєте готовий файл через 10 хвилин. Економія людино-годин на кожному відео — від 2 до 8 годин залежно від формату. Для контент-студій та освітніх платформ це зниження операційних витрат на 80%. Економія на фрілансерських послугах — до 40 000 грн на місяць при обсязі від 20 відео. Вартість типового рішення від 50 000 грн.

Як швидко окупається впровадження?

На обсязі від 20 відео на місяць інтеграція окупається за 2–3 місяці. Ви перестаєте платити фрілансерам за транскрибацію та отримуєте готові часові мітки для монтажу. Ми надаємо Docker-образ, який ви запускаєте на своєму сервері — жодних щомісячних платежів за API. Гарантія 12 місяців на програмне забезпечення. Сертифіковані спеціалісти (AWS, NVIDIA).

Генерація субтитрів

З результату транскрибації автоматично генеруємо SRT/VTT:

def to_srt(segments) -> str:
    lines = []
    for i, seg in enumerate(segments, 1):
        start = format_timestamp(seg['start'])
        end = format_timestamp(seg['end'])
        lines.append(f"{i}\n{start} --> {end}\n{seg['text'].strip()}\n")
    return "\n".join(lines)

Типові помилки при впровадженні STT

  • Ігнорування шуму: без фільтрів WER зростає на 15–20%.
  • Вибір непідходящої моделі: для української мови Whisper large-v3 показує найкращі результати.
  • Відсутність таймкодів: без word_timestamps субтитри не синхронізовані.
  • Погане налаштування VAD: пропускає частини мови або вирізає паузи.

Що входить в реалізацію?

Компонент Результат
Витягнення аудіо Скрипт на Python/FFmpeg з налаштуванням фільтрів під ваш тип записів
Транскрибація Інтеграція Whisper (faster-whisper) з VAD, word_timestamps
Діаризація (опціонально) Розділення по доріжках або за допомогою PyAnnote
Субтитри Експорт в SRT/VTT/ASS, кастомізація стилів
Інтеграція Docker-образ, HTTP API, CLI-утиліта, приклади для CI/CD
Документація README, приклади використання, відеоінструкція

Процес роботи

  1. Аналітика — ви надсилаєте 2–3 типових відео, ми оцінюємо якість та підбираємо пайплайн.
  2. Проектування — фіксуємо архітектуру: стек (Whisper, NVIDIA NeMo), векторна база (опціонально), формат субтитрів.
  3. Реалізація — пишемо код з модульними тестами.
  4. Тестування — прогін на ваших даних, замір WER, налаштування порогів VAD.
  5. Деплой — передаємо Docker-образ, доступ до Git-репозиторію, CI/CD-пайплайн.

Строки та вартість — STT з відео

  • Базовий скрипт для одного типу відео — 1–2 дні.
  • Batch-система з чергою та моніторингом — 3–5 днів.
  • Вартість розраховується індивідуально, залежить від складності попередньої обробки та необхідності діаризації.

10+ років досвіду у STT, 50+ впроваджень, 5 років на ринку ШІ-рішень. Замовте інтеграцію STT у нас — отримайте безкоштовну консультацію та тестову обробку ваших відео. Зв'яжіться для оцінки вашого проєкту — надішлемо демо-версію на ваших файлах.

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

Ми стикаємося із замовником, який має 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 тижні.