App下載

【Python】分析個人音樂收藏

猿友 2018-08-02 18:48:52 瀏覽數(shù) (5770)
反饋


本文轉(zhuǎn)載至知乎ID:Charles(白露未晞)知乎個人專欄

下載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。

0 人點贊