你有沒有常常好奇一些音樂軟件的頻譜特效是怎麼作的,爲何作的這麼好看?有沒有想試試本身提取音樂頻譜並可視化展示出來?今天,咱就結合上次的音樂剪輯操做:python
來可視化下面這首歌曲的頻譜!編輯器
開始以前,你要確保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
使用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 提取音樂頻譜並可視化