国产日韩欧美一区二区三区三州_亚洲少妇熟女av_久久久久亚洲av国产精品_波多野结衣网站一区二区_亚洲欧美色片在线91_国产亚洲精品精品国产优播av_日本一区二区三区波多野结衣 _久久国产av不卡

?

wav音頻文件格式分析與數(shù)據(jù)獲取

2016-12-15 20:22羅海濤
電腦知識(shí)與技術(shù) 2016年27期
關(guān)鍵詞:音頻文件低位字節(jié)

羅海濤

摘要:音頻文件是把語(yǔ)音信號(hào)離散化的數(shù)字文件,wav格式的音頻文件是常用的二進(jìn)制音頻格式,廣泛應(yīng)用于語(yǔ)音信號(hào)處理、語(yǔ)音識(shí)別、語(yǔ)音合成等領(lǐng)域;本文詳細(xì)分析了wav音頻文件格式,并用C語(yǔ)言編程,實(shí)現(xiàn)對(duì)該格式文件的訪問(wèn),獲取音頻信息和數(shù)據(jù)。

關(guān)鍵字:wav;音頻文件;音頻信息;音頻數(shù)據(jù)

中圖分類號(hào):TP37 文獻(xiàn)標(biāo)識(shí)碼:A 文章編號(hào):1009-3044(2016)27-0211-03

1 概述

語(yǔ)言是人們之間進(jìn)行通訊和交流必不可少的手段。語(yǔ)音由人的發(fā)音器官發(fā)出,語(yǔ)音信號(hào)是連續(xù)的模擬信號(hào),在用計(jì)算機(jī)來(lái)處理時(shí),需要進(jìn)行數(shù)字化,包括采樣、量化等過(guò)程,轉(zhuǎn)換成離散的數(shù)字信號(hào),保存在音頻文件中?,F(xiàn)在很多領(lǐng)域要求對(duì)語(yǔ)音信號(hào)中的音頻數(shù)據(jù)進(jìn)行進(jìn)一步的加工和處理。例如,利用讀出的音頻信號(hào)數(shù)據(jù),進(jìn)行語(yǔ)音信號(hào)時(shí)域和頻域分析、語(yǔ)音壓縮、語(yǔ)音編碼、解碼、語(yǔ)音合成、語(yǔ)音識(shí)別、語(yǔ)音增強(qiáng)等,并通過(guò)波形觀察比較不同編碼效果。另外,利用多媒體語(yǔ)音系統(tǒng)我們還可以用語(yǔ)音數(shù)據(jù)和波形方便地進(jìn)行噪聲模擬分析,語(yǔ)音特征提取研究,以及語(yǔ)音識(shí)別和訓(xùn)練等應(yīng)用方面的實(shí)驗(yàn)。又如:在人工智能領(lǐng)域,通過(guò)設(shè)計(jì)軟件和硬件電路,用聲音去控制計(jì)算機(jī)工作,還有機(jī)器人通過(guò)語(yǔ)音與人進(jìn)行簡(jiǎn)單的對(duì)話交流等等。這些都要求我們對(duì)數(shù)字語(yǔ)音信號(hào)進(jìn)行一些必要的加工處理。

wav文件格式是一種重要的數(shù)字音頻文件格式,是目前應(yīng)用很廣泛的一種音頻格式。相比于其他格式如MP3、MP4、RAM等壓縮效率更高的音頻文件格式,wav文件沒(méi)有采用壓縮技術(shù),因而其文件要大很多,一般都在幾兆字節(jié),甚至更大。但也正因?yàn)闆](méi)有采用壓縮技術(shù),wav文件中聲音的采樣數(shù)據(jù)很容易被讀出來(lái),便于做其他處理。例如:畫(huà)出聲音的信號(hào)波形、作出頻譜,進(jìn)行時(shí)域、頻域分析,提取語(yǔ)音信號(hào)的特征參數(shù)用于語(yǔ)音識(shí)別等?,F(xiàn)在的應(yīng)用程序幾乎都支持wav文件格式,也有專門(mén)軟件可以完成從wav文件格式向其他文件格式的轉(zhuǎn)換,或者把其他格式文件轉(zhuǎn)換為wav格式,例如,微軟公司的Adobe Audition。因此wav文件在目前仍然有著廣泛的應(yīng)用價(jià)值,有很多應(yīng)用程序仍然采用wav文件格式。

本文在Visual C++環(huán)境下編程實(shí)現(xiàn)了wav音頻文件的讀取,讀出其中的參數(shù)和音頻數(shù)據(jù),以便進(jìn)一步用于特征參數(shù)提取、說(shuō)話人識(shí)別等,并對(duì)TIMIT語(yǔ)音庫(kù)的語(yǔ)音文件進(jìn)行了讀取試驗(yàn)驗(yàn)證。

