Проблема: субтитри не синхронізовані, пошук по відео неточний
Типова ситуація: ви отримуєте транскрипцію аудіофайлу, але кожне слово не прив'язане до часових міток. Це означає — субтитри пливуть, пошук по фразах не працює, 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 — за вашими вимогами.
Що входить в роботу
- Аналітика — визначаємо ваш стек і вимоги (локальний/хмарний STT, потрібні формати, мова).
- Проектування — обираємо оптимального провайдера, налаштовуємо конфігурацію (параметри моделі, буферизація).
- Реалізація — пишемо інтеграцію: код розпізнавання з STT таймстампами, експорт у потрібний формат, обробка помилок.
- Тестування — заміряємо точність на ваших аудіофайлах (p99, розбіжність міток).
- Деплой — розгортаємо на вашому сервері (Docker, хмарна функція) або налаштовуємо SaaS-акаунт.
Вихідні артефакти:
- Робочий модуль розпізнавання з word timestamps.
- Документація по API та налаштуванню.
- Навантажувальні тести (latency p99, throughput).
- Доробка під ваш інтерфейс (якщо потрібно).
Скільки це коштує та терміни
Вартість інтеграції word-level timestamps залежить від обсягу та складності вашого проєкту. При великих обсягах (100+ годин на місяць) економія сягає 40%. Терміни: від 0.5 до 1 дня для доробки пайплайну, 2–3 дні для побудови системи з нуля.
Зв'яжіться з нами — оцінимо ваш проєкт і запропонуємо рішення під ключ. Отримайте консультацію щодо стеку та термінів.







