您好,登錄后才能下訂單哦!
這篇文章將為大家詳細(xì)講解有關(guān)利用python怎么對音頻進(jìn)行處理,文章內(nèi)容質(zhì)量較高,因此小編分享給大家做個參考,希望大家閱讀完這篇文章后對相關(guān)知識有一定的了解。
一:讀取本地音頻數(shù)據(jù)
處理音頻第一步是需要從讓計算機(jī)“聽到”聲音,這里我們使用 python 標(biāo)準(zhǔn)庫中自帶的 wave模塊進(jìn)行音頻參數(shù)的獲取。
(1) 導(dǎo)入 wave 模塊
(2) 使用 wave 中的函數(shù) open 打開音頻文件,wave.open(file,mode)函數(shù)帶有兩個參數(shù), 第一個 file 是所需要打開的文件名及路徑,使用字符串表示;第二個 mode 是打開的模式,也是用字符串表示 ('rb'或'wb')
(3) 打開音頻后使用 getparams() 獲取音頻基本的相關(guān)參數(shù)(nchannels:聲道數(shù),
sampwidth:量化位數(shù)或量化深度,framerate:采樣頻率,nframes:采樣點(diǎn)數(shù))
# 導(dǎo)入 wave 模塊 import wave # 用于繪制波形圖 import matplotlib.pyplot as plt # 用于計算波形數(shù)據(jù) import numpy as np # 用于系統(tǒng)處理,如讀取本地音頻文件 import os # 打開WAV文檔 f = wave.open(r"2.wav",'rb' ) # 讀取格式信息 params = f.getparams () nchannels,sampwidth, framerate, nframes = params [:4] print(framerate)
(1) 通過第一步,可以繼續(xù)讀取音頻數(shù)據(jù)本身,保存為字符串格式
readframes:
讀取聲音數(shù)據(jù),傳遞一個參數(shù)指定需要讀取的長度(以取樣點(diǎn)為單位),readframes返回的是二進(jìn)制數(shù)據(jù)(一大堆bytes),在Python中用字符串表示二進(jìn)制數(shù)據(jù)。
strData = f.readframes(nframes)
(2) 如果需要繪制波形圖,則需要將字符串格式的音頻數(shù)據(jù)轉(zhuǎn)化為 int 類型
frombuffer:
根據(jù)聲道數(shù)和量化單位,將讀取的二進(jìn)制數(shù)據(jù)轉(zhuǎn)換為一個可以計算的數(shù)組。
通過frombuffer函數(shù)將二進(jìn)制轉(zhuǎn)換為整型數(shù)組,通過其參數(shù)dtype指定轉(zhuǎn)換后的數(shù)據(jù)格式。
waveData=np.frombuffer(strData,dtype=np.int16)
此處需要使用到 numpy 進(jìn)行數(shù)據(jù)格式的轉(zhuǎn)化
(3) 將幅值歸一化
把數(shù)據(jù)變成(0,1)之間的小數(shù)。主要是為了數(shù)據(jù)處理方便提出來的,把數(shù)據(jù)映射到0~1范圍之內(nèi)處理,更加便捷快速。
waveData=waveData*1.0/(max(abs(waveData)))
這一步去掉也可畫出波形圖,可以嘗試不用此步,找出波形圖的不同
(4) 繪制圖像
通過取樣點(diǎn)數(shù)和取樣頻率計算出取樣的時間:
time = np.arange(0,nframes)*(1.0/framerate)
import wave # 導(dǎo)入 wave 模塊 import matplotlib.pyplot as plt # 用于繪制波形圖 import numpy as np # 用于計算波形數(shù)據(jù) import os # 用于系統(tǒng)處理,如讀取本地音頻文件 f = wave.open(r"di.wav",'rb' ) params = f.getparams () nchannels,sampwidth, framerate, nframes = params [:4] print(framerate) # 讀取波形數(shù)據(jù) strData = f.readframes(nframes) # 將字符串轉(zhuǎn)換為16位整數(shù) 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()
關(guān)于利用python怎么對音頻進(jìn)行處理就分享到這里了,希望以上內(nèi)容可以對大家有一定的幫助,可以學(xué)到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。