2 wav文件格式分析

2.1 wav文件格式

由于wav格式的波形文件是二進(jìn)制文件,用C語(yǔ)言編程對(duì)該文件讀取其中的數(shù)據(jù),需要先了解它的格式。

wav格式是微軟公司開(kāi)發(fā)的一種聲音文件格式,也叫波形文件,是最早的數(shù)字音頻文件格式,它具有RIFF(Resource Interchange File Format)格式。RIFF格式的wav文件由若干個(gè)Chunk(塊)組成,按順序?yàn)镽IFF WAVE Chunk、Format Chunk、Fact Chunk(可選)和Data Chunk。每個(gè)塊都有固定而且類似的格式,一般第1部分是塊的ID,作為標(biāo)識(shí),4個(gè)字節(jié)大小,緊跟其后的是該塊的大小,也是用4個(gè)字節(jié)表示,低字節(jié)表示低位,高字節(jié)表示高位;第3部分略有差異,以下分別詳細(xì)說(shuō)明。

RIFF WAVE塊格式如表1所示:

Wav文件最開(kāi)始4個(gè)字節(jié)是ID部分,其內(nèi)容為RIFF的ASCII碼,緊跟的4個(gè)字節(jié)是文件大?。ㄗ止?jié)數(shù))減去ID 和Size所占字節(jié)數(shù),共8個(gè)字節(jié),即文件大?。ㄗ止?jié)數(shù))減去8。然后是Type部分,其內(nèi)容為WAVE的ASCII碼,4個(gè)字節(jié)。

Format塊要復(fù)雜得多,其格式如表2所示:

其中ID部分同樣占4個(gè)字節(jié),其內(nèi)容為"fmt "(注意最后有一個(gè)空格)的ASCII碼。

fact塊為可選的塊,有的波形文件有這個(gè)塊,有的沒(méi)有,其格式如表3所示:

有些wav文件是由某些軟件轉(zhuǎn)化來(lái)的,一般就包含該塊。其ID部分為fact的ASCII碼,緊跟的4個(gè)字節(jié)是存儲(chǔ)的是4,然后是data部分,其內(nèi)容為WAVE的ASCII碼,4個(gè)字節(jié)。

最后一個(gè)塊是Data塊,其格式如表4所示:

其ID部分為data的ASCII碼,緊跟的4個(gè)字節(jié)是音頻數(shù)據(jù)個(gè)數(shù),然后是data部分,存儲(chǔ)的是具體的音頻數(shù)據(jù)。

2.2 wav文件示例

我用debug調(diào)試工具把一個(gè)wav二進(jìn)制文件調(diào)入內(nèi)存,再用該工具的顯示命令d,把其中部分內(nèi)容顯示出來(lái),如圖1所示。

圖中,第1行的d是顯示命令,第2行的“1396:0100”是內(nèi)存地址,4個(gè)十六進(jìn)制數(shù)據(jù)“52 49 46 46”依次是"RIFF"4個(gè)字母的ASCII碼;緊跟的4個(gè)十六進(jìn)制數(shù)據(jù)“06 C7 03 00”實(shí)際上是一個(gè)數(shù)值,低位在前,高位在后,因此是十六進(jìn)制數(shù)0x3C706,即十進(jìn)制數(shù)247558,該值等于整個(gè)wav文件大小減去8;再后面的4個(gè)十六進(jìn)制數(shù)據(jù)“57 41 56 45”依次是"WAVE"4個(gè)字母的ASCII碼;至此是第一個(gè)塊,即RIFF WAVE塊。

