Недавно я искал способы поэкспериментировать с использованием глубокого обучения аудио. Я подумал, что было бы круто попытаться создать нейронную сеть, которая могла бы взять все песни исполнителя, а затем сгенерировать новую песню в стиле исполнителя. Я знал, что есть способы сделать это, используя файлы MIDI для песен, но я хотел попытаться использовать настоящие аудиофайлы.
Это сообщение в блоге будет первым в серии, в которой я попытаюсь решить эту проблему.
Для начала мне нужен был способ конвертировать аудиофайл в формат, который можно было бы передать в нейронную сеть. После некоторого исследования я нашел способ конвертировать аудиофайлы в байты, а затем конвертировать байты в аудиофайл.
Используя библиотеку wave в Python, я смог взять файл wav и вывести его информацию, такую как количество каналов и частоту кадров, как показано ниже.
Number of channels 2 Sample width 2 Frame rate. 44100 Number of frames 10930176 parameters: _wave_params(nchannels=2, sampwidth=2, framerate=44100, nframes=10930176, comptype='NONE', compname='not compressed')
С этой информацией я смог записать все кадры в массив в байтовом формате.
Теперь, когда я смог получить аудиоинформацию в формате, подходящем для нейронной сети, следующей частью было определение структуры модели, которую я буду использовать.
Я решил использовать GAN или Generative Adversarial Network.
Ниже представлены три модели, которые я построил.
Generator _________________________________________________________________ Layer (type) Output Shape Param # ================================================================= dense_213 (Dense) (None, 512) 512512 _________________________________________________________________ leaky_re_lu_159 (LeakyReLU) (None, 512) 0 _________________________________________________________________ dense_214 (Dense) (None, 1024) 525312 _________________________________________________________________ leaky_re_lu_160 (LeakyReLU) (None, 1024) 0 _________________________________________________________________ dense_215 (Dense) (None, 1000) 1025000 ================================================================= Total params: 2,062,824 Trainable params: 2,062,824 Non-trainable params: 0 _________________________________________________________________ Discriminator _________________________________________________________________ Layer (type) Output Shape Param # ================================================================= dense_216 (Dense) (None, 512) 512512 _________________________________________________________________ leaky_re_lu_161 (LeakyReLU) (None, 512) 0 _________________________________________________________________ dropout_55 (Dropout) (None, 512) 0 _________________________________________________________________ dense_217 (Dense) (None, 256) 131328 _________________________________________________________________ leaky_re_lu_162 (LeakyReLU) (None, 256) 0 _________________________________________________________________ dropout_56 (Dropout) (None, 256) 0 _________________________________________________________________ dense_218 (Dense) (None, 128) 32896 _________________________________________________________________ leaky_re_lu_163 (LeakyReLU) (None, 128) 0 _________________________________________________________________ dense_219 (Dense) (None, 1) 129 ================================================================= Total params: 676,865 Trainable params: 676,865 Non-trainable params: 0 ________________________________________________________________ GAN _________________________________________________________________ Layer (type) Output Shape Param # ================================================================= input_28 (InputLayer) (None, 1000) 0 _________________________________________________________________ sequential_55 (Sequential) (None, 1000) 2062824 _________________________________________________________________ sequential_56 (Sequential) (None, 1) 676865 ================================================================= Total params: 2,739,689 Trainable params: 2,739,689 Non-trainable params: 0 _________________________________________________________________
Основная идея состоит в том, что Дискриминатор обучается на аудиоданных, которые всегда будут иметь целевое значение 1 - так как это реально. Затем шум подается в Генератор, а выходной сигнал подается в Дискриминатор. Затем Дискриминатор сможет предсказать, был ли вход настоящим звуком или ложным шумом. Затем GAN обновляет Генератор и со временем улучшит качество воспроизведения «настоящего» звука.
После настройки моделей следующей задачей будет найти способ уменьшить частоту дискретизации музыки и уменьшить общее количество параметров, поскольку в настоящее время это будет слишком большой нагрузкой на мой компьютер.
Итак, во второй части я рассмотрю способы уменьшения дискретизации звука, а также поищу хорошие источники звука - музыку, которая хорошо подойдет для такого эксперимента.
Быть в курсе.