Визначення гендеру голосу в аудіо: від спектрального аналізу до ML-моделей
Tech
audio analysis
python
machine learning
librosa

Визначення гендеру голосу в аудіо: від спектрального аналізу до ML-моделей

Як ми покращили класифікацію гендеру голосу в нашому аудіоаналізаторі — від ненадійних оцінок 100% впевненості до чесних оцінок завдяки кращим ознакам і підходам ML.

Uygar DuzgunUUygar Duzgun
Mar 26, 2026
Updated 4 квіт. 2026 р.
4 min read

Проблема: Самовпевненість і часто неправильні результати

Ми оновили аналіз голосу в MixAnalytic — нашому AI-проєкті для аудіоаналізу, призначеному для музичних продюсерів. Функція визначає, чи є в треку вокал, і оцінює стать голосу, щоб адаптувати поради щодо міксу.

Попередня реалізація використовувала librosa для оцінки основної частоти (F0) та аналізу спектрального центроїда. Працювало… інколи. У чому була справжня проблема? Вона з упевненістю заявляла: «Жіночий голос — 100% довіри» на треках із чоловічим вокалом. Це гірше, ніж взагалі не мати цієї функції.

Ось що ми дізналися, виправляючи це, і три рівні покращень, доступні будь-кому, хто працює з аналізом голосу в Python.

Рівень 1: Припиніть брехати про довіру

Найшвидший виграш — визнати, що спектральний аналіз *не може* зробити. Чистий F0 + спектральний центроїд — це груба евристика, а не класифікатор. Наші виправлення:

Обмежте довіру до 85% — один лише спектральний аналіз ніколи не має претендувати на беззаперечність
Завжди додавайте невизначеність — мінімум 10% «невпевнено» в кожному результаті
М’якша мова — «ймовірно чоловік» замість «виявлено чоловічий голос»
Ширші зони перетину — діапазон 140–185 Гц справді неоднозначний (тенор vs контральто)

```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.