Синхронізація транскрипції з аудіо: точні часові мітки слів

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

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

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

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

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

Проблема: субтитри не синхронізовані, пошук по відео неточний

Типова ситуація: ви отримуєте транскрипцію аудіофайлу, але кожне слово не прив'язане до часових міток. Це означає — субтитри пливуть, пошук по фразах не працює, karaoke-ефекти неможливі. Word-level timestamps вирішують це завдання: кожне слово в тексті має точні start/end секунди. Часові мітки слів забезпечують синхронізацію транскрипції з аудіо. Без такого прив'язування неможливо зробити клікабельну транскрипцію (click on word → jump to position), автоматичний монтаж по тексту або субтитри для глухих. Ми налаштовуємо синхронізацію під ваш стек — будь то локальний Whisper чи хмарний Deepgram.

Досвід наших інженерів у цій галузі дозволяє гарантувати точність міток не гірше за заявлену виробником, навіть на складних записах. У цій статті — технічні деталі: які моделі дають найкращу точність, як налаштувати параметри та які підводні камені трапляються на різних типах аудіо.

Чому без міток на рівні слів не обійтися?

Без word-level timestamps ви втрачаєте функціональність, яка вже стала стандартом у відео-редакторах і подкаст-платформах. Якщо мітки є — відкриваються сценарії:

  • Субтитри з поблочною синхронізацією (кожне слово з'являється в момент вимови).
  • Пошук по відео за будь-яким фрагментом тексту.
  • Аналітика — підрахунок часу вимови кожного слова (озвучення, спич-терапія).

Як ми реалізуємо word-level timestamps

Використовуємо перевірений стек. Для локальної обробки — faster-whisper (модель large-v3, GPU). Для хмарних сценаріїв — Deepgram (його точність на зашумлених записах у 2 рази вища, ніж у Whisper) або Google STT з параметром enable_word_time_offsets.

Приклад базового коду на Python:

from faster_whisper import WhisperModel

model = WhisperModel("large-v3", device="cuda")
segments, _ = model.transcribe("audio.wav", word_timestamps=True, language="uk")

for segment in segments:
    for word in segment.words:
        print(f"[{word.start:.3f}s → {word.end:.3f}s] {word.word} (p={word.probability:.2f})")

Точність Whisper: ±50–150 мс на чистому аудіо. Якщо важлива гранична точність — підключаємо Deepgram з його гранулярністю. Методологія розпізнавання описана в Radford et al., "Robust Speech Recognition via Large-Scale Weak Supervision".

Порівняння провайдерів

Провайдер Параметр Точність міток Особливості
Whisper word_timestamps=True ±50–150 мс Локально, безкоштовно, GPU обов'язковий
Deepgram timestamps=true ±30–80 мс Хмара, висока точність, $0.004/хвилина
Google STT enable_word_time_offsets=True ±40–100 мс Інтеграція з GCP, підтримка 125+ мов
AWS Transcribe за умовчанням ±50–120 мс Екосистема AWS, автоматичне розпізнавання
AssemblyAI timestamps=True ±30–100 мс Додаткові фічі (umami, емоції)

Точність міток на різних типах аудіо

Тип аудіо Whisper large-v3 Deepgram Google STT
Чистий дикторський (студія) ±50–100 мс ±30–60 мс ±40–80 мс
Запис з шумами (вулиця) ±100–200 мс ±60–120 мс ±80–150 мс
Телефонна розмова (8 кГц) ±150–300 мс ±80–150 мс ±100–200 мс

Як підвищити точність міток?

Навіть найкращі STT дають збої на складних аудіо. Ось що ми рекомендуємо:

  • Переконайтеся, що аудіо відповідає вимогам моделі: частота дискретизації 16 кГц, моно, мінімальний рівень шуму.
  • Використовуйте параметри VAD: у Whisper це vad_filter=True (відсікає тишу, зменшує дрейф міток).
  • Якщо мітки «пливуть» на довгих записах (більше 30 хвилин), застосовуйте сегментацію з перекриттям (overlap 10–15 секунд).
  • Для хмарних сервісів активуйте punctuate та formatting — іноді вони покращують вирівнювання слів.
  • Перевіряйте поріг імовірності: занадто високий (0.9+) видаляє частину слів, ламаючи часову шкалу. Оптимально 0.6–0.8.
Коли VAD не допомагає? На аудіо з нестаціонарним шумом (наприклад, зачинення дверей, сигнали) VAD може помилково відсікати фрагменти. У таких випадках краще використовувати ручну розмітку тиші або комбінувати VAD з енергетичним детектором.

Докладніше про VAD можна прочитати на сторінці voice activity detection.

Кейс: покращення точності для подкаст-платформи

Один із проєктів — подкаст-платформа з архівами записів українською та англійською. Вихідний пайплайн на Google STT давав точність міток ±150 мс, що призводило до розсинхронізації субтитрів. Ми впровадили гібрид: локальний Whisper для чорнової розмітки (економія ~30% витрат на хмарні API) і Deepgram для фінальної корекції міток. Після налаштування VAD та ресемплінгу до 16 кГц p99 latency знизилася до 200 мс, а точність міток покращилася до ±50 мс на 90% записів. Результат — субтитри не пливуть, користувачі можуть клікати на будь-яке слово й переходити до моменту.

Експорт у формати

Мітки перетворюються в будь-який необхідний формат. Наприклад, субтитри з дробленням по одному слову (для karaoke-ефекту):

def words_to_srt(words: list) -> str:
    """Кожне слово — окремий субтитр (для karaoke)"""
    srt = []
    for i, w in enumerate(words, 1):
        start = format_srt_time(w.start)
        end = format_srt_time(w.end)
        srt.append(f"{i}\n{start} --> {end}\n{w.word.strip()}\n")
    return "\n".join(srt)

def format_srt_time(seconds: float) -> str:
    h = int(seconds // 3600)
    m = int((seconds % 3600) // 60)
    s = int(seconds % 60)
    ms = int((seconds % 1) * 1000)
    return f"{h:02d}:{m:02d}:{s:02d},{ms:03d}"

Підтримуємо SRT, VTT, JSON, XML — за вашими вимогами.

Що входить в роботу

  1. Аналітика — визначаємо ваш стек і вимоги (локальний/хмарний STT, потрібні формати, мова).
  2. Проектування — обираємо оптимального провайдера, налаштовуємо конфігурацію (параметри моделі, буферизація).
  3. Реалізація — пишемо інтеграцію: код розпізнавання з STT таймстампами, експорт у потрібний формат, обробка помилок.
  4. Тестування — заміряємо точність на ваших аудіофайлах (p99, розбіжність міток).
  5. Деплой — розгортаємо на вашому сервері (Docker, хмарна функція) або налаштовуємо SaaS-акаунт.

Вихідні артефакти:

  • Робочий модуль розпізнавання з word timestamps.
  • Документація по API та налаштуванню.
  • Навантажувальні тести (latency p99, throughput).
  • Доробка під ваш інтерфейс (якщо потрібно).

Скільки це коштує та терміни

Вартість інтеграції word-level timestamps залежить від обсягу та складності вашого проєкту. При великих обсягах (100+ годин на місяць) економія сягає 40%. Терміни: від 0.5 до 1 дня для доробки пайплайну, 2–3 дні для побудови системи з нуля.

Зв'яжіться з нами — оцінимо ваш проєкт і запропонуємо рішення під ключ. Отримайте консультацію щодо стеку та термінів.