很多時候一首音樂大家都只記得高潮部分,很多人在聽歌的時候也只喜歡聽高潮部分。但是,我們不可能對每一段音樂都進行高潮部分的剪輯吧,聽著 我都累了。所以,教大家怎麼怎麼提取音樂的高潮部分。 1.原理 不知道大家有沒有這樣的體會,大部分時候,歌曲的高潮部分通常是重覆次數最多的部分。因此我們可以根據這一個特 ...
很多時候一首音樂大家都只記得高潮部分,很多人在聽歌的時候也只喜歡聽高潮部分。但是,我們不可能對每一段音樂都進行高潮部分的剪輯吧,聽著 我都累了。所以,教大家怎麼怎麼提取音樂的高潮部分。
1.原理
不知道大家有沒有這樣的體會,大部分時候,歌曲的高潮部分通常是重覆次數最多的部分。因此我們可以根據這一個特征,提出我們的演算法:
**1.遍歷整首歌曲。**
**2.將選定長度的部分與其他部分比較並計算相似度,以查看是否重覆。**
**3.尋找重覆次數較大、且間隔長的片段。**
2.代碼實現
為了避免造輪子,我找到了別人已經做過的類似的項目:https://github.com/vivjay30/pychorus
我們只需要分析這個源代碼中最核心的部分,即求相似區段的源代碼,就能知道它是不是符合我們的項目需求了:
可以看到,這部分代碼就是做了我們演算法的第二步,進行了片段與片段之間的相似度計算。檢測時用到的相似函數是這樣的:
這主要是因為歌曲由12個基本音符的幀的集合而組成,v1和v2是任意兩段音樂的音符矢量,如果說兩段音樂非常相似,那麼右邊的式子將接近於0. 如果說 1-右邊的式子 得分非常高,則說明兩段音樂非常相似。
下麵我們看看怎麼使用這個項目求音樂高潮部分,其實非常簡單。
2.1 安裝所需要的項目
你可以通過pip安裝該項目,如果你還沒有安裝好Python相關環境,建議閱讀這篇文章:Python超詳細安裝指南,PIP安裝指令如下:
pip install pychorus
2.2 編寫代碼
實際上,這個包用起來可是相當簡單,如果我們只是想單純提取歌曲高潮部分:
from pychorus import find_and_output_chorus chorus_start_sec = find_and_output_chorus("你的音樂文件", "提取結果的目標路徑", 要多少秒的高潮部分)
沒錯,兩行代碼就解決了。如果你想知道一些詳細的細節,比如說輸出相似矩陣或者結果可視化,建議閱讀github中該項目的操作指令。
3.效果展示
以《孤芳自賞》 為例,讓我們試試這個提取器的功力。
####Python學習交流Q群:906715085
#提取音樂高潮部分 from pychorus import find_and_output_chorus chorus_start_sec = find_and_output_chorus("孤芳自賞.mp3", "孤芳自賞_high.wav", 40)
大家也可以根據我今天的教程,試著提取一下自己喜歡的音樂的高潮部分哦!
4.批量提取
剛剛,只是完成了單首歌曲的高潮提取,如果你想提取整個文件夾下的音樂的高潮部分,可以這樣做:
文字版代碼:
#提取音樂高潮部分 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) targets = f"{modpath}\\output\\" if not os.path.exists(targets): os.makedirs(targets) find_and_output_chorus( datapath, f"{targets}{filepath.split('.')[0]}_high.wav", 40 ) extract_all_file("F:\\push\\20200611\\music\\")
來吧,展示一下你提取的音樂。這個教程還是輕輕鬆松、有手就行那種,有沒有學會呀,沒有學會要記得呼喚我。今天的分享到這裡就要結束了,下一期再見。