← Назад к вопросам
Как будешь подготавливать аудиоданные для обучения модели?
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, 1]
- Извлечение признаков (mel-spectrogram, MFCC, etc.)
- Нарезка на окна с перекрытием
- Аугментация для увеличения датасета
- Нормализация признаков (z-normalization, min-max)
- Паддинг до одинакового размера
- Визуализация для проверки качества
Выбор признаков зависит от задачи: mel-spectrograms для audio-in-the-wild, MFCC для speech, полный STFT для music generation.