你有沒有經(jīng)常好奇一些音樂軟件的頻譜特效是怎么做的,為什么做的這么好看?有沒有想試試自己提取音樂頻譜并可視化展現(xiàn)出來?今天,咱就結(jié)合上次的音樂剪輯操作:
1.準(zhǔn)備
開始之前,你要確保Python和pip已經(jīng)成功安裝在電腦上噢,如果沒有,請訪問這篇文章:超詳細(xì)Python安裝指南 進(jìn)行安裝。
Windows環(huán)境下打開Cmd(開始—運(yùn)行—CMD),蘋果系統(tǒng)環(huán)境下請打開Terminal(command+空格輸入Terminal),準(zhǔn)備開始輸入命令安裝依賴。
當(dāng)然,我更推薦大家用VSCode編輯器,把本文代碼Copy下來,在編輯器下方的終端裝依賴模塊,多舒服的一件事啊:Python 編程的最好搭檔—VSCode 詳細(xì)指南。
在終端輸入以下命令安裝我們所需要的依賴模塊:
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 切割頻譜,以獲得更佳的效果。我們細(xì)分到0到1秒的區(qū)段來查看頻譜:
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):
# 導(dǎo)兒音樂
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()
這下細(xì)是細(xì)了,但是還是太復(fù)雜了,其實(shí)我們做頻譜的展示,或許只需要正值即可:
然后我們還可以進(jìn)一步放大,比如說0.9秒到1秒之間的頻譜:
# 公眾號:Python 實(shí)用寶典
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()
這樣好看許多,不過如果要達(dá)成QQ音樂那種效果,還是需要進(jìn)行大量改造。
比如用精美的圖像元素來填充替代、然后零值如何處理?如何讓頻譜更加平穩(wěn)?此外,我們是靜態(tài)的圖像,還需要根據(jù)事件動態(tài)地延續(xù)波段。
用于生產(chǎn)的代碼肯定比我們這簡易的代碼更加復(fù)雜,而且也不應(yīng)該是暴力去除負(fù)值繪制圖像。這些有興趣的讀者可以自行研究啦。
-
頻譜
+關(guān)注
關(guān)注
7文章
884瀏覽量
45671 -
編輯器
+關(guān)注
關(guān)注
1文章
806瀏覽量
31207 -
可視化
+關(guān)注
關(guān)注
1文章
1197瀏覽量
20969 -
python
+關(guān)注
關(guān)注
56文章
4799瀏覽量
84810
發(fā)布評論請先 登錄
相關(guān)推薦
評論