Как будешь подготавливать аудиоданные для обучения модели?

«Как будешь подготавливать аудиоданные для обучения модели?» — вопрос из категории Предобработка данных, который задают на 26% собеседований Data Scientist / ML Инженер. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Подготовка аудиоданных — критический этап. Мой пайплайн включает стандартизацию, извлечение признаков и аугментацию.

1. Унификация формата (ресемплинг и моно-конвертация): Первым делом привожу все аудио к единой частоте дискретизации (часто 16 кГц для речи) и одному каналу (моно). Это обеспечивает согласованность входных данных.

import librosa
audio, orig_sr = librosa.load('input.wav', sr=None)  # Загрузка с исходной частотой
target_sr = 16000
audio_resampled = librosa.resample(audio, orig_sr=orig_sr, target_sr=target_sr)

2. Нормализация громкости: Привожу амплитуду сигналов к общему диапазону (например, [-1, 1]), чтобы модель не училась на уровне громкости.

audio_normalized = librosa.util.normalize(audio_resampled)

3. Извлечение признаков (Feature Extraction): Сырые волновые формы редко подают на вход модели. Я извлекаю спектральные признаки.

  • MFCC (Mel-Frequency Cepstral Coefficients): Стандарт для задач распознавания речи и классификации звуков. Они аппроксимируют восприятие звука человеком.
    # Извлечение 13 MFCC коэффициентов + их первые и вторые производные (delta)
    mfcc = librosa.feature.mfcc(y=audio_normalized, sr=target_sr, n_mfcc=13)
    delta_mfcc = librosa.feature.delta(mfcc)
    delta2_mfcc = librosa.feature.delta(mfcc, order=2)
    features = np.vstack([mfcc, delta_mfcc, delta2_mfcc])  # Итоговый вектор признаков 39xT
  • Mel-спектрограммы: Часто используются в end-to-end моделях (например, на основе CNN).

4. Аугментация данных для увеличения датасета: Чтобы модель стала robust к вариациям в реальном мире, применяю преобразования к аудио или признакам.

import audiomentations as A
augment = A.Compose([
    A.AddGaussianNoise(min_amplitude=0.001, max_amplitude=0.015, p=0.5),
    A.TimeStretch(min_rate=0.8, max_rate=1.25, p=0.5),
    A.PitchShift(min_semitones=-4, max_semitones=4, p=0.5),
])
augmented_audio = augment(samples=audio_normalized, sample_rate=target_sr)

5. Сегментация и паддинг: Для задач, требующих фиксированной длины входа (например, классификация), нарезаю аудио на сегменты одинаковой длительности. Более короткие сегменты дополняю (pad) нулями или тишиной.

6. Создание таргетов: Для supervised learning подготавливаю метки, синхронизированные с аудио (например, текст для ASR или временные метки для sound event detection).