偶然在网上看到了一个让我很感兴趣的项目 Magenta,用Tensorflow让神经网络自动创造音乐。
白话就是:可以用一些音乐的风格来制作模型,然后用训练出的模型对新的音乐进行加工从而创造出新的音乐。
花了半天时间捣鼓终于有了成果,挺开心的,同时也把这半天的经验拿来分享,能让大家节约一些时间也算是我对社会做出的一点贡献吧。
再次感受 Google 的黑科技
希望大家能喜欢我的Chinglish
--第一步,安装,工具准备!--
操作系统:请放弃 windows 吧,选择linux 或者 Unix
想在windows上直接运行现在真的是毫无办法,刚开始想尝试新技术,应用容器——docker,不过没有windows 专业版的 hyperV,无法成功安装docker。
在linux上安装
1. 基本编程环境
python 2.7 / 3.* 都可以使用 TensorFlow 的 API
Java 环境:JDK
可以用 apt-get 安装
顺便把java添加到环境中吧,linux 中修改 bashrc. 路径PATH="$PATH:$HOME/bin"
这部分我就不赘述,反正你要这都不会百度基本上就告别编程了。
2. Project Magenta
https://github.com/tensorflow/magenta.git
3. TensorFlow 的安装
https://www.tensorflow.org/versions/r0.9/get_started/os_setup.html
本团员是这样做的:
$ sudo apt-get install python-pip python-dev
$ sudo pip install --upgrade https://storage.googleapis.com/tensorflow/linux/cpu/tensorflow-0.9.0-cp27-none-linux_x86_64.whl
你可能会在这个过程遇到版本依赖问题,可以尝试参考下面做法:
sudo aptitude install python-dev
4. 安装bazel
https://github.com/bazelbuild/bazel/releases/tag/0.3.0
选择合适版本
http://www.bazel.io/docs/install.html
面对新鲜事物,请听亲生父母的,请一定看官方文档:http://www.bazel.io/docs/install.html
注:linux download 的时候可以使用 wget
--第二步:开始创作!--
命令可以保存为 bash 格式方便以后使用,我是分四个步骤,编了4个批处理文件,
请一定注意修改路径
// 中途需要从github下载一些东西,不造是什么,所以请保持网络畅通
1. 第一个bash:创建旋律数据库
#!/bin/bash
##创建旋律数据库
MIDI_DIRECTORY=/home/liukun/TensorFlow/magenta/music/train #这里换成你的文件路径就行了
SEQUENCES_TFRECORD=/home/liukun/TensorFlow/magenta/music/train/notesequences.tfrecord
bazel run //magenta/scripts:convert_midi_dir_to_note_sequences -- \
--midi_dir=$MIDI_DIRECTORY \
--output_file=$SEQUENCES_TFRECORD \
--recursive
2. 第二个bash:提取出训练样本
# TFRecord file containing NoteSequence protocol buffers from convert_midi_dir_to_note_sequences.py.
SEQUENCES_TFRECORD=/home/liukun/TensorFlow/magenta/music/train/notesequences.tfrecord
# TFRecord file that TensorFlow‘s SequenceExample protos will be written to. This is the training dataset.
TRAIN_DATA=/home/liukun/TensorFlow/magenta/music/train/training_melodies.tfrecord
# Optional evaluation dataset. Also, a TFRecord file containing SequenceExample protos.
EVAL_DATA=/home/liukun/TensorFlow/magenta/music/eval_melodies.tfrecord
# Fraction of input data that will be written to the eval dataset (if eval_output flag is set).
EVAL_RATIO=0.10
bazel run //magenta/models/basic_rnn:basic_rnn_create_dataset -- \
--input=$SEQUENCES_TFRECORD \
--train_output=$TRAIN_DATA \
--eval_output=$EVAL_DATA \
--eval_ratio=$EVAL_RATIO
遇到的问题:本地github保存的账号可能会因为与远程github账号不同而出现错误,我root账户绑定了github用户,哪曾想到今天.....所以不用sudo了
3. 第三个bash : 训练神经网络模型, 最耗费时间!!!
#首先compile basic_rnn工具
bazel build //magenta/models/basic_rnn:basic_rnn_train
TRAIN_DATA=/home/liukun/TensorFlow/magenta/music/train/training_melodies.tfrecord
#训练模型,其中“rnn_layer_size”是神经网络的层数,可以自定义
/home/liukun/TensorFlow/magenta/bazel-bin/magenta/models/basic_rnn/basic_rnn_train --experiment_run_dir=/home/liukun/TensorFlow/magenta/music --sequence_example_file=$TRAIN_DATA --eval=false --hparams=‘{"rnn_layer_sizes":[30]}‘ --num_training_steps=2000
我为了节省时间,只训练了2000遍,所以......
4. 第四个bash:生成新的的旋律!
##生成旋律
#指定测试旋律的文件地址
PRIMER_PATH=/home/liukun/TensorFlow/magenta/music/origional/Canon.mid
#注意这里是绝对地址,只能指定一首歌
# num_outputs 指定生成曲目数量
bazel run //magenta/models/basic_rnn:basic_rnn_generate -- \
--experiment_run_dir=/home/liukun/TensorFlow/magenta/magenta/models \
--hparams=‘{"rnn_layer_sizes":[30]}‘ \
--primer_midi=$PRIMER_PATH \
--output_dir=/home/liukun/TensorFlow/magenta/music/generate \
--num_steps=64 \
--num_outputs=3
等待显得那么漫长。
程序执行结束,我按耐不住一颗好奇之心,满怀期待地打开刚刚诞生于这个世界的新艺术,泪目,这融合了21世纪最前沿技术的新作
旋律奏响,真TM......不好听。
老司机留话:
主要需要修改的就是文件的路径了。
我的思路使用一些风格突出的歌曲作为训练集,然后对简单的旋律进行加工,这样应该更能体现效果。
提醒:文件路径要使用绝对路径,虽然不知道问什么,但不这样就会出错,提示权限问题。
关于这个项目的Google讨论小组:
https://groups.google.com/a/tensorflow.org/forum/#!forum/magenta-discuss
最后祝大家假期愉快!
5555半天没刷题了~~~~
作者博客:http://www.cnblogs.com/learn-to-rock/
转载请注意排版,别搞得难看的一比!!!
项目文件目录树供参考:
. ├── bazel installer │ ├── bazel │ └── bazel-0.3.0-installer-linux-x86_64.sh ├── magenta │ ├── 1.sh │ ├── 1.sh~ │ ├── 2.sh │ ├── 2.sh~ │ ├── 3.sh │ ├── 3.sh~ │ ├── 4.sh │ ├── 4.sh~ │ ├── bazel-bin -> /home/liukun/.cache/bazel/_bazel_liukun/ebbbbefb206fd0a3aa08c53b60fb3fee/execroot/magenta/bazel-out/local-opt/bin │ ├── bazel-genfiles -> /home/liukun/.cache/bazel/_bazel_liukun/ebbbbefb206fd0a3aa08c53b60fb3fee/execroot/magenta/bazel-out/local-opt/genfiles │ ├── bazel-magenta -> /home/liukun/.cache/bazel/_bazel_liukun/ebbbbefb206fd0a3aa08c53b60fb3fee/execroot/magenta │ ├── bazel-out -> /home/liukun/.cache/bazel/_bazel_liukun/ebbbbefb206fd0a3aa08c53b60fb3fee/execroot/magenta/bazel-out │ ├── bazel-testlogs -> /home/liukun/.cache/bazel/_bazel_liukun/ebbbbefb206fd0a3aa08c53b60fb3fee/execroot/magenta/bazel-out/local-opt/testlogs │ ├── __init__.py │ ├── LICENSE │ ├── magenta │ │ ├── 1.sh │ │ ├── 2.sh~ │ │ ├── BUILD │ │ ├── __init__.py │ │ ├── __init__.pyc │ │ ├── lib │ │ │ ├── BUILD │ │ │ ├── __init__.py │ │ │ ├── __init__.pyc │ │ │ ├── melodies_lib.py │ │ │ ├── melodies_lib_test.py │ │ │ ├── midi_io.py │ │ │ ├── midi_io.pyc │ │ │ ├── midi_io_test.py │ │ │ ├── note_sequence_io.py │ │ │ ├── note_sequence_io_test.py │ │ │ ├── sequence_example_lib.py │ │ │ ├── sequence_to_melodies.py │ │ │ ├── sequence_to_melodies_test.py │ │ │ └── tf_lib.py │ │ ├── models │ │ │ ├── attention_rnn │ │ │ │ ├── attention_rnn_create_dataset.py │ │ │ │ ├── attention_rnn_encoder_decoder.py │ │ │ │ ├── attention_rnn_generate.py │ │ │ │ ├── attention_rnn_graph.py │ │ │ │ ├── attention_rnn_train.py │ │ │ │ ├── BUILD │ │ │ │ └── README.md │ │ │ ├── basic_rnn │ │ │ │ ├── basic_rnn_create_dataset.py │ │ │ │ ├── basic_rnn_encoder_decoder.py │ │ │ │ ├── basic_rnn_encoder_decoder.pyc │ │ │ │ ├── basic_rnn_generate.py │ │ │ │ ├── basic_rnn_graph.py │ │ │ │ ├── basic_rnn_graph.pyc │ │ │ │ ├── basic_rnn_train.py │ │ │ │ ├── BUILD │ │ │ │ ├── README.md │ │ │ │ └── run_basic_rnn_train.sh │ │ │ ├── lookback_rnn │ │ │ │ ├── BUILD │ │ │ │ ├── lookback_rnn_create_dataset.py │ │ │ │ ├── lookback_rnn_encoder_decoder.py │ │ │ │ ├── lookback_rnn_generate.py │ │ │ │ ├── lookback_rnn_graph.py │ │ │ │ ├── lookback_rnn_train.py │ │ │ │ └── README.md │ │ │ └── shared │ │ │ ├── BUILD │ │ │ ├── melody_rnn_create_dataset.py │ │ │ ├── melody_rnn_generate.py │ │ │ ├── melody_rnn_train.py │ │ │ ├── primer.mid │ │ │ └── README.md │ │ ├── protobuf │ │ │ ├── BUILD │ │ │ └── music.proto │ │ ├── reviews │ │ │ ├── assets │ │ │ │ ├── attention_interpolation.png │ │ │ │ ├── attention_parameterization.png │ │ │ │ ├── color-preserving-ny.jpg │ │ │ │ ├── diagram.png │ │ │ │ ├── generation.gif │ │ │ │ ├── mnist_generation.png │ │ │ │ ├── pixelrnn_figure6.png │ │ │ │ ├── pixelrnn_full_context.png │ │ │ │ ├── pixelrnn_masks_A.png │ │ │ │ ├── pixelrnn_masks_B.png │ │ │ │ ├── pixelrnn_masks_highlevel.png │ │ │ │ ├── svhn_generation.png │ │ │ │ └── tubingen-starry-night.jpg │ │ │ ├── draw.md │ │ │ ├── pixelrnn.md │ │ │ ├── README.md │ │ │ ├── styletransfer.md │ │ │ └── summary_generation_sequences.md │ │ ├── Rossini_barbe(2).mid │ │ ├── Rossini_barbe(3).mid │ │ ├── Rossini_barbe.mid │ │ ├── scripts │ │ │ ├── BUILD │ │ │ ├── convert_midi_dir_to_note_sequences.py │ │ │ └── convert_midi_dir_to_note_sequences_test.py │ │ └── testdata │ │ ├── BUILD │ │ ├── example_complex.mid │ │ ├── example.mid │ │ └── notesequences.tfrecord │ ├── music │ │ ├── eval_melodies.tfrecord │ │ ├── generate │ │ │ ├── 2016-07-16_224233_1.mid │ │ │ ├── 2016-07-16_224233_2.mid │ │ │ └── 2016-07-16_224233_3.mid │ │ ├── origional │ │ │ └── Canon.mid │ │ └── train │ │ ├── basket.mid │ │ ├── detective.mid │ │ ├── notesequences.tfrecord │ │ └── training_melodies.tfrecord │ ├── pretty_midi.BUILD │ ├── python_midi.BUILD │ ├── README.md │ ├── six.BUILD │ ├── tools │ │ └── bazel.rc │ ├── util │ │ └── python │ │ └── BUILD │ ├── WORKSPACE │ └── WORKSPACE~