Python 提取音樂頻譜並可視化

你有沒有常常好奇一些音樂軟件的頻譜特效是怎麼作的,爲何作的這麼好看?有沒有想試試本身提取音樂頻譜並可視化展示出來?今天,咱就結合上次的音樂剪輯操做:python

Python 剪輯音樂就是這麼簡單編程

來可視化下面這首歌曲的頻譜!編輯器

1.準備工做

開始以前,你要確保Python和pip已經成功安裝在電腦上,若是沒有,請訪問這篇文章:超詳細Python安裝指南 進行安裝。spa

Windows環境下打開Cmd(開始—運行—CMD),蘋果系統環境下請打開Terminal(command+空格輸入Terminal),準備開始輸入命令安裝依賴。code

固然,我更推薦你們用VSCode編輯器,把本文代碼Copy下來,在編輯器下方的終端裝依賴模塊,多舒服的一件事啊:Python 編程的最好搭檔—VSCode 詳細指南教程

輸入如下命令安裝本文所須要的依賴模塊:事件

pip install pydub
pip install librosa

看到 Successfully installed xxx 則說明安裝成功。ip

2.頻譜展現

使用librosa和matplot,咱們能夠用10行代碼完整地展現整個頻譜:rem

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秒的區段來查看頻譜:get

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):
    # 導入音樂
    song = AudioSegment.from_mp3(filepath)
    
    # 取begin秒到end秒間的片斷
    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()

這下細是細了,可是仍是太複雜了,其實咱們作頻譜的展現,只須要正值便可:

而後咱們還能夠進一步放大,好比說0.9秒到1秒之間的頻譜:

放大

n0 = 9000
n1 = 10000

music = np.array([mic for mic in music if mic > 0])
plt.figure(figsize=(14, 5))
plt.plot(music[n0:n1])
plt.grid()

顯示圖

plt.show()

這樣好看許多,不過若是要達成QQ音樂那種效果,仍是須要進行大量改造。

好比用精美的圖像元素來填充替代、而後零值如何處理?如何讓頻譜更加平穩?此外,咱們是靜態的圖像,還須要根據事件動態地延續波段。

用於生產的代碼確定比咱們這簡易的代碼更加複雜,並且也不該該是暴力去除負值繪製圖像。這些有興趣的讀者能夠自行研究啦。

咱們的文章到此就結束啦,若是你但願咱們今天的Python 實戰教程,請持續關注咱們,若是對你有幫助,麻煩在下面點一個贊/在看哦,有任何問題均可以在下方留言區留言,咱們都會耐心解答的!


Python實用寶典
不僅是一個寶典
歡迎關注公衆號:Python實用寶典

原文來自Python實用寶典:Python 提取音樂頻譜並可視化

Python實用寶典

相關文章
相關標籤/搜索