天天看點

Python實戰案例,分析個人音樂收藏,了解音頻處理及實作資料可視化

前言:

簡單地分析一下自己的音樂收藏。

那麼就讓我們愉快地開始吧~~~

Python實戰案例,分析個人音樂收藏,了解音頻處理及實作資料可視化

相關工具

Python版本:3.6.4

相關子產品:

numpy子產品;

sklearn子產品;

matplotlib子產品;

以及一些Python自帶的子產品。

mpg123:

1.25.10

環境搭建

安裝Python并添加到環境變量,pip安裝需要的相關子產品;

将相關檔案中提供的mpg123.zip檔案解壓後添加到環境變量中,例如:

Python實戰案例,分析個人音樂收藏,了解音頻處理及實作資料可視化

開始分析

友善起見,所有的音樂檔案均先轉為.wav格式後再做分析。

從最簡單的開始吧!讓我們先來看看不同歌手的聲音波形圖:

周傑倫:

Python實戰案例,分析個人音樂收藏,了解音頻處理及實作資料可視化

感覺波形圖好混亂,似乎是資料量太大引起的,于是我打算換一個政策,隻畫出每首歌曲前10秒的波形圖來作比較,畢竟良好的開端是成功的一半?

Python實戰案例,分析個人音樂收藏,了解音頻處理及實作資料可視化

許嵩:

Python實戰案例,分析個人音樂收藏,了解音頻處理及實作資料可視化

陳奕迅:

Python實戰案例,分析個人音樂收藏,了解音頻處理及實作資料可視化

Interesting...

好像還是挺有意思的,但并看不出什麼端倪來的樣子,同一個歌手唱的歌的波形結構之間的差異和不同歌手唱的歌的波形結構之間的差異仿佛都挺大的。雖然并沒有規定說同一個歌手唱的歌的波形結構之間的差異一定很小,不同歌手唱的歌的波形結構之間的差異一定很大。

好吧,有些混亂,還是随意點的好。那麼我們來嘗試性地提取一下歌曲的特征吧。我們打算提取的歌曲特征有:

① 歌曲波形的統計矩,包括均值、标準差、偏态和峰态,同時,我們通過平滑窗(遞增平滑,長度分别為1,10,100,1000)來擷取這些特征在不同時間尺度上的表現;

② 為了展現信号的短時變化,我們可以計算一下波形一階差分幅度的統計矩,同樣也通過平滑窗來擷取這些特征(均值、标準差、偏态和峰态)在不同時間尺度上的表現;

③ 最後,我們計算一下波形的頻域特征,這裡我們隻計算歌曲在不同頻段(将整個頻段均分為10份)的能量占比,不過直接對歌曲的波形資料作快速傅裡葉變換的話其計算量過于龐大了,是以先讓波形資料通過長度為5的平滑窗再對其作快速傅裡葉變換。

綜上所述,我們已經獲得了歌曲的42個特征值。下面我們嘗試利用這些特征值對我這幾天下載下傳的43首歌曲進行k均值聚類。首先,為了便于結果的可視化,我們利用PCA對資料進行降維(42維特征到2維特征),為了友善起見,我們直接調庫(sklearn)實作,結果列印如下:

Python實戰案例,分析個人音樂收藏,了解音頻處理及實作資料可視化

OK,接下來我們就可以對降維後的資料進行聚類了,這裡我們将自己實作一下k均值聚類算法而不是簡單地調庫,最終的聚類結果如下圖所示(k=4):

Python實戰案例,分析個人音樂收藏,了解音頻處理及實作資料可視化

接下來我們嘗試先對歌曲的42個特征值進行歸一化處理,然後再進行上面的PCA和聚類操作,同時令k=3,最終的聚類結果如下圖所示:

Python實戰案例,分析個人音樂收藏,了解音頻處理及實作資料可視化

Emmm,好像效果更差了。

不過我發現我喜歡了8年的歌“尾戒”竟然一枝獨秀了!還是很棒的,哈哈~~~

當然,這裡有一個問題,歌曲的42個特征值是人工選取的,也許并不很好的表現出歌曲特征,且這些特征之間的相關系數是不為0的,也就是存在備援特征。

https://www.christianpeccei.com/musicmap/
           

一文利用了遺傳算法從42個特征值中篩選出了18個特征值作為歌曲最終的特征向量,其結果如下:

Python實戰案例,分析個人音樂收藏,了解音頻處理及實作資料可視化
Python實戰案例,分析個人音樂收藏,了解音頻處理及實作資料可視化

懶得複現了,直接用他的結論重新進行聚類,結果如下(k=3):

Python實戰案例,分析個人音樂收藏,了解音頻處理及實作資料可視化

那就這樣吧,就當學點基礎的音頻處理、機器學習和可視化技術了。

文章到這裡就結束了,感謝你的觀看,關注我每天分享Python技術分享,下篇文章分享垃圾郵件識别