← Назад к вопросам

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

2.2 Middle🔥 91 комментариев
#Pandas и обработка данных#Глубокое обучение

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI29 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Подготовка аудиоданных для обучения модели

Аудиоданные требуют специфической предварительной обработки перед использованием в ML моделях. Процесс включает загрузку, нормализацию, представление в форме, пригодной для обучения.

1. Загрузка и базовая обработка аудиофайлов

import librosa
import numpy as np
import soundfile as sf
from scipy import signal

# Загрузка аудиофайла
audio_path = "audio.wav"
y, sr = librosa.load(audio_path, sr=None)  # y - audio data, sr - sample rate

print(f"Sample rate: {sr} Hz")
print(f"Duration: {len(y) / sr:.2f} seconds")
print(f"Audio shape: {y.shape}")

# Загрузка с переопределением частоты дискретизации
y, sr = librosa.load(audio_path, sr=16000)  # Обычно используют 16kHz

2. Нормализация аудиосигнала

# Нормализация к диапазону [-1, 1]
audio_normalized = y / np.max(np.abs(y))

# Z-нормализация (по среднему и дисперсии)
audio_znorm = (y - np.mean(y)) / np.std(y)

# Нормализация по максимальному значению в dB
S = librosa.feature.melspectrogram(y=y, sr=sr)
S_db = librosa.power_to_db(S, ref=np.max)

print(f"Min: {audio_normalized.min():.3f}, Max: {audio_normalized.max():.3f}")

3. Извлечение признаков (Feature Extraction)

Для звука используют различные типы признаков:

# 3.1 Mel-Spectrogram (самый популярный)
mel_spec = librosa.feature.melspectrogram(
    y=y, 
    sr=sr, 
    n_mels=128,  # Количество мел-полос
    n_fft=2048,  # FFT window size
    hop_length=512
)

# Логарифмическое преобразование
mel_spec_db = librosa.power_to_db(mel_spec, ref=np.max)
print(f"Mel-spectrogram shape: {mel_spec_db.shape}")

# 3.2 MFCC (Mel-Frequency Cepstral Coefficients)
mfcc = librosa.feature.mfcc(
    y=y, 
    sr=sr, 
    n_mfcc=13
)

print(f"MFCC shape: {mfcc.shape}")

# 3.3 Спектральные признаки
D = librosa.stft(y)  # Кратковременное преобразование Фурье
magnitude = np.abs(D)
phase = np.angle(D)

# 3.4 Признаки временной области
zero_crossing_rate = librosa.feature.zero_crossing_rate(y)[0]
spectral_centroid = librosa.feature.spectral_centroid(y=y, sr=sr)[0]
spectral_rolloff = librosa.feature.spectral_rolloff(y=y, sr=sr)[0]
rmse = librosa.feature.rms(y=y)[0]

print(f"Zero Crossing Rate: {zero_crossing_rate.mean():.3f}")
print(f"Spectral Centroid: {spectral_centroid.mean():.1f} Hz")

4. Нарезка аудиофайлов на окна

# Разбиение длинного аудиофайла на сегменты
window_duration = 2  # 2 секунды
window_samples = window_duration * sr
hop_samples = sr // 2  # 50% перекрытия

audio_windows = []
for start in range(0, len(y) - window_samples, hop_samples):
    window = y[start:start + window_samples]
    # Применяем окно для сглаживания границ
    window = window * signal.get_window('hann', len(window))
    audio_windows.append(window)

print(f"Number of windows: {len(audio_windows)}")
print(f"Window size: {window_samples} samples ({window_duration}s)")

# Преобразование в mel-spectrograms
mel_specs = []
for window in audio_windows:
    mel = librosa.feature.melspectrogram(y=window, sr=sr, n_mels=128)
    mel_db = librosa.power_to_db(mel, ref=np.max)
    mel_specs.append(mel_db)

X = np.array(mel_specs)  # Shape: (num_windows, n_mels, time_steps)

5. Аугментация аудиоданных

import librosa.effects

# 5.1 Изменение скорости (time stretch)
y_stretched = librosa.effects.time_stretch(y, rate=1.1)  # На 10% быстрее

# 5.2 Сдвиг по высоте (pitch shift)
y_pitched = librosa.effects.pitch_shift(y, sr=sr, n_steps=2)  # На 2 полутона выше

# 5.3 Добавление шума
noise = np.random.normal(0, 0.005, len(y))
y_noisy = y + noise

# 5.4 SpecAugment (аугментация спектрограммы)
def spec_augment(spec, freq_mask_param=30, time_mask_param=40):
    # Маскирование частотных полос
    f = np.random.randint(0, freq_mask_param)
    f_start = np.random.randint(0, spec.shape[0] - f)
    spec_copy = spec.copy()
    spec_copy[f_start:f_start + f, :] = 0
    
    # Маскирование временных отсчётов
    t = np.random.randint(0, time_mask_param)
    t_start = np.random.randint(0, spec.shape[1] - t)
    spec_copy[:, t_start:t_start + t] = 0
    
    return spec_copy

