1. 程式人生 > 程式設計 >python音訊處理的示例詳解

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,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音訊處理內容請搜尋我們以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援我們!