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

- -
- 100%
- +
При попытке обучить модель на CPU всё работает очень медленно. Для маленьких моделей и небольших данных процессора достаточно. Если данных много, используйте GPU: в PyTorch это делается переносом модели и данных на устройство командой .to('cuda').
Творческое задание
Запишите три типа звуков: речь, музыку и шум — по несколько минут каждого. Извлеките из них реальные признаки с помощью extract_features. Обучите модель на реальных данных и сравните точность с синтетическими данными. Насколько реальные данные сложнее?
Добавьте четвёртый класс — например, тишину или звук природы. Измените модель так, чтобы она классифицировала четыре класса. Понадобится ли изменить архитектуру или достаточно просто переобучить выходной слой?
Визуализируйте границы решений. Возьмите два признака (например, RMS и спектральный центроид), обучите модель только на них и постройте график: точки разных цветов для разных классов и цветной фон, показывающий предсказания модели. Вы увидите, где модель ошибается и почему.
В следующей главе мы перейдём от абстрактных признаков к главному инструменту нейросетевой обработки звука — спектрограмме. Мы узнаем, почему звук для нейросети — это картинка, и как свёрточные сети, придуманные для анализа изображений, стали основой современных аудиоалгоритмов.
Глава 2. Спектрограмма как картинка: звук глазами нейросети
О чём эта глава
В предыдущей главе мы сделали первый шаг в нейросетевую обработку звука. Мы обучили полносвязную сеть классифицировать аудиофрагменты по нескольким числовым признакам: громкости, частоте пересечений нуля, спектральному центроиду. Это работало, но у такого подхода есть фундаментальное ограничение. Мы сами решали, какие признаки важны. Мы говорили сети: «Смотри на среднюю громкость, на центроид, на частоту пересечений нуля». А что, если мы упустили что-то важное? Что, если ключевое отличие речи от музыки скрыто не в этих четырёх числах, а в каком-то тонком паттерне, который мы не догадались измерить?
В идеальном мире мы бы не выбирали признаки вручную. Мы бы отдали сети весь сигнал целиком и сказали: «Смотри сама. Найди закономерности». Но у полносвязной сети есть проблема: она не умеет работать с длинными последовательностями. Аудиофрагмент длиной в одну секунду при частоте дискретизации 22 050 Гц — это 22 050 чисел. Полносвязная сеть с таким количеством входов будет огромной, медленной и склонной к переобучению.
Решение было найдено в области, далёкой от звука — в компьютерном зрении. Там исследователи столкнулись с похожей проблемой: изображение содержит миллионы пикселей, и подавать их все на вход полносвязной сети неэффективно. Они придумали свёрточные сети — архитектуру, которая смотрит на изображение через маленькие скользящие окна и выделяет локальные паттерны. И кто-то заметил: спектрограмма звука — это тоже изображение. По горизонтали — время, по вертикали — частота, а цвет или яркость — энергия. И на этом изображении есть текстуры, формы, линии — всё то, что свёрточные сети отлично умеют анализировать.
В этой главе мы перейдём от ручных признаков к спектрограммам. Мы узнаем, как превратить звук в изображение, которое нейросеть может «видеть». Мы построим свёрточную сеть, которая анализирует спектрограмму, и научим её классифицировать звуки не по четырём числам, а по всему богатству частотно-временной картины.
Почему спектрограмма — это картинка
Спектрограмма — это визуальное представление звука. По горизонтальной оси откладывается время, по вертикальной — частота, а цвет или яркость каждой точки показывает, сколько энергии было на этой частоте в этот момент времени. Мы подробно разбирали спектрограммы во второй книге, в главе про 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)
Конец ознакомительного фрагмента.
Текст предоставлен ООО «Литрес».
Прочитайте эту книгу целиком, купив полную легальную версию на Литрес.
Безопасно оплатить книгу можно банковской картой Visa, MasterCard, Maestro, со счета мобильного телефона, с платежного терминала, в салоне МТС или Связной, через PayPal, WebMoney, Яндекс.Деньги, QIWI Кошелек, бонусными картами или другим удобным Вам способом.



