Читать книгу «Python в аудио-спецэффектах. Как работают нейросети изнутри.» онлайн полностью📖 — Александр Иванов — MyBook.
cover

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

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

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

Всё это работает благодаря нейросетям. И всё это кажется магией. Вы нажимаете кнопку — получаете результат. Что происходит внутри? Непонятно. Почему результат такой хороший? Тоже непонятно. Почему иногда он всё-таки плохой? Тем более непонятно.

Эта книга написана для того, чтобы магия перестала быть магией. Чтобы нейросетевая обработка звука стала для вас не чёрным ящиком, а понятным инструментом. Таким же понятным, каким стали фильтры и свёртки после второй книги. Таким же привычным, каким стала нормализация громкости после первой.

Мы не будем погружаться в математические глубины машинного обучения на уровне исследовательских статей. Но мы не будем и просто запускать готовые модели, не понимая их устройства. Мы пойдём по среднему пути — тому самому, который сработал в первых двух книгах. Мы будем понимать достаточно, чтобы осмысленно применять нейросети, диагностировать проблемы и адаптировать модели под свои задачи. И мы будем писать код, который делает реальную работу со звуком.

Три уровня работы со звуком

В первой книге мы были практиками. У нас была задача: убрать шум, выровнять громкость, смонтировать подкаст. Мы брали готовые функции — librosa.effects.split, nr.reduce_noise, pyln.normalize.loudness — и получали результат. Мы не знали, что внутри, но мы знали, как применить. Это первый уровень: использование.

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

В третьей книге мы станем создателями нового. Мы узнаем, как работают нейросетевые алгоритмы, которые превосходят классические. Мы научимся обучать модели, которые убирают шум лучше спектрального вычитания, разделяют источники лучше адаптивных фильтров и синтезируют речь, неотличимую от человеческой. Мы не будем просто вызывать готовые модели — мы будем понимать их архитектуру, готовить для них данные, обучать и оценивать качество. Это третий уровень: создание интеллектуальных систем.

Эти три уровня не заменяют, а дополняют друг друга. Практик знает, какую кнопку нажать. Инженер знает, что за этой кнопкой происходит. Создатель знает, как сделать кнопку, которой ещё нет.

Что такое нейросеть на самом деле

Прежде чем мы начнём, давайте разберёмся с главным. Нейросеть — это не мозг. Это не искусственный интеллект в научно-фантастическом смысле. Это не существо, которое думает и осознаёт себя. Нейросеть — это математическая функция. Очень большая, очень сложная, с миллионами параметров, но — функция. Она принимает на вход числа и выдаёт на выходе числа.

В чём же отличие нейросети от обычной функции, скажем, от фильтра? Фильтр мы проектируем сами. Мы решаем: вот здесь будет частота среза, вот здесь — крутизна спада, вот такие коэффициенты. Мы понимаем, почему фильтр работает именно так. Нейросеть же никто не проектирует вручную. Её параметры — те самые миллионы чисел — находятся автоматически, в процессе обучения. Мы показываем нейросети тысячи примеров входных и выходных данных, и она постепенно подстраивает свои параметры так, чтобы для каждого входа выдавать правильный выход.

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

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

Почему нейросети победили в обработке звука

Классические алгоритмы обработки звука основаны на математических моделях. Мы предполагаем, что шум стационарен — и применяем спектральное вычитание. Мы предполагаем, что реверберация линейна — и применяем свёртку. Мы предполагаем, что голосовой сигнал периодичен на коротких интервалах — и применяем автокорреляцию для определения высоты тона.

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

Нейросети не делают предположений. Они не знают, что такое стационарность, линейность или периодичность. Они просто смотрят на данные. Если в данных есть закономерность, нейросеть её выучит. Неважно, можем ли мы описать эту закономерность формулой. Неважно, понимаем ли мы её физический смысл. Если тысячи примеров показывают, что после определённого паттерна на спектрограмме идёт другой паттерн, нейросеть это запомнит и воспроизведёт.

