• Python 超简单 提取音乐高潮(附批量提取)


    很多时候我们想提取某首歌的副歌部分(俗称 高潮部分),只能手动直接卡点剪切,但是对于大批量的获取就很头疼,如何解决?

    很多人学习python,不知道从何学起。
    很多人学习python,掌握了基本语法过后,不知道在哪里寻找案例上手。
    很多已经做案例的人,却不知道如何去学习更加高深的知识。
    那么针对这三类人,我给大家提供一个好的学习平台,免费领取视频教程,电子书籍,以及课程的源代码!
    QQ群:1097524789

    今天我们就来用Python帮我们自动提取吧!

    先来听听效果,孤芳自赏提取高潮后的部分:


    怎么样,是不是迫不及待想往下读了?不要急,让我们从原理开始慢慢讲起。

    一、原理简介

    不知道大家有没有这样的体会,大部分时候,歌曲的高潮部分通常是重复次数最多的部分。因此我们可以根据这一个特征,提出我们的算法:

        1.遍历整首歌曲。

        2.将选定长度的部分与其他部分比较并计算相似度,以查看是否重复。

        3.寻找重复次数较大、且间隔长的片段。

     

    二、代码编写

    为了避免造轮子,我们找到了别人已经做过的类似的项目:https://github.com/vivjay30/pychorus

    我们只需要分析这个源代码中最核心的部分,即求相似区段的源代码,就能知道它是不是符合我们的项目需求了:


    可以看到,这部分代码就是做了我们算法的第二步,进行了片段与片段之间的相似度计算。检测时用到的相似函数是这样的:

    这主要是因为歌曲由12个基本音符的帧的集合而组成,v1和v2是任意两段音乐的音符矢量,如果说两段音乐非常相似,那么右边的式子将接近于0. 如果说 1-右边的式子 得分非常高,则说明两段音乐非常相似

    下面我们看看怎么使用这个项目求音乐高潮部分,其实非常简单。

    2.1 安装所需要的项目

    你可以通过pip安装该项目,PIP安装指令如下:

    pip install pychorus

    2.2 编写代码

    实际上,这个包用起来可是相当简单,如果我们只是想单纯提取歌曲高潮部分:

    
    
    1. from pychorus import find_and_output_chorus

    2. chorus_start_sec = find_and_output_chorus("你的音乐文件", "输出高潮部分文件", 要多少秒的高潮部分)

    没错,两行代码就解决了。如果你想知道一些详细的细节,比如说输出相似矩阵或者结果可视化,建议阅读github中该项目的操作指令。下面让我们检验一下效果。

    三、效果检验

    以《孤芳自赏》 为例,让我们试试这个提取器的功力。

    原曲:

    孤芳自赏 原曲来自裸睡的猪00:0004:28

    编写代码:

    
    
    1. # 提取音乐高潮部分

    2. from pychorus import find_and_output_chorus

    3. chorus_start_sec = find_and_output_chorus("孤芳自赏.mp3", "孤芳自赏_high.wav", 40)

    效果如下:

    孤芳自赏 高潮部分来自裸睡的猪00:0000:40


    非常优秀!提取了我心目中想要的部分。大家也可以根据我们今天的教程,试着提取一下自己喜欢的音乐的高潮部分哦!

    四、批量提取

    刚刚,只是完成了单首歌曲的高潮提取,如果你想提取整个文件夹下的音乐的高潮部分,可以这样做:

    图片版代码

    文字版代码:

    # Python 实用宝典# 提取音乐高潮部分# 2020/06/11import osimport sysfrom pychorus import find_and_output_chorusdef extract_all_file(files_path):"""    批量提取音乐高潮    Args:        files_path (str): 文件夹路径    """# 文件夹路径    modpath = os.path.dirname(os.path.abspath(sys.argv[0]))for filepath in os.listdir(files_path):# 路径处理        datapath = os.path.join(modpath, files_path + filepath)# output文件夹是否存在        targets = f"{modpath}\output\"if not os.path.exists(targets):            os.makedirs(targets)# 提取音乐高潮至当前output文件夹下        find_and_output_chorus(            datapath, f"{targets}{filepath.split('.')[0]}_high.wav", 40        )extract_all_file("F:\push\20200611\music\")

    Python的优势就在于有众多的库,所以大家不必担心很难,多看几遍,然后挑自己感兴趣 的案例动手实践,相信你会慢慢爱上Python!

  • 相关阅读:
    第6章 LVM详解
    第5章 Linux上管理文件系统
    第4章 ext文件系统机制原理剖析
    第3章 Linux上文件的权限管理
    第2章 系统用户/组管理(2) su和sudo
    第2章 细说Linux系统用户/组管理(1)
    cpio用法详细说明
    Linux find运行机制详解
    第1章 Linux文件类基础命令
    PXE+kickstart无人值守安装CentOS 6
  • 原文地址:https://www.cnblogs.com/shann001/p/13113671.html
Copyright © 2020-2023  润新知