6. Обработка пропущенных значений и аномалий

# Проверка на NaN и бесконечность
if np.isnan(audio_normalized).any():
    audio_normalized = np.nan_to_num(audio_normalized)

if np.isinf(audio_normalized).any():
    audio_normalized = np.nan_to_num(audio_normalized, posinf=1, neginf=-1)

# Обнаружение тишины (для фильтрации)
energy = librosa.feature.rms(y=y)[0]
silent_frames = energy < energy.mean() * 0.1

7. Полный pipeline подготовки данных

from sklearn.preprocessing import StandardScaler
from pathlib import Path

def prepare_audio_batch(audio_files, target_sr=16000, n_mels=128):
    """
    Подготовить батч аудиофайлов для обучения модели.
    """
    X, file_names = [], []
    
    for audio_file in audio_files:
        try:
            # Загрузка
            y, sr = librosa.load(audio_file, sr=target_sr)
            
            # Нормализация
            y = y / (np.max(np.abs(y)) + 1e-8)
            
            # Извлечение mel-spectrogram
            mel_spec = librosa.feature.melspectrogram(
                y=y, sr=sr, n_mels=n_mels, n_fft=2048, hop_length=512
            )
            mel_db = librosa.power_to_db(mel_spec, ref=np.max)
            
            # Нормализация признаков
            mel_db = (mel_db - mel_db.mean()) / (mel_db.std() + 1e-8)
            
            X.append(mel_db)
            file_names.append(Path(audio_file).stem)
            
        except Exception as e:
            print(f"Error processing {audio_file}: {e}")
            continue
    
    # Паддинг до одинакового размера
    max_len = max(x.shape[1] for x in X)
    X_padded = np.array([
        np.pad(x, ((0, 0), (0, max_len - x.shape[1])), mode='constant')
        for x in X
    ])
    
    return X_padded, file_names

# Использование
audio_files = ["audio1.wav", "audio2.wav", "audio3.wav"]
X, names = prepare_audio_batch(audio_files)
print(f"Input shape: {X.shape}")

8. Особенности для разных задач

# Классификация жанров: используем средние характеристики
def extract_genre_features(y, sr):
    features = {
        "mfcc_mean": librosa.feature.mfcc(y=y, sr=sr).mean(axis=1),
        "spectral_centroid": librosa.feature.spectral_centroid(y=y, sr=sr).mean(),
        "spectral_rolloff": librosa.feature.spectral_rolloff(y=y, sr=sr).mean(),
        "zero_crossing": librosa.feature.zero_crossing_rate(y).mean()
    }
    return np.concatenate(list(features.values()))

# Speech recognition: используем mel-spectrogram как image
def prepare_speech_data(y, sr):
    mel_spec = librosa.feature.melspectrogram(y=y, sr=sr, n_mels=80)
    mel_db = librosa.power_to_db(mel_spec, ref=np.max)
    return mel_db[np.newaxis, :, :]  # Добавляем channel dimension

# Music generation: используем полный STFT
def prepare_music_data(y, sr, n_fft=2048):
    D = librosa.stft(y, n_fft=n_fft)
    magnitude = np.abs(D)
    phase = np.angle(D)
    return magnitude, phase

9. Проверка качества подготовки

# Визуализация mel-spectrogram
import matplotlib.pyplot as plt

fig, axes = plt.subplots(2, 1, figsize=(10, 8))

# Временной сигнал
axes[0].plot(y)
axes[0].set_title("Audio Waveform")
axes[0].set_xlabel("Sample")

# Mel-spectrogram
mel_spec_db = librosa.power_to_db(mel_spec, ref=np.max)
im = axes[1].imshow(mel_spec_db, aspect='auto', origin='lower')
axes[1].set_title("Mel-Spectrogram (dB)")
axes[1].set_xlabel("Time Frame")
axes[1].set_ylabel("Mel Frequency Bin")
plt.colorbar(im, ax=axes[1])
plt.tight_layout()
plt.show()

Заключение

Типичный pipeline подготовки аудиоданных:

  1. Загрузка с нормализацией частоты дискретизации
  2. Нормализация амплитуды к диапазону [-1, 1]
  3. Извлечение признаков (mel-spectrogram, MFCC, etc.)
  4. Нарезка на окна с перекрытием
  5. Аугментация для увеличения датасета
  6. Нормализация признаков (z-normalization, min-max)
  7. Паддинг до одинакового размера
  8. Визуализация для проверки качества

Выбор признаков зависит от задачи: mel-spectrograms для audio-in-the-wild, MFCC для speech, полный STFT для music generation.