• <tr id="yyy80"></tr>
  • <sup id="yyy80"></sup>
  • <tfoot id="yyy80"><noscript id="yyy80"></noscript></tfoot>
  • 99热精品在线国产_美女午夜性视频免费_国产精品国产高清国产av_av欧美777_自拍偷自拍亚洲精品老妇_亚洲熟女精品中文字幕_www日本黄色视频网_国产精品野战在线观看 ?

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

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

    羅海濤

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

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

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

    1 概述

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

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

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

    2 wav文件格式分析

    2.1 wav文件格式

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

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

    RIFF WAVE塊格式如表1所示:

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

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

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

    fact塊為可選的塊,有的波形文件有這個塊,有的沒有,其格式如表3所示:

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

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

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

    2.2 wav文件示例

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

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

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

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

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

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

    3 編程實現(xiàn)

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

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

    #ifndef _WAV_H_

    #define _WAV_H_

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

    struct RIFF_HEADER

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

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

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

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

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

    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ù)塊對齊方式(每個采樣需要的字節(jié)數(shù))

    unsigned short int wBitsPerSample; //2字節(jié)顯示每個采樣需要的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個結(jié)構(gòu)體對應(yīng)fact塊:

    struct FACT_Chunk

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

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

    第5個結(jié)構(gòu)體對應(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一個文件指針:

    FILE *wav_in;

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

    4 語

    用C語言編程讀取二進(jìn)制音頻文件內(nèi)容,比較復(fù)雜,但代碼效率高,得到音頻數(shù)據(jù)后,便于后面用C語言進(jìn)行進(jìn)一步的處理,例如,分幀、提取語音特征參數(shù)或進(jìn)行語音濾波等,這些工作在語音信號處理、語音識別中經(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ù),2005(8)73-75.

    [3] 徐濟(jì)仁.WAV文件格式實例分析[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ú)立出口電商APP
    預(yù)計2020年油價將低位震蕩
    棗樹低位截干萌枝嫁接新技術(shù)
    河北果樹(2020年2期)2020-05-25 06:58:42
    上半年磷復(fù)肥市場低位運(yùn)行
    利好不足下半年尿素市場仍將低位震蕩
    No.10 “字節(jié)跳動手機(jī)”要來了?
    簡談MC7字節(jié)碼
    基于Android手機(jī)的音頻文件取證技術(shù)研究
    提取APP中的音頻文件
    電腦愛好者(2015年5期)2015-09-10 07:22:44
    數(shù)字水印在音頻文件篡改檢測中的應(yīng)用
    扎赉特旗| 南溪县| 康定县| 三河市| 齐河县| 涞水县| 建宁县| 疏附县| 孟州市| 徐州市| 阳原县| 屯昌县| 上林县| 出国| 哈尔滨市| 方城县| 独山县| 毕节市| 上思县| 陕西省| 罗田县| 开江县| 海阳市| 高碑店市| 乌苏市| 皮山县| 定安县| 武邑县| 韩城市| 五莲县| 平阳县| 布尔津县| 邵阳县| 利川市| 中阳县| 罗甸县| 商河县| 华池县| 丹阳市| 平阳县| 广丰县|