作者 | Max Frenzel
来源 | Medium
MUTEK是世界领先的电子音乐和数字艺术节。MUTEK最初来自蒙特利尔,现在每年在全球多个城市举行,东京就是其中之一。
AI音乐实验室将于11月9日至19日举行,将汇集来自世界各地的15位艺术家,探讨人工智能在音乐制作和表演中的应用。
https://mutek.jp/en/news/archives/109
MUTEK.JP AI音乐实验室的参与者将研究三种流派-音景,噪音和技术-在日本文化背景的特定背景下比较三种流派的传统,现代状态和未来。实验室的主要任务是在机器学习和人工智能领域的专家的参与下,使用AI / ML技术创建新作品。
然后,将在12月的主要MUTEK.JP音乐节上进行一些最佳效果的选择。
用于NeuralFunk的工具,进一步开发它们,并以更加用户友好的方式打包它们的绝佳时机,以便音乐制作人无需太多的编码或机器学习背景都可以使用。
这项工作的结果是称之为SampleVAE的工具。所有代码均可在线获得。
https://github.com/maxfrenzel/SampleVAE?source=post_page-----e966c7562f22----------------------
可以将其用作预先训练的black-box工具(请参见Readme和Jupyter笔记本中的示例),可以在自己的数据集上进行训练,也可以深入研究代码并完全使其成为自己的代码。它带有三个简单的预训练模型,但也可以轻松地在自定义数据集上训练。
该工具具有三个主要功能:
- 以几种独特的方式产生声音
- 将声音分为不同的类别
- 在大型样本库中查找类似的声音
将在下面介绍这些功能。简单地谈谈技术方面。
之所以称它为SampleVAE,是因为它本质上是一种可变自动编码器(VAE),可将音频样本作为其输入和输出数据。
稍微详细一点,它是一个带有逆自回归流的卷积VAE,并在VAE编码器的隐藏状态之上具有一个可选的分类器网络。音频按照梅尔频谱图进行处理。该模型在TensorFlow中实现。
虽然现有一些针对音乐制作人的AI工具,其中许多确实非常适合特定用户和特定目的,但对于没有深度学习背景的普通音乐家来说,它们中的大多数要么太难了,要么它们的使用范围太有限了。
希望SampleVAE既可以高度自定义,又可以适应许多不同的用例,但同时又很容易设置和使用。
从训练有素的模型初始化工具就像在python会话中运行以下代码一样简单。
代码语言:javascript复制from tool_class import *
tool = SoundSampleTool(model_name, library_directory)
它也很轻便,可以在没有GPU的情况下在相当大的数据集上进行训练,并且推理时足够快,可以使用标准笔记本电脑集成到现场表演中。
该工具本身仍处于早期阶段,很高兴看到MUTEK AI实验室以及其他地方的实际艺术家将如何使用它。它是如此灵活,以至于用例几乎是无穷无尽的,希望可以利用这些想法来进一步开发该工具,或者其他人将使用该代码并针对自己的目的对其进行调整。
综上所述,简要了解一下该工具的当前功能。
产生声音
VAE是生成模型。这意味着在对实际数据进行训练之后,它们可以通过从其潜在空间中获取点并将其运行通过解码器来生成看似真实的数据。
SampleVAE利用此功能提供了几种独特的方式来生成音频(或更确切地说是声谱图,然后通过Griffin-Lim算法将其转换为音频)。
随机抽样
生成声音(并将其保存到名为的文件中'generated.wav')的最简单方法是,从潜在空间中随机选择一个点,并将其通过解码器。
代码语言:javascript复制tool.generate(out_file='generated.wav')
结果实际上是非常随机的。它们往往属于模型所训练的声音类别,例如鼓声,但通常还会产生非常独特且听起来像外星人的声音。
重新产生声音
另一种方法是获取输入文件,找到其嵌入,然后再次对其进行解码。这可以看作是声音的一种失真。
代码语言:javascript复制tool.generate(out_file='generated.wav', audio_files=[input_file])
当使用附加variance参数在解码之前将一些噪声添加到嵌入时,这将变得更加有趣。这可以在同一输入文件上生成无限的变化。
结合多种声音
产生新声音的最有趣的方法可能是组合多种声音。
代码语言:javascript复制tool.generate(out_file='generated.wav', audio_files=[input_file1, input_file2])
这将嵌入所有传入的文件,对其平均进行嵌入,然后对结果进行解码。
可以传递weights参数(浮点数列表)以非简单平均的方式组合向量。例如,这允许添加一个声音的更多而减少声音的数量(以及在声音之间进行内插)。
此外,它还允许使用其他有趣的嵌入矢量算法,例如从另一种声音中减去一种声音。例如,从另一声音中减去具有高起音的短音可能会减弱该声音的起音。
当然,所有这些都可以与variance参数组合以增加随机性。
声音相似度搜索
大多数生产者都会知道这个问题。有一个可以进行此类工作的示例,但是想尝试其他类似的示例。问题是如果有一个庞大的样本库,则很难找到样本。因此经常最终会一遍又一遍地使用相同的内容,或者选择不理想的内容。
find_similarSampleVAE工具的功能允许通过查看样本库(在初始化工具时指定),比较嵌入并返回最相似的样本来解决此问题。
例如,如果想找到与特定军鼓采样器最相似的五种声音,可以运行以下代码来获取文件列表,它们的起音时间(一秒钟内对此有更多的了解)以及它们与嵌入空间中的目标文件。
查找与给定军鼓声音相似的文件
上例中使用的库很小,只有几百个鼓声。但是该工具发现了几种类似的小军鼓声音,以及一些听起来很像小军鼓的踩镲声音。请注意,它认为最相似的文件(距离为零)实际上是输入文件本身,该文件也恰好包含在库中。
SampleVAE的当前实现将所有样本视为恰好两秒长。较长的文件被裁剪,较短的文件被填充。但是,出于示例库的目的,可以library_segmentation=True在初始化工具时指定将较大的文件分割为多个两个第二片的过程。然后,开始时间(以秒为单位)会标记相似样本在长文件中的位置。
例如,如果有很长的现场录音并想在其中找到特定的声音(这可能适用于实验室的音景类型),这可能很有用。
分类
最后,该工具可用于将样本分类为几个唯一的类。两个预训练模型具有与之关联的分类器。
第一个model_drum_classes在大约1万个鼓声音的数据集上经过训练,并具有9个不同鼓类的分类器(例如,踢鼓,军鼓等)。该模型的混淆矩阵如下。
用于训练预测九种鼓类型的模型的混淆矩阵
可以看到,许多类都被很好地认可,在低,中,高音调之间有相当多的混淆。
要使用预测功能,只需运行
代码语言:javascript复制probabilities, most_likely_class = tool.predict(input_file)
这将返回所有类的概率向量,以及具有最高概率的类的名称。
这种分类的潜在应用很大。例如交互式视听装置Neural Beatbox于今年夏天在伦敦的Barbican中心展出,使用这种分类作为其主要AI组件之一。
第二个预训练模型,model_drum_machines是在大约4k鼓声的小型数据集上进行训练的,分类器包含71种不同的鼓机(例如Akai XR10,Roland TR-808等)。同样,该模型的混淆矩阵如下。
模型的混淆矩阵,该模型经过训练可将声音分类为71种鼓机(例如Roland TR-808)。这并不意味着显示出良好的结果,数据集很小,每个类只有几个示例。这仅仅是为了表明可能。
对于这样一个复杂的分类任务,数据集太小了,但是加入这个模型只是为了说明可能的另一种想法。
这些是当前工具的主要功能。可以立即将它们与预先训练的模型一起使用。
但是如果想训练自己的数据怎么办?也很容易!
训练自己的模型
准备数据集
在训练模型之前,首先需要生成样本数据集。幸运的是,有一个简单的脚本可以做到这一点:
代码语言:javascript复制python make_dataset.py --data_dir root_dir --dataset_name my_dataset
上面的调用在root_dir(和嵌套目录)中找到了所有音频文件,将它们随机分为训练和验证数据(默认比率为0.9),并将它们保存为名为的数据集my_dataset。
如果要准备包含分类器信息的数据集,只需运行即可make_dataset_classifier.py。这会将的直接子目录root_dir视为唯一的类名称,然后在其中查找所有音频文件。
训练模型
现在已经准备好数据集,可以训练模型。
代码语言:javascript复制python train.py --logdir model_name --dataset my_dataset
该脚本会认为模型已被完全训练,因此会自动降低学习率并检查收敛性并停止训练(但是,如果需要更多控制,也可以覆盖所有这些方法)。
就是这样。现在已经拥有可以与该工具一起使用的模型。
改进,问题和想法
如上所述,该工具尚处于初期阶段,还有很多改进的空间。在这里,想提一些可能会想探索的想法,或者也许有人愿意解决的想法。
一个问题是该工具当前只能处理两秒钟的持续时间。其原因主要是在反卷积解码器中,目前它的形状已硬编码为两个第二音频的频谱图形状。
与此相关的是,虽然整个特征处理管道实际上不仅支持Mel频谱图,而且还支持更高级和可定制的特征,但更改选项也会改变张量的形状,这再次使当前的解码器崩溃。
给定音频参数自动确定解码器的形状将解决这两个问题。
当前解码器的另一个问题是,它生成的频谱图的细节很低而且很模糊(卷积VAE的常见问题),从而导致音频样本的清晰度较低。尝试不同的解码器方法可能会导致生成的音频质量更高。如果深入研究代码,实际上会找到一个选项,以启用堆叠在反卷积网络顶部的怪异RNN组合。只是对此进行了短暂的试验,但是在获得一些奇怪的早期结果之后并没有对其进行深入研究。
尝试一种可以直接在音频(例如WaveNets)上直接运行的完全不同的编码器/解码器体系结构可能也很有希望。从频谱图重建音频总是伴随着损耗/噪声,因此完全绕开此步骤可能会导致产生更高质量的样本。
对于带有分类器的模型,不能保证分类器部分和VAE部分以相同的速率收敛。尽管对于VAE来说,实际上似乎有点过拟合是为了获得更清晰的频谱图,但分类器也不应过拟合(嗯,有人可能会为过拟合的分类器提出创造性的用法)。主网络和分类器网络具有不同的学习率可能会很好。或者是冻结编码器和分类器权重,并仅继续训练解码器的选项。
在大型数据集中只有少数几个类示例已知的情况下,对半监督分类器的支持也将很不错。该模型代码实际上包含我使用的一个较旧的半监督模型的部分(对不起,我的代码往往有点混乱……),可以很容易地将其恢复,并且数据集的生成也可以适应这种情况而无需太多麻烦。
当前,一些生成的样本包含噪声。尤其是快速衰减的短声音具有较长的“噪声尾巴”。但是,对于使用此工具生成的样本,这种噪声似乎很有特征。因此,将噪声消除操作添加到声音生成步骤可能是相当直接的。
目前,示例库的可选分段似乎有点过于敏感。有时它会以缓慢的衰减将长音(例如片)分割成多种声音。
如前所述,该工具本身重量轻,速度快,足以将其直接集成到生产工作流程甚至现场表演中。将其包装到Max for Live设备中可能会很酷。有了二维的潜在空间,它甚至可以直接从由打击垫控制的2D网格上的点产生声音。
一切皆有可能
其他工具
SampleVAE不是Qosmo带给MUTEK AI音乐实验室的唯一工具。当在SampleVAE上工作时,Nao Tokui 在研究节奏生成工具。
甚至确实将该工具作为Max for Live设备直接集成到主要数字音频工作站之一的Ableton Live中。该工具可以直接训练并在Live中运行。
https://github.com/naotokui/RhythmVAE_M4L
目前,Nao正在开发类似的用于生成旋律的工具。
除了Qosmo的定制工具外,还将在实验室中探索许多其他公共可用的AI音乐工具。