標籤:數字訊號 mat color 它的 數組 sed blank 組成 channels
Python 開啟wav檔案的操作wav檔案
利用python開啟一個wav音頻檔案,然後分析wav檔案的資料存放區格式,有了格式之後就能很方便的進行一些訊號處理的操作。Wikipedia給出的wav檔案的資料如下
Waveform Audio File Format (WAVE, or more commonly known as WAV due to its filename extension - both pronounced "wave"‘)(rarely, Audio for Windows) is a Microsoft and IBM audio file format standard for storing an audio bitstream on PCs. It is an application of the Resource Interchange File Format (RIFF) bitstream format method for storing data in "chunks", and thus is also close to the 8SVX and the AIFF format used on Amiga and Macintosh computers, respectively. It is the main format used on Windows systems for raw and typically uncompressed audio. The usual bitstream encoding is the linear pulse-code modulation (LPCM) format.
音頻格式資料在網上也有一些標準格式的說明,比如WAVE PCM soundfile format http://soundfile.sapp.org/doc/WaveFormat/
關於Python中對wave檔案的處理,可以參考官方給出的文檔 https://docs.python.org/3/library/wave.html
當然大多數情況下,很需要對資訊進行篩選的能力,在使用python來處理wav檔案的時候僅僅需要其中的幾個操作,並不一定要每個都掌握,在需要的時候查詢文檔。
注意
大段的文字來敘述wav音頻檔案是什麼並不是作為編程練習的目的,人的精力是有限的不可能同時掌握所有的知識點。一開始,就學習聲音的原理,然後再驗證,這些工作應該是由搞資訊編碼的研究者來完成,而作為一個工程師應該集中精力研究代碼上的複現。不如反其道行之,讀取音頻檔案,根據系統提供的API獲得各種參數,再去查詢參數的資訊。編程練習要思考怎麼用一般在處理音頻檔案的時候。有個流程就是將音頻檔案匯入,分析波形,進行傅裡葉變換之類的操作,作為資料的預先處理,才可以進行下一步數值資料的處理,其實音頻處理最想要的過程無非如上所述。所以正常情況下,還要知道音頻檔案中的資料的含義,用電腦科學的思想分析就是需要知道它的資料結構。
音頻檔案資訊
用到了python 處理wav檔案的包 wave,讀取wave 資訊,遍曆參數
import wave as wefilename = ‘child1.wav‘WAVE = we.open(filename)for item in enumerate(WAVE.getparams()): print(item)
查詢官方文檔中對於wave.getparams()的描述
Wave_read.getparams()
Returns a namedtuple() (nchannels, sampwidth, framerate, nframes, comptype, compname), equivalent to output of the get*() methods.
輸出資訊(聲道,採樣寬度,畫面播放速率,幀數,唯一標識,無損)
採樣點的個數為 2510762,採樣的頻率為44100HZ,通過這兩個參數可以得到聲音訊號的時間長度
每個採樣點是16 bit = 2 bytes ,那麼將採樣點的個數 2510762*2/(1024*1024)=4.78889MB,那麼這個資訊就是檔案大小資訊。
檢驗一下聲音波形的時間
child1.wav 4.78MB,時間長度56s
time = 56.93337868480726
根據上面WAVE PCM soundfile format 的資料資訊查詢。有一個印象:WAV檔案中由以下三個部分組成:
1."RIFF" chunk descriptor 2.The "fmt" sub-chunk 3.The "data" sub-chunk 存這些資訊的時候都要要有 “ID”、“大小”、“格式”,這些資訊標註了資料的位置,“WAV”格式由“fmt”和“data”,兩個部分組成,其中“fmt”的儲存塊用來存音頻檔案的格式,“data”的儲存塊用來存實際聽到的聲音的資訊,物理上描述的振幅和時間:長度(時間)和振幅,當然人的耳朵聽加的是時間長度,以及音調高低。有這麼一個概念之後,才聯想到“單聲道振幅資料為n*1矩陣點,立體聲為n*2矩陣點”,有這麼一個印象,音頻訊號處理實質就是對這個數組進行處理。也就是說可以讀取這個數組,在配合頻率的資訊直接畫出波形圖。
注意一下幾點
1.一個採樣點的值代表了給定時間內的音頻訊號,一個採樣幀由適當數量的採樣點組成並能構成音頻訊號的多個通道。
2.對於立體聲訊號一個採樣幀有兩個採樣點,一個採樣點對應一個聲道。一個採樣幀作為單一的單元傳送到數/模轉換器(DAC),以確保正確的訊號能同時發送到各自的通道中。
3.單聲道振幅資料為n*1矩陣點,立體聲為n*2矩陣點,那麼將來檔案的資訊處理通過一個矩陣來實現
WAV檔案波形
為了繪製波形圖,需要的參數有時間和振幅的資訊,完整的步驟如下:
1.將WAV檔案匯入到Python的工作環境中。
2.設定參數,聲音訊號(時間、振幅、頻率)。
3.將這些資訊通過 matplotlib.pyplot提供的介面繪畫出來。
可以得到一個振幅隨著時間變化的函數。
1 import wave as we 2 import matplotlib.pyplot as plt 3 import numpy as np 4 from scipy.io import wavfile 5 6 filename = ‘child1.wav‘ 7 WAVE = we.open(filename) 8 print(‘---------聲音資訊------------‘) 9 for item in enumerate(WAVE.getparams()):10 print(item)11 a = WAVE.getparams().nframes # 幀總數12 f = WAVE.getparams().framerate # 採樣頻率13 sample_time = 1/f # 採樣點的時間間隔14 time = a/f #聲音訊號的長度15 sample_frequency, audio_sequence = wavfile.read(filename)16 print(audio_sequence) #聲音訊號每一幀的“大小”17 x_seq = np.arange(0,time,sample_time)18 19 plt.plot(x_seq,audio_sequence,‘blue‘)20 plt.xlabel("time (s)")21 plt.show() WAV檔案的儲存格式
通過上述操作流程,瞭解了幾個資訊:
1.通過python現有包wave 可以擷取wav檔案幾個基礎資訊,比如檔案的聲道,聲音的採樣寬度,畫面播放速率,幀數,是否唯一標識,是否無損,關於WAV檔案處理的入門資訊,可先用幾行代碼獲得WAV檔案基本處理資訊,然後將這些資訊通過畫圖的形式繪畫出來。
2.WAV檔案中的時間,可以按照採樣點數目,以及頻率的大小獲得,將來可以加視窗,進行數字訊號處理上的一些操作,對聲音訊號作進一步的分析。
3.WAV檔案中將聲音訊號存為n*1矩陣點或者n*2矩陣點,區分條件為是單聲道還是雙聲道,對聲音訊號的研究可以轉化為這個數組的研究。
Python學習筆記--音頻處理