<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          Python 簡單可視化音樂 — 提取頻譜法

          共 2110字,需瀏覽 5分鐘

           ·

          2022-06-14 09:08


          你有沒有經(jīng)常好奇一些音樂軟件的頻譜特效是怎么做的,為什么做的這么好看?有沒有想試試自己提取音樂頻譜并可視化展現(xiàn)出來?今天,咱就結(jié)合上次的音樂剪輯操作:

          Python 剪輯音樂就是這么簡單

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

          1.準備


          開始之前,你要確保Python和pip已經(jīng)成功安裝在電腦上噢,如果沒有,請訪問這篇文章:超詳細Python安裝指南 進行安裝。

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

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

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

          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秒的區(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()


          這下細是細了,但是還是太復(fù)雜了,其實我們做頻譜的展示,或許只需要正值即可:


          然后我們還可以進一步放大,比如說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音樂那種效果,還是需要進行大量改造。

          比如用精美的圖像元素來填充替代、然后零值如何處理?如何讓頻譜更加平穩(wěn)?此外,我們是靜態(tài)的圖像,還需要根據(jù)事件動態(tài)地延續(xù)波段。

          用于生產(chǎn)的代碼肯定比我們這簡易的代碼更加復(fù)雜,而且也不應(yīng)該是暴力去除負值繪制圖像。這些有興趣的讀者可以自行研究啦。

          如果你喜歡今天的Python 教程,請持續(xù)關(guān)注Python實用寶典,如果對你有幫助,麻煩在下面點一個贊/在看,有任何問題都可以在下方留言,我們會耐心解答的!


          點擊下方閱讀原文可以獲取所有代碼和鏈接哦!

          Python實用寶典 (pythondict.com)

          不只是一個寶典

          歡迎關(guān)注公眾號:Python實用寶典
          瀏覽 141
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          評論
          圖片
          表情
          推薦
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  亚洲中文字幕高清 | xxxx日本少妇 | 豆花视频理论在线播放 | 国产免费AV在线 | 丁香激情综合网 |