Проблема: Самовпевненість і часто неправильні результати
Ми оновили аналіз голосу в MixAnalytic — нашому AI-проєкті для аудіоаналізу, призначеному для музичних продюсерів. Функція визначає, чи є в треку вокал, і оцінює стать голосу, щоб адаптувати поради щодо міксу.
Попередня реалізація використовувала librosa для оцінки основної частоти (F0) та аналізу спектрального центроїда. Працювало… інколи. У чому була справжня проблема? Вона з упевненістю заявляла: «Жіночий голос — 100% довіри» на треках із чоловічим вокалом. Це гірше, ніж взагалі не мати цієї функції.
Ось що ми дізналися, виправляючи це, і три рівні покращень, доступні будь-кому, хто працює з аналізом голосу в Python.
Рівень 1: Припиніть брехати про довіру
Найшвидший виграш — визнати, що спектральний аналіз *не може* зробити. Чистий F0 + спектральний центроїд — це груба евристика, а не класифікатор. Наші виправлення:
```python MAX_CONFIDENCE = 85 # Spectral analysis alone cannot be definitive MIN_UNCERTAINTY = 10 # Always show some uncertainty
confidence = min(raw_confidence, MAX_CONFIDENCE) uncertainty = max(MIN_UNCERTAINTY, 100 - confidence) ```
Це не робить аналіз *кращим*, але робить його *чесним*. Користувачі довіряють системі, яка каже «ймовірно жіночий, 72%», більше, ніж тій, що каже «жіночий, 100%» і помиляється.
Саме такі деталі важливі, коли ви створюєте інструменти для продюсерів — якщо визначення голосу очевидно неправильне, вони перестануть довіряти й решті вашого mix analysis.
Рівень 2: Кращі ознаки з MFCC
Фундаментальна проблема класифікації лише за F0 полягає в тому, що висота тону сама по собі не визначає стать. Глибоке жіноче контральто і чоловічий тенор можуть мати майже ідентичні значення F0.
MFCC (Mel-Frequency Cepstral Coefficients) фіксують спектральну огинаючу голосу — форму голосового тракту — яка надійніше відрізняється між чоловічими та жіночими голосами. Дослідження стабільно показують, що 13 MFCC + їхні дельти дають значно краще розділення.
```python import librosa
# Extract 13 MFCCs + delta + delta-delta = 39 features mfccs = librosa.feature.mfcc(y=segment, sr=sr, n_mfcc=13) delta_mfccs = librosa.feature.delta(mfccs) delta2_mfccs = librosa.feature.delta(mfccs, order=2) ```
У поєднанні з простим sklearn-класифікатором (SVM або Random Forest), навченим на розмічених даних голосу, цей підхід може досягати 85–90% точності — суттєвий стрибок порівняно лише з спектральними евристиками.
Найкраще: жодних нових залежностей понад те, що вже є в більшості аудіопроєктів (librosa + scikit-learn).
Рівень 3: Попередньо навчені ML-моделі
Для точності рівня production (90–97%) потрібні спеціалізовані моделі. Є два помітні варіанти:
inaSpeechSegmenter
Набір інструментів на базі CNN від Французького національного аудіовізуального інституту. Він виграв змагання MIREX 2018 з виявлення мовлення та сегментує аудіо на speech/music/noise, одночасно класифікуючи стать мовця.
```bash pip install inaSpeechSegmenter ```
```python from inaSpeechSegmenter import Segmenter seg = Segmenter(detect_gender=True) segments = seg("audio_file.wav") # Returns: [('female', 0.0, 4.5), ('music', 4.5, 8.2), ('male', 8.2, 12.0)] ```
Плюси: перевірено в боях, активно підтримується, добре працює зі змішаним контентом (мовлення + музика). Мінуси: додає залежність ~200MB, потрібен ffmpeg, повільніше на CPU.
Hugging Face Wav2Vec2
Попередньо навчена transformer-модель, донавчена для класифікації статі. Модель `norwoodsystems/norwood-maleVSfemale` — легкий бінарний класифікатор.
```python from transformers import pipeline
classifier = pipeline("audio-classification", model="norwoodsystems/norwood-maleVSfemale") result = classifier("audio_file.wav") ```
Плюси: ~97% точності, простий API, виграє від попереднього навчання wav2vec2. Мінуси: більший розмір моделі, потрібні transformers + torch.
Який підхід вам варто використовувати?
| Підхід | Точність | Залежності | Швидкість |
|---|---|---|---|
| -------- | ---------- | ------------- | ------------ |
| F0 + спектр (чесно) | ~60–70% | librosa лише | Дуже швидко |
| MFCC + sklearn | ~85–90% | librosa + sklearn | Швидко |
| inaSpeechSegmenter | ~92–95% | CNN-модель (~200MB) | Середньо |
| Wav2Vec2 fine-tuned | ~95–97% | transformers + torch | Повільніше |
Для інструмента музичного аналізу на кшталт нашого найкраща «точка солодкого смаку» — Рівень 1 зараз (чесно про обмеження), паралельно рухаючись до Рівня 2 або 3 для майбутнього релізу. Найгірше, що ви можете зробити, — показати хибну впевненість: користувачі перестануть довіряти всьому вашому аналізу, якщо визначення голосу очевидно неправильне.
Головний висновок
Якщо ви будуєте аналіз голосу лише на librosa та спектральних ознаках: будьте скромні в тому, що це може робити. Обмежуйте бали довіри, використовуйте формулювання з «ймовірно/можливо», і завжди показуйте невизначеність. Ваші користувачі поважатимуть чесність більше, ніж фальшиву точність.
А якщо точність справді важлива для вашого сценарію використання, інвестуйте в MFCC-ознаки або попередньо навчену модель. Стрибок від 60% до 95% точності цілком виправдовує додаткову складність.
Хочете почути різницю? Завантажте трек у MixAnalytic — це безкоштовно і дає аналіз голосу разом із повним mix feedback, підсиленим AI.
