编译:yxy
出品:ATYUN订阅号
我做了一个简单的概率模型来生成流行音乐。通过客观标准,我可以说模型产生的音乐听起来比其他深度学习技术制作的音乐更像是流行音乐。我是怎么做到的?我这样做的部分原因是,我认为流行音乐的核心:和声与旋律之间的有统计关系。
旋律是声乐和曲调。和声是和弦与和弦进行。在钢琴中,旋律由右手演奏,而和声由左边演奏。
问题
在深入研究他们的关系之前,让我首先定义问题。我开始这个项目的初衷是通过深度学习(或者说AI)产生流行音乐。这很快让我想到使用LSTM,这是一种特殊的RNN,非常适合生成文本和制作音乐。
但随着我对这个主题的深入了解,我开始还以应用RNN及其变体生成流行音乐的逻辑。逻辑基于对流行音乐的内部结构的几个假设,我并不完全赞同。
具体的假设是和声与旋律之间的独立关系。
以多伦多大学的2017年发表的Song from Pi: A Musically Plausible Network for Pop Music Generation (Hang Chu, et al)为例。在这篇文章中,作者明确地说“假设…和弦是独立和旋律无关”。基于此,作者构建了一个复杂的多层RNN模型。旋律有自己的层用于生成音符,它与和弦层无关。除了独立之外,这个特殊的模型决定了旋律的和谐。这只意味着和声取决于音符生成的旋律。
Hang Chu等人的堆叠RNN模型。每一层都负责处理歌曲的不同方面。
这种建模方式让我感觉很奇怪,因为它不像是人类创作流行音乐的方式。作为一名受过古典音乐训练的钢琴家,我绝不会考虑在不首先考虑和声音符的情况下写旋律音符。这是因为和声音符定义且限制了旋律音符。曾经风靡一时的YouTube视频中,Axis of Awesome早已证明了这一思想(http://imgcdn.atyun.com/2018/08/4-Chords-Music-Videos-The-Axis-Of-Awesome.3gp)。
他们的视频显示了西方流行音乐的一个典型特征:和声,或那四个和弦,基本决定了旋律是什么。用数据科学的术语,我们可以说条件概率控制和决定了和声与旋律之间的统计关系。因为旋律音符自然取决于和声音符。因此可以认为,和声音符本身就限制了特定歌曲中旋律音符的选择。
解决方案
我喜欢建立自己的解决方案来解决复杂的问题。因此,我决定构建自己的模型,以我自己的方式捕捉音乐数据丰富的底层结构。我开始关注控制不同类型音符之间关系的预定概率。就如我上面提过的和声与旋律之间的关系。
处理数据
使用music21库,我主要(但不是完全)基于马尔科夫进程处理这些midi文件。这使我能够提取输入数据中不同类型的音符之间的统计关系。具体来说,我计算了我的音符的转换概率。这基本上意味着当音符从一个转换到下一个时,我们可以获得转换发生的概率。(下面有更深入的解释)
midi:歌曲的数字化版本。
首先,我提取了和声音符和旋律音符之间的“垂直”转换概率。我还根据数据集计算了旋律音符中的所有“水平”转换概率。我也为和声音符完成了这项任务。下图演示了音乐数据中不同类型音符之间的三种不同过渡矩阵的示例。
顶部:和声和旋律之间的音符 – 中间:旋律之间的音符 – 底部:和声之间的音符
模型
使用这三个概率矩阵,我的模型将遵循:
1.从数据中选择随机和声音符。
2.使用上面的第一个概率矩阵,根据和声音符选择一个旋律音符。
3.使用上面的第二个概率矩阵,根据旋律选择一个旋律音符。
4.重复第3步,直到达到终止线。
5.使用第三个概率矩阵,根据之前的和声音符选择一个新的和声音符。
6.重复步骤1-4直到终止线。
以下是这6个简单步骤的具体示例。
机器随机选择Harmony Note F.
和声音符F有4个旋律音符可供选择。使用第一个转换矩阵,它可能会选择音符C,因为C具有相对较高的可能性(概率为24.5%)。
旋律音符C将转到第二个转换矩阵选择下一个旋律音符。它可能会选择旋律音符A,因为它的概率最高(88%)。
步骤3将继续生成新的旋律音符,直到预设的终止线。
和声音符F将转到第三个转换矩阵以选择下一个和声音符。它可能会根据相对较高的可能性选择F或C.
步骤1-4将重复,直到预设的终止线。
评估
现在是困难的部分 – 如何评估不同的模型。毕竟,我的文章声称简单概率可以胜过神经网络。但是我们如何从神经网络模型中评估我的模型呢?我们怎样才能客观地宣称我的音乐比人工智能做出的音乐更像流行音乐呢?
要回答这个问题,我们首先要知道究竟是什么定义了流行音乐。我给出了第一个定义:和声与旋律之间的统计关系。但流行音乐还有其他定义要素。这就是为什么流行音乐有一个在一首歌中重复多次的清晰可辨的开头、中间和结尾(序曲、主歌、过渡、副歌、收场等)。
例如,“Let it go, let it go, can’t hold it back anymore….”是音乐的中间部分,而不是开始和结束。这部分在歌曲中重复了三次(应该出自冰雪奇缘)。
因此,我们可以使用所谓的自相似矩阵。简单来说,自相似性矩阵用数学方法将歌曲的开头、中间和结尾可视化。下面是一首歌曲的自相似矩阵,电影Once中的Falling Slowly。
每个小块代表了歌曲中四拍的每一个音符。对角线上每个大块代表一首歌的一部分。
第一个蓝色块表示歌曲的开头部分,而下一个黄色块表示该歌曲的下一部分。由于它们(自相似),第一和第三块的阴影相同。由于它们自身相似性,第二和第四簇的色彩相同。
我在我用作输入数据的20首流行歌曲中制作了20个这些自相似矩阵。然后,我让我的机器尽可能忠实地复制他们的结构。
结果
结果很不错。在使用自相似矩阵之前,我的机器生成的音乐内部没有重复的结构。但是在复制输入数据的结构之后,在我生成的音乐中可以看到这些边界,如下所示。
使用自相似矩阵之前和之后。
与此对比,多伦多大学神经网络产生的流行音乐的自相似矩阵如下所示:
这就是比较和评估不同模型的方法。
泛化
我想解决的最后一个问题是泛化。所谓泛化,即:我们如何推广我的数据驱动音乐模型,使其能够应用于流行音乐以外的情况?换句话说,是否有另一种人类的发明与我的流行音乐制造模型有相同的结构?
经过深思熟虑后,我发现还有另外一种人类文化的创作具有这种内部数据结构 – 流行歌词!
以Edward McCain为例。它的片段如下:
让我们在机器学习中使用相同的生成环境来分解歌词。我们可能将“I ‘ ll be”关联为语言模型中的第一个输入词。它将用于生成“your”,然后产生“crying”,从而导致“shoulder”。
然后是一个非常重要的问题:下一句话的第一个词组(另一个“I ‘ l be”)是否会依赖于最后一个单词“shoulder”?换句话说,第一句的最后一个单词和下一个句子的第一个单词之间是否有任何关系?
我认为,答案是否定的。当句子以“shoulder”结束时,下一个单词将根据前一个单词“I ‘ l be”生成。这是因为每个句子的第一个单词是故意重复的,这说明每个句子的第一个词之间存在着相似的条件关系。第一个单词成为下一个单词序列的触发点。
是一个有趣的发现。流行音乐和流行歌词似乎都将这种架构作为其内部数据!这不是超级迷人吗?
github:https://github.com/haebichan/PopMusicMaker
领取专属 10元无门槛券
私享最新 技术干货