python音頻處理的示例詳解
準備工作:
首先,我們需要 import 幾個工具包,一個是 python 標準庫中的 wave 模塊,用於音頻處理操作,另外兩個是 numpy 和 matplot,提供數據處理函數。
一:讀取本地音頻數據
處理音頻第一步是需要從讓計算機“聽到”聲音,這裡我們使用 python 標準庫中自帶的 wave模塊進行音頻參數的獲取。
(1) 導入 wave 模塊
(2) 使用 wave 中的函數 open 打開音頻文件,wave.open(file,mode)函數帶有兩個參數, 第一個 file 是所需要打開的文件名及路徑,使用字符串表示;第二個 mode 是打開的模式,也是用字符串表示 (’rb’或’wb’)
(3) 打開音頻後使用 getparams() 獲取音頻基本的相關參數(nchannels:聲道數,
sampwidth:量化位數或量化深度,framerate:采樣頻率,nframes:采樣點數)
# 導入 wave 模塊 import wave # 用於繪制波形圖 import matplotlib.pyplot as plt # 用於計算波形數據 import numpy as np # 用於系統處理,如讀取本地音頻文件 import os # 打開WAV文檔 f = wave.open(r"2.wav",'rb' ) # 讀取格式信息 params = f.getparams () nchannels,sampwidth, framerate, nframes = params [:4] print(framerate)
二:讀取單通道音頻,並繪制波形圖(常見音頻為左右2個聲道)
(1) 通過第一步,可以繼續讀取音頻數據本身,保存為字符串格式
readframes:
讀取聲音數據,傳遞一個參數指定需要讀取的長度(以取樣點為單位),readframes返回的是二進制數據(一大堆bytes),在Python中用字符串表示二進制數據。
strData = f.readframes(nframes)
(2) 如果需要繪制波形圖,則需要將字符串格式的音頻數據轉化為 int 類型
frombuffer:
根據聲道數和量化單位,將讀取的二進制數據轉換為一個可以計算的數組。
通過frombuffer函數將二進制轉換為整型數組,通過其參數dtype指定轉換後的數據格式。
waveData=np.frombuffer(strData,dtype=np.int16)
此處需要使用到 numpy 進行數據格式的轉化
(3) 將幅值歸一化
把數據變成(0,1)之間的小數。主要是為瞭數據處理方便提出來的,把數據映射到0~1范圍之內處理,更加便捷快速。
waveData=waveData*1.0/(max(abs(waveData)))
這一步去掉也可畫出波形圖,可以嘗試不用此步,找出波形圖的不同
(4) 繪制圖像
通過取樣點數和取樣頻率計算出取樣的時間:
time = np.arange(0,nframes)*(1.0/framerate)
import wave # 導入 wave 模塊 import matplotlib.pyplot as plt # 用於繪制波形圖 import numpy as np # 用於計算波形數據 import os # 用於系統處理,如讀取本地音頻文件 f = wave.open(r"di.wav",'rb' ) params = f.getparams () nchannels,sampwidth, framerate, nframes = params [:4] print(framerate) # 讀取波形數據 strData = f.readframes(nframes) # 將字符串轉換為16位整數 waveData = np.frombuffer(strData,dtype=np.int16) # 幅值歸一化 waveData = waveData*1.0/(max(abs(waveData))) #計算音頻的時間 time = np.arange(0,nframes)*(1.0 / framerate) plt.plot(time,waveData) plt.xlabel("Time(s)") plt.ylabel("Amplitude") plt.title("Single channel wavedata") plt.show()
效果圖
到此這篇關於python音頻處理的示例詳解的文章就介紹到這瞭,更多相關python音頻處理內容請搜索WalkonNet以前的文章或繼續瀏覽下面的相關文章希望大傢以後多多支持WalkonNet!
推薦閱讀:
- Python調用百度api實現語音識別詳解
- python數學建模是加深Numpy和Pandas學習
- Python NumPy教程之數組的創建詳解
- Python數據分析之Numpy庫的使用詳解
- Python多進程共享numpy 數組的方法