Это не означает, что классические алгоритмы умерли. Они по-прежнему полезны, когда данных мало, когда нужна предсказуемость и интерпретируемость, когда важна скорость и малые вычислительные ресурсы. Но для задач, где качество важнее всего, нейросети сегодня — бесспорные лидеры.

Как устроена эта книга

Книга состоит из девяти глав. Мы начнём с самого простого — одного искусственного нейрона, — и дойдём до создания собственных нейросетевых аудиоэффектов.

В первой главе мы познакомимся с фундаментом: что такое искусственный нейрон, как из нейронов собирается сеть, что такое обучение и функция потерь. Мы напишем простую полносвязную сеть на PyTorch и научим её классифицировать звуки — отличать речь от музыки, музыку от шума. Это даст нам базовый инструментарий, с которым мы будем работать всю книгу.

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

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

В четвёртой главе мы изучим автокодировщики — архитектуру, которая сжимает данные в компактное представление и восстанавливает обратно. Мы применим автокодировщик к спектрограммам и увидим, как он учится выделять самое важное и отбрасывать шум.

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

В шестой главе мы реализуем нейросетевое шумоподавление. Мы обучим свою модель, которая берёт зашумлённую запись и выдаёт чистую. Мы сравним результат с классическим спектральным вычитанием из второй книги и увидим разницу.

В седьмой главе мы займёмся синтезом речи. Мы узнаем, как работают модели Text-to-Speech, и научимся клонировать голос — создавать синтезированную речь, которая звучит как конкретный человек.

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

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

Бонусная глава соберёт всю трилогию воедино. Мы посмотрим на путь, который мы прошли: от вызова готовых функций в первой книге до создания нейросетевых эффектов в третьей.

Что вам понадобится

Для работы с книгой вам нужен Python 3.9 или новее. Я предполагаю, что у вас уже установлены библиотеки из первых двух книг: numpy, librosa, soundfile, scipy, matplotlib. Если нет — установите их одной командой:

bash

pip install numpy librosa soundfile scipy matplotlib

Главная новая библиотека — PyTorch. Установка зависит от вашей системы, но для большинства пользователей подойдёт:

bash

pip install torch torchaudio

Если у вас есть видеокарта NVIDIA и вы хотите использовать её для ускорения обучения, установите версию с поддержкой CUDA. Инструкции есть на официальном сайте pytorch.org. Если видеокарты нет — не страшно. Все примеры в книге работают на обычном процессоре, просто обучение может занять чуть больше времени.

Вам также понадобится torchaudio — библиотека для работы со звуком, интегрированная с PyTorch. Она умеет загружать аудиофайлы, вычислять спектрограммы и применять аудиоэффекты — и всё это в виде тензоров PyTorch, готовых для подачи в нейросеть.

Для некоторых глав нам понадобятся предобученные модели. Я дам ссылки для скачивания и код для загрузки. Ничего покупать не нужно — всё бесплатно и открыто.

Как читать эту книгу

Главы построены последовательно: каждая следующая опирается на предыдущие. Если вы новичок в нейросетях, читайте по порядку. Если у вас уже есть опыт — можете переходить к интересующим главам, но имейте в виду, что в первой главе вводятся базовые понятия, которые используются дальше.

Каждая глава завершается творческим заданием. Не пропускайте их. Нейросети — это область, где понимание приходит через практику. Можно прочитать десять книг и всё равно не уметь обучить модель. А можно обучить одну модель своими руками — и понять больше, чем из всех книг вместе.

И, как всегда, экспериментируйте. Меняйте параметры. Ломайте код и чините. Нейросети — это не хрупкие конструкции. Они либо работают, либо нет. Когда не работают — это не провал, а приглашение к исследованию.

Пара слов перед стартом

Я помню свой первый опыт обучения нейросети. Это был простой перцептрон, который должен был отличать единицы от нулей на картинке восемь на восемь пикселей. Я запустил обучение и ждал. Процессор гудел, вентилятор ноутбука раскрутился до максимума. Через десять минут модель обучилась. Она правильно классифицировала аж семьдесят два процента примеров. Я был в восторге. Семьдесят два процента! Машина, которую я написал сам, научилась видеть!

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