Python實(shí)現(xiàn)wav和pcm的轉(zhuǎn)換方式
wav和pcm的轉(zhuǎn)換(Python版本)
wav和pcm是語(yǔ)音信號(hào)處理中最常見(jiàn)的文件格式,時(shí)常會(huì)遇到需要兩種文件格式的相互轉(zhuǎn)換。
wav存儲(chǔ)的一般是解碼后為[-1, 1]的float數(shù)據(jù),文件頭有44個(gè)字節(jié)記錄文件的采樣率、長(zhǎng)度等等信息。
pcm存儲(chǔ)的是int型整數(shù),不含任何采樣率相關(guān)信息。雖然原理比較簡(jiǎn)單,但是整理后更便于利用。
wav轉(zhuǎn)pcm
原理:將文件頭去掉,數(shù)據(jù)轉(zhuǎn)成int型即可。
import numpy as np def wav2pcm(wavfile, pcmfile, data_type=np.int16): ? ? f = open(wavfile, "rb") ? ? f.seek(0) ? ? f.read(44) ? ? data = np.fromfile(f, dtype= data_type) ? ? data.tofile(pcmfile)?
pcm轉(zhuǎn)wav
原理:利用wave庫(kù),添加通道信息、采樣位數(shù)、采樣率等信息作為文件頭,pcm數(shù)據(jù)直接寫(xiě)入即可。
import wave def pcm2wav(pcm_file, wav_file, channels=1, bits=16, sample_rate=16000): ? ? pcmf = open(pcm_file, 'rb') ? ? pcmdata = pcmf.read() ? ? pcmf.close() ? ? if bits % 8 != 0: ? ? ? ? raise ValueError("bits % 8 must == 0. now bits:" + str(bits)) ? ? wavfile = wave.open(wav_file, 'wb') ? ? wavfile.setnchannels(channels) ? ? wavfile.setsampwidth(bits // 8) ? ? wavfile.setframerate(sample_rate) ? ? wavfile.writeframes(pcmdata) ? ? wavfile.close()
PCM和WAV音頻格式的區(qū)別及python自動(dòng)轉(zhuǎn)換
WAV和PCM的簡(jiǎn)單介紹
PCM
pcm:pulse code modulation,脈沖編碼調(diào)制。將聲音等模擬信號(hào)變成符號(hào)化的脈沖列,予以記錄。是由[0]、[1]等符號(hào)構(gòu)成的數(shù)字信號(hào),未經(jīng)過(guò)任何編碼和壓縮處理。pcm是沒(méi)有壓縮的編碼方式。
WAV
wav:wav是一種無(wú)損音頻文件格式,wav都有一個(gè)文件頭,文件頭包括音頻流的【編碼參數(shù)】,而對(duì)音頻流的編碼沒(méi)有硬性規(guī)定,符合ACM規(guī)范的編碼都行,所以wav格式通常只要在其他編碼(pcm、MP3)下,加相應(yīng)的decode(頭文件)就可以轉(zhuǎn)換
關(guān)于音頻的基礎(chǔ)知識(shí)
聲道數(shù)channels
聲道數(shù)即聲音通道的數(shù)目。比如單聲道就是左右聲道播放是同一個(gè)聲音,立體聲可以使左右聲道分工,使聽(tīng)起來(lái)有空間效果。
采樣位數(shù)bits
也可以稱為采樣值或取樣值,或叫采樣精度、位深度,就是將采樣樣本幅度量化。例如8bits就是把縱坐標(biāo)分成2的8次方,即256份。可以衡量聲音波動(dòng)變化的一個(gè)參數(shù)(聲卡的分辨率)
采樣頻率sample_rate
取樣頻率,每秒取得聲音樣本的次數(shù)。頻率越高,聲音的質(zhì)量也就越好,還原也就越真實(shí)。
由于人耳的分辨率很有限,太高的頻率并不能分辨出來(lái)。在16位聲卡中有22KHz、44KHz等幾級(jí),其中,22KHz相當(dāng)于普通FM廣播的音質(zhì),44KHz已相當(dāng)于CD音質(zhì)了,目前的常用采樣頻率都不超過(guò)48KHz
pcm文件所占容量:儲(chǔ)存量=(采樣頻率*采樣位數(shù)*聲道*時(shí)間)/ 8 | (8為單位,字節(jié)數(shù))
互相轉(zhuǎn)換代碼
import wave import numpy as np # pcm轉(zhuǎn)wav格式,單聲道,采樣精度,采樣率 def pcm2wav(pcm_file, wav_file, channels=1, bits=16, sample_rate=16000): with open(pcm_file,'rb') as f: pcmdata = f.read() if bits % 8 != 0: raise ValueError("bits % 8 must == 0. now bits:"+str(bits)) wavfile = wave.open(wav_file,'wb') wavfile.setnchannels(channels) wavfile.setsampwidth(bits // 8) wavfile.setframerate(sample_rate) wavfile.writeframes(pcmdata) wavfile.close() # wav轉(zhuǎn)pcm格式 def wav2pcm(wav_file, pcm_file, data_type=np.int16): with open(wav_file,'rb') as f: f.seek(0) f.read(44) data = np.fromfile(f,dtype=data_type) data.tofile(pcm_file) #wav_file,pcm_file分別是兩種格式文件的讀取(存儲(chǔ))路徑
總結(jié)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
使用Python-OpenCV消除圖像中孤立的小區(qū)域操作
這篇文章主要介紹了使用Python-OpenCV消除圖像中孤立的小區(qū)域操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-07-07Python爬取APP下載鏈接的實(shí)現(xiàn)方法
這篇文章主要實(shí)現(xiàn)的是批量下載安卓APP。顯然用手點(diǎn)是不科學(xué)的。于是嘗試用Python寫(xiě)了一個(gè)半自動(dòng)化的腳本。所謂半自動(dòng)化,就是把下載鏈接批量抓取下來(lái),然后一起貼到迅雷里進(jìn)行下載,這樣可以快速批量下載。有需要的朋友們可以一起看看吧。2016-09-09python中os.remove()用法及注意事項(xiàng)
在本篇內(nèi)容里小編給大家分享的是一篇關(guān)于python中os.remove()用法及注意事項(xiàng),有需要的朋友們可以跟著學(xué)習(xí)下。2021-01-0120行Python代碼實(shí)現(xiàn)一款永久免費(fèi)PDF編輯工具的實(shí)現(xiàn)
這篇文章主要介紹了20行Python代碼實(shí)現(xiàn)一款永久免費(fèi)PDF編輯工具的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-08-08pycharm 實(shí)現(xiàn)本地寫(xiě)代碼,服務(wù)器運(yùn)行的操作
這篇文章主要介紹了pycharm 實(shí)現(xiàn)本地寫(xiě)代碼,服務(wù)器運(yùn)行的操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-06-06Matplotlib實(shí)現(xiàn)各種條形圖繪制
這篇文章主要介紹了Matplotlib實(shí)現(xiàn)各種條形圖繪制,文章通過(guò)利用 plt.bar 方法實(shí)現(xiàn)各種條形圖繪制,內(nèi)容詳細(xì)具有一定的參考價(jià)值,需要的小伙伴可以參考一下2022-03-03