基于Python的热门音乐特征数据分析

目录

  1. 摘要 3
  2. 引言 3
  3. 研究方法 3
    3.1 数据获取 4
    3.1.1 获取当下最热门的400首音乐 4
    3.2 音频处理 5
    3.2.1 音乐格式转换与时长处理 6
    3.2.2 midi生成 7
    3.3 音频特征 7
    3.3.1 基础音频信息 8
    3.3.2 统计特征提取 12
    3.4 数据降维及归一化 17
    3.4.1 PCA主成分分析 17
    3.4.2 数据归一化 17
    3.5 聚类算法 18
    3.5.1 K-Means聚类 18
    3.5.2 MiniBatch k-Means 20
    3.5.3 评价聚类模型 20
    3.6 分类算法 22
    3.6.1 HMM算法(隐马尔可夫模型) 22
  4. 案例实践 25
    4.1 数据爬取以及处理 26
    4.2 波形分析 28
    4.2.1 音乐波形图 28
    4.2.2 音乐语谱图 31
    4.2.3 音乐音调变化图 34
    4.2.4 音乐自相似矩阵图 37
    4.2.5 光谱过零率以及质心变化 39
    4.3 音乐特征分析聚类 41
    4.3.1 统计特征处理 41
    4.3.2 特征筛选 42
    4.3.3 归一化和降维处理 44
    4.3.4 K-Means聚类 45
    4.4 音乐风格分类 50
    4.4.1 HMM模型训练 51
    4.4.2 音乐分类预测 53
    4.5 midi文件生成 55
  5. 结论 56
  6. 反思与不足 57
  7. 参考文献 57

本次毕业设计选取了当下最热门的400首音乐,通过一系列方法提取每首歌的波形特征,再经过降维以及机器学习等手段,进行无监督学习对音乐数据进行聚类的同时训练并使用监督学习分类器进行音乐流派分类,并通过可视化方法呈现分类聚类效果。
由于数据量要求过大,仅仅通过人工获取数据明显是一个不现实的手段,我们选择利用爬虫工具对数据进行大批量的获取。但由于抖音短视频官网做了相当严密的反爬虫机制,很难从抖音官网获取视频信息,以及得到其背景音乐,所以我们选择使用第三方抖音数据分析网站来获取我们需要的热门音乐数据。
我们调查研究了新榜、抖查查、66榜、飞瓜数据、卡思数据、蝉妈妈等近十个分析网站,最终选取了蝉妈妈作为音乐数据来源。
经过前面所述的数据分析方法,我们得出以下结论:

1.通过4.2 波形分析,我们可以发现,BGM旨在用最低的时间成本,让听众迅速地记住这首歌,大部分视频的BGM都是直接采用副歌片段,在开头吸引人的注意力,之后采用重复,稍加变化的音调组合继续抓住人们的注意力,并通过歌曲的抑扬顿挫对应视频的内容,通过抖音自带的滑动机制,让人们沉迷于每十多秒就能带来的新鲜感之中。
2.通过提取近400首的抖音热门BGM的众多特征,通过一系列降维的方法,我们可以发现这些歌曲从某方面来看是具有共通性的,在某种衡量水平上来看,呈现聚集的趋势,详见4.3 音乐特征分析聚类。从而进一步我们选取音乐风格为他们的分类标准,试图探究抖音热门BGM的音乐风格差异,详见4.4 音乐风格分类,我们可以很明显的看出,blues风格以及hippop风格的歌曲占有很大的比重,即这两种风格的音乐在抖音中更容易得到关注。
3.通过对最热门的音乐共同特征提取和聚类效果,我们主观地给出一些对于热门音乐共通点的看法。随着信息技术的发展,短视频走上了时代的风口浪尖,对于一首歌来说,决定它是否好听很大程度就看他的副歌部分的“流行性”,这里的流行性指的是旋律有记忆点、易传唱,特别是副歌部分突出的特点。抖音中热曲也符合这个特点,它们中的大多数都有10s左右特别洗脑,特别抓耳的旋律,我们在听这些“快餐式音乐”的时候基本记不住主歌部分,歌名也不是用户的关注对象,这些音乐能够做到用最快的时间,以最洗脑的旋律在人耳朵中留下记忆点,这一现象也值得我们给予更多地关注和思考。
4.通过wav文件读取特征值分析音高变化,学习抖音热门音乐音调变化,并通过midi文件融合生成音乐,通过类似的方法我们可以做到某种程度上批量产出抖音热门音乐,即使这些音乐在质量上参差不齐,不一定比得上音乐人制作的音乐,但是它胜在批量生产,简单便捷,可以以低效的成本达到高回报的产出。据我们所知,目前抖音内部还在使用人工推流的方式来筛选热门音乐,我们的工作可以从一些角度对他们有启发和帮助。
注册会员后,通过点击音乐榜单,在f12控制台的network窗口监听到浏览器发出的http请求以及服务器返回的数据,本文转载自http://www.biyezuopin.vip/onews.asp?id=14766经过筛选得到获取音乐榜单的请求:

search?keyword=&page=1&size=50&orderby=user_count&incr_type=7d&order=desc

通过分析header信息,利用python的request库模拟header对服务器发出请求,并且筛选得到音乐的名称,播放量等信息,写入csv:

try:
  response = requests.get(url, headers=headers)
  if response.status_code == 200:
    list = response.json().get('data').get('list')
    for item in list:
      del item['cover_image']
      del item['use_trend']
      del item['hot_awemes']
      del item['is_fav']
      return list
except requests.ConnectionError as e:
   print('Error', e.args)
...
with open(csvPath, "w") as csvfile:
  writer = csv.writer(csvfile)
  writer.writerow(["音乐ID", "音乐名", "创作者", "歌曲时间", "使用人数", "使用人数增量"])
  for item in music_info:
    writer.writerow([item.get('music_id'), item.get('title'), item.get('author'), item.get('audition_duration'),
                     item.get('user_count'), item.get('user_incr')])
    print("csv写入成功!")

在得到音乐信息后,通过音乐的id,再次向服务器请求,获取音乐的mp3地址,下载后存储在本地:

 try:
    response = requests.get(url, headers=headers)
    if response.status_code == 200:
      src = response.json().get('data')
      print(name, end=": ")
      if src != '' and src != 'None':
        music = requests.get(src)
        # 下面填写本地存储的路径,记得后缀添加mp3
        open(downLoadPath + name + '.mp3', 'wb').write(music.content)
        print("成功")
     else:
      print("歌曲不存在")
    except requests.ConnectionError as e:
        print('Error', e.args)  # 输出异常信息



























































物联沃分享整理
物联沃-IOTWORD物联网 » 基于Python的热门音乐特征数据分析

发表评论