使用深度学习生成音乐:在 Python + Keras 中使用 RNN

157 阅读3分钟

音乐生成是深度学习的一个迷人应用,我们可以教机器根据现有音乐的模式和结构创作新音乐。循环神经网络 (RNN) 和生成对抗网络 (GAN) 等深度学习模型已被用于音乐生成。

在本教程中,我们将使用 Python 和 Keras 库通过循环神经网络生成新音乐。

在 Python 和 Keras 中使用 RNN 生成音乐

导入库

我们将从导入必要的库开始,包括用于构建模型的 Keras 和用于处理音乐数据的 music21。

从keras导入numpy作为np 。模型从keras导入顺序。layers import LSTMDenseDropout from music21 import converter,instrument,note,chord,stream
  
  

加载和准备数据

接下来,我们将加载音乐数据并准备好在模型中使用。

# 加载音乐数据
midi = converter.parse( 'path/to/midi/file.mid' ) 

# 提取音符和和弦
notes = [] 
for element in midi.flat: 
    if  isinstance (element, note.Note): 
        notes. append( str (element.pitch)) 
    elif  isinstance (element, chord.Chord): 
        notes.append( '.' .join( str (n) for n in element.normalOrder)) 
# 定义词汇
pitchnames = sorted ( set (项目中的项目notes)) 
note_to_int = dict ((note, number) for number, note in  enumerate (pitchnames)) 
# 将音符转换为整数
sequence_length = 100
 network_input = [] 
network_output = [] 
for i in  range ( 0 , len (notes) - sequence_length, 1 ): 
    sequence_in = notes[i:i + sequence_length] 
    sequence_out = notes[i + sequence_length] 
    network_input.append([note_to_int[char] for char in sequence_in]) 
    network_output.append(note_to_int[sequence_out])
n_patterns = len (network_input) 
n_vocab = len ( set (notes)) 
# Reshape input data
 X = np.reshape(network_input, (n_patterns, sequence_length, 1 )) 
X = X / float (n_vocab) 
# One-hot encode输出数据
y = to_categorical(网络输出)

在此示例中,我们从 MIDI 文件加载音乐数据并提取音符和和弦。然后我们定义一个独特的音符和和弦的词汇表,并将它们转换为整数。我们创建固定长度的输入和输出序列并对输出数据进行单热编码。

建立模型

接下来,我们将构建用于音乐生成的 RNN 模型。

# 定义模型
model = Sequential() 
model. 添加(LSTM( 512 , input_shape=(X.shape[ 1 ], X.shape[ 2 ]), return_sequences=True))
模型。添加(Dropout( 0.3 ))
模型。添加(LSTM( 512 ))
模型。添加(密集(256))
模型。添加(Dropout( 0.3 ))
模型。add (Dense(n_vocab, activation= 'softmax' )) 

# 编译模型
model.compile(loss= 'categorical_crossentropy' , optimizer= 'adam')

在此示例中,我们定义了具有两个 LSTM 层和两个用于正则化的 dropout 层的 RNN 模型。

火车模型

接下来,我们将在准备好的音乐数据上训练模型。

# 训练模型
model.fit(X, y, epochs=100, batch_size=64)

在这个例子中,我们在准备好的音乐数据的输入和输出序列上训练模型。

产生新音乐

最后,我们可以使用训练好的模型来生成新的音乐。

# 生成新音乐
start  = np.random.randint( 0 , len(network_input) -1 ) 
int_to_note = dict((number, note) for number, note in enumerate(pitchnames)) 
pattern  = network_input[ start ] 
prediction_output = [] #为范围( 500 )内的note_index

生成注释:    prediction_input = np.reshape( pattern , ( 1 , len( pattern ),
 
1 )) 
    prediction_input = prediction_input /  float (n_vocab) 
    prediction = model.predict(prediction_input, verbose = 0 ) 
    index = np.argmax(prediction) 
    result  = int_to_note[index] 
    prediction_output.append( result ) 
    pattern.append(index)
    模式 =  pattern [ 1 :len( pattern )] 

#创建MIDI 文件
offset  =  0
 output_notes = [] 
for pattern  in prediction_output: 
    if ( '.'  in  pattern )或pattern.isdigit(): 
        notes_in_chord = pattern.split( '.' ) 
        notes = [] 
        for current_note in notes_in_chord: 
            new_note = note.Note( int (current_note)) 
            new_note .storedInstrument = instrument.Piano() 
            notes.append(new_note) 
        new_chord = chord.Chord(notes) 
        new_chord.offset = offset
         output_notes.append(new_chord) 
    else : 
        new_note = note.Note( int ( pattern )) 
        new_note.offset =  offset
         new_note.storedInstrument = instrument.Piano() 
        output_notes.append(new_note)
    偏移量 + =  0.5

 midi_stream = stream.Stream( output_notes) 
midi_stream.write( 'midi' , fp = 'output.mid' )

在此示例中,我们通过从准备好的音乐数据中随机选择一个起始序列并使用经过训练的 RNN 模型在每个时间步预测下一个音符来生成新音乐。然后我们从生成的音符创建一个 MIDI 文件。

借助深度学习,我们现在可以根据现有音乐的模式和结构创作新音乐。