Python實現(xiàn)提取音樂頻譜的方法詳解
前言
你有沒有經(jīng)常好奇一些音樂軟件的頻譜特效是怎么做的,為什么做的這么好看?有沒有想試試自己提取音樂頻譜并可視化展現(xiàn)出來?今天,咱就結(jié)合上次的音樂剪輯操作:
來簡單粗暴地可視化下面這首歌曲的頻譜!
1.準備
開始之前,你要確保Python和pip已經(jīng)成功安裝在電腦上,如果沒有,可以訪問這篇文章:超詳細Python安裝指南 進行安裝。
Windows環(huán)境下打開Cmd(開始—運行—CMD),蘋果系統(tǒng)環(huán)境下請打開Terminal(command+空格輸入Terminal),準備開始輸入命令安裝依賴。
當(dāng)然,我更推薦大家用VSCode編輯器,把本文代碼Copy下來,在編輯器下方的終端裝依賴模塊,多舒服的一件事啊
在終端輸入以下命令安裝我們所需要的依賴模塊:
pip install pydub pip install librosa
看到 Successfully installed xxx 則說明安裝成功。
2.頻譜展示
使用librosa和matplot,我們可以用10行代碼完整地展示整個頻譜:
import?matplotlib.pyplot?as?plt import?librosa.display # 音樂文件載入 audio_path =?'Fenn.mp3' music, sr = librosa.load(audio_path) # 寬高比為14:5的圖 plt.figure(figsize=(14,5)) librosa.display.waveplot(music, sr=sr) # 顯示圖 plt.show()
不過,這樣的頻譜是整段音樂的,看起來非常難看,接下來我們使用 pydub 切割頻譜,以獲得更佳的效果。我們細分到0到1秒的區(qū)段來查看頻譜:
import?matplotlib.pyplot?as?plt import?librosa.display import?numpy?as?np from?pydub?import?AudioSegment # 1秒=1000亳秒 SECOND =?1000 #音樂文件 AUDIO_PATH =?'Fenn.mp3' def?split_music(begin, end, filepath): ????# 導(dǎo)兒音樂 ????song = AudioSegment.from_mp3(filepath) ????# 取begin秒至ijend秒間的片段 ????song = song[begin*SECOND: end*SECOND] ????# 存儲為臨時文件做備份 ????temp_path =?'backup/'+filepath ????song.export(temp_path) ????return?temp_path music, sr = librosa.load(split_music(0,?1, AUDIO_PATH)) #寬高比為14:5的圖 plt.figure(figsize=(14,?5)) librosa.display.waveplot(music, sr=sr) plt.show()
這下細是細了,但是還是太復(fù)雜了,其實我們做頻譜的展示,或許只需要正值即可:
然后我們還可以進一步放大,比如說0.9秒到1秒之間的頻譜:
# 公眾號:Python 實用寶典 n0 =?9000 n1 =?10000 music = np.array([mic?for?mic?in?music?if?mic >?0]) plt.figure(figsize=(14,?5)) pit.plot(music[n0:n1]) plt.grid() #顯示圖 plt.show()
這樣好看許多,不過如果要達成QQ音樂那種效果,還是需要進行大量改造。
比如用精美的圖像元素來填充替代、然后零值如何處理?如何讓頻譜更加平穩(wěn)?此外,我們是靜態(tài)的圖像,還需要根據(jù)事件動態(tài)地延續(xù)波段。
用于生產(chǎn)的代碼肯定比我們這簡易的代碼更加復(fù)雜,而且也不應(yīng)該是暴力去除負值繪制圖像。這些有興趣的讀者可以自行研究啦。
以上就是Python實現(xiàn)提取音樂頻譜的方法詳解的詳細內(nèi)容,更多關(guān)于Python提取頻譜的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
DjangoRestFramework 使用 simpleJWT 登陸認證完整記錄
Djangorestframework-simplejwt是Django REST Framework框架的一個jwt插件,使用 python http 工具進行接口測試的方法文中給大家提到,重點給大家分享djangorestframework-simplejwt 使用記錄及登陸認證的完成過程,感興趣的朋友跟隨小編一起看看吧2021-06-06Python+matplotlib繪制不同大小和顏色散點圖實例
這篇文章主要介紹了Python+matplotlib繪制不同大小和顏色散點圖實例,matplotlib的用法是比較多種多樣的,下面一起看看其中的一個實例吧2018-01-01python中torch.load中的map_location參數(shù)使用
在PyTorch中,torch.load()函數(shù)是用于加載保存模型或張量數(shù)據(jù)的重要工具,map_location參數(shù)為我們提供了極大的靈活性,具有一定的參考價值,感興趣的可以了解一下2024-03-03