Beispiel #1
0
def main(_):
    if os.path.isfile(FLAGS.control) or os.path.isdir(FLAGS.control):
        if os.path.isdir(FLAGS.control):
            files = list(utils.find_files_by_extensions(FLAGS.control))
            assert len(files) > 0, 'no file in "{control}"'.format(
                control=FLAGS.control)
            control = np.random.choice(files)
        events, compressed_controls = torch.load(FLAGS.control)
        controls = ControlSeq.recover_compressed_array(compressed_controls)
        max_len = FLAGS.max_length
        if FLAGS.max_length == 0:
            max_len = controls.shape[0]

        control = np.expand_dims(controls, 1).repeat(1, 1)
        control = 'control sequence from "{control}"'.format(control=control)

    assert max_len > 0, 'either max length or control sequence length should be given'

    #FLAGS.start_string = FLAGS.start_string.decode('utf-8')

    if os.path.isdir(FLAGS.checkpoint_path):
        FLAGS.checkpoint_path =\
            tf.train.latest_checkpoint(FLAGS.checkpoint_path)

    model = CharRNN(EventSeq.dim(),
                    ControlSeq.dim(),
                    sampling=True,
                    lstm_size=FLAGS.lstm_size,
                    num_layers=FLAGS.num_layers,
                    use_embedding=FLAGS.use_embedding,
                    embedding_size=FLAGS.embedding_size)
    model.sess.run(tf.global_variables_initializer())
    model.load(FLAGS.checkpoint_path)

    outputs = model.sample(1000,
                           prime=events[0:100],
                           vocab_size=EventSeq.dim())

    outputs = outputs.reshape([-1, 1])
    print(outputs)
    name = 'output-{i:03d}.mid'.format(i=0)
    path = os.path.join("output/", name)
    n_notes = utils.event_indeces_to_midi_file(outputs[:, 0], path)
    print('===> {path} ({n_notes} notes)'.format(path=path, n_notes=n_notes))
with torch.no_grad():
    if use_beam_search:
        outputs = model.beam_search(init,
                                    max_len,
                                    beam_size,
                                    controls=controls,
                                    temperature=temperature,
                                    verbose=True)
    else:
        outputs = model.generate(init,
                                 max_len,
                                 controls=controls,
                                 greedy=greedy_ratio,
                                 temperature=temperature,
                                 verbose=True)

outputs = outputs.cpu().numpy().T  # [batch, steps]

#========================================================================
# Saving
#========================================================================

os.makedirs(output_dir, exist_ok=True)

for i, output in enumerate(outputs):
    name = f'output-{i:03d}.mid'
    path = os.path.join(output_dir, name)
    n_notes = utils.event_indeces_to_midi_file(output, path)
    print(f'===> {path} ({n_notes} notes)')