Недавно я искал способы поэкспериментировать с использованием глубокого обучения аудио. Я подумал, что было бы круто попытаться создать нейронную сеть, которая могла бы взять все песни исполнителя, а затем сгенерировать новую песню в стиле исполнителя. Я знал, что есть способы сделать это, используя файлы 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 обновляет Генератор и со временем улучшит качество воспроизведения «настоящего» звука.

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

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

Быть в курсе.