Python в аудио-спецэффектах. Как работают нейросети изнутри.
Python в аудио-спецэффектах. Как работают нейросети изнутри.

Полная версия

Python в аудио-спецэффектах. Как работают нейросети изнутри.

Язык: Русский
Год издания: 2026
Добавлена:
Настройки чтения
Размер шрифта
Высота строк
Поля
На страницу:
3 из 3

В этой главе мы перейдём от ручных признаков к спектрограммам. Мы узнаем, как превратить звук в изображение, которое нейросеть может «видеть». Мы построим свёрточную сеть, которая анализирует спектрограмму, и научим её классифицировать звуки не по четырём числам, а по всему богатству частотно-временной картины.

Почему спектрограмма — это картинка

Спектрограмма — это визуальное представление звука. По горизонтальной оси откладывается время, по вертикальной — частота, а цвет или яркость каждой точки показывает, сколько энергии было на этой частоте в этот момент времени. Мы подробно разбирали спектрограммы во второй книге, в главе про STFT. Сейчас важно понять, почему это представление так хорошо подходит для нейросетей.

Когда человек смотрит на спектрограмму, он видит осмысленные структуры. Речь выглядит как серия горизонтальных полос — это основной тон и обертоны, — перемежающихся вертикальными тёмными полосами пауз. Гласные звуки выглядят как яркие области в определённых частотных диапазонах — формантах. Согласные — как короткие шумовые всплески. Музыка выглядит как множество параллельных горизонтальных линий на частотах, кратных основному тону. Шум — как равномерная текстура без выраженной структуры.

Свёрточная нейросеть, обученная на изображениях, умеет выделять текстуры, края, формы. Она находит маленькие паттерны — например, горизонтальную линию определённой толщины, — затем собирает их в более крупные структуры — например, набор параллельных линий, характерный для гласного звука, — и в итоге формирует высокоуровневое представление: «это речь». Всё это происходит автоматически, без нашего указания. Сеть сама решает, какие визуальные признаки важны для классификации.

От сигнала к спектрограмме

Давайте напишем код, который превращает аудиосигнал в спектрограмму — тензор, готовый для подачи в нейросеть.

python

import torch

import torchaudio

import librosa

import numpy as np

def audio_to_mel_spectrogram(y, sr, n_mels=128, n_fft=2048, hop_length=512):

"""

Превращает аудиосигнал в мел-спектрограмму.


Мел-шкала имитирует восприятие частоты человеческим ухом:

низкие частоты представлены подробнее, высокие — грубее.

"""

# Преобразуем в тензор PyTorch, если пришёл numpy-массив

if isinstance(y, np.ndarray):

y = torch.tensor(y, dtype=torch.float32)


# Создаём преобразователь

mel_transform = torchaudio.transforms.MelSpectrogram(

sample_rate=sr,

n_fft=n_fft,

hop_length=hop_length,

n_mels=n_mels,

power=2.0

)


# Применяем

mel_spec = mel_transform(y)


# Переводим в логарифмическую шкалу (децибелы)

mel_spec_db = torchaudio.transforms.AmplitudeToDB()(mel_spec)


return mel_spec_db

# Загрузим пример и построим спектрограмму

import soundfile as sf

import matplotlib.pyplot as plt

# Создадим тестовый сигнал: речь + музыка

sr = 22050

duration = 2.0

t = np.linspace(0, duration, int(sr * duration), endpoint=False)

# Первая секунда — тон 440 Гц с обертонами (как музыка)

y_music = (np.sin(2 * np.pi * 440 * t[:int(sr)]) +

0.6 * np.sin(2 * np.pi * 880 * t[:int(sr)]) +

0.4 * np.sin(2 * np.pi * 1320 * t[:int(sr)]))

# Вторая секунда — шум (как шипение)

y_noise = np.random.randn(int(sr)) * 0.3

# Объединяем

y_test = np.concatenate([y_music, y_noise])

# Вычисляем мел-спектрограмму

mel_spec = audio_to_mel_spectrogram(y_test, sr)

print(f"Форма спектрограммы: {mel_spec.shape}")

print(f" Измерений: частота x время = {mel_spec.shape[1]} x {mel_spec.shape[2]}")

# Визуализируем

plt.figure(figsize=(12, 5))

plt.imshow(mel_spec[0].numpy(), aspect='auto', origin='lower',

extent=[0, duration, 0, sr/2], cmap='inferno')

plt.colorbar(label='Амплитуда (дБ)')

plt.xlabel('Время (сек)')

plt.ylabel('Частота (Гц)')

plt.title('Мел-спектрограмма')

plt.tight_layout()

plt.savefig('mel_spectrogram_demo.png', dpi=150)

print("Спектрограмма сохранена как mel_spectrogram_demo.png")

Обратите внимание на форму полученного тензора: [1, n_mels, time_frames]. Первое измерение — каналы (моно — один канал). Второе — частотные полосы. Третье — временные окна. Это трёхмерный тензор, очень похожий на изображение: каналы (как RGB в картинке), высота (частоты), ширина (время). Свёрточные сети, придуманные для анализа картинок, принимают на вход именно такой формат.

Конец ознакомительного фрагмента.

Текст предоставлен ООО «Литрес».

Прочитайте эту книгу целиком, купив полную легальную версию на Литрес.

Безопасно оплатить книгу можно банковской картой Visa, MasterCard, Maestro, со счета мобильного телефона, с платежного терминала, в салоне МТС или Связной, через PayPal, WebMoney, Яндекс.Деньги, QIWI Кошелек, бонусными картами или другим удобным Вам способом.

Конец ознакомительного фрагмента
Купить и скачать всю книгу
На страницу:
3 из 3