首頁 > 軟體

Python實現提取音樂頻譜的方法詳解

2022-06-14 14:02:54

前言

你有沒有經常好奇一些音樂軟體的頻譜特效是怎麼做的,為什麼做的這麼好看?有沒有想試試自己提取音樂頻譜並視覺化展現出來?今天,咱就結合上次的音樂剪輯操作:

3行Python程式碼實現剪輯音樂

來簡單粗暴地視覺化下面這首歌曲的頻譜!

1.準備

開始之前,你要確保Python和pip已經成功安裝在電腦上,如果沒有,可以存取這篇文章:超詳細Python安裝指南 進行安裝。

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

當然,我更推薦大家用VSCode編輯器,把本文程式碼Copy下來,在編輯器下方的終端裝依賴模組,多舒服的一件事啊

在終端輸入以下命令安裝我們所需要的依賴模組:

pip install pydub
pip install librosa

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

2.頻譜展示

使用librosa和matplot,我們可以用10行程式碼完整地展示整個頻譜:

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秒的區段來檢視訊譜:

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秒至ijend秒間的片段
    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秒之間的頻譜:

# 公眾號:Python 實用寶典
n0 = 9000
n1 = 10000
music = np.array([mic for mic in music if mic > 0])
plt.figure(figsize=(14, 5))
pit.plot(music[n0:n1])
plt.grid()
#顯示圖
plt.show()

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

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

用於生產的程式碼肯定比我們這簡易的程式碼更加複雜,而且也不應該是暴力去除負值繪製影象。這些有興趣的讀者可以自行研究啦。

以上就是Python實現提取音樂頻譜的方法詳解的詳細內容,更多關於Python提取頻譜的資料請關注it145.com其它相關文章!


IT145.com E-mail:sddin#qq.com