扩展您喜欢的歌曲

嗨,大家好! 我只想花一点时间感谢大家阅读我的上一篇文章。 我认为没有足够的人会一直阅读它,谢谢! 这篇文章不会是该文章的延续,因为像每个人一样,我倾向于分心。

因此,带着复制的想法,我想尝试重现这种Web体验,但是要在Python脚本中进行,因为我在前端开发时既懒又可怕。

如果您不关心我所做的事情的具体细节以及它如何工作,请跳到底部。


我们如何开始做到这一点?

就像我的许多项目一样,这都是从大量阅读开始的。 本质上,我对该项目的需求是音乐的量化表示。 经过一番挖掘之后,我意识到Spotify API通过Audio Analysis端点公开了我需要的信息! (旁注:此端点以前来自另一家公司Echo Nest,直到Spotify最近购买了它们。这是它们的文档)。此端点有很多好处供我们使用。 这是Spotify API参考上提供的示例输出,分为以下部分:

免责声明:由于这是一个示例,因此JSON非常简短。 对于任何正常的调用,此对象都是巨大的,因此不要尝试将其打印到控制台上并期望能够弄清楚发生了什么。

  { 
“酒吧”:[
{
“开始”:251.98282,
“持续时间”:0.29765,
“信心”:0.652
}
],
“节拍”:[
{
“开始”:251.98282,
“持续时间”:0.29765,
“信心”:0.652
}
],

此部分包含歌曲中所有节拍的开始和持续时间。 这很有趣,但是没有任何声音价值。 您会注意到,这些部分中的每一个都将具有与之相关的置信度值,这增强了网络的信心,这取决于对歌曲特定方面的分析

  “元”:{ 
“ analyzer_version”:“ 4.0.0”,
“ platform”:“ Linux”,
“ detailed_status”:“确定”,
“状态代码”:0,
“时间戳记”:1456010389,
“ analysis_time”:9.1394,
“ input_process”:“ libvorbisfile L + R 44100-> 22050”
}

接下来,您将获得一些元数据。 有用,但是这些不是我们正在寻找的机器人。

  “部分”:[ 
{
“开始”:237.02356,
“持续时间”:18.32542,
“信心”:1,
“响度”:-20.074,
“节奏”:98.253,
“ tempo_confidence”:0.767,
“键”:5
“ key_confidence”:0.327,
“模式”:1,
“ mode_confidence”:0.566,
“ time_signature”:4
“ time_signature_confidence”:1
}
]

现在,我们将获得一些更令人兴奋的东西。 歌曲的节奏因节奏的变化而引爆。 每个部分都有一个起点和持续时间,因此您可以确定起点和终点。 同样,每个部分在速度,音调,响度和拍号上都有其自己的价值。 模式值告诉我们这首歌是大还是小。 分析这些很有趣,但是它们的粒度不如我希望它们用于该项目。

  “细分”:[ 
{
“开始”:252.15061,
“持续时间”:3.19297,
“信心”:0.522,
“ loudness_start”:-23.356,
“ loudness_max_time”:0.06971,
“ loudness_max”:-18.121,
“ loudness_end”:-60,
“音高”:[
0.709,
0.092,
0.196,
0.084,
0.352,
0.134,
0.161,
1,
0.17,
0.161,
0.211,
0.15
],
“音色”:[
23.312,
-7.374,
-45.719,
294.874,
51.869,
-79.384,
-89.048,
143.322,
-4.676,
-51.303,
-33.274,
-19.037
]
}
]

这是我用于此项目的分析部分。 这些片段是声音的一部分,在音高和音色上都相对均匀。 除了时间信息之外,我们还可以获取响度,音调和音色信息。 对于响度,我们将其作为起点,终点和最高点。 音高由一个矢量给出,该矢量对应于12个音高(C,C#,D到B)。 从0到1的值是音高在给定声音中占主导地位的量度。 例如,如果我们分析一个C大调和弦,它会将与C,E和G音高相对应的值吐出1,而在其他所有位置都接近0。

  C大调和弦: 
“音高”:[
1,
0.092,
0.196,
0.084,
1,
0.134,
0.161,
1,
0.17,
0.161,
0.211,
0.15
]

有了这些信息,我们现在可以分析声音在音调中的接近程度,但是声音的其他方面又如何呢? 这就是音色矢量帮助我们解决问题的地方。

根据Echo Nest文档的介绍,音色是“一种复杂的概念,也称为声音的颜色,纹理或音质,它是从片段的频谱时态表面的形状中得出的,与音高和响度无关。”很多单词,但从本质上讲,这个概念是它们识别小号和弹C的小提琴之间的区别。这解释起来有点复杂,但是向量的12个值对应于基函数的系数,如下所示。

这些功能代表诸如响度,亮度,平坦度或声音的冲击之类的东西。 了解这一点对最终项目不是太重要,我们不是在寻找特定类型的声音,因此只打算在各个片段之间进行比较。

有了端点并了解所有含义之后,就可以弄清楚如何识别歌曲中的相似点!


我的解决方案如何工作?

我决定要做的是首先比较歌曲中的片段,然后找出听起来最相似的片段。 为此,我采用了我们从Analysis端点收集的所有信息,并使用良好的ole减法计算了差异,或计算了向量值之间的欧式距离。 通过加总所有差异并增加一些额外的权重,我终于有了一种量化的方式来说出一首歌的两个声部听起来是多么的不同。 (再次贷给保罗·拉米尔)

  def calucate_distance(seg1,seg2): 
pitch_dist = euclidian_distance(np.array(seg1 [“ pitches”]),np.array(seg2 [“ pitches”])))
timbre_dist = weighted_euclidian_distance(np.array(seg1 [“ timbre”]),np.array(seg2 [“ timbre”]),1)
start_loudness_dist = abs(seg1 [“ loudness_start”]-seg2 [“ loudness_start”])
max_loudness_dist = abs(seg1 [“ loudness_max”]-seg2 [“ loudness_max”])
duration_dist = abs(seg1 [“ duration”]-seg2 [“ duration”])
confidence_dist = abs(seg1 [“ confidence”]-seg2 [“ confidence”])
距离=音色距离+音高距离* 10 +开始响度距离+最大响度距离+持续时间距离* 100 +置信度距离
返回距离

所有段的距离值都在整个位置。 我最终只考虑了彼此之间不超过60个单位的细分。 这种方法效果很好,但是我注意到的是,裁员通常是断断续续的,并且确实缺乏跳到那里的“背景”。 例如,由于它们相同,它可能会从一个钢琴音符跳到另一个钢琴音符,但歌曲可能位于完全不同的地方,而且听起来很糟糕。 为了解决这个问题,我开始从最近的4个细分中计算出一个平均细分,然后比较所有平均值以获得更平滑的跳跃。 简而言之,我认为这可行。 我对某些跳跃仍然不满意,但是在大多数情况下还可以。 为了使它们成为可行的形式,我进行了跳跃,并从中绘制了图表。 然后,我只是遍历边缘以提取一个数组,该数组具有“ to”和“ from”部分,这些部分与我想跳的歌曲中的位置相对应。

最后,与Spotify交互可能是我最不高兴的代码领域。 我只是继续检查播放器,看它是否已经通过了下一段的“从”部分。 最糟糕的是,当您跳完所有歌曲时,它会生成新的歌曲,但不会等待歌曲完成播放,因此几乎立即跳到第一跳的结尾而无需等待这首歌赶上了。

我有一些主要的改进空间。 在这里您可以看到所有代码。

如何使用?

步骤1 —克隆仓库:git clone https://github.com/nab0310/SpotifyML.git

第2步-安装所有相关的Python软件包(您需要Python 3):pip3 install -r requirements.txt

步骤3 —创建一个config.py文件,其中包含您的Spotify应用程序凭据,如下所示:

client_id =”
client_secret =”

如果您在创建Spotify应用程序方面需要帮助,我将在第一篇文章中进行介绍。

步骤4 —打开Spotify并开始播放任何歌曲(注意:我真的不知道为什么会这样,但是我怀疑在尝试访问该帐户时必须打开Spotify播放器)

第5步-启动脚本! 以下是一些您可以执行的操作示例:
songExtender.py -s”-按歌曲名称搜索
songExtender.py —歌曲”-按歌曲名称搜索
songExtender.py -a”-按艺术家名称搜索
songExtender.py —艺术家”-按艺术家名称搜索
songExtender.py -u”-使用Song URI来获取歌曲(Song URI看起来像这样:spotify:track:5mF5awNTdA3SYYSxRaE2X9)

第6步-脚本将询问您是否要扩展哪首歌,如果您看到它命中并让魔术发生了! 如果看不到歌曲,请尝试使用歌手和歌曲来缩小范围,或者仅使用URI。

第7步-遇到任何疑问或问题,请尽情享受,或随时与我联系。


如果您喜欢这个,请务必查看我的 Github 如果您对我如何将编程和音乐结合起来还有其他想法,请在下面告诉我!