1. 程式人生 > >Python學習筆記--音頻處理

Python學習筆記--音頻處理

org frequency -- 個數 學習筆記 pre 技術分享 edi enumerate

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 we

filename = 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學習筆記--音頻處理