python音頻處理的示例詳解
準(zhǔn)備工作:
首先,我們需要 import 幾個(gè)工具包,一個(gè)是 python 標(biāo)準(zhǔn)庫(kù)中的 wave 模塊,用于音頻處理操作,另外兩個(gè)是 numpy 和 matplot,提供數(shù)據(jù)處理函數(shù)。
一:讀取本地音頻數(shù)據(jù)
處理音頻第一步是需要從讓計(jì)算機(jī)“聽(tīng)到”聲音,這里我們使用 python 標(biāo)準(zhǔn)庫(kù)中自帶的 wave模塊進(jìn)行音頻參數(shù)的獲取。
(1) 導(dǎo)入 wave 模塊
(2) 使用 wave 中的函數(shù) open 打開(kāi)音頻文件,wave.open(file,mode)函數(shù)帶有兩個(gè)參數(shù), 第一個(gè) file 是所需要打開(kāi)的文件名及路徑,使用字符串表示;第二個(gè) mode 是打開(kāi)的模式,也是用字符串表示 ('rb'或'wb')
(3) 打開(kāi)音頻后使用 getparams() 獲取音頻基本的相關(guān)參數(shù)(nchannels:聲道數(shù),
sampwidth:量化位數(shù)或量化深度,framerate:采樣頻率,nframes:采樣點(diǎn)數(shù))
# 導(dǎo)入 wave 模塊 import wave # 用于繪制波形圖 import matplotlib.pyplot as plt # 用于計(jì)算波形數(shù)據(jù) import numpy as np # 用于系統(tǒng)處理,如讀取本地音頻文件 import os # 打開(kāi)WAV文檔 f = wave.open(r"2.wav",'rb' ) # 讀取格式信息 params = f.getparams () nchannels,sampwidth, framerate, nframes = params [:4] print(framerate)
二:讀取單通道音頻,并繪制波形圖(常見(jiàn)音頻為左右2個(gè)聲道)
(1) 通過(guò)第一步,可以繼續(xù)讀取音頻數(shù)據(jù)本身,保存為字符串格式
readframes:
讀取聲音數(shù)據(jù),傳遞一個(gè)參數(shù)指定需要讀取的長(zhǎng)度(以取樣點(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)換為一個(gè)可以計(jì)算的數(shù)組。
通過(guò)frombuffer函數(shù)將二進(jìn)制轉(zhuǎn)換為整型數(shù)組,通過(guò)其參數(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ù)處理方便提出來(lái)的,把數(shù)據(jù)映射到0~1范圍之內(nèi)處理,更加便捷快速。
waveData=waveData*1.0/(max(abs(waveData)))
這一步去掉也可畫(huà)出波形圖,可以嘗試不用此步,找出波形圖的不同
(4) 繪制圖像
通過(guò)取樣點(diǎn)數(shù)和取樣頻率計(jì)算出取樣的時(shí)間:
time = np.arange(0,nframes)*(1.0/framerate)
import wave # 導(dǎo)入 wave 模塊 import matplotlib.pyplot as plt # 用于繪制波形圖 import numpy as np # 用于計(jì)算波形數(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))) #計(jì)算音頻的時(shí)間 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音頻處理的示例詳解的文章就介紹到這了,更多相關(guān)python音頻處理內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
利用Python實(shí)現(xiàn)定時(shí)程序的方法
在 Python 中,如何定義一個(gè)定時(shí)器函數(shù)呢?本文主要介紹了2種方法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-07-07Python實(shí)現(xiàn)提取指定名稱的文件并批量復(fù)制到其他文件夾
本文介紹基于Python語(yǔ)言,讀取一個(gè)文件夾,并將其中每一個(gè)子文件夾內(nèi)符合名稱要求的文件加以篩選,并將篩選得到的文件復(fù)制到另一個(gè)目標(biāo)文件夾中的方法,需要的朋友可以參考下2023-10-10PyCharm軟件無(wú)法安裝lxml庫(kù)的問(wèn)題及解決
這篇文章主要介紹了PyCharm軟件無(wú)法安裝lxml庫(kù)的問(wèn)題及解決,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-01-01Python Dataframe 指定多列去重、求差集的方法
今天小編就為大家分享一篇Python Dataframe 指定多列去重、求差集的方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2018-07-07簡(jiǎn)要講解Python編程中線程的創(chuàng)建與鎖的使用
這篇文章主要介紹了簡(jiǎn)要講解Python編程中線程的創(chuàng)建與鎖的使用,Python中雖然有GIL的存在,但依然是能夠創(chuàng)建多個(gè)線程來(lái)交替使用的,需要的朋友可以參考下2016-02-02django 實(shí)現(xiàn)celery動(dòng)態(tài)設(shè)置周期任務(wù)執(zhí)行時(shí)間
今天小編就為大家分享一篇django 實(shí)現(xiàn)celery動(dòng)態(tài)設(shè)置周期任務(wù)執(zhí)行時(shí)間,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2019-11-11OpenCV實(shí)戰(zhàn)案例之車(chē)道線識(shí)別詳解
計(jì)算機(jī)視覺(jué)在自動(dòng)化系統(tǒng)觀測(cè)環(huán)境、預(yù)測(cè)該系統(tǒng)控制器輸入值等方面起著至關(guān)重要的作用,下面這篇文章主要給大家介紹了關(guān)于OpenCV實(shí)戰(zhàn)案例之車(chē)道線識(shí)別的相關(guān)資料,需要的朋友可以參考下2022-10-10Numpy中np.vstack()?和?np.hstack()?的實(shí)現(xiàn)
本文主要介紹了Numpy中np.vstack()和np.hstack()的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2024-04-04Python3實(shí)現(xiàn)生成隨機(jī)密碼的方法
這篇文章主要介紹了Python3實(shí)現(xiàn)生成隨機(jī)密碼的方法,是Python程序設(shè)計(jì)中非常實(shí)用的一個(gè)技巧,需要的朋友可以參考下2014-08-08