語(yǔ)音文件
PCM
我們?cè)谝纛l處理的時(shí)候經(jīng)常會(huì)接觸到PCM數(shù)據(jù):它是模擬音頻信號(hào)經(jīng)模數(shù)轉(zhuǎn)換(A/D變換)直接形成的二進(jìn)制序列,該文件沒(méi)有附加的文件頭和文件結(jié)束標(biāo)志。
聲音本身是模擬信號(hào),而計(jì)算機(jī)只能識(shí)別數(shù)字信號(hào),要在計(jì)算機(jī)中處理聲音,就需要將聲音數(shù)字化,這個(gè)過(guò)程叫經(jīng)模數(shù)轉(zhuǎn)換(A/D變換)。最常見(jiàn)的方式是透過(guò)脈沖編碼調(diào)制PCM (Pulse Code Modulation) 。
運(yùn)作原理如下:首先我們考慮聲音經(jīng)過(guò)麥克風(fēng),轉(zhuǎn)換成一連串電壓變化的信號(hào),如下圖所示。這張圖的橫座標(biāo)為秒,縱座標(biāo)為電壓大小。

要將這樣的信號(hào)轉(zhuǎn)為 PCM 時(shí),需要將聲音量化,我們一般從如下幾個(gè)維度描述一段聲音:
1.聲道數(shù)? 2.采樣位數(shù)? 3.采樣頻率? 4.時(shí)長(zhǎng)
采樣頻率:即取樣頻率,指每秒鐘取得聲音樣本的次數(shù)。采樣頻率越高,聲音的質(zhì)量也就越好,聲音的還原也就越真實(shí),但同時(shí)它占的資源比較多。由于人耳的分辨率很有限,太高的頻率并不能分辨出來(lái)。在16位聲卡中有22KHz、44KHz等幾級(jí),其中,22KHz相當(dāng)于普通FM廣播的音質(zhì),44KHz已相當(dāng)于CD音質(zhì)了,目前的常用采樣頻率都不超過(guò)48KHz。
采樣位數(shù):即采樣值或取樣值(就是將采樣樣本幅度量化)。它是用來(lái)衡量聲音波動(dòng)變化的一個(gè)參數(shù),也可以說(shuō)是聲卡的分辨率。它的數(shù)值越大,分辨率也就越高,所發(fā)出聲音的能力越強(qiáng)。
聲道數(shù):很好理解,有單聲道和立體聲之分,單聲道的聲音只能使用一個(gè)喇叭發(fā)聲(有的也處理成兩個(gè)喇叭輸出同一個(gè)聲道的聲音),立體聲的PCM?可以使兩個(gè)喇叭都發(fā)聲(一般左右聲道有分工) ,更能感受到空間效果。
時(shí)長(zhǎng):?采樣的時(shí)長(zhǎng)
下面再用圖解來(lái)看看采樣位數(shù)和采樣頻率的概念。讓我們來(lái)看看這幾幅圖。
圖中的黑色曲線(xiàn)表示的是PCM?文件錄制的自然界的聲波,
紅色曲線(xiàn)表示的是PCM?文件輸出的聲波,
這個(gè)圖中,采樣點(diǎn)是離散的,每一個(gè)點(diǎn)對(duì)應(yīng)pcm一個(gè)單元的數(shù)據(jù)。
采樣頻率越高,x軸采樣點(diǎn)就越密集,聲音越接近原始數(shù)據(jù)
采樣位數(shù)越高,y軸采樣點(diǎn)就越密集,聲音越接近原始數(shù)據(jù)

