Python實現(xiàn)wav和pcm的轉(zhuǎn)換方式
wav和pcm的轉(zhuǎn)換(Python版本)
wav和pcm是語音信號處理中最常見的文件格式,時常會遇到需要兩種文件格式的相互轉(zhuǎn)換。
wav存儲的一般是解碼后為[-1, 1]的float數(shù)據(jù),文件頭有44個字節(jié)記錄文件的采樣率、長度等等信息。
pcm存儲的是int型整數(shù),不含任何采樣率相關(guā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庫,添加通道信息、采樣位數(shù)、采樣率等信息作為文件頭,pcm數(shù)據(jù)直接寫入即可。
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自動轉(zhuǎn)換
WAV和PCM的簡單介紹
PCM
pcm:pulse code modulation,脈沖編碼調(diào)制。將聲音等模擬信號變成符號化的脈沖列,予以記錄。是由[0]、[1]等符號構(gòu)成的數(shù)字信號,未經(jīng)過任何編碼和壓縮處理。pcm是沒有壓縮的編碼方式。
WAV
wav:wav是一種無損音頻文件格式,wav都有一個文件頭,文件頭包括音頻流的【編碼參數(shù)】,而對音頻流的編碼沒有硬性規(guī)定,符合ACM規(guī)范的編碼都行,所以wav格式通常只要在其他編碼(pcm、MP3)下,加相應的decode(頭文件)就可以轉(zhuǎn)換
關(guān)于音頻的基礎(chǔ)知識
聲道數(shù)channels
聲道數(shù)即聲音通道的數(shù)目。比如單聲道就是左右聲道播放是同一個聲音,立體聲可以使左右聲道分工,使聽起來有空間效果。
采樣位數(shù)bits
也可以稱為采樣值或取樣值,或叫采樣精度、位深度,就是將采樣樣本幅度量化。例如8bits就是把縱坐標分成2的8次方,即256份??梢院饬柯曇舨▌幼兓囊粋€參數(shù)(聲卡的分辨率)
采樣頻率sample_rate
取樣頻率,每秒取得聲音樣本的次數(shù)。頻率越高,聲音的質(zhì)量也就越好,還原也就越真實。
由于人耳的分辨率很有限,太高的頻率并不能分辨出來。在16位聲卡中有22KHz、44KHz等幾級,其中,22KHz相當于普通FM廣播的音質(zhì),44KHz已相當于CD音質(zhì)了,目前的常用采樣頻率都不超過48KHz
pcm文件所占容量:儲存量=(采樣頻率*采樣位數(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分別是兩種格式文件的讀取(存儲)路徑
總結(jié)
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
使用Python-OpenCV消除圖像中孤立的小區(qū)域操作
這篇文章主要介紹了使用Python-OpenCV消除圖像中孤立的小區(qū)域操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-07-0720行Python代碼實現(xiàn)一款永久免費PDF編輯工具的實現(xiàn)
這篇文章主要介紹了20行Python代碼實現(xiàn)一款永久免費PDF編輯工具的實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2020-08-08pycharm 實現(xiàn)本地寫代碼,服務器運行的操作
這篇文章主要介紹了pycharm 實現(xiàn)本地寫代碼,服務器運行的操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-06-06