有时,我们为了设置手机铃声或发送抖音视频,在音乐片段上花费了大量时间。尤其是当我们要发布很多抖音视频的时候,我们还要收集很多短音乐,这是一个相当耗时的工作。那么,这个音乐高潮的提取能否实现自动化呢?答案是:是的。一、原理介绍不知道大家有没有这样的经历。大多数时候,歌曲的高潮部分通常是重复次数最多的部分。因此,我们可以根据这个特点提出我们的算法:1.遍历整首歌曲。2.将所选长度的部分与其他部分进行比较,计算相似度,看是否重复。3.寻找重复次数多、间隔长的片段。2.代码编写为了避免造轮子,找了一个别人做过的类似项目:https://github.com/vivjay30/pychorusdefcompute_similarity_matrix_slow(self,chroma):"""虽然慢,但是是直接的方式计算片段相似度矩阵"""num_samples=chroma.shape[1]time_time_similarity=np.zeros((num_samples,num_samples))foriinrange(num_samples):forjinrange(num_samples):#检测每个片段的相似度segmentDegreetime_time_similarity[i,j]=1-(np.linalg.norm(chroma[:,i]-chroma[:,j])/sqrt(12))returntime_time_similarity可以看到,这部分代码就是做我们算法的第二步,计算片段之间的相似度。检测中使用的相似度函数如下:这主要是因为歌曲是由一组12个基本音符的帧组成的。v1和v2是任意两首音乐的音符向量。如果两首乐曲非常相似,那么右边的公式就会接近于0。如果1-score右边的公式非常高,说明两首乐曲非常相似。下面我们就来看看如何利用这个项目来寻找音乐的高潮,其实很简单。2.1可以通过pip安装项目。如果你还没有安装Python环境,推荐阅读这篇文章:Python安装pipinstallpychorus2.2编写代码其实这个包使用起来还是挺简单的。如果我们只是想简单的提取歌曲的高潮部分:frompychorusimportfind_and_output_choruschorus_start_sec=find_and_output_chorus("yourmusicfile","outputclimaxpartfile",howsomesecondsofclimaxpartittakes)可以,两行代码就可以了解决这个问题。下面我们来看看效果。3.效果测试以《孤芳自赏》为例,让我们来试试这款抽油烟机的威力。原曲:
