点击上方关注,All in AI中国
作者——Max Frenzel
很长一段时间以来,我一直希望将我对音乐的热情与我在人工智能方面的工作结合起来。但我一直再拖延。我觉得我需要先提高我的音乐制作技巧,然后再尝试深度学习这个过程。
由Nuevo.Studio设计的NeuralFunk的封面(http://nuevo.studio)
但是在9月中旬,我看到在今年的神经信息处理系统(NIPS)会议上(http://nips4creativity.com),将召开另一个关于创造和设计机器学习的研讨会,这可能是AI社区每年最大的活动。艺术品和音乐的提交截止日期是10月底。
这一切激励使我终于摆脱困境,停止找借口,开始做点什么。
NeuralFunk,一个完全基于样本追踪,其中所有样本都是由深度神经网络生成的。(https://soundcloud.com/taktilednb/neuralfunk?utm_source=soundcloud&utm_campaign=wtshare&utm_medium=Twitter&utm_content=https://soundcloud.com/taktilednb/neuralfunk)
它并没有像我原先想要的那样完全变成典型的Neurofunk音轨,而是发展成为非常独特的音乐。它是由黑暗,混乱和疲惫组成的,几乎让听众窒息,没有时间休息和呼吸。NeuralFunk与其生成方式一样具有实验性。
下面我想告诉你这个项目是如何产生的,从深度学习和音乐制作的角度。
如果你只对其中一个方面感兴趣,请随意跳过其他部分。我还将分享一些代码和生成的示例的链接。
NeuralFunk的起源
我最初进入电子音乐制作是通过手指击鼓(https://www.instagram.com/p/BnvYsyjBat-/?taken-by=mffrenzel)进行的,这仍然是我作为一个制作人的主要定义。所以我结合深度学习和音乐的第一个想法实际上是完全不同的。
我不打算制作完整的曲目,甚至不会产生任何音频。相反,我在想现场表演的有趣想法。具体来说,我正在考虑一个可以确定音频样本之间相似性的系统,这样我就可以自动交换其他类似声音。
举个简单的例子:我可能会有一种特殊的小鼓声,但是我想用类似但稍微不同的声音取而代之。
在更实验性的环境中,我可能想要在场地上录制我的观众或随机声音场景,然后自动从中提取声音以替换我正在使用的实际样本。通过这种方式,我可以逐渐从完全基于精心制作和手动挑选的样本的音轨转变为更有机和随机的东西,甚至可能有观众的互动,仍然可以保持其原始的音质。
除了是一个很酷的性能工具外,找到类似样本的好方法也可以在生产过程中提供很多帮助。几乎每个制作人都知道在不断增长的库中找到正确的样本是多么痛苦和耗时的过程,这些过程通常分布在许多随机目录和嵌套子目录中。
一年多以前,当我向Makoto谈到这个想法时,他非常友好地给了我一个大量的样本库。稍微摆弄了一下之后,我又回到了我最初专注于音乐制作的本身。
但现在我有充分的理由最终快速完成任务:NIPS研讨会截止日期。
但是,我得出的结论是,鉴于我这个项目只有一个月的时间,我原来的想法是不可实现的。深度学习部分不会成为问题,但为现场表演制定后端并制定有趣的列行程序会花费更多时间,特别是因为我在Max for Live(https://www.ableton.com/en/live/max-for-live/)(或任何其他开发环境中没有太多经验这可能适用于此)。
相反,我决定制作一首曲目。
我的主要风格是Drum&Bass。而Neurofunk的子流派,因其名称也是歌曲标题的灵感来源,看起来就像是是完美的搭配。
Neurofunk是Drum&Bass的一种黑暗而激烈的亚流派。除此之外,它的特点是非常复杂的声音设计,尤其是低音线。有关这方面的最新例子,请查看Document One在"LSD"中从0:44左右开始的低音。(https://youtu.be/F8cq83rkeGQ)对于更多"传统",请查看InsideInfo和Mefjus的"脉动"。(https://youtu.be/0tg2F9QESiE)
这种复杂的声音设计似乎与我使用神经网络的目的相符。然而,大多数Neurofunk制作人严重依赖复杂的波表或FM合成来精心塑造他们的声音。完全基于样本可能具有挑战性。此外,Neurofunk往往非常精确和尖锐。这两个属性我不确定神经网络的方法能否给出。
不过,我还是接受了挑战。而且,样本只是一个起点。
虽然我设定了每个声音必须来自神经网络生成的样本的限制,但我没有对我可以使用的效果或后处理设置任何限制,让我有很大的自由来塑造声音。
通过这种方式,我认为NeuralFunk与大多数其他AI辅助音乐生成方法不同。
在许多情况下,人们或者像在RNN中一样(https://magenta.tensorflow.org/performance-rnn),让AI模型通过MIDI生成来记录序列,或者使用深度学习来合成特定乐器,例如NSynth。(https://magenta.tensorflow.org/nsynth)
通过深度学习来合成所有的声音,然后从中产生一个音轨,这不是我到目前为止遇到的事情,尽管如果我是第一个这样做的话我会感到非常惊讶。虽然这可能是第一个以这种方式创建的Drum&Bass音轨。
结果显然不是AI制作的音乐。但它的音乐是用人工智能作为声音设计工具和探索新的创作表达方式而制作的。
深度学习阶段
鉴于非常粗略的想法,下一步是弄清楚用什么类型的网络来实际生成样本。
我还不太清楚我要走的方向,我再次从Nao那里得到了一些灵感。他有一个用于声谱分类的iPython笔记本。(https://gist.github.com/naotokui/a2b331dd206b13a70800e862cfe7da3c)我对声音分类不感兴趣,但我认为一些预处理可能很有用,所以我开始尝试使用它,将我库中的一些样本转换成光谱图。
这是项目NeuralFunk真正开始的时候,这张9月21日的Amen Break谱图。
在那之后,我决定从实际的神经网络开始,一个好的(并且有点明显的)地方是采用一个基本的waveNet(https://deepmind.com/blog/wavenet-generative-model-raw-audio/),在我的样本库上训练它,然后看看会发生什么。
我开始收集来自不同样本目录的所有样本。这主要是Makoto的样本,以及我的Maschine 2 Library,以及扩展的Resonant Blaze(https://www.native-instruments.com/en/products/komplete/expansions/resonant-blaze/),Prospect Haze(https://www.native-instruments.com/en/products/komplete/expansions/prospect-haze/)和Decoded Forms(https://www.native-instruments.com/en/products/komplete/expansions/decoded-forms/)(所有这些都是强烈推荐的)。我非常感谢本地工具,因为他们将样本作为wav文件直接提供,而不是深藏在软件中。
然后我将它们全部转换为16kHz,然后把超过10秒的任何音频都剪切掉。有一些较长的循环和整个音轨和茎,但我决定忽略那些。
最后我有大约62,000个样本(虽然我后来注意到我可能已经有更多了,因为我的自动搜索仅寻找与".wav"和".aiff"的完全匹配,这错过了很多,如".WAV",".aif"等)。
接下来,我采用了Wavenet的TensorFlow(https://github.com/ibab/tensorflow-wavenet),并简单地训练了该数据。考虑到数据的巨大差异,我并不期待惊人的结果,但这是一个开始,值得尝试。我确实最终得到了一些有趣的结果。尽管如预期的那样,大多数都是(不是随机的)噪音。
为了让Wavenet更好地了解它应该生成什么数据,我决定添加一个调节网络。
除了音频文件本身,我还创建并保存了每个文件前三秒的频谱图表示。我的初步计划是添加一个完整的卷积编码器网络,该网络将通过Wavenet进行端对端训练,将频谱图作为附加输入并将其压缩到条件向量。
不幸的是,至少在我的快速实验中,这被证明是一项艰巨的任务,而Wavenet只是学会了在频谱图编码器学习任何有用之前忽略条件向量。这似乎是太多强大的解码器阻止编码器学习的许多情况之一。(https://towardsdatascience.com/the-variational-autoencoder-as-a-two-player-game-part-iii-d8d56c301600)。
然而,在摆弄Wavenet的同时,我仍然没有放弃我最初想要找到样本之间相似性的想法。我的想法是,我可以使用Wavenet生成大量的随机样本,然后使用相似性搜索来查找接近我喜欢的特定参考声音的声音。
因此,为了使相似性搜索起作用,我还编写了一个在相同光谱图上训练的变分自动编码器(VAE)。我可以使用生成的嵌入来简单地通过比较潜在空间中的距离来进行相似性搜索。
但这个模型实际上可以让我做得更多。
我没有使用Wavenet端到端地训练编码器,而是使用VAE的嵌入作为Wavenet的条件向量,从而获得更好的结果。Wavenet现在显然利用了条件反射信息,它的输出具有许多它所受到的声音特征。
但即便如此,我可以使用VAE的解码器本身重建频谱图,然后使用Griffin-Lim算法重新映射回音频。
在这里,一个模型允许我创建嵌入,我可以使用它来调节另一个模型,使我能够进行高级语义搜索,以及实际上自己生成新颖的声音。
它也非常容易训练,只需几个小时就可以在我的iMac的CPU上进行融合。模型本身也很简单。这实际上是我第一次从头开始编写一个反卷积网络,所以我很快就把它拼凑在了一起,但它似乎是可行的。
鉴于时间很短,我并不真正关心优化。一旦有所作为,我就继续前进。我所做的一切都不严谨。我甚至懒得将我的数据拆分成单独的测试或验证集。
我添加到VAE的唯一一点点花哨的事情是一些标准化的流层。同样,我的实验远不够严格,但添加一些流动层似乎从质量上导致了总体上更好的结果。
我做了64维嵌入。但是使用TSNE,我可以将维度减小到2,以进行可视化。
原始样本没有任何类别标签,因此我使用文件名提取一些近似标签,在名称中查找"kick"和"sfx"等单词。结果出人意料的好。这里是所有样本的可视化,这些样本属于我选择的八个类别之一。
实际上我很惊讶群集的结果是如此之好,以及哪些群集与哪些群集相邻。
我做了另一个可视化,包括所有样本(即文件名中没有匹配标签的样本)。
结果不是那么好,但这可能部分是因为我没有时间或耐心来摆弄TSNE参数并且只取得了我得到的第一个结果。
可以在此处找到VAE的所有代码,以及一些预处理和其他随机位。(https://github.com/maxfrenzel/SpectrogramVAE)
我没有费心共享我的Wavenet代码,因为我尝试过的所有更复杂的东西实际上都没有用,而且真正起作用的东西实际上只是对原始实现的一个小修改(https://github.com/ibab/tensorflow-wavenet),它允许直接读取和输入预先计算嵌入来自".npy"文件的向量并使用它们进行调节。
样本生成阶段
拥有所有模型后,我可以开始实际生成一些声音。
首先是VAE和Griffin-Lim组合。它给了我三种产生声音的方法。
最简单的方法是对频谱图进行编码,再次对其进行解码,然后重建音频。一个例子是这个clavinet样本。我们可以看到基本频率得到了很好的保留,但很多其他细节都得到了改变。
这声嘟嘟声是另一个好例子。同样,基本频率和整体轮廓被保留,但很多细节被改变或丢失。
第二种方法是实际组合两个或多个嵌入,然后解码生成的潜在代码。一个很好的例子,它实际上最终形成了一个主旋律元素是一种鼓声和声乐的组合。
结果是一个非常好的和谐的声音,但开始时增加了一些有趣的subby,给出了一个很好的stabby合成声音。
这是另一个例子,结合了三种不同的输入。
生成的样本是一个kick声,就像其中一个输入,但有很多有趣的角色来自hi-hat和tabla。
最后,我也可以在没有任何输入的情况下直接从潜在空间进行采样。这导致了许多有趣的结果。
其中一些是明显可识别的声音类型,而另一些则更随机和具有实验性,但仍然可用作声音效果。
我想说,在这一点上,我遵循了非常清晰而深思熟虑的声音生成和设计过程。但考虑到时间有限,我实际上做的是编写一个脚本,选择0到3之间的随机数,然后从我的库中随机选择输入样本,嵌入它们,将它们组合起来,并生成最终的音频。
这样我就生成了几千个半随机样本。
我做的另一件小事就是给自己加上一点个人特征,记录下自己说的"Taktile"(我的艺术家名字)和"NeuralFunk",然后通过VAE解码器和Wavenet运行这两个样本,以获得两个基于它们的样本。
结果并没有真正类似人声,但是他们将它作为音效进入音轨(例如,第一个下降的技术声音实际上是"Taktile"样本之一)。
我对Wavenet几乎采用了完全相同的方法。
选择0到3之间的随机数,随机选择预先计算的预处理嵌入数(或从高斯中采样一个随机数)并将它们组合成单个条件向量,然后让Wavenet为每个嵌入生成32,000个样本(2秒)。
我再次以这种方式生成了数百个随机声音片段。
有趣的是,Wavenet似乎理解了一般的声音特性,而不是时间信息。而且由于它训练过完整的循环和节拍,它产生了一些非常有趣的输出。
例如,给定单次一次性打击声作为条件作用,结果有时实际上是包括相似类型的打击声的完整节拍。
如果我继续研究这个问题,我可能想要尝试的一件事就是不对整个频谱图进行编码并将其用作全局调节,而是对各个时间片进行编码,然后将它们作为局部调节方式馈送到Wavenet以获得对它的声音的时间方面的更多控制。
但就目前而言,我仍然有很多有趣的样本可供使用。
你可以在此处下载所有示例。(https://www.dropbox.com/s/vo5s1iq5eqyxxcm/Generated Samples.zip?dl=0)zip文件内部分别是对应于Wavenet和VAE样本的两个目录。
对于VAE,以"random"开头的文件名是基于我库中随机样本的文件。以"采样"开头的那些直接从在潜在空间中采样的代码解码。对于每个音频文件,我还包括一个输出频谱图的png,以及输入频谱图(如果有任何输入)。
Wavenet目录包含四个对应于四个不同模型的子目录。 "generated_1"和"generated_2"是无条件模型,而"generated_emb2"和"generated_emb_big2"是条件模型(末尾的数字指的是我训练它们的批量大小)。
对于有条件的文件,文件名包含它所处理的原始文件。例如。 "generated_emb_big2"中的"emb2_13727-StylusBD08 023_9519-Kick JunkieXL 3.wav"以两个文件"StylusBD08 023"和"Kick JunkieXL 3"(其他数字指我自己的内部索引系统)为条件。
你可以以任何你想要的方式使用这些样本。如果你想出一些很酷的东西,我很乐意听到它!
生产阶段
在生成了数千个样本之后,终于有了时间来制作并将它们变成类似于音乐的东西。
虽然我最近开始更多地了解Ableton Live,但我决定在Native Instrument的Maschine中做这个项目,因为这仍然是我迄今为止最舒服和最熟悉的DAW。我只是偶尔切换到Live,因为它是令人惊奇的变形工具。
最初的生产阶段非常痛苦。尽管我将我的VAE作为相似性搜索工具,但它目前的版本有许多缺点,这使得它对这项任务毫无用处。例如,它只考虑样本的开头。但特别是在Wavenet的情况下,文件中经常会有更多有趣的部分被埋没。
出于这个原因,我实际上不得不手动浏览所有样本并找到有趣的声音。这花了我两个整个晚上,我花了好几个小时来把我发现的有趣的声音放入我粗略按声音类型排序的组中,即打击乐,旋律,SFX和低音。然后,我进一步通过鼓组并按鼓声类型对每个样本进行颜色编码,例如红色为kick,绿色为snare,等等。
最后,我将所有kicks,snares和hats复制到不同的组中,以便稍后我可以一起处理它们。
最后,我有超过20个不同的小组,每个小组有16个样本,总共超过320个样本,我觉得很有趣。
但到目前为止,这远不是繁琐的预处理的结束......正如我所提到的,有趣的声音通常不在样本的开头。我必须把我真正想要的部分分离出来。
还有相当多的样本,特别是VAE产生的样本,有一些令人不快的高频噪声,所以我应用了一些低通滤波器来消除它。
最后,为了在一致的键中写入音轨,在这种情况下(主要是F minor),我不得不通过每个音调移位来调整旋律样本。
有了这一切,经过几个小时,基本的准备和预处理终于完成了,我可以开始制作音乐了。
我做的第一件事就是布置Amen Break(https://en.wikipedia.org/wiki/Amen_break)。但是我也想对它进行重新采样,这样我就可以把它弄零散。
结果是一个相当不错的声音Amen Break(除了最后一个糟糕的声音钹)。对于附带的图像,我认为通过DeepDream运行原始的"Amen,Brother"封面会很不错。
点击此处来听它(https://www.instagram.com/p/Bo9ATWbhCbQ/)。不幸的是Instagram嵌入似乎没有工作,所以我只是链接到它。
我试着放下一些鼓,但听不到任何好的声音。然后我想可能从一些旋律的东西开始。或者低音。但无论我试图在哪里开始,我都无法得到任何像样的东西。
我早期尝试更多声音设计,为样本添加滤镜,效果和调制,听起来也很糟糕。
在接下来的几天里,我做了很多微调,并在介绍中添加了其他元素。但每当我试图超越它时,我都会再次陷入困境。
幸运的是,我的好友D.A.V.E.当我告诉他关于这个项目时,他立即提出要合作。
D.A.V.E.他不仅是一位出色的DJ和制作人,而且他也是一位优秀的老师,他在这条道路上给了我很多帮助。我强烈建你去看看他的作品。(https://www.digitalandvinylexpert.com)
他提出了一些合成器部分,说实话,一开始听我真的觉得有点讨厌,但后来我完全被吸引了并且经过一些修改变成了我最喜欢的元素之一。
这是合作的一个非常酷的事情。即使你并不总是完全喜欢或赞同你的合作者所做的事情,它也会给你新的想法并帮助你摆脱困境。你可以修改它并使它成为你自己的,并最终得出一些你自己从来没有想过的成品。
在接下来的几天里,我们来回了解项目的最新消息。事实上,我们处于完全不同的时区(D.A.V.E.在伦敦,我在东京)实际上非常有助于协调事情。在工作之后的晚上(我的时间),我们会快速调整并谈论想法,然后我会在音轨上工作几个小时。在晚上结束时,我会把他的最新版本寄给他,当我第二天早上起床时,他又给我发了一些新的想法。
最终,在大约一周的时间里,NeuralFunk成长为现在的样子。这并不是我在开始这个项目时所设想的那种神奇的音轨,但无论如何它总是具有实践性的。
以下是Maschine的(几乎)最终安排。这绝对是一个Maschine项目,拥有我所做过的最不同的团体和模式。
有很多事我想改变或改进,特别是低音和其他低频元素相当混乱,但根本没有时间。
所以最后我决定把它称之为"完成",要观看我即兴创作的视频,请点击此处(https://www.instagram.com/p/BpUHNzihncV)。
总的来说,我认为该项目非常有趣。老实说,我完全满意的唯一部分是介绍,如果有更多的时间,我可能会废弃很多东西并重做它,但考虑到时间限制以及样本本身的实验性质,我认为结果也不算太糟糕。
我还有很多方向。其中一些我已经在上面提到了,但我还有更多的想法。
例如,我想改进VAE中的编码器/解码器架构,从一个简单的卷积网络处理谱图,就像处理任何其他图像一样,到考虑了沿两个轴的不同信息的东西。
我还在考虑回到我原来的想法,并将相似性搜索(甚至可能是样本生成)集成到一些有趣的现场表演工具中。
Copyright © 2024 妖气游戏网 www.17u1u.com All Rights Reserved