Python 3行代碼提取音樂高潮部分

前言:

有些時候,為瞭設定手機鈴聲或者發抖音視頻,我們會耗費大量時間在剪輯音樂高潮部分上。那麼這個音樂高潮的提取能不能自動化呢?當然可以。

先來看看,怎麼樣來提取孤芳自賞提取高潮後的部分:

1.原理簡介

不知道大傢有沒有這樣的體會,大部分時候,歌曲的高潮部分通常是重復次數最多的部分。因此我們可以根據這一個特征,提出我們的算法:

  •  1.遍歷整首歌曲。
  •  2.將選定長度的部分與其他部分比較並計算相似度,以查看是否重復。
  •  3.尋找重復次數較大、且間隔長的片段。

2.代碼編寫

為瞭避免造輪子,我們找到瞭別人已經做過的類似的項目

我們隻需要分析這個源代碼中最核心的部分,即求相似區段的源代碼,就能知道它是不是符合我們的項目需求瞭:

可以看到,這部分代碼就是做瞭我們算法的第二步,進行瞭片段與片段之間的相似度計算。

檢測時用到的相似函數是這樣的:

圖片

這主要是因為歌曲由12個基本音符的幀的集合而組成,v1和v2是任意兩段音樂的音符矢量,如果說兩段音樂非常相似,那麼右邊的式子將接近於0. 如果說 1-右邊的式子 得分非常高,則說明兩段音樂非常相似。

下面我們看看怎麼使用這個項目求音樂高潮部分,其實非常簡單。

2.1 安裝所需要的項目

你可以通過pip安裝該項目,如果你還沒有安裝好Python相關環境,建議先安裝,PIP安裝指令如下:

pip install pychorus

2.2 編寫代碼

實際上,這個包用起來可是相當簡單,如果我們隻是想單純提取歌曲高潮部分:

from pychorus import find_and_output_chorus

chorus_start_sec = find_and_output_chorus("你的音樂文件", "提取結果的目標路徑", 要多少秒的高潮部分)

沒錯,兩行代碼就解決瞭。如果你想知道一些詳細的細節,比如說輸出相似矩陣或者結果可視化,建議閱讀github中該項目的操作指令。下面讓我們檢驗一下效果。

3.效果檢驗

以《孤芳自賞》 為例,讓我們試試這個提取器的功力。 編寫代碼:

# 提取音樂高潮部分
from pychorus import find_and_output_chorus
chorus_start_sec = find_and_output_chorus("孤芳自賞.mp3", "孤芳自賞_high.wav", 40)

非常優秀!提取瞭我心目中想要的部分。大傢也可以根據我們今天的教程,試著提取一下自己喜歡的音樂的高潮部分哦!

4.批量提取

剛剛,隻是完成瞭單首歌曲的高潮提取,如果你想提取整個文件夾下的音樂的高潮部分,可以這樣做:

文字版代碼:

# Python 實用寶典
# 提取音樂高潮部分
# 2020/06/11
import os
import sys
from pychorus import find_and_output_chorus
def 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 3行代碼提取音樂高潮部分的文章就介紹到這瞭,更多相關Python代碼提取音樂高潮部分內容請搜索WalkonNet以前的文章或繼續瀏覽下面的相關文章希望大傢以後多多支持WalkonNet!

推薦閱讀: