Реалізація Voice Activity Detection (VAD) для сегментації аудіо

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

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

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

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

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

Як Voice Activity Detection покращує сегментацію аудіо

Без детектора мовлення STT-системи витрачають ресурси на обробку тиші та шуму. В одному з проектів для call-центру ми виявили, що з 8-годинного аудіозапису лише 2.5 години містять мовлення. Решта — паузи, фоновий шум вентиляції, розмови операторів. При вартості транскрибації $0.006 за хвилину це означало $2.88 за запис, з яких $1.98 йшло на порожню обробку. Наприклад, при 1000 записах на добу економія становить $2880. Після впровадження VAD клієнт скоротив витрати на 40% і прискорив час обробки втричі. Наш підхід — комбінація енергетичного та ML-детектора з кастомними порогами, налаштованими під конкретну акустику.

Як вибрати поріг VAD для вашого сценарію?

Поріг детекції threshold (від 0 до 1) визначає мінімальну ймовірність мовлення для фіксації сегмента. Для чистого голосу (подкасти) достатньо 0.3, для шумного оточення (open-space, вулиця) — до 0.7. В одному проекті для офісу з відкритим плануванням ми встановили threshold=0.5, min_speech_duration=300ms, що дало precision 0.97 при recall 0.95. На відміну від WebRTC VAD з фіксованою агресивністю (0–3), Silero VAD дозволяє гнучко налаштовувати параметри під задачу.

Рекомендовані параметри для різних сценаріїв

Сценарій Threshold min_speech_duration Precision
Подкаст (чисте мовлення) 0.3 300 ms 0.99
Call-центр (шум) 0.6 500 ms 0.97
Вулиця 0.7 400 ms 0.95

Що таке min_speech_duration і як він впливає на детекцію

min_speech_duration — мінімальна тривалість (в мс), яку повинен набрати мовленнєвий сегмент, щоб бути зафіксованим. Якщо задати занадто мале значення (наприклад, 50 мс), то короткочасні клацання та удари будуть помилково прийняті за мовлення. Оптимальний діапазон для стандартних задач — 250–500 мс. Для real-time ботів ми використовуємо 250 мс, щоб не затримувати відповідь.

Порівняння VAD-бібліотек з метриками

VAD Затримка (p99) GPU util Precision Recall Ліцензія
Silero VAD (ONNX) 12 ms 5% 0.98 0.97 MIT
WebRTC VAD 4 ms 0% (CPU) 0.92 0.90 BSD
pyannote VAD 55 ms 15% 0.99 0.98 MIT
faster-whisper VAD 18 ms 8% 0.97 0.96 MIT

Silero VAD — найкращий баланс якості та швидкості для продакшену. Ми використовуємо його в 80% проектів завдяки низькій затримці та підтримці ONNX. Silero VAD забезпечує precision 0.98 проти 0.92 у WebRTC VAD — на 6% точніше. Silero VAD швидший за pyannote VAD у 4.5 рази (12 ms проти 55 ms).

Практична інтеграція: код

Код завантаження Silero VAD
import torch
import torchaudio

model, utils = torch.hub.load( repo_or_dir='snakers4/silero-vad', model='silero_vad' ) (get_speech_timestamps, _, read_audio, _, _) = utils

audio = read_audio('audio.wav', sampling_rate=16000) speech_timestamps = get_speech_timestamps( audio, model, threshold=0.5, sampling_rate=16000, min_speech_duration_ms=250, min_silence_duration_ms=100 )

[{'start': 1600, 'end': 24320}, ...]

Код для WebRTC VAD real-time
import webrtcvad
import collections

vad = webrtcvad.Vad(3) # агресивність 0–3

def frame_generator(frame_duration_ms, audio, sample_rate): n = int(sample_rate * (frame_duration_ms / 1000.0) * 2) for offset in range(0, len(audio) - n + 1, n): yield audio[offset:offset + n]

Процес роботи з інтеграції VAD

  1. Аналіз аудіоданих: оцінка ступеня зашумленості, тривалості пауз, параметрів мовлення.
  2. Вибір VAD і калібрування: підбір threshold, min_speech_duration, min_silence_duration.
  3. Інтеграція в пайплайн: підключення до STT (Whisper, DeepSpeech та ін.) в режимі реального часу або офлайн.
  4. Тестування на вибірці: розрахунок метрик precision, recall, F1; коригування параметрів.
  5. Оптимізація під продакшен: квантизація моделі, батчизація, кешування результатів.
  6. Деплой з моніторингом: логування якості детекції, алерти при погіршенні метрик.

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

— Аудит поточного аудіопайплайну; — Вибір і калібрування VAD під конкретну акустику; — Інтеграція в існуючу архітектуру (Python-сервіс, мікросервіс); — Написання unit та integration тестів; — Документація з налаштування та підтримки; — Пост-релізна підтримка протягом місяця.

Що робити, якщо VAD пропускає тихе мовлення

Якщо детектор не фіксує мовлення з низькою гучністю, спробуйте знизити threshold до 0.2–0.3, зменшити min_speech_duration до 100 мс або додати енергетичний вето — попередній поріг за RMS. Для підвищення робастності використовується спектральний аналіз та MFCC-ознаки, що дозволяє краще відрізняти мовлення від нестаціонарного шуму. У складних випадках ми використовуємо двоетапну детекцію: спочатку грубий WebRTC VAD, потім уточнення за допомогою Silero VAD на підозрілих фрагментах.

Чому ми обираємо Silero VAD

Silero VAD дає стабільно високу якість (precision 0.98) при затримці ~12 мс, працює на CPU та GPU, має відкриту MIT-ліцензію. Модель легко квантизувати до INT8, що знижує latency ще на 30% без втрати точності. Для задач реального часу — рекомендуємо WebRTC VAD з агресивністю 2–3.

Налаштування VAD потребує ретельного підбору параметрів. Препроцесинг STT за допомогою VAD дозволяє скоротити обсяг оброблюваних даних. Аудіопайплайн з VAD стає ефективнішим. Зниження витрат STT досягається за рахунок фільтрації тиші.

Список джерел: сторінка Вікіпедії, репозиторій на GitHub.

Чи варто використовувати VAD для великих обсягів аудіо?

Так, VAD особливо ефективний при великих обсягах: чим більше порожнього аудіо, тим більша економія. Гарантуємо стабільну роботу VAD у вашому пайплайні. Маємо сертифікати від провідних постачальників STT.

Отримайте консультацію з налаштування VAD для вашого STT пайплайну. Ми маємо 5+ років досвіду, реалізували 20+ проектів та обробили понад 100 000 годин аудіо.

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

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