用 TensorFlow 开发会作曲的 AI
背景和知识点介绍
人工智能的不断火热.
Google 的 Magenta(洋红色)项目
mark
https://magenta.tensorflow.org/
Make Music and Art Using Machine Learning
项目的源代码在 github, pip install 就可以安装.
可以查看官方文档查看用法.
所用到的音乐存储格式
mark
MP3 包含音乐, midi 有点像一个电子的乐谱, 告诉电脑怎么演奏.
用到的神经网络技术
RNN & LSTM(基于 RNN 优化的一个长短期记忆) long short time memory
为什么用 RNN(循环神经网络)?
RNN 每一个输入与前面的输出建立起关联
能够很好的处理序列化的数据. 前面的数据和后面的数据是有联系, 影响的.
能以前面的序列化对象为基础, 来 "生成" 新的序列化对象
生成句子(序列化)
我是中国人, 我很爱我的祖国, 我会说
序列中的每个词不可以颠倒顺序, 是有次序的.
mark
循环神经网络会帮我们填上答案.
生成音乐(也是序列化)
mark
它也可以基于前面的音乐, 为我们生成新的音乐.
音乐基础知识
mark
音符.
一个八度: Octave
八度由 12 个半音组成.
读作 sharp, 是音乐里的升音符号, 在 sharp 前面的这个音去升高一个半音.
mark
c# 比 c 高了一个半音. c# 与 d 之间也是一个半音. c 和 d 之间相差一个全音. 之后每隔间隔是一个半音.
E 和 F 相当于 mi 和 fa, 他们两之间其实是一个半音, 而不是一个全音.
最后的 b 和下一个的 C 又高半个音.
mark
编程语言 C# 的含义其实是音符
c# : c 升高半个音
音符表格
mark
midi 格式是用这些数字来标志的. C4 中央和 A4 都是调音的节点
0-127 表示不同音的音符.
http://midikits.net/midi_analyser/midi_note_numbers_for_octaves.htm
数字表示对应的音.
mark
https://newt.phys.unsw.edu.au/jw/notes.html
标准的钢琴是 88 个键, 不能表示全部的 128 个数据.
钢琴最低的音从 A0(21)开始. a0 对应白键, a#0 对应黑键, B0 对应白键 23
mark
B0 和 c1 之间是一个半音.
钢琴有七个八度音, 12*7 一个八度音里面有 12 个半音.
88 键的钢琴, 有七个八度. 加上首部的 3 个键, 和尾部的 1 个键 c8
12*7 + 3 +1 =88
曲子样例 1 & 2
还行, 能听
局限性
mark
音乐和数学的联系
mark
mark
生动的音乐和枯燥的数学真的有联系?
数学是科学的皇后.
数学是大部分我们研究的学科的基础: 物理, 密码学, 天文学, 化学.
计算机底层语言也是 0,1 这样的二进制(cpu 里面晶体管的开关)
德国数学家高斯说: "数学是科学的皇后"
音乐的本质
音乐是由声音 (Sound) 组成的
声音是由重复的声波 (Sound Wave) 组成的
音符的音调有对应的频率, 由 Hz 描述
http://www.paleotechnologist.net/?p=2253
mark
音符对应的 Frequency(Hz)表示. 最小, 理想, 最大.
音乐中的数学
在乐谱中经常能看到数学: 2/4 (以四分音符为一拍, 每小节两拍)
音符之间的关系也由数学所表示
mark
两个四分音符加起来就是一个二分音符. 两个八分音符加起来是一个四分音符
全音符表示为几个音符相加之后的和.
节奏(Rhythm) 是音乐在时间上的组织.
毕达哥拉斯琴弦律
两个音弦长成简单整数比, 同时或连续弹奏, 发出和谐声音.
毕达哥拉斯 勾股定理
和谐的比例贯穿整个大自然的 "音乐"
宇宙的星球间的距离成简单的整数比, 运行时发出美妙的球体音乐
法国数学家傅里叶的证明
傅里叶变换
所有的乐声(不论是器乐还是声乐) 都能用数学表达式来表述
是一些简单的正弦周期函数的和
每种声音都有三种品质: 音调, 音量和音色
黄金比例 和 斐波那契数列
有不少作曲家用黄金比例和斐波那契数列来帮助他们作曲
黄金比例: 0.618:1
斐波那契数列:
mark
开始是 1,1+2 等于 3, 数前后关系有黄金比例.
把音乐形式用我们的数学形式来表达, 放进我们的循环神经网络, 训练之后为我们生成新的音乐形式.
什么是 midi 文件
Musical Instrument Digital Interface(乐器数字接口)
"数码乐谱" 二进制文件
基本结构: 文件头 + 数据描述
http://ericjknapp.com/blog/2014/03/28/midi-file-format/
mark
头部, 后面是数据
现代音乐几乎都是 MiDI 加上音色库来制作合成的
什么是 MIDI
20 世纪 80 年代初为解决电声乐器之间的通信问题而提出.
记录的是音符, 控制参数等指令. 它指示设备要做什么及怎么做
电脑, 合成器, 声卡, 电子乐器能相互控制, 交换信息
mark
在 midi 设备的控制下连接电子吉他. 电子琴等.
MIDI 和五线谱的区别
五线谱是拿给人演奏看的
MIDI 是拿给电脑演奏看的
MIDI 文件格式分析 - 理论篇
https://www.midifan.com/modulearticle-detailview-901.htm
我们会演示如何从 midi 中读取数据, 然后存入我们的二进制文件.
再去给我们的神经网络调用训练. 训练之后也会产生一个 midi 的文件
我们之后再把 midi 文件转成 mp3 文件, 给大家播放试听.
MiDI 包含的信息量一般来说远远超过五线谱
MIDI 的优势
小: MIDI 文件一般十几 kb,MP3 文件一般十几 MB 1MB=1024kb
记录的信息丰富: 音轨, 声调, 强度, 音量, 颤音, 相位, 节奏
提高制作音乐效率, 降低成本, 乐队耗资太大
示例 MIDI 文件.
MIDI 是一个电子乐谱. 一般不能直接播放. win 可以直接播放.
车库乐队软件可以播放.
配置 AI 作曲的开发环境
TensorFlow
sudo pip install keras
Music21(处理一些音乐格式的)
sudo pip install music21
H5Py 用于存储二进制数据的
sudo pip install h5py
Ffmpeg(处理音乐声卡相关)
sudo apt install ffmpeg
Timidity(midi 转成 mp3)
sudo apt install timidity
http://web.mit.edu/music21/
麻省理工学院出品的软件包.
HDF5 python 的一个接口. 对于 hdf5 数据格式进行操作
ffmpeg 一个跨平台的音频, 视频转换.
timidity 是可以去播放 midi 的一个.
sudo pip install keras
sudo pip install music21
sudo pip install h5py
sudo apt install timidity
来源: http://www.jianshu.com/p/5a4f5eec815f