采樣頻率單位為Hz,表示每秒采樣的次數(shù):
一般有11025HZ(11KHz)、22050HZ(22KHz)、44100Hz(44KHz)三種。
采樣位數(shù)單位為bit(位),一般有 8bit 和 16bit 。8bit 表示用 8bit 空間量化某時(shí)刻的聲音,這一點(diǎn)基本是和圖片用r、g、b三單位共 24bit 量化顏色一樣。
綜上所述,我們可以得到pcm文件的體積計(jì)算公式(這里我們把 采樣位數(shù)/8 是因?yàn)殡娔X上是將bit轉(zhuǎn)化為byte):
存儲(chǔ)量
存儲(chǔ)量 = (采樣頻率?×?采樣位數(shù)/8) ×?聲道?×?時(shí)間.
每個(gè)采樣數(shù)據(jù)記錄的是振幅,采樣精度取決于儲(chǔ)存空間的大小。
1字節(jié)(8bit)只能記錄256個(gè)數(shù),也就是只能將振幅劃分到256個(gè)等級(jí)。
2字符(16bit)可以記錄
個(gè)數(shù),將振幅劃分到65536個(gè)等級(jí),是CD的標(biāo)準(zhǔn)。
4字節(jié)(32bit)細(xì)分到
個(gè)數(shù),?沒(méi)有必要,太精細(xì)了。
以8k 16bit音頻為例、采樣率8k=8000個(gè)采樣點(diǎn)/秒。
16bit音頻是16位。每8位一個(gè)字節(jié),所以16bit是兩個(gè)字節(jié)。
上面的是單聲道(nomo),如果是雙聲道,所有信息全部×2
?時(shí)間是這個(gè)音頻的秒數(shù)
例如,數(shù)字激光唱盤(pán)(CD-DA,紅皮書(shū)標(biāo)準(zhǔn))的標(biāo)準(zhǔn)采樣頻率為44.l kHz,采樣數(shù)位為16 位,立體聲(2聲道),可以幾乎無(wú)失真地播出頻率高達(dá)22 kHz的聲音,這也是人類(lèi)所能聽(tīng)到的最高頻率聲音。激光唱盤(pán)一分鐘音樂(lè)需要的存儲(chǔ)量為:
(44.1*1000* l6 *2)*60/8=10,584,000(字節(jié))=10.584 M Bytes
這個(gè)數(shù)值就是 PCM 聲音文件在硬盤(pán)中所占磁盤(pán)空間的存儲(chǔ)量。
單雙聲道
?數(shù)據(jù)以二進(jìn)制序列儲(chǔ)存在文件里
?單聲道8bit (1字節(jié)):? ? ? ? 聲音
雙聲道8bit? (2字節(jié)):? ? ? ? 左聲道? 右聲道
單聲道8bit? (2字節(jié)):? ? ? ? 聲音低字節(jié)? 聲音高字節(jié)
單聲道16bit(4字節(jié)):?左音道低字節(jié)?左聲道高字節(jié)?右聲道低字節(jié)?右聲道高字節(jié)?
雙聲道音頻的存儲(chǔ)方式是LRLRLRLR,16bit音頻是每個(gè)聲道都是16bit(2字節(jié))么?PCM是interleaved的方式存儲(chǔ),具體存儲(chǔ)的時(shí)候還有小端(little?endian)和 (big?endian)的問(wèn)題,一般的存儲(chǔ)是小端的,也就是2字節(jié),低位在前,高位在后一個(gè)采樣點(diǎn)16位是0x 1234?存儲(chǔ)的時(shí)候是 0x34 和 0x12 ,?如果是大端就反過(guò)來(lái)。
一個(gè)單聲道的pcm無(wú)頭音頻1M ,轉(zhuǎn)成?雙聲道就變成2M了,就算是有一條聲道沒(méi)信息(或者微弱信號(hào)噪聲),但是?轉(zhuǎn)成雙聲道的時(shí)候就算是靜音,數(shù)據(jù)大小是0x0000他也是要占著位數(shù)的,所以不管怎樣,只要是雙聲道就會(huì)變成2倍大小。
WAV和PCM的關(guān)系
前面也介紹到了,PCM 數(shù)據(jù)本身只是一個(gè)裸碼流,它是由聲道、采樣位數(shù)、采樣頻率、時(shí)長(zhǎng)共同決定的,因此我們至少要知道其中的三個(gè)才能將 PCM 所代表的數(shù)據(jù)提取出來(lái)。
因此,純PCM數(shù)據(jù)是無(wú)法播放的,因此還需要一段描述數(shù)據(jù)。計(jì)算機(jī)系統(tǒng)中的一個(gè)比較常見(jiàn)的做法是將pcm碼流和描述信息封裝在一起,形成一個(gè)音頻文件。這樣就可以直接播放了。
一種常見(jiàn)的方式是使用wav格式定義的規(guī)范將pcm碼流和描述信息封裝起來(lái)。查看 pcm 和對(duì)應(yīng)wav文件的 hex(16進(jìn)制)文件,可以發(fā)現(xiàn),wav文件只是在pcm文件的開(kāi)頭多了44字節(jié) ,來(lái)表征其聲道數(shù)、采樣頻率和采樣位數(shù)等信息。這個(gè)其實(shí)和bmp非常類(lèi)似。
多種音頻格式
WAV、G729、G723 、MP3 等音頻格式都是8k 16bit?wav音頻經(jīng)過(guò)壓縮的格式。
由于廠商眾多、?很多音頻格式?應(yīng)運(yùn)而生,比如nice公司出品的 nmf 其實(shí)音頻,其實(shí)就是一個(gè)經(jīng)過(guò)多層再包裝的g729;vox 格式是華為公司出品的音頻。
VOX格式
vox 格式是華為的格式、他的后綴一種是 V3 的,直接把后綴改成vox就可以聽(tīng);還有一種后綴就是vox。
vox格式因?yàn)楸旧硎菦](méi)有頭信息的看不到,所以不知道采樣率不能轉(zhuǎn)碼、這時(shí)候用 cooledit 打開(kāi)聽(tīng)一下,選擇8k的采樣率打開(kāi)如果語(yǔ)速很快音頻實(shí)際是6k;如果選擇6k的采樣率打開(kāi)如果語(yǔ)速很快音頻實(shí)際是8k。現(xiàn)在?得知采樣率之后就可以用工具轉(zhuǎn)碼,下面會(huì)說(shuō)到工具ffmpeg以及他的輕量版sox。
G729
G729以10字節(jié)作為一個(gè)解碼單元,G729轉(zhuǎn)碼時(shí)先把頭去掉再轉(zhuǎn)。
G729是十六倍壓縮。8k 16bit 8kb/s (正常是128kb/s?壓縮16倍)
MP3
和g729一樣是16倍壓縮,但是由于壓縮算法不一樣,G729的頻譜是光滑的、而MP3音頻的損失很多。是最差的一種音頻格式。
Alaw
8k 8bit?stereo 128kb/s音頻格式,應(yīng)該是非壓縮的格式
音頻轉(zhuǎn)碼
首先音頻格式之間轉(zhuǎn)碼,比如g729?轉(zhuǎn)?mp3 流程是g729->8k、16bit wav -> mp3,都是要先經(jīng)過(guò)wav的。
抓碼工具
<1> 8k8bit nist --> 8k16bit pcm
sox -r 8000 -b 8 -c 1 -t nist 1.nist -s -r 8000 -b 16 1.wav dither
<2> wav->amr->wav
ffmpeg -i inFile1.wav -ab 12.2k outFile.amr
ffmpeg -i outFile.amr outFile.wav
or
ffmpeg -acodec libopencore_amrnb -i outFile.amr outFile.wav
<3> wav-alaw->wav
ffmpeg -i inFile1.wav -acodec pcm_alaw -ar 8000 outFile1.wav
ffmpeg -i outFile1.wav outFile.wav
<4> mulaw->wav
ffmpeg -i inFile.wav outFile.wav
<5> mp3->wav
ffmpeg -i inFile.mp3 outFile.wav
<6> alaw->wav
sox -e a-law alaw.wav -r 8000 -b 16 out.wav
<7> music.mp3 -> wav
ffmpeg -i music.mp3 -ar 8000 -ac 1 outFile.wav
<8> pcm add header -> wav
sox -s -t raw -r 8000 -c 1 -2 in.pcm out.wav
ffmpeg -acodec pcm_s16le -f s16le -ar 8000 -i in.pcm -ar 8000 -ac 1 -ab 128k out.wav
<9> sphere-->wav (wsj data)
sph2pipe 1.WV1 -f wav 1.wav
<10> vox-->wav
./ffmpeg -acodec adpcm_ima_oki -f s16le -ar 6000 -i 1211452.V3 12.wav
<11> two path->mono注:mono.wav -> 單聲道 stereo.wav -> 雙聲道(立體聲)
ffmpeg -i left.wav -i right.wav -filter_complex amix=inputs=2 mono.wav
ffmpeg -i left.wav -i right.wav -filter_complex "amovie=left.wav [l];amovie=right.wav [r]; [l] [r] amerge" stereo.wav
<12> stereo filter
ffmpeg -i fa.mp3 -map_channel 0.0.0 -ar 8000 -ab 128k left.wav -map_channel 0.0.1 -ar 8000 -ab 128k right.wav
<13> wav speed up #聲音加速
ffmpeg -i 16k.wav -filter:a "atempo=1.75" 16k_fast.wav
<14>g729 tranfer
removeHead xx.V3 58 xx.g729
ffmpeg -acodec g729 -f g729 -i xx.g729 xx.wav
<15> nmf->g729->wav
./nmf2g729 1.nmf 1.nmf.g729ffmpeg -acodec g729 -f g729 -i xx.g729 xx.wav
sox
一般會(huì)內(nèi)置的輕量級(jí)ffmpeg工具。
合并多個(gè)音頻
sox 1.wav 2.wav 3.wav 1_2_3.wav
hexdump查看音頻文件頭信息
hexdump -Cv?in.wav | less
音頻頭字節(jié)信息
標(biāo)準(zhǔn)音頻的頭字節(jié)是44位?
查看音頻字節(jié)信息是:hexdump -C in.wav

