在
Artezio的机器学习课程中
,我遇到了可以制作音乐的学习模型。 音乐是我生活中不可或缺的一部分,多年来我一直在乐队(朋克摇滚,雷鬼,嘻哈,摇滚等)中演奏,并且是狂热的听众。
不幸的是,由于我的许多原因,我很年轻的许多团体都分手了。 或他们没有分手,但是他们现在正在录制的内容...好吧,如果他们分手会更好。
我很想知道现在是否有一个现成的模型可以在我最喜欢的小组之一的足迹上学习并创建相似的构图。 由于音乐家本身不再是非常成功的,也许神经网络可以处理他们吗?
来源在研究完成的模型后,我很快发现
了这篇文章 ,其中概述了六个最著名的选项。 当然,这是关于数字音乐格式的。 从文章中可以看出,可以区分两种主要的音乐生成方法:基于数字化音频流(我们从扬声器听到的声音-原始音频,wav文件)和基于MIDI(音乐符号)的使用。
我放弃了带有原始音频的选项,这就是原因。
- 结果并不令人印象深刻-将此类模型用于和弦音乐会产生非常具体的结果。 这很不寻常,您可以创建有趣的画作,但不适合我的用途:听起来很奇怪,但我想听听与原作类似的内容。
来源钢琴音乐的一个很好的例子:
在管弦乐或摇滚乐中,听起来更奇怪:
他们在这里尝试处理Black Metal,而不仅仅是原始音频。
- 在我最喜欢的乐队的作品中,各种乐器的声音-人声,鼓,贝斯,吉他,合成器。 每个乐器都与其他乐器一起听起来。 我正在寻找一个模型,该模型将以相同的方式起作用,即不仅适用于单个乐器,而且还要考虑它们的联合声音。
当音乐家需要通过耳朵学习一部分乐器时,他会尝试将他需要的乐器与整个声音流隔离开。 然后他重复自己的声音,直到获得相似的结果。 即使对于听力良好的人来说,这项任务也不是最容易的-音乐可能很困难,乐器会“融合”。
来源我遇到了试图解决类似问题的软件工具。 有几个基于机器学习的项目。 例如,在我撰写本文时,Magenta发布了一种新乐器Wave2Midi2Wave,它能够“拾取”钢琴音符并实际“播放”它们。 还有其他工具,尽管总的来说该任务尚未解决。
因此,为了从作品中学到东西,最容易记下现成的笔记。 这是最简单的方法。 逻辑上假设神经网络更容易处理音乐的音乐表示,其中每种乐器都由单独的音轨表示。
- 对于原始音频,结果是所有乐器的混合,无法将零件单独加载到音序器(音频编辑器)中,无法校正,更改声音等。 我很高兴神经网络能构成一首成功曲子,但却在几个音符中犯了一个错误-使用音符时,我可以轻松地校正它们,而使用原始音频几乎是不可能的。
音乐符号也有其缺点。 它没有考虑到性能细微差别的数量。 对于MIDI,并不总是知道这些MIDI文件是谁,它们与原始文件有多接近。 也许编译器只是犯了一个错误,因为“删除”游戏并非易事。
使用和弦音符时,有必要确保乐器在任何时候都处于调音状态。 另外,从人的角度来看,这些时刻的顺序是合乎逻辑的,这一点很重要。
事实证明,没有太多的解决方案可用于音符,甚至不能用于一种乐器,但可以同时使用多种声音。 我最初忽略了Google TensorFlow的Magenta项目,因为它被描述为“非复音的”。 当时,MusicVAE库尚未发布,所以我决定参加BachBot项目。
来源巴赫博特
原来,解决我的问题的方法已经存在。 听听BachBot调校的
“生日快乐” ,听起来像是Bach合唱。
合唱是一种特定的音乐,它由四种声音组成:女高音,中提琴,中音和低音。 每种乐器一次可以产生一个音符。 在这里,您必须更深入地研究音乐。 我们将在四个方面讨论音乐。
在音符中,音符具有两个指示符-音高(to,re,mi ...)和持续时间(整数,一半,八分之一,十六分之一,三十秒)。 因此,整个音符持续一整节拍,两个半音符持续一整节拍,整个音符十六分之十六。
在准备用于训练神经网络的数据时,BachBot的创建者考虑了以下因素:
- 为了不使用来自不同琴键的和弦来敲击模型,这听起来不和谐,所有和弦都指向同一个琴键;
- 神经网络必须提供离散值,音乐是一个连续的过程,这意味着离散化是必要的。 一种乐器可以演奏很长的完整音符,而另一种乐器可以同时演奏十六分之一。 为了解决这个问题,所有音符都分成十六分之三。 换句话说,如果第四个音符出现在音符中,则它会以相同的第十六个输入的形式到达四次-第一次带有被按下的标志,而接下来的三个带有继续的标志。
数据格式如下-(音高,新音符|旧音符的延续)
(56,正确)#女高音
(52,False)#Alt
(47,错误)#次中音
(38,False)#低音
通过该过程从流行音乐21数据集中提取了所有合唱之后,BachBot作者发现合唱中没有很多四个音符组合的组合(如果将它们带到相同的琴键上),尽管看起来可能是128 x 128 x 128 x 128(MIDI中使用的128个音高水平)。 条件字典的大小不是很大。 这是一个奇怪的说法,当我们谈论MusicVAE时,我们将回到它。 因此,我们以这种四音序的形式记录了巴赫合唱。
人们常说音乐是一种语言。 因此,不足为奇的是BachBot的创造者将NLP(自然语言处理)中流行的技术应用于音乐,即他们在生成的数据集上训练
LSTM网络并获得了可以补充一种或多种乐器甚至从零开始创建合唱的模型。 也就是说,您设置了高音,中音和低音,然后BachBot为您添加女高音旋律,并且听起来像是Bach。
这是另一个示例:
听起来不错!
您可以更详细地观看
此视频 。 那里有一个有趣的分析,是根据
bachbot.com网站上的一项调查
收集的鼓励用户从神经网络创建的音乐中区分出原始的巴赫合唱。 结果提到,如果神经网络为所有其他设置创建低音部分,那么只有一半的用户可以将神经网络创建的和弦与原始和弦区分开。 很有趣,但是大多数音乐专家对此感到困惑。 使用其他工具,情况会好一些。 作为贝司手,这听起来很侮辱-暂时需要小提琴手,但现在是贝司手重拾石膏板技能的时候了。
洋红色
在研究BachBot时,我发现它已包含在Magenta项目(Google TensorFlow)中。 我决定仔细研究一下,发现在洋红色的框架内已经开发了几种有趣的模型,其中之一只是致力于处理复音成分。 Magenta开发了出色的工具,甚至已经为Ableton音频编辑器启动了该插件,就音乐家的应用而言,这特别好。
我的最爱:
节拍搅拌器 (在给定的鼓声部分上产生变化)和
潜在循环 (在旋律之间创建过渡)。
我决定使用MusicVAE工具的主要思想是,创建者试图在LSTM网络上将模型与可变自动编码器-VAE相结合。
如果您还记得,在有关Bach Bot的对话中,我们注意到和弦字典不包含128x128x128x128元素,而是更少。 MusicVAE的创作者也注意到了这一点,并决定使用压缩的潜在空间。
顺便说一句,这是培训MusicVAE的典型方法,您无需将源转换为一个键。 我想,转置不是必需的,因为源代码仍将由自动编码器转换,并且音调信息将消失。
VAE的设计方式使解码器可以有效地从训练数据集中恢复数据,而潜在空间表示输入数据特征的平滑分布。
这是非常重要的一点。 这样就可以创建相似的对象并执行具有逻辑意义的内插。 在原始空间中,我们有128x128x128x128个变体,它们结合了四个音符的声音,但实际上并没有全部使用(它们听起来对人耳来说不错)。 可变自动编码器将它们变成隐藏空间中的一个小得多的集合,您可以在该空间中提出从原始空间的角度来看具有有意义意义的数学运算,例如,相邻点将是相似的音乐片段。
一个很好的例子是本文中如何使用自动编码器为照片添加眼镜。 您可以在
本文的 Magenta官方网站上了解有关Muisc VAE工作原理的更多信息,也有指向arXiv的链接。
因此,选择了该乐器,仍然可以将其用于我的原始目标-根据已录制的音轨创建新音乐,并评估听起来像原始组的声音多少。 洋红色无法在我的Windows笔记本电脑上使用,并且很长一段时间以来一直在计算没有GPU的模型。 在遭受了虚拟机,docker容器等困扰之后,我决定使用云。
Google提供了
colab笔记本 ,您可以在其中沉迷于洋红色模型。 但是,就我而言,无法训练模型,由于各种限制-可用内存量,超时关闭,缺乏正常的命令行以及缺乏安装必要库的root权限,该过程始终崩溃。 假设地,甚至有机会使用GPU,但是我再说一次,我无法安装模型并启动它。
我当时在考虑购买服务器,祝您好运,我发现Google为Google Cloud云服务提供了GPU,甚至还有免费试用期。 没错,事实证明,在俄罗斯,只有法人才能正式使用它们,但是它们让我处于免费试用模式。
因此,我在GoogleCloud中使用一个GPU模块创建了一个虚拟机,在Internet上找到了我最喜欢的组之一的多个midi文件,并将它们上传到云中的midi文件夹中。
安装洋红色:
pip install magenta-gpu
我想所有这些都可以由一个团队来安装,这真是太好了,但是...错误。 看来您必须触摸命令行,对不起。
我们看一下错误:rtmidi库未安装在云计算机上,如果没有,则无法使用Magenta。
反过来,由于缺少libasound2-dev软件包,它崩溃了,而且我也没有root特权。
不太可怕:
sudo su root apt-get install libasound2-dev
Hooray,现在pip install rtmidi可以正常运行,而pip install magenta-gpu也可以正常运行。
我们在Internet上找到并将源文件下载到midi文件夹中。 他们听起来
像这样 。
我们将midi转换为网络已经可以使用的数据格式:
convert_dir_to_note_sequences \ --input_dir=midi\ --hparams=sampling_rate=1000.0\ --output_file=notesequences_R2Midi.tfrecord \ --log=DEBUG \ --recursive
然后开始训练
music_vae_train \ --config=hier-multiperf_vel_1bar_med \ --run_dir=/home/RNCDtrain/ \ --num_steps=1 \ --checkpoints_to_keep=2 \ --hparams=sampling_rate=1000.0 \ --hparams=batch_size=32,learning_rate=0.0005 \ --num_steps=5000 \ --mode=train \ --examples_path=notesequences_R2Midi.tfrecord
再次是问题。 Tensorflow崩溃并显示
错误 -幸运的是,几天前它找不到库,有人已经描述了此错误,并且可以修复Python源。
我们爬进文件夹
/usr/local/lib/python2.7/dist-packages/tensorflow_probability/python/distributions#
并替换导入行,如github上的错误所述。
再次启动music_vae_train,然后……万岁! 培训已经结束!
来源hier-multiperf_vel_1bar_med-我使用一个复音模型(最多8个乐器),每个乐器产生一个小节。
一个重要的参数是checkpoints_to_keep = 2,云中的磁盘容量是有限的,问题之一是学习过程由于磁盘溢出而一直被中断,检查点相当繁重-每个检查点为0.6-1 GB。
在5000年代的某个地方,错误开始在40-70附近跳跃。 我不知道这是不是一个好结果,但是似乎有了少量的培训数据,网络将受到进一步的培训,并且浪费在Google数据中心免费提供给我的GPU的时间也没有意义。 我们传给下一代。
由于某些原因,当安装Magenta时,并没有安装生成文件本身,我不得不将其放在其他人的文件夹中:
curl -o music_vae_generate.py https://raw.githubusercontent.com/tensorflow/magenta/master/magenta/models/music_vae/music_vae_generate.py
最后,创建片段:
music_vae_generate --config=hier-multiperf_vel_1bar_med --checkpoint_file=/home/RNCDtrain/train/ --mode=sample --num_outputs=32 --output_dir=/home/andrey_shagal/ --temperature=0.3
config-生成类型,与培训期间完全相同-多轨,1个时钟
checkpoint_file-使用受过训练的模型获取最后一个文件的文件夹
模式-样本-创建样本(还有另一个选项插值-在两个小节之间创建过渡小节)
num_outputs-生成多少个片段
温度-创建样本时从0到1的随机化参数。在0处,结果更可预测,更接近于源,在1处-正如我所看到的,我是一名艺术家。
在输出中,每个小节得到32个片段。 数次启动了生成器后,我听了片段,并在一条轨道上粘合了最好的片段:neurancid.mp3。
因此,“我今年夏天度过了。” 我很满意 当然,收音机“ Maximum”不太可能进入播放列表,但如果您收听,它的确看起来就像原始的Rancid乐队。 声音当然不同于录音室的录音,但我们主要处理音符。 此外,还有行动的余地-使用各种VST插件处理Midi,与现场音乐人重新录制声部,或者等到Wave2Midi2Wave的家伙超负荷使用吉他。
没有对笔记的抱怨。 理想情况下,我希望神经网络能够创造出杰作,或者至少使Billboard前100名大获成功。但是,尽管她学习了如何
使用摇杆上的
酒精和毒品,却演奏了八分之一的全部拍子(事实上,不仅如此,我为她的父亲般的骄傲而感到自豪。从20秒过渡到22秒)。 这是有原因的,还有更多原因。
- 少量数据。
- 我使用的模型产生的碎片只有一个度量大小。 通常,在朋克摇滚中,一次测量不会发生很多事件。
- 有趣的过渡和旋律仅在高音即兴即兴,从和弦过渡到和弦的背景下起作用,而自动编码器以及少量数据似乎丢失了大多数乐曲,甚至将所有的即兴即兴降低到了两个辅音和多个非音调和弦。 我们需要尝试一个适用于16种测量的模型,很遗憾其中只有3种声音可用。
我联系了开发人员,他们建议尝试减小潜在空间的尺寸,因为他们在200,000条磁道上训练了网络,而在15条上进行了训练。我无法达到减小z空间的可见效果,但是仍然需要改进。
顺便说一句,单调和单调并非总是负数。 从萨满教派仪式到技术派对,一步之遥。 我们必须尝试在诸如此类的模型上训练模型-狂欢,技术,配音,雷鬼,嘻哈舞弊。 当然,有机会创造令人愉快的僵尸。 我在Midi中发现了大约20首Bob Marley的歌曲,瞧,这是一个非常不错的循环:
MIDI上方的部分将用现场低音和吉他重新录制,并由VST合成器进行处理,使片段听起来更加生动。 在原始网络中,发布的只是注释。 如果您使用标准的Midi播放器播放它们,听起来像这样:
当然,如果您创建了一些基本的主题鼓图,并在节拍混合器+低音和合成器的基本部分中有一个潜在的循环(有更多关于它们的信息)来启动它们,那么很有可能运行一种用于Techno无线电的算法,该算法将不断创建新的音轨甚至一个无休止的轨道。 永恒的嗡嗡声!
MusicVAE还提供了训练网络以生成16小节三重奏片段的机会-鼓,贝斯和主音。 也很有趣。 输入数据-多轨midi文件-系统以所有可能的组合分为三部分,然后进一步训练模型。 这样的网络需要大量资源,但是结果是立即需要16个周期! 不可能抵抗。 我试图想象一个在Rancid和NOFX之间播放声音的组会如何发出声音,并为每个组中的相同数量的曲目进行训练:
也有重新录制现场吉他的Midi声部。 标准的MIDI播放器是这样的:
有趣! 这绝对比我的第一小组好! 顺便说一句,相同的模型为我们提供了不错的免费爵士乐:
我遇到的问题:
- 缺乏良好,方便的架子,这会减少等待培训的时间。 该模型仅在linux下工作,训练时间很长,很长一段时间都没有GPU,而且我一直想尝试更改参数并查看会发生什么。 例如,一个具有100个时代的GPU处理器的云服务器在“ 16个周期的三重循环”模型中的计数为8小时。
- 典型的机器学习问题是数据不足。 仅15个midi文件-了解音乐非常小。 神经网络与青年时代的我不同,在听音乐之前没有听过6张Rancid专辑,我没有去听音乐会,这一结果是从15条迷笛曲目中获得的,这些曲目与原始曲目都不相称。 现在,如果您用传感器缠住吉他手,并从每个音符中提取所有声音,那么……让我们看看Wave2Midi2Wave的想法是如何发展的。 也许几年后,解决此类问题的笔记可能会被拒绝。
- 音乐家应该清楚地融入节奏,但不是完美。 在midi周末,音符没有动态变化(例如,在鼓中),它们完全以相同的音量进行演奏,完全是在一次单击中演奏(如音乐家所说,即在节拍中精确地演奏),即使您随机分散它们,音乐也开始发出声音。更生动,更愉快。 同样,Wave2Midi2Wave已经在处理此问题。
现在,您对AI创作音乐的可能性以及我的音乐喜好有所了解。 您认为AI在未来的创作过程中会扮演什么角色? 在创作过程中,机器能否与人类平等地创作音乐,甚至比人类更好? 否则,人工智能将仅在原始工艺中在音乐领域成名。