之后4個(gè)十六進(jìn)制數(shù)據(jù)“66 6D 74 20”依次是"fmt "3個(gè)字母加最后一個(gè)空格的ASCII碼,這表示Format塊開(kāi)始;之后(第3行1396:0110) 4個(gè)十六進(jìn)制數(shù)據(jù)“10 00 00 00”實(shí)際上是一個(gè)數(shù)值,低位在前,高位在后,因此是十六進(jìn)制數(shù)0x10,即十進(jìn)制數(shù)16,表示該塊的“Size”分布,由表2得知,該塊最后沒(méi)有附加信息;之后2個(gè)十六進(jìn)制數(shù)據(jù)“01 00”實(shí)際上是一個(gè)數(shù)值,低位在前,高位在后,因此是十六進(jìn)制數(shù)0x1,即十進(jìn)制數(shù)1,根據(jù)表2,這是編碼方式;之后再2個(gè)十六進(jìn)制數(shù)據(jù)“01 00”同樣是一個(gè)數(shù)值,低位在前,高位在后,因此是十六進(jìn)制數(shù)0x1,即十進(jìn)制數(shù)1,根據(jù)表2,這是聲道數(shù)目,1表示單聲道;之后4個(gè)十六進(jìn)制數(shù)據(jù)“44 AC 00 00”是一個(gè)數(shù)值,低位在前,高位在后,因此是十六進(jìn)制數(shù)0xAC44,即十進(jìn)制數(shù)44100,根據(jù)表2,這是采樣頻率,即每秒鐘采集的樣本個(gè)數(shù),單位為Hz;之后4個(gè)十六進(jìn)制數(shù)據(jù)“88 58 01 00”是一個(gè)數(shù)值,低位在前,高位在后,因此是十六進(jìn)制數(shù)0x15888,即十進(jìn)制數(shù)88200,根據(jù)表2,這是每秒所需字節(jié)數(shù);前面采樣頻率為44100,即每秒有44100個(gè)樣本數(shù)據(jù),此處每秒需88200字節(jié),顯然,每個(gè)采樣數(shù)據(jù)用2個(gè)字節(jié)來(lái)表示;之后2個(gè)十六進(jìn)制數(shù)據(jù)“02 00”(第4行1396:0120)是一個(gè)數(shù)值,低位在前,高位在后,因此是十六進(jìn)制數(shù)0x2,即十進(jìn)制數(shù)2,根據(jù)表2,這是每個(gè)采樣數(shù)據(jù)需要的字節(jié)數(shù),這和前面的分析結(jié)論一致;之后2個(gè)十六進(jìn)制數(shù)據(jù)“10 00”是一個(gè)數(shù)值,低位在前,高位在后,因此是十六進(jìn)制數(shù)0x10,即十進(jìn)制數(shù)16,根據(jù)表2,這是每個(gè)采樣數(shù)據(jù)需要的二進(jìn)制位數(shù),16位即2個(gè)字節(jié);Format塊到此結(jié)束。

之后的4個(gè)十六進(jìn)制數(shù)據(jù)“64 61 74 61”(第4行1396:0120)依次是"data"4個(gè)字母的ASCII碼,此處是data塊開(kāi)始;之后4個(gè)十六進(jìn)制數(shù)據(jù)“E2 C6 03 00”(第4行1396:0120)是一個(gè)數(shù)值,低位在前,高位在后,因此是十六進(jìn)制數(shù)0x3C6E2,即十進(jìn)制數(shù)247522,根據(jù)表4,這是采樣數(shù)據(jù)大小,以字節(jié)個(gè)數(shù)為單位;再后面就是具體的采樣數(shù)據(jù),每個(gè)數(shù)據(jù)用2個(gè)字節(jié)表示,低位在前,高位在后。這個(gè)例子的wav文件沒(méi)有fact塊。

從圖1中看出,前面的采樣數(shù)據(jù)全為0,這是因?yàn)閣av音頻文件一開(kāi)始是靜音,沒(méi)有聲音。在進(jìn)一步用debug工具的d命令繼續(xù)往下顯示,如圖2所示。

從圖2可以看出,音頻文件有聲音的部分,其采樣數(shù)據(jù)就不是0。

3 編程實(shí)現(xiàn)

根據(jù)前面的分析和示例,我在Visual C++環(huán)境下用C語(yǔ)言編程實(shí)現(xiàn)了對(duì)wav音頻文件的音頻數(shù)據(jù)讀取。

由于wav二進(jìn)制文件結(jié)構(gòu)較復(fù)雜,先定義一個(gè)頭文件“wav.h”,在頭文件除了給出定義:

#ifndef _WAV_H_

#define _WAV_H_

更重要的是針對(duì)前面分析的四種塊,分別定義四種結(jié)構(gòu)體,第1個(gè)結(jié)構(gòu)體對(duì)應(yīng)RIFF WAVE塊:

struct RIFF_HEADER

{unsigned char szRiffID[4]; //R,I,F(xiàn),F(xiàn)

unsigned int dwRiffSize; //4個(gè)字節(jié)顯示RIFF塊大小,

//其值等于WAV文件字節(jié)數(shù)-4(RIFFID字節(jié)數(shù))-4(此處字節(jié)數(shù))

unsigned char szRiffFormat[4]; }; //W,A,V,E

考慮到Format塊較復(fù)雜,定義了兩個(gè)結(jié)構(gòu)體來(lái)表示它:

struct FORMAT_Chunk

