本文轉(zhuǎn)載至知乎ID:Charles(白露未晞)知乎個(gè)人專欄
本文轉(zhuǎn)載至知乎ID:Charles(白露未晞)知乎個(gè)人專欄
下載W3Cschool手機(jī)App,0基礎(chǔ)隨時(shí)隨地學(xué)編程>>戳此了解
導(dǎo)語(yǔ)
下載W3Cschool手機(jī)App,0基礎(chǔ)隨時(shí)隨地學(xué)編程>>戳此了解
偶遇了一篇文章:
“Mapping Your Music Collection”
https://www.christianpeccei.com/musicmap/
感覺頗有緣分,似有命中注定之感,于是想著用一些簡(jiǎn)單的音頻處理、機(jī)器學(xué)習(xí)和可視化技術(shù),簡(jiǎn)單地分析一下自己的音樂收藏。當(dāng)然我對(duì)樂理知識(shí)一無(wú)所知,所以分析將不涉及任何與樂理知識(shí)相關(guān)的內(nèi)容,純屬“瞎玩”性質(zhì)的分析。T_T
那么就讓我們愉快地開始吧~~~
相關(guān)文件
百度網(wǎng)盤下載鏈接: https://pan.baidu.com/s/16lZb3JbHeC__k_oP8RMXUg
密碼: nxpt
相關(guān)工具
Python版本:3.6.4
相關(guān)模塊:
numpy模塊;
sklearn模塊;
matplotlib模塊;
以及一些Python自帶的模塊。
mpg123:
1.25.10
環(huán)境搭建
安裝Python并添加到環(huán)境變量,pip安裝需要的相關(guān)模塊;
將相關(guān)文件中提供的mpg123.zip文件解壓后添加到環(huán)境變量中,例如:

開始分拆
方便起見,所有的音樂文件均先轉(zhuǎn)為.wav格式后再做分析。
從最簡(jiǎn)單的開始吧!讓我們先來(lái)看看不同歌手的聲音波形圖:
周杰倫:

感覺波形圖好混亂,似乎是數(shù)據(jù)量太大引起的,于是我打算換一個(gè)策略,只畫出每首歌曲前10秒的波形圖來(lái)作比較,畢竟良好的開端是成功的一半?
周杰倫:

許嵩:

陳奕迅:

Interesting...
好像還是挺有意思的,但并看不出什么端倪來(lái)的樣子,同一個(gè)歌手唱的歌的波形結(jié)構(gòu)之間的差異和不同歌手唱的歌的波形結(jié)構(gòu)之間的差異仿佛都挺大的。雖然并沒有規(guī)定說(shuō)同一個(gè)歌手唱的歌的波形結(jié)構(gòu)之間的差異一定很小,不同歌手唱的歌的波形結(jié)構(gòu)之間的差異一定很大。
好吧,有些混亂,還是隨意點(diǎn)的好。那么我們來(lái)嘗試性地提取一下歌曲的特征吧。我們打算提取的歌曲特征有:
① 歌曲波形的統(tǒng)計(jì)矩,包括均值、標(biāo)準(zhǔn)差、偏態(tài)和峰態(tài),同時(shí),我們通過(guò)平滑窗(遞增平滑,長(zhǎng)度分別為1,10,100,1000)來(lái)獲取這些特征在不同時(shí)間尺度上的表現(xiàn);
② 為了體現(xiàn)信號(hào)的短時(shí)變化,我們可以計(jì)算一下波形一階差分幅度的統(tǒng)計(jì)矩,同樣也通過(guò)平滑窗來(lái)獲取這些特征(均值、標(biāo)準(zhǔn)差、偏態(tài)和峰態(tài))在不同時(shí)間尺度上的表現(xiàn);
③ 最后,我們計(jì)算一下波形的頻域特征,這里我們只計(jì)算歌曲在不同頻段(將整個(gè)頻段均分為10份)的能量占比,不過(guò)直接對(duì)歌曲的波形數(shù)據(jù)作快速傅里葉變換的話其計(jì)算量過(guò)于龐大了,因此先讓波形數(shù)據(jù)通過(guò)長(zhǎng)度為5的平滑窗再對(duì)其作快速傅里葉變換。
綜上所述,我們已經(jīng)獲得了歌曲的42個(gè)特征值。下面我們嘗試?yán)眠@些特征值對(duì)我這幾天下載的43首歌曲進(jìn)行k均值聚類。首先,為了便于結(jié)果的可視化,我們利用PCA對(duì)數(shù)據(jù)進(jìn)行降維(42維特征到2維特征),為了方便起見,我們直接調(diào)庫(kù)(sklearn)實(shí)現(xiàn),結(jié)果打印如下:

OK,接下來(lái)我們就可以對(duì)降維后的數(shù)據(jù)進(jìn)行聚類了,這里我們將自己實(shí)現(xiàn)一下k均值聚類算法而不是簡(jiǎn)單地調(diào)庫(kù),最終的聚類結(jié)果如下圖所示(k=4):

接下來(lái)我們嘗試先對(duì)歌曲的42個(gè)特征值進(jìn)行歸一化處理,然后再進(jìn)行上面的PCA和聚類操作,同時(shí)令k=3,最終的聚類結(jié)果如下圖所示:

Emmm,好像效果更差了。
不過(guò)我發(fā)現(xiàn)我喜歡了8年的歌“尾戒”竟然一枝獨(dú)秀了!還是很棒的,哈哈~~~
當(dāng)然,這里有一個(gè)問題,歌曲的42個(gè)特征值是人工選取的,也許并不很好的表現(xiàn)出歌曲特征,且這些特征之間的相關(guān)系數(shù)是不為0的,也就是存在冗余特征。
https://www.christianpeccei.com/musicmap/一文利用了遺傳算法從42個(gè)特征值中篩選出了18個(gè)特征值作為歌曲最終的特征向量,其結(jié)果如下:


懶得復(fù)現(xiàn)了,直接用他的結(jié)論重新進(jìn)行聚類,結(jié)果如下(k=3):

Emmm,好像半斤八兩。
那就這樣吧,就當(dāng)學(xué)點(diǎn)基礎(chǔ)的音頻處理、機(jī)器學(xué)習(xí)和可視化技術(shù)了。
所有源代碼和素材均在相關(guān)文件中提供了,End。