看紅色部分
其中音頻大小可以在第40-43位(從0位開(kāi)始)倒著看是音頻大小:0x 00 02 53 a0?
轉(zhuǎn)換成十進(jìn)制是152480 加上標(biāo)準(zhǔn)頭字節(jié)?44 是152524字節(jié)

查看音頻的文件大小是152524字節(jié)?與計(jì)算結(jié)果吻合
其實(shí)看4-7位也行,4-7位查看下來(lái)是152516字節(jié)
152516+8=152524字節(jié)其實(shí)這個(gè)152516就是除了頭字節(jié)的八個(gè)字節(jié)后面的字節(jié)數(shù)

看藍(lán)色部分
第24-25位是0x 40 1f? = 8k 這個(gè)位置標(biāo)記的是音頻的采樣率大小標(biāo)準(zhǔn)音頻的頭字節(jié)是44位?
PCM頭信息
一個(gè)裸的PCM格式音頻數(shù)據(jù),如果不帶頭信息,不知道其采樣率等相關(guān)信息,就無(wú)法用播放器播放出來(lái)。下面是默認(rèn)的頭信息格式:
//音頻頭部格式
struct wave_pcm_hdr
{
? ? char? ? ? ? ? ? ? ? ? ? ? riff[4];? ? ? ? ? ? ? ? ? ? ? ? ? ?// = "RIFF"
? ? SR_DWORD? ? ? ? size_8;? ? ? ? ? ? ? ? ? ? ? ? // = FileSize - 8
? ? char? ? ? ? ? ? ? ? ? ? ? wave[4];? ? ? ? ? ? ? ? ? ? ? // = "WAVE"
? ? char? ? ? ? ? ? ? ? ? ? ? ?fmt[4];? ? ? ? ? ? ? ? ? ? ? ? // = "fmt "
? ? SR_DWORD? ? ? ? dwFmtSize;? ? ? ? ? ? ? ? // = 下一個(gè)結(jié)構(gòu)體的大小 : 16
? ? SR_WORD? ? ? ? ? format_tag;? ? ? ? ? ? ? ? ? // = PCM : 1
? ? SR_WORD? ? ? ? ? channels;? ? ? ? ? ? ? ? ? ? // = 通道數(shù) : 1
? ? SR_DWORD? ? ? ?samples_per_sec;? ? ? // = 采樣率 : 8000 | 6000 | 11025 | 16000
? ? SR_DWORD? ? ? ?avg_bytes_per_sec;? ? // = 每秒字節(jié)數(shù) : dwSamplesPerSec *wBitsPerSample / 8
? ? SR_WORD? ? ? ? ? block_align;? ? ? ? ? ? ? ? // = 每采樣點(diǎn)字節(jié)數(shù) : wBitsPerSample / 8
? ? SR_WORD? ? ? ? ? bits_per_sample;? ? ? ? // = 量化比特?cái)?shù): 8 | 16
? ? char? ? ? ? ? ? ? ? ? ? ?data[4];? ? ? ? ? ? ? ? ? ? ? ?// = "data";
? ? SR_DWORD? ? ? ?data_size;? ? ? ? ? ? ? ? ?// = 純數(shù)據(jù)長(zhǎng)度 : FileSize - 44
} ;
//默認(rèn)音頻頭部數(shù)據(jù)
struct wave_pcm_hdr default_pcmwavhdr =
{
? ? { 'R', 'I', 'F', 'F' },
? ? 0,
? ? {'W', 'A', 'V', 'E'},
? ? {'f', 'm', 't', ' '},
? ? 16,
? ? 1,
? ? 1,
? ? 16000,
? ? 32000,
? ? 2,
? ? 16,
? ? {'d', 'a', 't', 'a'},
? ? 0?
};