多媒體技術近年來發展很快,較好品質的聲卡可以提供16位的立體聲及44KHZ的播放錄制能力,它不僅可以提供原音逼真的取樣,其合成的音質也十分理想,有的聲卡還加入了數字信號處理器,可編程控制的DSP具有強大的運算能力,它可以用來作聲音信息的壓縮和一些特殊效果的處理。具有此功能的聲卡提供的WAV文件提供的語音信息可以滿足語音特征識別的要求。
1.1 RIFF文件和WAV文件格式
在Windows環境下,大部分的多媒體文件都依循著一種結構來存放信息,這種結構稱為"資源互換文件格式"(Resources lnterchange File Format),簡稱RIFF。例如聲音的WAV文件、視頻的AV1文件等等均是由此結構衍生出來的。RIFF可以看做是一種樹狀結構,其基本構成單位為chunk,猶如樹狀結構中的節點,每個chunk由"辨別碼"、"數據大小"及"數據"所組成。
辨別碼由4個ASCII碼所構成,數據大小則標示出緊跟其後數據的長度(單位為Byte),而數據大小本身也用掉4個Byte,所以事實上一個chunk的長度為數據大小加8。一般而言,chunk本身並不允許內部再包含chunk,但有兩種例外,分別為以"RIFF"及"L1ST"為辨別碼的chunk。而針對此兩種chunk,RIFF又從原先的"數據"中切出4個Byte。 此4個Byte稱為"格式辨別碼",然而RIFF又規定文件中僅能有一個以"RIFF"為辨別碼的chunk。
只要依循此一結構的文件,我們均稱之為RIFF檔。此種結構提供了一種系統化的分類。如果和MS一DOS文件系統作比較,"RIFF"chunk就好比是一台硬盤的根目錄,其格式辨別碼便是此硬盤的邏輯代碼(C:或D:),而"L1ST"chunk即為其下的子目錄,其他的chunk則為一般的文件。至於在RIFF文件的處理方面,微軟提供了相關的函數。視窗下的各種多媒體文件格式就如同在磁盤機下規定僅能放怎樣的目錄,而在該目錄下僅能放何種數據。
WAV為WAVEFORM(波形)的縮寫。聲音文件的結構如圖1所示,"RIFF"的格式辨別碼為"WAVE"。整個文件由兩個chunk所組成:辨別碼"fmt"(注意,最後一個是空白字符!)及"data"。
在"fmt"的chunk下包含了一個PCMWAVEFORMAT數據結構,其定義如下:
typedef strUCt pcmwaveformat - tag {
WAVEFORMAT wf ;
Word wBitsPerSample;
} PCMWAVEFORMAT;
typedef struct waveformat - tag {
WORD wFormatTag ;
WORD nChannels;
DWORD nSamplesPerSec;
DWORD nAvgBytesperSec;
WORD nBlockAlign;
} WAVEFORMAT;
其意義分別為:
wFormatTag:記錄著此聲音的格式代號,例如WAVE_FORMAT_PCM,WAVE_F0RAM_ADPCM等等。
nChannels:記錄聲音的頻道數。
nSamp1esPerSec:記錄每秒取樣數。
nAvgBytesPerSec:記錄每秒的數據量。
nBlockA1ign:記錄區塊的對齊單位。
>
> wBitsPerSample:記錄每個取樣所需的位元數。
>
> "data"Chunk包含真正的聲音數據。Window目前僅提供WAVE_FORMAT_PCM一種數據格式,所代表的意義是脈派編碼調變(Pu1se Code Modulation)。針對此格式,Windows定義了在"data"的chunk中數據的存放情形,圖2中列出了四種不同頻道數及取樣所需的位元數以及位元位置的安排。
>
> "RIFF" 頻道0 頻道0 頻道0 頻道0
>
> xxxx nChannels=1,wBitsPerSample=8
>
> "WAVE" 頻0(左) 頻道1(右) 頻道0(左) 頻道1 (右)
>
> "fmt "
>
> nChannels=2,wBitsPerSample=8
>
> sizeof(PCMWAVEFORMAT)
>
> struct of PCMWAVEFORMAT 頻道0(低位) 頻道0(高位) 頻道0(低位)頻道0(高位)
>
> "data" nChannels=1,wBitsPerSample=16
>
> xxxx 頻道0(低位) 頻道0(高位) 頻道0(低位)頻道0(高位)
>
> (低位) (高位) (低位) (高位)
>
> wave form data
>
> nChannels=2,wBitsPerSample=16
>
> 圖1 WAV文件結構 圖2 PCM文件中位元安排方式
>
> 第一排表示單聲道8位元,第二排表示雙聲道8位元,第三排表示單聲道16位元,第四排表示雙聲道16位元。8位元代表音量大小由8個位元所表示,16位元則代表音量大小由16個位元所表示。理論上8位元可以表示0~255,16位元可表示0~65536,不過windows卻定16位元其值的范圍從-32168~32167。此外尚有一點要注意的是,0並不一定代表無聲,而是由中間的數值來決定,也就是在8位元時為128,16位元時為0才是無聲。所以,若程序設計時需放入無聲的數據,糯特別注意聲音格式是16或是8位元,以放入適當的值。
>
> 1.2 WAV文件信息的具體應用
>
> WAV文件中包括了對原始聲音的高速率采樣,並且以WAVE_PCM_FORMAT脈派編碼調變格式,我們可以在VISUAL C++程序中實現,在讀出WAVEHDR文件頭之後,下面就是原始聲音的高速率采樣信息,我們可以對它作多方面的信息處理。
>
> 1.2.1 波形顯示。
>
> 我們可以以時域-幅度的方式顯示出原始聲音的波形,這是最簡單同時也是最直接的信息處理方式。在時域范圍內,我們可以觀察該信號波形是否連續,中間是否有跳變等。
>
> 1.2.2頻譜顯示
>
> 我們可以以頻域-幅度的方式顯示出原始聲音的頻譜,在對原始信號經過FFT變換之後,可以得到該信號的頻譜,進而得到該信號的能量集中帶,分布特征,譜對稱系數等等。
>
> 1.2.3 用於語音信號識別
>
> 講話者的個體識別是語音信號處理的一個重要內容,但它的一個前提條件是必須提供語音信號的數字波形,通常的方法是將原始的語音信號進行放大、抗混疊濾波、A/D采樣、數值編碼,最終得到語音信號的數字波形,通常多采用硬件處理,費時費力,如果我們借助非常成熟的聲卡技術,將WAV文件打開,就非常方便地得到語音信號的數字波形,為下一步進行語音信號識別提供良好的前端預處理。
>
> 我們可以以頻域-幅度的方式顯示出原始聲音的頻譜,在對原始信號經過FFT變換之後,可以得到該信號的頻譜,進而得到該信號的能量集中帶,分布特征,譜對稱系數等等。
>
> 1.2.3 用於語音信號識別
>
> 講話者的個體識別是語音信號處理的一個重要內容,但它的一個前提條件是必須提供語音信號的數字波形,通常的方法是將原始的語音信號進行放大、抗混疊濾波、A/D采樣、數值編碼,最終得到語音信號的數字波形,通常多采用硬件處理,費時費力,如果我們借助非常成熟的聲卡技術,將WAV文件打開,就非常方便地得到語音信號的數字波形,為下一步進行語音信號識別提供良好的前端預處理。