電話錄音采用什么文件格式?
小靈呼電話錄音系統(tǒng)LV包括呼叫中心系統(tǒng)的錄音功能均采用WAV格式作為文件存儲(chǔ),其實(shí)WAV格式也分2、4倍壓縮率及線性無壓縮之分,參見電話錄音壓縮率說明,我們可以看到a率、u率、adpcm、8位pcm,16位pcm均可采用WAV格式存儲(chǔ),可見采用WAV格式存儲(chǔ)并不一定很占空間,它還是可以采用壓縮格式的。
電話錄音采用WAV有什么好處?
WAV是Windows世界里最通用最流行的語音壓縮存儲(chǔ)格式,采用此格式存放錄音文件,可以被大多數(shù)播放軟件播放,而不局限于通過小靈呼軟件界面播放。
WAV文件格式介紹
文件是Windows標(biāo)準(zhǔn)的文件格式,WAV文件作為多媒體中使用的聲波文件格式之一,它是以RIFF格式為標(biāo)準(zhǔn)的。RIFF是英文Resource Interchange FileFormat的縮寫,每個(gè)WAV文件的頭四個(gè)字節(jié)便是“RIFF”。WAV文件由文件頭和數(shù)據(jù)體兩大部分組成。其中文件頭又分為RIFF/WAV文件標(biāo)識(shí)段和聲音數(shù)據(jù)格式說明段兩部分。WAV文件各部分內(nèi)容及格式見附表。常見的聲音文件主要有兩種,分別對應(yīng)于單聲道(11.025KHz采樣率、8Bit的采樣值)和雙聲道(44.1KHz采樣率、16Bit的采樣值)。采樣率是指:聲音信號在“模→數(shù)”轉(zhuǎn)換過程中單位時(shí)間內(nèi)采樣的次數(shù)。采樣值是指每一次采樣周期內(nèi)聲音模擬信號的積分值。對于單聲道聲音文件,采樣數(shù)據(jù)為八位的短整數(shù)(short int 00H-FFH); 而對于雙聲道立體聲聲音文件,每次采樣數(shù)據(jù)為一個(gè)16位的整數(shù)(int),高八位和低八位分別代表左右兩個(gè)聲道。WAV文件數(shù)據(jù)塊包含以脈沖編碼調(diào)制(PCM)格式表示的樣本。WAV文件是由樣本組織而成的。在單聲道WAV文件中,聲道0代表左聲道,聲道1代表右聲道。在多聲道WAV文件中,樣本是交替出現(xiàn)的。
WAV文件格式說明表
| | | | | | | | | | | | | | | | | | | | | | | | | | | |
| | | | | | 格式類別(10H為PCM形式的聲音數(shù)據(jù)) | | | | | | | | | | 采樣率(每秒樣本數(shù)),表示每個(gè)通道的播放速度 | | | | | 波形音頻數(shù)據(jù)傳送速率,其值為通道數(shù)×每秒數(shù)據(jù)位數(shù)×每樣 本的數(shù)據(jù)位數(shù)/8。播放軟件利用此值可以估計(jì)緩沖區(qū)的大小 | | | |
| 每樣本的數(shù)據(jù)位數(shù),表示每個(gè)聲道中各個(gè)樣本的數(shù)據(jù)位數(shù)。如果有多 個(gè)聲道,對每個(gè)聲道而言,樣本大小都一樣。 24H 4 char 數(shù)據(jù)標(biāo)記符"data" 28H 4 long int 語音數(shù)據(jù)的長度 |
PCM數(shù)據(jù)的存放方式: 樣本1 樣本2 8位單聲道 0聲道 0聲道 8位立體聲 0聲道(左) 1聲道(右) 0聲道(左) 1聲道(右) 16位單聲道 0聲道低字節(jié) 0聲道高字節(jié) 0聲道低字節(jié) 0聲道高字節(jié) 16位立體聲 0聲道(左)低字節(jié) 0聲道(左)高字節(jié) 1聲道(右)低字節(jié) 1聲道(右)高字節(jié) PCM數(shù)據(jù)的存放方式: WAV文件的每個(gè)樣本值包含在一個(gè)整數(shù)i中,i的長度為容納指定樣本長度所需 的最小字節(jié)數(shù)。首先存儲(chǔ)低有效字節(jié),表示樣本幅度的位放在i的高有效位上, 剩下的位置為0,這樣8位和16位的PCM波形樣本的數(shù)據(jù)格式如下所示。 多媒體技術(shù)近年來發(fā)展很快,較好品質(zhì)的聲卡可以提供16位的立體聲及44KHZ的播放錄制能力,它不僅可以提供原音逼真的取樣,其合成的音質(zhì)也十分理想,有的聲卡還加入了數(shù)字信號處理器,可編程控制的DSP具有強(qiáng)大的運(yùn)算能力,它可以用來作聲音信息的壓縮和一些特殊效果的處理。具有此功能的聲卡提供的WAV文件提供的語音信息可以滿足語音特征識(shí)別的要求。 RIFF概念 在Windows環(huán)境下,大部分的多媒體文件都依循著一種結(jié)構(gòu)來存放信息,這種結(jié)構(gòu)稱為"資源互換文件格式"(Resources lnterchange File Format),簡稱RIFF。例如聲音的WAV文件、視頻的AV1文件等等均是由此結(jié)構(gòu)衍生出來的。RIFF可以看做是一種樹狀結(jié)構(gòu),其基本構(gòu)成單位為chunk,猶如樹狀結(jié)構(gòu)中的節(jié)點(diǎn),每個(gè)chunk由"辨別碼"、"數(shù)據(jù)大小"及"數(shù)據(jù)"所組成。 塊的標(biāo)志符(4BYTES) | 數(shù)據(jù)大小 (4BYTES) | 數(shù)據(jù) |
圖一、 塊的結(jié)構(gòu)示意圖 辨別碼由4個(gè)ASCII碼所構(gòu)成,數(shù)據(jù)大小則標(biāo)示出緊跟其后數(shù)據(jù)的長度(單位為Byte),而數(shù)據(jù)大小本身也用掉4個(gè)Byte,所以事實(shí)上一個(gè)chunk的長度為數(shù)據(jù)大小加8。一般而言,chunk本身并不允許內(nèi)部再包含chunk,但有兩種例外,分別為以"RIFF"及"L1ST"為辨別碼的chunk。而針對此兩種chunk,RIFF又從原先的"數(shù)據(jù)"中切出4個(gè)Byte。 此4個(gè)Byte稱為"格式辨別碼",然而RIFF又規(guī)定文件中僅能有一個(gè)以"RIFF"為辨別碼的chunk。 RIFF/LIST標(biāo)志符 | 數(shù)據(jù)1大小 | 數(shù)據(jù)1 | | |
圖二、RIFF/LIST塊結(jié)構(gòu) 只要依循此一結(jié)構(gòu)的文件,我們均稱之為RIFF檔。此種結(jié)構(gòu)提供了一種系統(tǒng)化的分類。如果和MS一DOS文件系統(tǒng)作比較,"RIFF"chunk就好比是一臺(tái)硬盤的根目錄,其格式辨別碼便是此硬盤的邏輯代碼(C:或D:),而"L1ST"chunk即為其下的子目錄,其他的chunk則為一般的文件。至于在RIFF文件的處理方面,微軟提供了相關(guān)的函數(shù)。視窗下的各種多媒體文件格式就如同在磁盤機(jī)下規(guī)定僅能放怎樣的目錄,而在該目錄下僅能放何種數(shù)據(jù)。 WAV文件格式 WAVE文件是非常簡單的一種RIFF文件,它的格式類型為"WAVE"。RIFF塊包含兩個(gè)子塊,這兩個(gè)子塊的ID分別是"fmt"和"data",其中"fmt"子塊由結(jié)構(gòu)PCMWAVEFORMAT所組成,其子塊的大小就是sizeofof(PCMWAVEFORMAT),數(shù)據(jù)組成就是PCMWAVEFORMAT結(jié)構(gòu)中的數(shù)據(jù)。 標(biāo)志符(RIFF) | 數(shù)據(jù)大小 | 格式類型("WAVE") | "fmt" | Sizeof(PCMWAVEFORMAT) | PCMWAVEFORMAT | "data" | 聲音數(shù)據(jù)大小 | 聲音數(shù)據(jù) | 圖三、WAVE文件結(jié)構(gòu)
PCMWAVEFORMAT結(jié)構(gòu)定義如下:
Typedef struct
{
WAVEFORMAT wf; /波形格式;
WORD wBitsPerSample; //WAVE文件的采樣大小;
} PCMWAVEFORMAT;
//WAVEFORMAT結(jié)構(gòu)定義如下:
typedef struct
{
WORD wFormatag; //編碼格式,包括WAVE_FORMAT_PCM,WAVEFORMAT_ADPCM等
WORD nChannls; //聲道數(shù),單聲道為1,雙聲道為2;
DWORD nSamplesPerSec; //采樣頻率;
DWORD nAvgBytesperSec; //每秒的數(shù)據(jù)量;
WORD nBlockAlign; //塊對齊;
} WAVEFORMAT;
"data"子塊包含WAVE文件的數(shù)字化波形聲音數(shù)據(jù),其存放格式依賴于"fmt"子塊中wFormatTag成員指定的格式種類,在多聲道WAVE文件中,樣本是交替出現(xiàn)的。如16bit的單聲道WAVE文件和雙聲道WAVE文件的數(shù)據(jù)采樣格式分別如圖四所示:
16位單聲道:
16位雙聲道: 圖四、WAVE文件數(shù)據(jù)采樣格式 WAV文件格式實(shí)例分析:
| 0 1 2 3 4 5 6 7 8 9 A B C D E F | 00000000H 00000010H 00000020H 00000030H 00000040H | 52 49 46 46 0A 06 01 00 57 41 56 45 66 6D 74 20 12 00 00 00 01 00 02 00 44 AC 00 00 10 B1 02 00 04 00 10 00 00 00 66 61 63 74 04 00 00 00 76 41 00 00 64 61 74 61 D8 05 01 00 00 00 00 00 FF FF 00 00 FE FF FE FF 00 00 00 00 FE FF FE FF 00 00 |
| | | | |
文件頭 | | | | | | | | 0x00 01 06 0A(注意數(shù)據(jù)存儲(chǔ)順序); 文件長度 | | | | | | | | “fmt ”; fmt標(biāo)志,最后一位為空 | | | | 0x12; sizeof(PCMWAVEFORMAT) | | | | 1(WAVE_FORMAT_PCM); 格式類別,1表示為PCM形式的聲音數(shù)據(jù) | | | | | | | | | | | | 0x10B10000; 每秒數(shù)據(jù)量;其值為通道數(shù)×每秒數(shù)據(jù)位數(shù)×每樣本的數(shù)據(jù)位數(shù)/8。播放軟件利用此值可以估計(jì)緩沖區(qū)的大小。 | | | | 數(shù)據(jù)塊的調(diào)整數(shù)(按字節(jié)算的),其值為通道數(shù)×每樣本的數(shù)據(jù)位值/8。播放軟件需要一次處理多個(gè)該值大小的字節(jié)數(shù)據(jù),以便將其值用于緩沖區(qū)的調(diào)整。 | | |
| 每樣本的數(shù)據(jù)位數(shù),表示每個(gè)聲道中各個(gè)樣本的數(shù)據(jù)位數(shù)。如果有多個(gè)聲道,對每個(gè)聲道而言,樣本大小都一樣。 | | | | “data”; 數(shù)據(jù)標(biāo)記符 | | | | 0x00 01 05 D8; 語音數(shù)據(jù)大小 | 在Windows環(huán)境下,大部分的多媒體文件都依循著一種結(jié)構(gòu)來存放信息,這種結(jié)構(gòu)稱為"資源互換文件格式"(Resources lnterchange File Format),簡稱RIFF。例如聲音的WAV文件、視頻的AVI文件等等均是由此結(jié)構(gòu)衍生出來的。RIFF可以看做是一種樹狀結(jié)構(gòu),其基本構(gòu)成單位為chunk,猶如樹狀結(jié)構(gòu)中的節(jié)點(diǎn),每個(gè)chunk由"辨別碼"、"數(shù)據(jù)大小"及"數(shù)據(jù)"所組成。
辨別碼由4個(gè)ASCII碼所構(gòu)成,數(shù)據(jù)大小則標(biāo)示出緊跟其后數(shù)據(jù)的長度(單位為Byte),而數(shù)據(jù)大小本身也用掉4個(gè)Byte,所以事實(shí)上一個(gè)chunk的長度為數(shù)據(jù)大小加8。一般而言,chunk本身并不允許內(nèi)部再包含chunk,但有兩種例外,分別為以"RIFF"及"LIST"為辨別碼的chunk。而針對此兩種chunk,RIFF又從原先的"數(shù)據(jù)"中切出4個(gè)Byte。 此4個(gè)Byte稱為"格式辨別碼",然而RIFF又規(guī)定文件中僅能有一個(gè)以"RIFF"為辨別碼的chunk。
只要依循此一結(jié)構(gòu)的文件,我們均稱之為RIFF檔。此種結(jié)構(gòu)提供了一種系統(tǒng)化的分類。如果和MS一DOS文件系統(tǒng)作比較,"RIFF"chunk就好比是一臺(tái)硬盤的根目錄,其格式辨別碼便是此硬盤的邏輯代碼(C:或D:),而"LIST"chunk即為其下的子目錄,其他的chunk則為一般的文件。至于在RIFF文件的處理方面,微軟提供了相關(guān)的函數(shù)。視窗下的各種多媒體文件格式就如同在磁盤機(jī)下規(guī)定僅能放怎樣的目錄,而在該目錄下僅能放何種數(shù)據(jù)。
WAV為WAVEFORM(波形)的縮寫。在聲音文件的結(jié)構(gòu)中,"RIFF"的格式辨別碼為"WAVE"。整個(gè)文件由兩個(gè)chunk所組成:辨別碼"fmt "(注意,后面有一個(gè)空格)及"data"。
在"fmt "的chunk下包含了一個(gè)PCMWAVEFORMAT數(shù)據(jù)結(jié)構(gòu),其定義如下:
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:記錄聲音的頻道數(shù)。
nSamp1esPerSec:記錄每秒取樣數(shù)。
nAvgBytesPerSec:記錄每秒的數(shù)據(jù)量。
nBlockA1ign:記錄區(qū)塊的對齊單位。
wBitsPerSample:記錄每個(gè)取樣所需的位元數(shù)。
"data"Chunk包含真正的聲音數(shù)據(jù)。Window目前僅提供WAVE_FORMAT_PCM一種數(shù)據(jù)格式,所代表的意義是脈派編碼調(diào)變(Pu1se Code Modulation)。針對此格式,Windows定義了在"data"的chunk中數(shù)據(jù)的存放情形,圖2中列出了四種不同頻道數(shù)及取樣所需的位元數(shù)以及位元位置的安排。
"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文件結(jié)構(gòu) 圖2 PCM文件中位元安排方式
第一排表示單聲道8位元,第二排表示雙聲道8位元,第三排表示單聲道16位元,第四排表示雙聲道16位元。8位元代表音量大小由8個(gè)位元所表示,16位元?jiǎng)t代表音量大小由16個(gè)位元所表示。理論上8位元可以表示0~255,16位元可表示0~65536,不過windows卻定16位元其值的范圍從-32168~32167。此外尚有一點(diǎn)要注意的是,0并不一定代表無聲,而是由中間的數(shù)值來決定,也就是在8位元時(shí)為128,16位元時(shí)為0才是無聲。所以,若程序設(shè)計(jì)時(shí)需放入無聲的數(shù)據(jù),糯特別注意聲音格式是16或是8位元,以放入適當(dāng)?shù)闹怠?br />
WAV文件信息的具體應(yīng)用
WAV文件中包括了對原始聲音的高速率采樣,并且以WAVE_PCM_FORMAT脈派編碼調(diào)變格式,我們可以在VISUAL C++程序中實(shí)現(xiàn),在讀出WAVEHDR文件頭之后,下面就是原始聲音的高速率采樣信息,我們可以對它作多方面的信息處理。
波形顯示。
我們可以以時(shí)域-幅度的方式顯示出原始聲音的波形,這是最簡單同時(shí)也是最直接的信息處理方式。在時(shí)域范圍內(nèi),我們可以觀察該信號波形是否連續(xù),中間是否有跳變等。
頻譜顯示
我們可以以頻域-幅度的方式顯示出原始聲音的頻譜,在對原始信號經(jīng)過FFT變換之后,可以得到該信號的頻譜,進(jìn)而得到該信號的能量集中帶,分布特征,譜對稱系數(shù)等等。
用于語音信號識(shí)別
講話者的個(gè)體識(shí)別是語音信號處理的一個(gè)重要內(nèi)容,但它的一個(gè)前提條件是必須提供語音信號的數(shù)字波形,通常的方法是將原始的語音信號進(jìn)行放大、抗混疊濾波、A/D采樣、數(shù)值編碼,最終得到語音信號的數(shù)字波形,通常多采用硬件處理,費(fèi)時(shí)費(fèi)力,如果我們借助非常成熟的聲卡技術(shù),將WAV文件打開,就非常方便地得到語音信號的數(shù)字波形,為下一步進(jìn)行語音信號識(shí)別提供良好的前端預(yù)處理。
單片機(jī)源程序如下:
- #include "wave.h"
- char wave_file[]="00_1942.wav";
- FIL waveFile;
- UINT wave_bw;
- u8 wave_top_table[44];
- //u32 wave_write_table[1024];
- FRESULT wavefileStatus;
- void wave_top_init(u8 select,int channels,int sample_rate,unsigned char *table,int num)
- {
- WAVE_HEADER pcmHEADER;
- WAVE_FMT pcmFMT;
- WAVE_DATA pcmDATA;
- u16 i,j=0;
- u8 *p;
- u8 CounterTimer=0;
- CounterTimer=select;
- wavefileStatus = f_open(&waveFile,(TCHAR const*)wave_file, FA_OPEN_ALWAYS | FA_WRITE |FA_READ );
- if(FR_OK==wavefileStatus)
- {
- //WAVE_HEADER
- memcpy(pcmHEADER.fccID,"RIFF",strlen("RIFF"));
- if(CounterTimer==0)
- {
- pcmHEADER.dwSize=44-8+num;
- }
- else
- {
- pcmHEADER.dwSize=num+waveFile.obj.objsize-8;
- }
- memcpy(pcmHEADER.fccType,"WAVE",strlen("WAVE"));
- //WAVE_FMT
-
- memcpy(pcmFMT.fccID,"fmt ",strlen("fmt "));
- pcmFMT.dwSize=16;
- pcmFMT.wFormatTag=1;
- pcmFMT.wChannels=channels;
- pcmFMT.dwSamplesPerSec=sample_rate;
- pcmFMT.dwAvgBytesPerSec=channels*sample_rate*24/8;
- pcmFMT.wBlockAlign=1*24/8;
- pcmFMT.uiBitsPerSample=24;
-
- //WAVE_DATA;
- memcpy(pcmDATA.fccID,"data",strlen("data"));
- if(CounterTimer==0)
- {
- pcmDATA.dwSize=num;
- }
- else
- {
- pcmDATA.dwSize=waveFile.obj.objsize-44+num;
- }
- //waveFile.obj.objsize=0;
- j=0;
- p=(u8*)(&pcmHEADER);
- for(i=0;i<sizeof(WAVE_HEADER);i++)
- {
- wave_top_table[j++]=*p;
- p++;
- }
- p=(u8*)(&pcmFMT);
- for(i=0;i<sizeof(WAVE_FMT);i++)
- {
- wave_top_table[j++]=*p;
- p++;
- }
- p=(u8*)(&pcmDATA);
- for(i=0;i<sizeof(WAVE_DATA);i++)
- {
- wave_top_table[j++]=*p;
- p++;
- }
-
- f_lseek (&waveFile,0);
- f_write(&waveFile, (const void*)wave_top_table, 44, &wave_bw);
- f_sync (&waveFile);
-
- f_lseek (&waveFile,waveFile.obj.objsize);
- f_write(&waveFile, (const void*)table, num, &wave_bw);
- f_sync (&waveFile);
- f_close(&waveFile);
- }
- }
復(fù)制代碼
頭文件51hei提供下載:
PCM轉(zhuǎn)wave存到sd卡.rar
(1.33 KB, 下載次數(shù): 21)
2020-5-28 10:33 上傳
點(diǎn)擊文件名下載附件
下載積分: 黑幣 -5
|