基本概念,音頻,數位化聲音,常見格式,音頻數據處理,音頻數據存取,音頻數據錄製,音頻數據播放,音頻數據空間特徵模型,提出,空間特徵模型,視音頻數據處理,捕獲,回放,壓縮和解壓縮,
基本概念 音頻 音頻是多媒體中的一種重要的媒體,是聲音信號的形式。作為一種信息的載體,音頻可分為語音、音樂和其它聲音三種類型。不同的類型將具有不同的內在特徵,這些內在特徵可劃分為三級,即就是最低層的物理樣本級,中間層的聲學特徵級和最高層的語義級。物理樣本級包含的特徵有採樣頻率、時間刻度、樣本、格式、編碼等;聲學特徵級包含的特徵有感知特徵和聲學特徵,其中感知特徵有音調、音高、旋律、節奏等,聲學特徵包含能量、過零率、LPC 係數及音頻的結構化表示等;語義級包括音樂敘事、音頻對象描述、語音識別文本等。
數位化聲音 傳統的聲音處理方法是通過話筒等設備把聲音的振動轉化成模擬的電流, 經過放大和處理, 然後記錄到磁帶或傳至音箱等設備發聲。這種方法失真較大, 且消除噪音困難, 也不易被編輯和修改。聲音卡的出現解決了模擬方法中存在的問題, 它採用數位化方法來處理聲音。數位化的聲音數據就是音頻數據。
數位化聲音的過程實際上就是以一定的頻率對來自microphone 等設備的連續的模擬音頻信號進行模數轉換(
ADC )得到音頻數據的過程;數位化聲音的播放就是將音頻數據進行數模轉換(
DAC )變成模擬音頻信號輸出。在數位化聲音時有兩個重要的指標,即
採樣頻率 (Sampling Rate)和採樣大小(SamplingSize)。採樣頻率即單位時間內的採樣次數, 採樣頻率越大, 採樣點之間的間隔越小, 數位化得到的聲音就越逼真, 但相應的數據量增大, 處理起來就越困難;採樣大小即記錄每次樣本值大小的數值的位數, 它決定採樣的動態變化範圍, 位數越多, 所能記錄聲音的變化程度就越細膩, 所得的數據量也越大。
常見格式 數位化的聲音數據這裡稱音頻數據, 可在記憶體中被編輯或修改, 也可以檔案形式存放在磁碟上, 稱為wave 檔案, 其擴展名為“ .wav” , 它採用Microsoft 定義的資源互換檔案格式(RIFF 格式), 具體結構如圖 。
WAVE 檔案結構 整個檔案可以看成是一個
RIFF 塊, 該RIFF 塊的形式類型為“
WAVE ” , 共包含了兩個子塊即“ fmt ” 和“
data ”子塊。檔案的開始4 個位元組為字元串“ RIFF” ,接著的4 個位元組為RIFF 塊的大小, 即“ fmt ” 子塊和“ data”子塊所占位元組之和, 然後的4 個位元組是字元串“WAVE” 。“
fmt ” 子塊的偏移地址為0CH -23H, 開始的4 個位元組為字元串“ fmt ” , 接著的4 個位元組是“ fmt ”子塊的大小, 為10H 或12H ,“ fmt ” 子塊的數據為組成PCMWAVEFORMAT 的數據。PCMWAVEFORMAT結構如下:
typedef struct {
WAVEFORM AT wf ;
WORD wBitsPerSample ;//樣本值位數
}PCM WAVEFORMAT
typedef struct {
WORD wFormatT ag ; //WAVE 格式
WORD nChannels ;//聲道數
DWO RD nSamplesPerSec ;//採樣頻率
DWO RD nAvgBytesPerSec;//每秒數據量
WORD nBlockAlig n;//數據塊位元組數
}WAVEFORMAT ;
當w FormatTag 為WAVE_RORMAT_PCM 時,nBlockAlig n 的值應等於nChannels 和w BitsPerSample之積除以8。“ data” 子塊是WAVE 檔案中最大的塊,開始的4 個位元組為字元串“ data” , 然後是音頻數據的位元組數, 占4 個位元組, 最後是數位化的音頻數據, 偏移地址從24H 至檔案尾。
音頻數據處理 音頻數據存取 可以用傳統的對檔案存取的方法將記憶體緩衝區中錄製的音頻數據以wave 格式檔案的形式存在磁碟上,或將磁碟上wave 檔案中音頻數據調入記憶體緩衝區。為了編程方便, 在MMS YSTEM .DLL 中專門提供一組多媒體檔案操作函式。如表1 所示。通過表1 的函式也可以很方便地實現打開、讀、寫和定位RIFF 檔案。
表1 多媒體檔案輸入輸出函式 音頻數據錄製 除了使用MCI 指令外, 也可用低層音頻函式錄製音頻數據, 流程如圖。
圖2 音頻數據錄音流程圖 先檢查系統是否有錄製音頻數據的設備及音頻輸入設備的性能;如正常則打開音頻輸入設備, 若操作成功, 則返回音頻輸入設備句柄,然後調用函式waveI nPrepareHeader 生成WAVE 音頻信息頭結構WAVEHDR
waveInAddBuffer 函式將從輸入設備獲得的數據寫入WAVEHDR;作完準備工作後開始錄音;錄音完成後要清除WAVEHDR, 釋放記憶體資源並且還要關閉音頻輸入設備。打開音頻輸入設備函式的原型為:
MM RESULT waveInOpen(
LPHWAVEIN phwi , //設備句柄指針
UINT uDeviceID, //設備ID
LPWAVEFORMAT EX pw fx , // 波形格式
DWORD dwCallback , // 回調函式地址
DWORD dwCallbackInstance , //
DWORD fdwOpen // 打開設備的標誌
);
pwfx 指向波形格式WAVEFORMATEX 結構, 該結構比前面介紹的WAVEFORMAT 結構多了一個域WORD cbSize, 其值為WAVEFORMATEX 結構的大小。執行該函式時, 需要事先設定pwfx 中各域的值指定格式, uDeviceID 通常設為WAVE_MAPPER。
另外, 錄音時, 通常錄音的時間是不固定的, 而錄音得到的數據量非常大, 合理地使用記憶體是必須要解決的難題。幸好, 低層音頻服務提供了對音頻處理的回調機制, 即在打開音頻設備時, 可通過指定fdw Open 參數為CALLBACK_FUNCTION 或CALLBACK_WINDOW來指定一個函式或視窗作為回調對象, dxCallback參數說明回調對象句柄或函式地址, 設備驅動程式不斷向回調對象傳送訊息, 通知音頻數據的處理狀態。
為了合理使用記憶體, 通常是在記憶體中定義一個能存放100MS 音頻數據的緩衝區, 每當該緩衝區錄滿數據時, 驅動程式就向回調對象即指定的視窗或回調函式分別發WM_WIM_DATA 訊息或WIM_DATA 訊息,由回調對象將音頻數據緩衝區中的數據取走存放到另一個地方。當執行關閉音頻設備函式時, 驅動程式向回調視窗傳送MM_WIM_C LOSE 訊息, 或向回調函式傳送WIM_CLOSE 訊息, 由回調對象負責釋放記憶體資源, 並且如果需要, 即將所錄製的音頻數據存入磁碟。
音頻數據播放 音頻數據的播放比錄製要簡單, 過程非常相似, 部分低層音頻播放函式如表2。
表2 低層音頻函式列表 待播放的音頻數據一般有兩種來源, 要么來自wave 檔案, 要么是應用程式剛錄製的音頻數據。如果是前者, 那么, 播放非常簡單,Windows 提供了一個高層的音頻數據播放函式Play Sound(), 該函式能播放由給定的檔案名稱、資源或系統事件所聲明的波形聲音, 如果播放成功, 返回TRUE;否則返回FALSE, 其原型為:
BOOL P laySound (
LPCSTR pszSound , // 聲音名稱
HM ODU LE hmod , // 模組句柄
DWO RD fdwSound //播放標誌
);
pszSound 指定播放的聲音, 如果為NULL, 則將停止當前正在播放的聲音。Fdw Sound 說明播放聲音的方式, 當其為SND_SYNC 時, 同步播放聲音, 即聲音播放完後才返回;當其為SND_ASYNC 時異步播放聲音。如果音頻數據是位於記憶體中, 則需要用表2 中介紹的低層音頻函式進行播放。
過程與錄製時非常相似, 也要先檢查播放設備是否存在及其性能, 打開播放設備, 生成WAVE 音頻信息頭數據塊WAVEHDR, 調用函式waveOutWrite 將WAVEHDR 數據寫入輸出設備, 進行播放;播放結束後, 也需釋放分配的資源和關閉音頻輸出設備。
音頻數據空間特徵模型 音頻特徵模型要求感知上直觀、物理意義明確;支持儘可能多的套用;特徵元素容易取得。因此,在構建空間特徵模型時,儘可能選擇彼此正交的特徵以降低特徵空間的維,同時能夠保留最多的信息量
提出 文獻中對音頻提出了9 種描述方案,分別是:ScaIeTree,音頻描述框架,AudioSegment,靜聲,會話內容,音色,聲音效果,旋律輪廓,其它處於CE 階段的描述方案。這些描述方案中前三種是比較通用的,後面的一些描述方案適用於特定的場合。例如音頻描述框架是低級音頻描述符的集合。
文獻中提到的“ 基於信號統計的匹配”和“ 基於變換的索引”,並採用了短時Fourier 變換或視窗Fourier 變換作為索引的方法,同時提到用MatIab 中的小波變換函式產生音頻數據索引的方法。用MatIab 中的小波變換函式進行實驗表明,用這種方法產生的索引,其檢索精度依然很低。
空間特徵模型 利用小波分析的方法提取波形聲音信號的小波近似係數,並在這些小波係數的基礎之上構建了下述的音頻空間特徵模型,產生音頻數據索引。
音頻特徵 =(六級近似小波係數,平均幅度,過零率,最好基)
公式定義的音頻空間特徵模型中包含四種元素,分別是六級近似小波係數,平均幅度,過零率和最好基。
視音頻數據處理 捕獲 VFW (Video tor Windows,簡稱vFw)是微軟為開發人員提供的專門用於視頻捕獲、視頻編輯和視頻播放的軟體開發工具。VFW的AVICAP模組主要用於視頻圖像和音頻數據的捕獲。利用該模組的AVIcap視窗類創建捕獲視窗。如果捕獲視窗與視頻採集設備驅動程式連線,捕獲視窗的客戶區用於顯示採集設備捕獲的實時視頻圖像。視頻圖像有
OverLay 和Pre—view兩種顯示模式:在OverLay模式下,實時圖像直接由採集設備傳至顯存中,不占用CPU資源,顯示速度較快;在Preview模式下,實時圖像由採集設備傳至系統記憶體,此時可對圖像數據進行壓縮、編輯和傳輸等操作,然後顯示圖像。如果捕獲視窗與音頻錄入設備驅動程式連線,捕獲視窗調用低層音頻服務進行波形音頻的捕獲。
在進行音頻數據捕獲之前,應用程式只需指定音頻數據緩衝區的大小和個數,當緩衝區錄製滿數據時,驅動程式通過傳送訊息等方式通知應用程式,應用程式就可以對捕獲的數據進行各種處理。AVIcap視窗提供的各種訊息對應著驅動程式相應的接口函式,應用程式若控制視音頻採集設備的驅動程式,只需調用AVICAP模組中的訊息宏函式向AVIcap視窗發出信息,由AVIcap視窗調用設備驅動程式自動完成指定的操作。
回放 音頻數據的回放採用MDK提供的與設備無關的音頻函式。回放時,應用程式將1個數據緩衝區提交給播放設備驅動程式,當驅動程式播放數據完畢時,就通過應用程式查詢、觸發事件或驅動程式傳送訊息等方式通知應用程式,應用程式再次提交1個數據緩衝區給驅動程式,如此循環。回放音頻數據時,應根據實際情況設定多個數據緩衝區,否則當設備驅動程式播放完畢返回此緩衝區,應用程式在準備此緩衝區期間,驅動程式處於等待狀態.這將會出現聲音斷續。
音頻數據的回放包括以下幾個步驟:①WaveOutOpen()用於打開波形數據回放設備,指定回放的波形數據的格式,設定設備驅動程式完成指定動作後通知應用程式的方法,通常情況下有驅動程式傳送訊息給指定視窗、回調函式、執行緒和事件等四種方法;②WaveOutPre—pareHeader()為波形播放設備準備回放緩衝區和數據,並設定數據長度、數據地址和各種標誌等;③WaveOutWrite()將波形數據傳送給播放設備,當設備驅動程式完成數據回放後,將按照WaveOutOpen()指定的方式通知應用程式,由應用程式進行下一步處理;④當音頻數據塊回放完畢後,由WaveOutUnPrepareHeader()清除WaveOutPrepareHeader()準備的數據緩衝區;⑤若停止回放,應先調用WaveOutReset()將所有的數據塊標誌設定為回放完畢並返回應用程式,再調用WaveOutClose()關閉渡形數據播放設備。
壓縮和解壓縮 通過ACM實現音頻數據的實時壓縮、解壓縮等功能時,基本包括幾個步驟:①通過acre—DriverEnum()和acmFormatEnum0函式遍歷系統提供的音頻壓縮解壓縮器,可根據不同的需要獲取指定音頻壓縮懈壓縮器的句柄;②根據遍歷結果,利用獲得的句柄使用aCE—DriverOpen()打開指定音頻壓縮解壓縮器驅動程式.若函式成功將獲得用於與壓縮解壓縮器通信的事例指針;⑧指定輸入、輸出的音頻格式使用acmStreamOpen()打開選取的ACM轉換流;④acmStreamPrepareHeader()為音頻數據的壓縮和解壓縮提供信息頭,信息頭包括源數據的長度,源數據和目標數據的地址等信息;⑤調用acmStreamConvcrt()函式完成音頻數據的壓縮解壓縮,在調甩acmStreamConvert()時可以指定回調函式,以便在轉換過程中顯示進度等信息;⑥音頻數據壓縮解壓縮完畢後,應用程式可以將緩衝區中的數據寫入檔案、進行網路傳輸或回放等操作.最後通過acmStreamClose()和aemDriverC[ose()函式關閉轉換流和驅動程式。