【Jukebox: A Generative Model for Music】
最近对于在音乐里面的应用还是蛮有兴趣的,找了一篇最新的Paper来看看怎么生成音乐。本文使用算法同时生成钢琴主调,用数字歌姬生成人声,并且基于上面的主调和人声再生成相应的伴奏。生成式模型大家应该也知道被广泛的应用于图像领域之中,比如说VAE和GAN都是非常经典的模型,那么在音频的处理领域同样是可以应用这些方法。
主流的处理有两种方式,第一种方法是得到MIDI文件,由于MIDI文件之中包含了曲子的走向以及可以将不同的乐器分离开,但是还有一种方法是处理Raw Audio也就是比如说MP3文件之类的,处理这样的一个问题的时候除了其中含有极高维度的特征人们很难感知之外,还有一个问题就是很难获取长距离的依赖关系,当然这种长距离的依赖关系同样是在NLP领域内非常棘手的问题。而作者使用了Hierarchical VQ-VAE的方式将音频压缩到了一个离散的空间之中然后使用AutoRegressive Sparse Transformer在这个离散的空间之中训练。
Model
首先先用数学化的语言进行描述一下,假设音乐以波的形式存在的话是在区间$[-1,1]^T$之内的,这里的$T$不是指转置(Trans)这里的$T$指的是Number of Samples,也就是在一秒钟之内采样的声音的个数,或者有一个更加熟悉的名字叫做采样率(Sampling Rate),这个范畴一般是在16kHZ到48kHZ之间,代表了一秒钟之内采样了16000个点还是采样了48000个点。对于CD来说,其采样的点数一般是44.1kHZ代表一秒钟之内采样了44100个点,而对于采样的点来说,其采样完毕需要存储,对于CD来说,其一般而言是以16bit的精确度进行存储的,也就是每一个采样点是使用16个1或者是0进行描述。
而作者的使用的模型的主体架构呢是叫做VQ-VAE,先将音频压缩到一个低维空间之中。一个One-Dimensional 的VQ-VAE可以将$x = <x_{t}>^{T}_{t=1}$压缩成为一个离散的Token的序列$z = <z_{s}\in [K]>^{S}_{s=1}$,其中的$K$是Vocabulary Size,我们将$T/S$称为是Hop Length。其中包含了应Encoder$E(x)$将$x$转换成为一系列的Latent Variable $h =<h_s>^{S}_{s=1}$,而在得到了Latent的State之后并不是直接接Decoder,而是将$h_s$转换成为了另外的一个向量$e_{z_s}$,而这里的$e$可以认为是认为设定好的一些具有明显的特征的向量,而对于Decoder则将$e$转为正常的输出。这里和普通的VAE的最大的的区别就是使用了$e$作为那个Hidden State而私以为在这里的Motivation是为了人为的控制住某些特征,同时加速处理的过程。
那么在这里的VQ-VAE的目标可以分解为三个目标的和
这里的$sg$代表的是停止做Gradient的操作,也就是这里不计算梯度。式子(2)度量的是在输入和输出之间的差距的程度,而式子(3)(4)所度量的是转换为人为设定的向量的时候所产生的Loss,以使得整个的模型更加稳定。
Music VQ-VAE
这里的VQ-VAE不仅仅是上面的一维的形式,而是呈现一个Hierarchical的结构,大概就是显示成为下面的这种形式
VQ-VAE模型常常受到诟病的一点就是其中的所有的的Embedding都会被Encoding到一个或者极少数的Vector之中,那么人为设定的那些Vector可能就会浪费掉,同时也会丢失很多的信息。所以作者避免上面的问题发生的一点就是使用Random Restarts,也就是当使用的$e$仅仅只有那几个的时候,其会Reset新来的那个$h$到一个随机的$e$上面。
在模型之中还有一种损失叫做Sample-Level Reconstruction Loss
其鼓励我们的模型可以更多的关注在Spectral Components的上面,也就是希望模型在训练的时候不去关注音乐之中过于细节的那些东西而是关注于那些Main Tune.
Music Priors and Upsamples
在我们按照上面的步骤之中训练完VQ-VAE之后,需要去在这些Compressed Space上面学习一个Prior $p(z)$以生成Samples,而作者将Priors分解为
对于之中的每一个概率都使用一个AutoRegressive模型进行处理,这里的模型是Transformers with attention,果然不得不说Transformer的确是一个变革啊,在各种应用之中都可以见到。
这里的生成式模型也可以通过调节其他的条件变得更加Controllable,比如说提供了歌曲的Artist和Genre的Label,其有两个主要的好处,第一个可以减少在Audio Prediction之中的Entropy,所以模型可以更好的在某一个指定的Style上面获得更好的Performance。
当然对于音乐来说,人声也是一个非常重要的部分,如果不对于人声进行区分的处理的话,所生成的音乐的人声的部分基本上是由Babbling所组成。所以这里又有另外的一个子任务就是Lyrics-to-singing(LTS)的任务,可以看成是Text-to-Speech(TTS)的一个延伸,当然这里的对于语音和语调的要求会更高,所以也就更加困难。所以这里好像也做了一个Attention的机制将器乐和人声对齐。
然后Encoder完了之后就是Decoder了,Decoder就很简单连接神经网络然后对齐就好了。这里的一个蛮有意思的东西就是Sampling,因为自己也是第一次看这种文章,所以觉得还是蛮有意思的。
给定了一个Prior之后,文章之中所提出的方法是从上往下采样的过程,Top – Middle – Bottom.然后上面的这样的一个过程只是生成了一个Block,然后假设给定了你一个5秒的片段,而我们要根据这5秒的片段继续生成,就需要使用一种方法叫做WIndowed Sampling
也就是在生成下面的一段语音的时候同时是使用之前的一部分的内容,以增加内容的连贯性。
Comments
对于音乐的评价的标准其实也更难去找到一个公认的标准,只能是凭借着读者自己的常识去判断。甚至是在文本生成之中的连贯性之类的指标也不能够简单的复制在这里面,因为比如自己而言对于音乐之中的一部分为了情感的烘托而做出的停顿或者是转折是非常喜欢的,甚至很多时候就是这些点而创造了一首伟大的音乐。而自己试听的感觉的话,作品的确是可以听出有机器的痕迹的,这点当然无可厚非,毕竟是完全的机器的创作自然不可能会过于生动。
自己感觉在NLP领域的很多的方法是可以完全简单的移植到这个上面来的,比如说Transformer就是一个移植的机制,而对于音乐来说,我虽然认为很多的调是不同区分是什么乐器的,那样的一个走向就是一个很好听的调调。但是直接的处理Raw Audio是一个非常困难的方式,而处理MIDI可能会是一个当前而言更加实际的选择。而自己倒也不知道现在有啥处理MIDI片段的方式,不过昨天看的一个简单的Demo里似乎并没有区分不同的乐器。我感觉首先对于不同的乐器分开处理可能会好一些。
Reference
Jukebox: A Generative Model for Music
Comments
Leave a Comment