{unsigned short int wFormatTag; //2字節(jié)顯示編碼方式,一般為0x0001

unsigned short int wChannels; //2字節(jié)顯示聲道數(shù)目,1為單聲道,2為雙聲道

unsigned int dwSamplesPerSec; //4字節(jié)顯示采樣頻率

unsigned int dwAvgBytesPerSec; //4字節(jié)顯示每秒所需字節(jié)數(shù)

unsigned short int wBlockAlign; //2字節(jié)顯示數(shù)據(jù)塊對(duì)齊方式(每個(gè)采樣需要的字節(jié)數(shù))

unsigned short int wBitsPerSample; //2字節(jié)顯示每個(gè)采樣需要的bit數(shù)

unsigned short int append_info; }; //附加信息

以及:

struct FMT_Chunk

{unsigned char szFmtID[4]; //f,m,t,

unsigned int dwFmtSize;//4字節(jié),=16,=18有附加信息在FORMAT_Chunk的append_info

struct FORMAT_Chunk wavFormat;};

第4個(gè)結(jié)構(gòu)體對(duì)應(yīng)fact塊:

struct FACT_Chunk

{unsigned char szFactID[4]; //f,a,c,t

unsigned int dwFactSize; }; //4字節(jié)顯示大?。〝?shù)值為4)

第5個(gè)結(jié)構(gòu)體對(duì)應(yīng)data塊:

struct DATA_Chunk

{unsigned char szDataID[4]; //d,a,t,a

unsigned int dwDataSize; }; //4字節(jié)顯示音頻數(shù)據(jù)塊大?。ㄗ止?jié)數(shù)),其后是音頻數(shù)據(jù)。

在頭文件定義了這些結(jié)構(gòu)體后,就可以在C++文件(.cpp文件)中編程,讀取wav文件中的音頻數(shù)據(jù)??梢韵榷x一個(gè)文件指針:

FILE *wav_in;

以指向并打開(kāi)音頻文件;再分別定義四種結(jié)構(gòu)體變量,文件位置指針等;再用fopen函數(shù)打開(kāi)音頻文件,用fread函數(shù)依次讀取文件中的各個(gè)量,以及后面的音頻數(shù)據(jù)。fread函數(shù)可以一次讀取一個(gè)字節(jié),也可以一次讀取一個(gè)結(jié)構(gòu)體的所有變量值,并自動(dòng)移動(dòng)文件指針,指向下一個(gè)需要讀取的位置。

4 語(yǔ)

用C語(yǔ)言編程讀取二進(jìn)制音頻文件內(nèi)容,比較復(fù)雜,但代碼效率高,得到音頻數(shù)據(jù)后,便于后面用C語(yǔ)言進(jìn)行進(jìn)一步的處理,例如,分幀、提取語(yǔ)音特征參數(shù)或進(jìn)行語(yǔ)音濾波等,這些工作在語(yǔ)音信號(hào)處理、語(yǔ)音識(shí)別中經(jīng)常用到。

參考文獻(xiàn):

[1] Haitao Luo, Local Thresholding De-noise Speech Signal, Fifth International Conference on Digital Image Processing(ICDIP 2013), 8878-48.

[2] 李敏.音頻文件格式WAVE的轉(zhuǎn)換[J].電腦知識(shí)與技術(shù),2005(8)73-75.

[3] 徐濟(jì)仁.WAV文件格式實(shí)例分析[J].微型機(jī)與應(yīng)用,2002(3):50-51.

[4] 舒廣,丁曉明,RIFF WAVE文件的結(jié)構(gòu)及應(yīng)用[J].電聲技術(shù),200(1):49-51.

猜你喜歡
音頻文件低位字節(jié)
No.8 字節(jié)跳動(dòng)將推出獨(dú)立出口電商APP
預(yù)計(jì)2020年油價(jià)將低位震蕩
棗樹(shù)低位截干萌枝嫁接新技術(shù)
上半年磷復(fù)肥市場(chǎng)低位運(yùn)行
利好不足下半年尿素市場(chǎng)仍將低位震蕩
No.10 “字節(jié)跳動(dòng)手機(jī)”要來(lái)了?
簡(jiǎn)談MC7字節(jié)碼
基于Android手機(jī)的音頻文件取證技術(shù)研究
數(shù)字水印在音頻文件篡改檢測(cè)中的應(yīng)用
建湖县| 宣化县| 济阳县| 榆中县| 文登市| 灵丘县| 陆丰市| 文化| 自治县| 囊谦县| 南漳县| 昌江| 辽中县| 商丘市| 洛宁县| 永福县| 永定县| 常熟市| 遂昌县| 鄂托克旗| 哈尔滨市| 安新县| 乌拉特后旗| 建平县| 阿尔山市| 油尖旺区| 青铜峡市| 湘潭市| 江源县| 正定县| 武陟县| 景洪市| 乌海市| 新建县| 米脂县| 清河县| 大余县| 新邵县| 惠安县| 海淀区| 雅安市|