
Оцінка мови в реальному часі: аналіз мовлення, аудіо та обличчя в виробничих AI-системах
https://ift.tt/nt14wre
Останній пост охоплював мультимодальне злиття, тимчасову синхронізацію та вирішення конфліктів на рівні архітектури. Цей — поглиблюється фактичною обробкою модальностей — як ви обробляєте мовлення, емоцію в аудіо та аналіз обличчя у виробничих системах в реальному часі.
Voice Activity Detection — перш за все
Більшість команд одразу звертаються до Whisper для перетворення мовлення на текст. У виробництві спершу потрібен VAD.
Виявлення активності голосу визначає, коли хтось насправді говорить, порівняно з тишею та фоном. Без нього ви надсилаєте до Whisper мовчазні аудіо-куски, витрачаєте обчислення та отримуєте галюцинаторні транскрипції. Whisper відомий такою поведінкою — подайте йому тишу, і він упевнено транскрибуватиме слова, які ніколи не були сказані.
Silero VAD — це найпопулярніший легкий варіант. Працює на CPU, інференс менше мс, забезпечує сегментацію — коли говорить, коли закінчується, й усе, що між ними, щоб ігнорувати.
Порядок конвеєра має значення: сирий звук → VAD → лише мовні сегменти потрапляють до моделі транскрипції. Це сам по собі може зменшити обчислення Whisper на 30–60% залежно від того, скільки тиші та «мертвого» повітря у ваших аудіопотоках. У телемедицині або сценаріях кол-центру це багато «мертвого повітря».
Speech-to-Text в виробництві
Whisper за замовчуванням. Але який Whisper важливий.
Whisper large-v3 — найвища точність, приблизно 1.5 Гб модель, занадто повільна для реального часу на одному GPU, якщо обробляєте кілька одночасних потоків.
Distil-Whisper — дистилювана версія, на 49% менше параметрів, у 6 разів швидше інференс, мінімальна втрата точності для англійської. Це те, з чого мають розпочинати більшість виробничих систем.
Faster-Whisper — бекенд CTranslate2, до 4x швидше за реалізацію OpenAI з тією ж точністю. За замовчуванням використовує квантизацію int8. Якщо ви самостійно хостите Whisper, використовуйте це, а не оригінальний репозиторій.
Для реального часу потоків вам не потрібно чекати, поки повна репліка завершиться. Потрібна покрокова обробка — зазвичай 2–5 секундні вікна з перекриттям. Це як слова, що ви говорите, з’являються на екрані під час вашого мовлення.
Угода тут така: коротші фрагменти дають швидшу відповідь, але гіршу точність на межах слів. Довші фрагменти підвищують точність, але додають затримку.
Практична настройка: фрагменти по 3 секунди з перекриттям 0.5 секунди, через Faster-Whisper з попереднім фільтруванням VAD. Це відповідає цільовій затримці 300–500 мс з бюджету попереднього посту.
Обробка заваг — disfluencies
Натуральна промова не ідеальна. «Я відчуваю, ем, якось, знаєте, досить добре, напевно». Виробничі системи мають вирішити — залишати ці паузи та запинки чи прибирати їх?
У клінічних застосуваннях залишайте їх. Патерни вагань, заповнювачі слів та самовиправлення несуть діагностичний сигнал. Збільшення дисфлюенсу може свідчити про когнітивне навантаження, тривогу або нейрологічні зміни. У професійних налаштуваннях це зазвичай не потрібно, але не у деяких чутливих випадках.
Для загальних застосувань прибирайте їх у постобробці. Легковагий текстовий очищуючий модель або навіть правила на основі регулярних виразів можуть видалити заповнювачі без втрати сенсу.
Audio Emotion Analysis
Це працює на сировому аудіосигналі, окремо від транскрипції. Ви не аналізуєте, що сказали, а як вони це сказали.
Feature Extraction
Основні ознаки, що несуть емоційний сигнал в аудіо:
Prosodic features — висота тону (F0), варіація тону, швидкість вимовляння, ритмічні патерни. Рівний тон за низької швидкості часто відповідає суму або втомі. Висока варіабельність тону при високій швидкості відповідає збудженню або азарту.
Spectral features — MFCC (Mel-frequency cepstral coefficients), спектральний центроїд, спектральний потік. Вони зафіксовують тембр та тональність голосу. Тремтячий голос має відмінні спектральні характеристики від стабільного.
Voice quality features — jitter (коливання висоти тону), shimmer (коливання амплітуди), відношення гармонік до шумів. Вони фіксують фізіологічне напруження у голосових зв’язках. Стрес та тривога суттєво збільшують jitter та shimmer.
Model Options
wav2vec 2.0 — моделі автономного навчання репрезентацій мови. Додатково тонувати на аудіодатасетах з емоціями (IEMOCAP, RAVDESS, MSP-IMPROV). Сильна базова лінія для виробничого виявлення емоцій.
HuBERT — подібна архітектура до wav2vec 2.0, часто трохи краща для downstream задач емоцій. Походження від Facebook/Meta.
SpeechBrain — відкритий інструментарій, що обгортає ці моделі з готовими рецептами розпізнавання емоцій. Найшвидший шлях від нуля до робочого класифікатора емоцій.
Custom CNN on spectrograms — конвертувати аудіо в мел-спектрограми та розглядати виявлення емоцій як задачу класифікації зображень. Простіший у навчанні та налагодженні. Нижчий потенціал порівняно з трансформерами, але на практиці ефективний для бінарних класификацій, таких як занепокоєння vs. відсутність занепокоєння.
Practical Consideration
Моделі емоцій, навчені на акторських датасетах (RAVDESS, більшість IEMOCAP), працюють гірше на реальній природній мові. Різниця значна. Розіграні гніві звучать по-іншому, ніж справжній гнів. Якщо ви розгортаєте у клінічному або обслуговуванні клієнтів, потрібно донавчання на природних даних або точність буде низькою.
Facial Analysis
Три рівні аналізу обличчя, кожен з різними обчислювальними витратами та значенням сигналу.
Face Detection
Перш ніж аналізувати щось, потрібно знайти обличчя у кадрі. MTCNN та RetinaFace — стандарти. RetinaFace точніший, особливо при часткових перекриттях (маски, руки, що закривають обличчя). Для реального часу — запуск детекції кожні 5–10 кадрів, а не кожного кадру — обличчя не телепортуються між кадрами. Відстежуйте між виявленнями за допомогою легкого трекера, як SORT або ByteTrack.
Facial Landmark Detection
68-пунктна або 478-пунктна (MediaPipe) розмітка. Карта геометрії обличчя — положення брів, кути рота, відкритість очей, напруження щелепи. Це те, що використовує подальша аналітика виразів.
MediaPipe Face Mesh — 478 3D міток, працює на CPU, може в реальному часі навіть на мобільних пристроях. Це виробничий стандарт для більшості команд. Підтримується Google, добре документований, дивовижно надійний.
dlib — 68 міток, старіший, але перевірений у боротьбі. Менш точний за MediaPipe, але передбачуваніші режими відмов.
Facial Expression Recognition
Action Unit (AU) detection — Система кодування обличчя (FACS) розбиває вирази на окремі рухи м’язів. AU4 (опускання брів) + AU15 (опускання куців рота) = модель суму tristeza. Це більш деталізовано та клінічно корисно, ніж категорійні мітки емоцій. Моделі: OpenFace 2.0, JAA-Net або донавчені ResNet на датасетах з AU-мітками (BP4D, DISFA).
Categorical emotion classification — відображає обличчя безпосередньо на емоційні мітки (щасливий, сумний, злий, наляканий, здивований, відраза, нейтральний). Простішою імплементацією, але втрачає нюанси. Примусовий усміх та справжній посмішки обидва класифікуються як “щасливий” — AU-виявлення розрізняє їх (справжні посмішки включають AU6, підняття щоки; примусові — ні).
У клінічних застосуваннях використовуйте AU detection. Гранулярність на рівні м’язів — це джерело діагностичної цінності.
Frame Rate and Processing
Не потрібно обробляти кожен кадр. Вирази обличчя змінюються повільніше відносно частоти кадрів відео. Обробка кожного 3-го або 5-го кадру при 30fps дає 6–10 аналізів на секунду — більш ніж достатньо для відстеження переходів виразів.
Це значне зниження витрат. За 30fps обробили б 1800 кадрів на хвилину на кожного пацієнта. За кожен 5-й кадр — 360. Та сама клінічна сигналізація, на 80% менше обчислень.
Стратегія подачи моделі
Запуск Whisper, моделі емоцій та моделі обличчя одночасно піднімає практичне питання: де знаходяться кожна модель?
GPU-виділення — Whisper (особливо large-v3) потребує GPU. Моделі емоцій аудіо досить малі, щоб працювати на CPU за умови використання витягування ознак + легковажний класифікатор. Виявлення обличчя та витягування векторів (MediaPipe) працюють на CPU. Моделі розпізнавання виразів виграють від GPU, але можуть працювати на CPU з допустимою затримкою за умови квантовизації.
Практичний розподіл для більшості команд: Whisper на GPU, аудіо-емоція на CPU, обличчя на CPU (MediaPipe + квантований модель виразів). Це дозволяє обслужити всі три модальності на одному GPU-екземплярі замість трьох.
Квантизація — INT8 через ONNX Runtime знижує час інференсу в 2–3 рази з незначною втратою точності для більшості моделей емоцій та виразів. Whisper також виграє — Faster-Whisper використовує CTranslate2, який застосовує квантизацію за замовчуванням.
Налаштування розміру пакета — якщо обробляєте кілька одночасних сесій, групуйте запити інференсу до моделей, що перебувають на GPU. Пакет із 4–8 фрагментів Whisper, оброблених разом, значно ефективніший за 4–8 послідовних одиночних інференсів. Це різниця між підтримкою 10 одночасних сесій та 50 на тому ж обладнанні.
Коли використовувати ONNX Runtime проти нативного PyTorch — ONNX для будь-якої моделі у виробничому інференсі. PyTorch для навчання та експериментів. ONNX Runtime із TensorRT execution provider на NVIDIA GPU забезпечує найкращу продуктивність інференсу. Конвертаційний крок додає початкову складність, але одразу окупається завдяки зменшенню затримки та пропускної здатності.
Putting It Together
Повний конвеєр за модальностями для одного вхідного аудіо-видео:
Raw audio → VAD (CPU, <1мс) → мовні сегменти → Whisper (GPU, 300–500мс) → транскрипція + часові позначки Raw audio → витяг ознак (CPU, 50мс) → модель емоцій (CPU, 100–200мс) → мітка емоції + довіра Video frames → детекція обличчя кожні 5 кадрів (CPU, 20мс) → витяг міток (CPU, 10мс) → модель виразів/AU (CPU/GPU, 50–100мс) → мітки виразів + довіра Усі три модальності працюють паралельно. Результати подаються у Fusion layer з попереднього посту. Загальний обсяг часу від початку до результату залишаєтсья в рамках бюджету 2 секунд — бо нічого не чекає на чогось іншого. Це — впровадження рівня реалізації. Наступний пост розглядає оцінку, моніторинг та що трапляється, коли ці моделі деградують у виробництві. Побачимось там. HI-FI News через DEV Community https://dev.to 14 квітня 2026 о 22:39 (посилання та зображення в оригіналі залишено без змін) April 13, 2026 at 10:39PM

Залишити відповідь