本文轉(zhuǎn)載至知乎ID:Charles(白露未晞)知乎個人專欄
本文轉(zhuǎn)載至知乎ID:Charles(白露未晞)知乎個人專欄
下載W3Cschool手機App,0基礎隨時隨地學編程>>戳此了解
導語
下載W3Cschool手機App,0基礎隨時隨地學編程>>戳此了解
偶遇了一篇文章:
“Mapping Your Music Collection”
https://www.christianpeccei.com/musicmap/
感覺頗有緣分,似有命中注定之感,于是想著用一些簡單的音頻處理、機器學習和可視化技術,簡單地分析一下自己的音樂收藏。當然我對樂理知識一無所知,所以分析將不涉及任何與樂理知識相關的內(nèi)容,純屬“瞎玩”性質(zhì)的分析。T_T
那么就讓我們愉快地開始吧~~~
相關文件
百度網(wǎng)盤下載鏈接: https://pan.baidu.com/s/16lZb3JbHeC__k_oP8RMXUg
密碼: nxpt
相關工具
Python版本:3.6.4
相關模塊:
numpy模塊;
sklearn模塊;
matplotlib模塊;
以及一些Python自帶的模塊。
mpg123:
1.25.10
環(huán)境搭建
安裝Python并添加到環(huán)境變量,pip安裝需要的相關模塊;
將相關文件中提供的mpg123.zip文件解壓后添加到環(huán)境變量中,例如:
開始分拆
方便起見,所有的音樂文件均先轉(zhuǎn)為.wav格式后再做分析。
從最簡單的開始吧!讓我們先來看看不同歌手的聲音波形圖:
周杰倫:
感覺波形圖好混亂,似乎是數(shù)據(jù)量太大引起的,于是我打算換一個策略,只畫出每首歌曲前10秒的波形圖來作比較,畢竟良好的開端是成功的一半?
周杰倫:
許嵩:
陳奕迅:
Interesting...
好像還是挺有意思的,但并看不出什么端倪來的樣子,同一個歌手唱的歌的波形結(jié)構(gòu)之間的差異和不同歌手唱的歌的波形結(jié)構(gòu)之間的差異仿佛都挺大的。雖然并沒有規(guī)定說同一個歌手唱的歌的波形結(jié)構(gòu)之間的差異一定很小,不同歌手唱的歌的波形結(jié)構(gòu)之間的差異一定很大。
好吧,有些混亂,還是隨意點的好。那么我們來嘗試性地提取一下歌曲的特征吧。我們打算提取的歌曲特征有:
① 歌曲波形的統(tǒng)計矩,包括均值、標準差、偏態(tài)和峰態(tài),同時,我們通過平滑窗(遞增平滑,長度分別為1,10,100,1000)來獲取這些特征在不同時間尺度上的表現(xiàn);
② 為了體現(xiàn)信號的短時變化,我們可以計算一下波形一階差分幅度的統(tǒng)計矩,同樣也通過平滑窗來獲取這些特征(均值、標準差、偏態(tài)和峰態(tài))在不同時間尺度上的表現(xiàn);
③ 最后,我們計算一下波形的頻域特征,這里我們只計算歌曲在不同頻段(將整個頻段均分為10份)的能量占比,不過直接對歌曲的波形數(shù)據(jù)作快速傅里葉變換的話其計算量過于龐大了,因此先讓波形數(shù)據(jù)通過長度為5的平滑窗再對其作快速傅里葉變換。
綜上所述,我們已經(jīng)獲得了歌曲的42個特征值。下面我們嘗試利用這些特征值對我這幾天下載的43首歌曲進行k均值聚類。首先,為了便于結(jié)果的可視化,我們利用PCA對數(shù)據(jù)進行降維(42維特征到2維特征),為了方便起見,我們直接調(diào)庫(sklearn)實現(xiàn),結(jié)果打印如下:
OK,接下來我們就可以對降維后的數(shù)據(jù)進行聚類了,這里我們將自己實現(xiàn)一下k均值聚類算法而不是簡單地調(diào)庫,最終的聚類結(jié)果如下圖所示(k=4):
接下來我們嘗試先對歌曲的42個特征值進行歸一化處理,然后再進行上面的PCA和聚類操作,同時令k=3,最終的聚類結(jié)果如下圖所示:
Emmm,好像效果更差了。
不過我發(fā)現(xiàn)我喜歡了8年的歌“尾戒”竟然一枝獨秀了!還是很棒的,哈哈~~~
當然,這里有一個問題,歌曲的42個特征值是人工選取的,也許并不很好的表現(xiàn)出歌曲特征,且這些特征之間的相關系數(shù)是不為0的,也就是存在冗余特征。
https://www.christianpeccei.com/musicmap/一文利用了遺傳算法從42個特征值中篩選出了18個特征值作為歌曲最終的特征向量,其結(jié)果如下:
懶得復現(xiàn)了,直接用他的結(jié)論重新進行聚類,結(jié)果如下(k=3):
Emmm,好像半斤八兩。
那就這樣吧,就當學點基礎的音頻處理、機器學習和可視化技術了。
所有源代碼和素材均在相關文件中提供了,End。