音頻數字信號詳解 html
整理者:赤勇玄心行天道 git
QQ號:280604597 github
微信號:qq280604597 算法
QQ羣:511046632 微信
博客:www.cnblogs.com/gaoyaguo 網絡
你們有什麼不明白的地方,或者想要詳細瞭解的地方能夠聯繫我,我會認真回覆的! cors
你能夠隨意轉載,無需註明出處! 編輯器
寫文檔實屬不易,我但願你們能支持我、捐助我,金額隨意,1塊也是支持,我會繼續幫助你們解決問題! 函數
信號就是信息的物理表現形式,或者定義爲攜載信息的自變量函數,信息是信號的具體內容。 工具
根據載體的不一樣,信號能夠分爲電的、聲的、光的、磁的、機械的、熱的、生物醫學的等各種信號。根據一個或多個產生源,信號可分爲單通道信號和多通道信號,例如單聲道音頻、雙聲道立體聲音頻、五通道環繞聲音頻。信號表現上可分爲任意時刻都能精確肯定信號取值的肯定信號,及任意時刻信號取值不能精確肯定的隨機信號。信號的自變量能夠是時間、頻率、控件或者其餘物理量,按自變量數劃分,能夠有一維的(多數是以時間或頻率爲自變量表示,例如音頻、心跳等)、二維的(例如黑白圖像信號的x,y座標)、多維的(例如黑白視頻信號的x,y座標及時間t,彩色視頻信號的紅、綠、藍三原色的三個三維信號組成的三通道信號)。還有其餘劃分方法,例如週期信號與非週期信號,功率信號與能量信號等。
在自變量的指定值上信號的取值稱爲信號的振幅值,也叫幅值或函數值,做爲自變量的函數的振幅值變化稱爲波形。
聲音就是先由物體振動產生的聲波,聲波再經過介質(空氣或固體、液體)傳播並能被人或動物聽覺器官所感知的波動現象。最初發出振動的物體叫聲源。振動引發的氣壓變化的大小稱爲聲壓,聲壓是決定聲強即響度的主要因素。氣壓具備必定的頻率,即聲波每秒變化的次數,以Hz(赫茲)表示。它決定了聲音的高低。聲壓的測量單位是帕(斯卡)。
人耳只能感覺到16Hz至20000Hz的聲波,低於16Hz的叫次聲波,高於20000Hz的叫超聲波。人耳對2000Hz至5000HZ的聲波感覺力最強,但人說話聲音頻率通常在300Hz至700HZ。
音頻是個專業術語,音頻一詞已用做通常性描述音頻範圍內和聲音有關的設備及其做用。人類可以聽到的全部聲音都稱之爲音頻,它可能包括噪音等。
音頻信號是指聲波的頻率、幅度變化信息載體。下圖就是一段音頻信號的頻譜圖:
連續時間連續幅值信號是指在以時間爲自變量的一維信號中,除個別不連續點外,信號在所討論的時間段內的任意時間點都有肯定的振幅值,且振幅值在取值範圍內也有任意種取值。該信號也叫模擬信號。
連續時間離散幅值信號是指在以時間爲自變量的一維信號中,除個別不連續點外,信號在所討論的時間段內的任意時間點都有肯定的振幅值,但振幅值在取值範圍內只有特定種取值。該信號也叫量化信號。
連續時間連續幅值信號和連續時間離散幅值信號都稱爲連續時間信號。
例如:信號 的時間和幅值都是連續的,即爲模擬信號。
離散時間連續幅值信號是指在以時間爲自變量的一維信號中,只在離散時間瞬間纔有幅值,在其它時間沒有,但振幅值在取值範圍內有任意種取值。該信號也叫採樣信號、抽樣信號、取樣信號、脈衝信號。
離散時間離散幅值信號是指在以時間爲自變量的一維信號中,只在離散時間瞬間纔有幅值,在其它時間沒有,且振幅值在取值範圍內也只有特定種取值。該信號也叫數字信號。
離散時間連續幅值信號和離散時間離散幅值信號都稱爲離散時間信號,也常稱爲序列。
肯定信號是指能用肯定的數學函數表示的信號,任意時刻都有肯定的幅值,預先能夠知道該信號的變化規律。
隨機信號是指不能數學函數表示的信號,不能預先能夠知道該信號的變化規律。
週期信號是指按照必定的時間間隔週而復始,而且無始無終的信號。
他們的表達式能夠寫做:
,
(任意整數)
其中稱爲
的週期,而知足關係式的最小
值則稱爲是信號的基本週期。
非週期信號是指該信號在時間上不具備周而復始的特性,即週期信號的週期趨於無限大。
連續時間信號和離散時間信號與週期信號和非週期信號彼此包含,即連續時間信號和離散時間信號中有周期信號和非週期信號,同理,週期信號和非週期信號中也包含連續時間信號和離散時間信號。
模擬信號是指用連續變化的物理量所表達的信息,其信號的幅度,或頻率,或相位隨時間做連續變化,如溫度、溼度、壓力、長度、電流、電壓等等,咱們一般又把模擬信號稱爲連續信號,它在必定的時間範圍內能夠有無限多個不一樣的取值。而數字信號是指在取值上是離散的、不連續的信號。
數字信號處理利用計算機的信號處理設備,採用數值計算的方法對信號進行處理的一門學科,包括濾波、變換、壓縮、擴展、加強、復原、估計、識別、分析、綜合等加工處理,已達到提取有用信息、便於應用的目的。
在數字信號處理領域,量化是指將信號的連續取值(或者大量可能的離散取值)近似爲有限多個(或較少的)離散值的過程。量化主要應用於從連續信號到數字信號的轉換中。連續信號通過採樣成爲離散信號,離散信號通過量化即成爲數字信號。注意離散信號一般狀況下並不須要通過量化的過程,但可能在值域上並不離散,仍是須要通過量化的過程。信號的採樣和量化一般都是由模數轉換器實現的。
防混疊模擬低通濾波器:把會形成混疊失真的高頻份量濾除掉。
模擬信號轉換成數字信號的過程叫作模數轉換,簡寫成A/D,完成這種功能的電路叫作模數轉換器,簡稱ADC。模數轉換器的框圖如圖所示:
輸入端輸入的模擬信號,經採樣、保持、量化和編碼四個過程的處理,轉換成對應的二進制數碼輸出。採樣就是利用模擬開關將連續變化的模擬量變成離散的數字量,如上圖中波形③所示。因爲經採樣後造成的數字量寬度較窄,通過保持電路可將窄脈衝展寬,造成梯形波,如波形④所示。量化就是將階梯形模擬信號中各個值轉化爲某個最小單位的整數倍,便於用數字量來表示。編碼就是將量化的結果(即整數倍值)用二進制數碼來表示。這個過程就實現了模數轉換。目前集成模數轉換器種類較多,有8位、10位模數轉換器。
實例:
數字信號轉換成模擬信號的過程叫作數模轉換,簡寫成D/A,完成這種功能的電路叫作數模轉換器,簡稱DAC。
原始信號
採樣並轉化後的數字信號
理想濾波器濾波(1.5.9式的實現過程)
最終還原後的信號
M:理論上,知足採樣定理採樣獲得的數字信號,忽略量化偏差,通過理想低通濾波器的濾波,能過無偏差的恢復(徹底恢復)原始信號。但實際上,有量化偏差,並且理想低通濾波器是不存在的(非因果系統),因此須要找到可以逼近理性低通濾波器的可行方案。
零階保持器的單位衝擊響應(DAC的單位衝擊響應)
零階保持器的頻率特性(理想低通濾波器的一種逼近方式)
零階保持器對一個數字信號的恢復過程
網絡電話,也稱互聯網電話、IP電話,是指通話雙方將語音信號以數據包的形式在互聯網上進行傳輸,從而實現打電話的功能。網絡電話的優勢就是資費很低,甚至是免費的,缺點就是網絡信號穩定性比電話網要差。
網絡電話一般是雙向同時進行的,也就是全雙工的。一方說話,另外一方則聽到聲音,看似簡單,可是其背後的流程卻十分複雜,其各個主要環節簡化後以下圖所示:
音頻數字信號採樣是指,從麥克風採樣音頻模擬信號,而後轉換成數字信號,俗稱錄音。
麥克風實際上是經過聲波帶動振膜一塊兒震動來採樣音頻信號的。下圖就是一個麥克風的振膜:
振膜在震動時會有幅度,這個幅度會隨着時間的推移而變化,咱們把這個幅度值用二維座標圖畫出來就是:
上圖所表示的其實就是音頻模擬信號了,因爲計算機不能處理模擬信號,只能處理一個一個的數據,因此咱們要將這個模擬信號轉換爲數字信號。轉換過程就是每隔一小段時間就採樣一次這個時刻的幅度值,以下圖:
通過轉換後,這個信號就能夠表示成一個4位無符號整型序列:{7,9,10,12,13,14,14,15,15,15,14,13,12,10,9,7,5,4,2,1,1,0,0,0,1,1,2,3,4,6,7},也能夠爲表示成一個4位有符號整型序列:{-1,1,2,4,5,6,6,7,7,7,6,5,4,2,1,-1,-3,-4,-6,-7,-7,-8,-8,-8,-7,-7,-6,-5,-4,-2,-1},這個序列就是數字信號了。
轉換後的數字信號和轉換前的模擬信號是有必定的偏差的,這就意味着偏差越大,音質越差,偏差越小,音質越好。
咱們能夠簡單的理解爲經過一個振膜採樣到的音頻數據就是一個聲道,兩個振膜就是兩個聲道,以此類推。
振膜通常有大、中、小三種尺寸,尺寸越大,對聲波越敏感,成本也越高。
一個麥克風裏面有的有一個振膜,有的有兩個振膜。一個振膜的麥克風進行的是Mono單聲道錄音,兩個振膜的麥克風進行的是Stereo雙聲道立體聲錄音。五聲道環繞立體聲錄音就是麥克風1錄取東北方向的聲音,麥克風2錄取西北方向的聲音,麥克風3錄取西南方向的聲音,麥克風4錄取東南方向的聲音,麥克風5錄取正前方的聲音。另外還有四聲道環繞立體聲錄音和七聲道環繞立體聲錄音。
單聲道麥克風:,雙聲道立體聲麥克風:
。
採樣頻率就是每秒對音頻模擬信號的採樣次數,常見音頻採樣頻率有8000Hz、16000Hz、22050Hz、32000Hz、44100Hz、48000Hz、96000Hz等。
採樣頻率越高,音頻數字信號就越接近以前的音頻模擬信號,音質也就越好,硬件成本也就越高,存儲空間佔用也就越大。
採樣位數能夠理解數字音頻設備處理聲音的解析度,即對聲音的辨析度。採樣位數通常有8位、16位、24位等,就像表示顏色的表示位數同樣(8位能表示256種顏色,16位能表示65536種顏色)。
若是採樣位數爲8位,則有256個級別的採樣數據,其動態範圍爲20×log(256)分貝,大約是48db。
若是採樣位數爲16位,則有65535個級別的採樣數據,其動態範圍爲20×log(65536)分貝,大約是96 db。
若是採樣位數爲24位,則有16777216個級別的採樣數據,其動態範圍爲20×log(16777216)分貝,大約是144db。
採樣位數越高,採樣數據的級別越密集,幅值採樣就越精準,音質也就越好,但硬件成本也就越高,存儲空間佔用也就越高。16位採樣已經接近了人聽覺極限和痛苦極限,是音樂的理想範圍,通常採樣位數都是這麼高了。
採樣數據就是指每一次採樣所獲得的那個振幅值。具體取值範圍以下:
採樣位數 |
數據類型 |
取值範圍 |
8位 |
無符號整型 |
0~255 |
8位 |
有符號整型 |
-128~127 |
16位 |
無符號整型 |
0~65535 |
16位 |
有符號整型 |
-32768~32767 |
24位 |
無符號整型 |
0~16777216 |
24位 |
有符號整型 |
-8388608~8388607 |
採樣數據幀就是將多個連續的採樣數據分爲一組,主要是爲了便於處理採樣數據。
採樣數據幀通常是以時間爲單位進行分組,例如:將8000hz的音頻數據流按20ms爲一個單位劃分爲一幀,則每幀包含160個採樣數據。
通常音頻編碼都是以音頻數據幀爲單位進行的,每次編碼一個音頻數據幀。
音頻數據幀的大小計算公式:(採樣頻率×採樣位數×聲道數×時間)÷8。
例如:一個採樣數據幀的時長爲20ms,即每20ms的音頻數據構成一個音頻數據幀。假設:採樣頻率爲16000Hz、採樣位數爲16位、聲道數爲1,則這個音頻數據幀的大小爲:(16000×16×1×0.02)÷8 = 640字節。算式中的0.02爲秒,即20ms。
採樣數據幀長度就是每一個採樣數據幀包含多少個採樣數據。
採樣數據幀的長度計算公式:採樣頻率×時間
例如:採樣頻率爲16000Hz,一個採樣數據幀的時長爲20ms,那麼這個採樣數據幀的長度爲:16000×0.02=320個採樣數據。算式中的0.02爲秒,即20ms。
咱們採樣到的最原始的音頻數字信號的那一串數列就是脈衝編碼調製格式的,也叫PCM格式。具體格式以下:
聲道數 |
採樣位數 |
字節1 |
字節2 |
字節3 |
字節4 |
字節5 |
字節6 |
字節7 |
字節8 |
單聲道 |
8位 |
FRONT 前聲道 採樣數據 |
FRONT 前聲道 採樣數據 |
FRONT 前聲道 採樣數據 |
FRONT 前聲道 採樣數據 |
FRONT 前聲道 採樣數據 |
FRONT 前聲道 採樣數據 |
FRONT 前聲道 採樣數據 |
FRONT 前聲道 採樣數據 |
單聲道 |
16位 |
FRONT 前聲道 採樣數據 |
FRONT 前聲道 採樣數據 |
FRONT 前聲道 採樣數據 |
FRONT 前聲道 採樣數據 |
||||
雙聲道 |
8位 |
LEFT 左聲道 採樣數據 |
RIGHT 右聲道 採樣數據 |
LEFT 左聲道 採樣數據 |
RIGHT 右聲道 採樣數據 |
LEFT 左聲道 採樣數據 |
RIGHT 右聲道 採樣數據 |
LEFT 左聲道 採樣數據 |
RIGHT 右聲道 採樣數據 |
雙聲道 |
16位 |
LEFT 左聲道 採樣數據 |
RIGHT 右聲道 採樣數據 |
LEFT 左聲道 採樣數據 |
RIGHT 右聲道 採樣數據 |
發送方依次將各個音頻數據幀經過網絡發送給通話的對方。因爲語音對講對實時性要求比較高,因此低延遲和平穩連續是很是重要的,這樣語音對講才能順暢。
網絡傳輸必需要注意的問題就是,一個是亂序到達,一個是丟包。
通常經常使用的網絡傳輸協議是實時傳輸協議(Real-time Transport Protocol、RTP),也有用TCP協議的。
音頻數字信號還原是指,將獲得的PCM格式音頻數據幀提交給聲卡,聲卡會把音頻數字信號再轉換爲音頻模擬信號,並輸出到揚聲器,揚聲器就會根據音頻模擬信號而振動起來,而後就會產生聲波,最後咱們就能聽還原後的聲音了。
僅僅只是實現網絡電話,那就只須要進行採樣、傳輸、播放就行了,可是實際使用過程當中咱們會發現語音對講中的各類問題會嚴重影響咱們的對講體驗,正是有不少現實的因素給咱們帶來了衆多挑戰,使得網絡電話系統的實現不是那麼簡單,其中涉及到不少專業技術。
我以爲"效果良好"的網絡電話系統應該達到以下幾點:
若是咱們將採樣到的PCM格式音頻數據直接發送或者存儲,那麼每秒須要佔用的帶寬就是16000Hz×16bit=31.25 KB/S,這就要佔用很大的帶寬了。那麼咱們就須要對PCM格式進行壓縮了,將壓縮後的音頻數據再進行發送或者存儲,當須要播放的時候,再解壓縮成PCM格式進行播放。咱們把音頻數據壓縮的過程稱之爲編碼,把音頻數據解壓縮的過程稱之爲解碼。
音頻編碼分爲兩大類,一類是無損壓縮,一類是有損壓縮。無損壓縮是指編碼前的PCM格式音頻數據和解碼後的PCM格式音頻數據是徹底同樣的,音頻信號沒有任何的損失。有損壓縮是指解碼後的PCM格式音頻數據只是近似於編碼前的PCM格式音頻數據,並不徹底同樣。因此無損壓縮的音質是最好的,壓縮率也是最低的,有損壓縮的音質會受壓縮率的高低影響好壞。
音頻編碼算法通常有三種方式:固定比特率、可變比特率、平均比特率。不一樣的編碼方式的區別主要在於壓縮率不同。
目前經常使用的無損音頻編碼格式有:AAL、APE、FLAC、等等,有損音頻編碼格式有:G.72九、iLBC、AAC、Speex、Opus、等等。
對於視頻編碼來講,CBR編碼指的是編碼器每秒鐘的輸出碼數據量(或者解碼器的輸入碼率)應該是固定制(常數)。編碼器檢測每一幀圖像的複雜程度,而後計算出碼率。若是碼率太小,就填充無用數據,使之與指定碼率保持一致;若是碼率過大,就適當下降碼率,也使之與指定碼率保持一致。所以,固定碼率模式的編碼效率比較低。在快速運動畫面部分,畫面細節較多,通常須要更多的比特來描述,但因爲強行下降碼率,所以會丟失部分畫面的細節信息,而出現畫面模糊、不清晰現象。對於音頻壓縮來講,好比MP3,比特率是最重要的因素,它用來表示每秒鐘的音頻數據佔用了多少個比特,這個值越高,音質就越好。CBR使用固定比特率編碼音頻,一首MP3從頭到尾爲某固定值,如128 kbps進行編碼。
可變比特率能夠隨着圖像的複雜程度的不一樣而變化,所以其編碼效率比較高,快速運動畫面的馬賽克就不多。編碼軟件在壓縮時,根據視頻數據,即時肯定使用什麼比特率,這樣既保證了質量,又兼顧了文件大小。使用這種方式時,編碼程序能夠選擇從最差音視頻質量(通常此時壓縮比最高)到最好音視頻質量(通常此時壓縮比最低)之間的各類視頻質量。在視頻文件編碼的時候,編碼程序會嘗試保持所選定的整個文件的品質,對視頻文件的不一樣部分選擇不一樣的比特率來編碼。例如,使用MP3格式的音頻編解碼器,音頻文件能夠以8~320kbps的可變碼率進行壓縮,獲得相對小的文件來節約存儲空間。MP3格式的文件格式是*.mp3。
當形容編解碼器的時候,VBR編碼指的是編碼器的輸出碼率(或者解碼器的輸入碼率)能夠根據編碼器的輸入源信號的複雜度自適應的調整,目的是達到保持輸出質量保持不變而不是保持輸出碼率保持不變。VBR適用於存儲(不太適用於流式傳輸),能夠更好的利用有限的存儲空間:用比較多的碼字對複雜度高的段進行編碼,用比較少的碼字對複雜度低的段進行編碼。
像Vorbis這樣的編解碼器和幾乎全部的視頻編解碼器內在的都是VBR的。*.mp3文件也能夠以VBR的方式進行編碼。
例如:有一段採樣頻率8000Hz的PCM格式音頻數據,一共10幀,每幀20ms,可能其中5幀聲音變化較大,其餘5幀聲音變化較小,那麼用VBR來編碼時,就會把聲音變化較大的那5幀用較高的採樣頻率編碼,編碼後體積也較大,另外那聲音變化較小的那5幀就用較低的採樣頻率編碼,編碼後體積也較小。
平均比特率是VBR的一種插值參數。它針對CBR不佳的文件體積比和VBR生成文件大小不定的特色首創了這種編碼模式。ABR在指定的文件大小內,例如以每50幀(30幀約1秒)爲一段,低頻和不敏感頻率使用相對低的流量,高頻和大動態表現時使用高流量,能夠作爲VBR和CBR的一種折衷選擇。
當對方接收到編碼後的音頻數據幀後,須要對其進行解碼,以恢復成爲可供聲卡直接播放的PCM格式音頻數據。若是是直接發送PCM格式的音頻數據幀,對方就不須要解碼,直接就能夠播放。
一般狀況下沒有解碼的音頻數據是不能播放的,但也有些操做系統能夠直接播放某些經常使用編碼格式的音頻數據,其實就是操做系統幫咱們作了解碼。
你們在語音通話時都會用到電腦的揚聲器外放功能,或者手機的免提功能。這是一個很方便的功能,但這個小小的功能曾經音頻技術提出了很大挑戰。當使用外放功能時,揚聲器播放的聲音會被麥克風再次採集,而後在傳給對方時,對方就會聽到本身的聲音,俗稱聲學回音。這個聲學回音在被循環不少次以後,還有可能會變成嘯叫。因此,咱們須要將這個聲學回音消除掉。
聲學回音消除算法的原理就是,根據音頻輸出數據幀,在音頻輸入數據幀中作一些相似抵消的運算,從而將聲學回音從音頻輸入數據中過濾掉。這個算法過程是至關複雜的,由於根據你聊天時所處的房間的大小、以及你在房間中的位置,迴音的聲波反射時長和次數將會不同,因此聲學回音消除算法須要自動調整內部參數來適應當前的環境。
聲學回音消除必須注意的問題:
聲學回音消除算法通常有這幾種:時域算法,頻域算法,子帶算法。
聲學回音消除算法分爲兩大類:基於DSP等實時平臺的迴音消除,基於Windows等非實時平臺的迴音消除。二者的技術難度和重點是不同的。
各個操做系統是否自帶聲學回音消除功能:
Windows、UNIX、Linux操做系統沒有自帶聲學回音消除功能,須要調用第三方庫實現。
Android操做系統雖然自帶有聲學回音消除功能,可是須要設備廠商本身實現,因爲不少廠商都實現不了該功能,因此大部分的手機都不自帶該功能,仍然須要調用第三方庫實現。
IOS操做系統自帶有聲學回音消除功能,並且效果很是好,能夠放心調用,固然也能夠調用第三方庫實現。
聲學回音消除效果演示:
音頻輸入數據:
音頻輸出數據:
音頻結果數據:
所謂音頻輸入輸出數據幀同步就是指,音頻輸入數據幀和音頻輸出數據幀的開始時間及結束時間都是相同的時刻。
因爲聲學回音消除算法要求音頻輸入輸出數據幀同步得很是好,因此在作聲學回音消除前,必須先研究如何作同步。可是,其實聲學回音消除算法要求並不必定徹底同步,主要是要求音頻輸入數據幀必須比音頻輸出數據幀要先開始,只要能保證音頻輸入數據中的迴音出如今音頻輸出數據幀以後,迴音就能夠被消除掉,但又不能先開始過久,越靠近越好,通常先開始0ms~300ms都是能夠正常消除的。
好比:一幀20ms,音頻輸入數據幀的開始時間爲13點05分15秒220毫秒、結束時間爲13點05分15秒240毫秒,那麼音頻輸出數據幀的開始時間也應該爲13點05分15秒220毫秒、結束時間也應該爲13點05分15秒240毫秒。若是作不到徹底同步,音頻輸出數據幀的開始時間也能夠爲13點05分15秒340毫秒、結束時間也能夠爲13點05分15秒360毫秒,慢120ms左右迴音消除是不會有問題的。
同步的方法:
Windows、UNIX、Linux操做系統:
直接用PortAudio庫能夠完美同步。
Android操做系統:
第一種:調用第三方修改的jni層的Android版的PortAudio的OpenSLES庫實現同步,本方法能夠完美同步,可是有些手機對OpenSLES庫支持並很差,致使播放或錄音有很高的延遲,因此本方法兼容性較差。下載地址:https://github.com/Gundersanne/portaudio_opensles
第二種:在單線程中,先初始化AudioRecord類和AudioTrack類,並先調用AudioRecord.startRecording()函數再調用AudioTrack.play()函數,而後進入循環體,先調用AudioTrack.write()函數阻塞播放音頻輸出數據幀,而後再調用AudioRecord.read()函數獲取音頻輸入數據幀,循環體完畢。理論上這樣作出來的音頻輸入輸出數據幀就是同步的,可是因爲Android操做系統Java代碼的函數調用是有延遲的,不一樣的手機延遲會不同,最終就會致使大部分的手機不能同步,因此本方法兼容性和穩定性都不好。
第三種:先在主線程中,初始化AudioRecord類和AudioTrack類,並先調用AudioRecord.startRecording()函數再調用AudioTrack.play()函數,而後再啓動兩個線程,一個音頻輸入線程負責調用AudioRecord.read()函數獲取音頻輸入數據幀,並依次存放到已錄音的音頻輸入數據幀鏈表,一個音頻輸出線程負責調用AudioTrack.write()函數播放音頻輸出數據幀,並依次存放到已播放的音頻輸出數據幀鏈表。先啓動音頻輸入線程,再啓動音頻輸出線程,這樣已錄音的音頻輸入數據幀鏈表和已播放的音頻輸出數據幀鏈表裏的數據幀就是一一對應同步的,本方法在大部分狀況下能夠差很少完美同步,可是極少數狀況下若是系統出現忽然卡頓,就可能會不一樣步了,因此本方法兼容性和穩定性都很好。
第四種:本人後來發現,有些手機在調用AudioRecord.startRecording()函數後,竟然並無真正開始錄音,而是要在調用AudioRecord.read()函數過程當中時纔會真正開始,那麼這樣就有可能會致使播放線程走在前面了,因此在第三種方法中,改成在音頻輸入線程調用一次AudioRecord.read()函數並丟棄掉後,再在音頻輸入線程中啓動音頻輸出線程。這樣本方法在絕大部分狀況下能夠差很少完美同步。
第五種:本人後來又發現,有些手機在調用AudioRecord.read()函數後,竟然並無真正開始錄音,而是要在調用好幾回AudioRecord.read()函數後纔會真正開始,那麼這樣就有可能會致使播放線程走在前面了,因此在第四種方法中,改成在音頻輸入線程調用屢次AudioRecord.read()函數,直到讀取到的音頻數據不是全0了並所有丟棄掉後,再在音頻輸入線程中啓動音頻輸出線程。這樣本方法在全部手機上能夠差很少完美同步。
IOS操做系統:
應該和Android操做系統的第五種方法同理,本人沒有測試過。
若是是調用系統自帶的聲學回音消除功能是不須要作同步的。
http://www.cnblogs.com/jqyp/archive/2011/12/31/2308659.html
1、前言
由於工做的關係,筆者從2004年開始接觸回聲消除(Echo Cancellation)技術,然後一直在某大型通信企業從事與回聲消除技術相關的工做,對回聲消除這個看似神祕、高端和難以理解的技術領域可謂知之甚詳。
要了解回聲消除技術的前因後果,不得不說起做爲現代通信技術的理論基礎——數字信號處理理論。首先,數字信號處理理論裏面有一門重要的分支,叫作自適應信號處理。而在經典的教材裏面,回聲消除問題歷來都是做爲一個經典的自適應信號處理案例來討論的。既然回聲消除在教科書上都做爲一種經典的具體的應用,也就是說在理論角度是沒有什麼神祕和新鮮的,那麼回聲消除的難度在哪裏?爲何提供回聲消除技術(無論是芯片仍是算法)的公司都是來自國外?回聲消除技術的神祕性在哪裏?
2、回聲消除原理
從通信迴音產生的緣由看,能夠分爲聲學回音(Acoustic Echo)和線路迴音(Line Echo),相應的回聲消除技術就叫聲學回聲消除(Acoustic Echo Cancellation,AEC)和線路回聲消除(Line Echo Cancellation, LEC)。聲學回音是因爲在免提或者會議應用中,揚聲器的聲音屢次反饋到麥克風引發的(比較好理解);線路迴音是因爲物理電子線路的二四線匹配耦合引發的(比較難理解)。
迴音的產生主要有兩種緣由:
1. 因爲空間聲學反射產生的聲學回音(見下圖):
圖中的男子說話,語音信號(speech1)傳到女士所在的房間,因爲空間的反射,造成迴音speech1(Echo)從新從麥克風輸入,同時疊加了女士的語音信號(speech2)。此時男子將會聽到女士的聲音疊加了本身的聲音,影響了正常的通話質量。此時在女士所在房間應用迴音抵消模塊,能夠抵消掉男子的迴音,讓男子只聽到女士的聲音。
2. 因爲2-4線轉換引入的線路迴音(見下圖):
在ADSL Modem和交換機上都存在2-4線轉換的電路,因爲電路存在不匹配的問題,會有一部分的信號被反饋回來,造成了迴音。若是在交換機側不加回音抵消功能,打電話的人就會本身聽到本身的聲音。
無論產生的緣由如何,對語音通信終端或者語音中繼交換機須要作的事情都同樣:在發送時,把不須要的迴音從語音流中間去掉。
試想一下,對一個至少混合了兩個聲音的語音流,要把它們分開,而後去掉其中一個,難度何其之大。就像一瓶藍墨水和一瓶紅墨水倒在一塊兒,而後須要把紅墨水提取出來,這恐怕不可能了。因此回聲消除被認爲是神祕和難以理解的技術也就不奇怪了。誠然,若是僅僅單獨拿來一段混合了迴音的語音信號,要去掉迴音也是不可能的(就算是最早進的盲信號分離技術也作不到)。可是,實際上,除了這個混合信號,咱們是能夠獲得產生迴音的原始信號的,雖然不一樣於迴音信號。
咱們看下面的AEC聲學回聲消除框圖(本圖片轉載)。
Figure Acoustic Echo Cancellation in a voice communication terminal
其中,咱們能夠獲得兩個信號:一個是藍色和紅色混合的信號1,也就是實際須要發送的speech和實際不須要的echo混合而成的語音流;另外一個就是虛線的信號2,也就是原始的引發迴音的語音。那你們會說,哦,原來回聲消除這麼簡單,直接從混合信號1裏面把把這個虛線的2減掉不就好了?請注意,拿到的這個虛線信號2和迴音echo是有差別的,直接相減會使語音面目全非。咱們把混合信號1叫作近端信號ne,虛線信號2叫作遠端參考信號fe,若是沒有fe這個信號,回聲消除就是不可能完成的任務,就像"巧婦難爲無米之炊"。
雖然參考信號fe和echo不徹底同樣,存在差別,可是兩者是高度相關的,這也是echo稱之爲迴音的緣由。至少,迴音的語義和參考信號是同樣的,也還聽得懂,可是若是你說一句,立刻又聽到本身的話回來一句,那是比較難受的。既然fe和echo高度相關,echo又是fe引發的,咱們能夠把echo表示爲fe的數學函數:echo=F(fe)。函數F被稱之爲迴音路徑。在聲學回聲消除裏面,函數F表示聲音在牆壁,天花板等表面屢次反射的物理過程;在線路回聲消除裏面,函數F表示電子線路的二四線匹配耦合過程。很顯然,咱們下面要作的工做就是求解函數F。獲得函數F就能夠從fe計算獲得echo,而後從混合信號1裏面減掉echo就實現了回聲消除。
儘管回聲消除是很是複雜的技術,但咱們能夠簡單的描述這種處理方法:
一、房間A的音頻會議系統接收到房間B中的聲音
二、聲音被採樣,這一採樣被稱爲回聲消除參考
三、隨後聲音被送到房間A的音箱和聲學回聲消除器中
四、房間B的聲音和房間A的聲音一塊兒被房間A的話筒拾取
五、聲音被送到聲學回聲消除器中,與原始的採樣進行比較,移除房間B的聲音
求解迴音路徑函數F的過程恐怕就是比較難以表達的數學公式了。鑑於通俗表達數學公式的難度比發現數學公式還難,筆者就不費力解釋了。下面這段表達了利用自適應濾波器原理求解函數F的過程。(如下能夠跳過)
自適應濾波器
自適應濾波器是以輸入和輸出信號的統計特性的估計爲依據,採起特定算法自動地調整濾波器係數,使其達到最佳濾波特性的一種算法或裝置。自適應濾波器能夠是連續域的或是離散域的。離散域自適應濾波器由一組抽頭延遲線、可變加權係數和自動調整係數的機構組成。附圖表示一個離散域自適應濾波器用於模擬未知離散系統的信號流圖。自適應濾波器對輸入信號序列x(n)的每個樣值,按特定的算法,更新、調整加權係數,使輸出信號序列y(n)與指望輸出信號序列d(n)相比較的均方偏差爲最小,即輸出信號序列y(n)逼近指望信號序列d(n)。
以最小均方偏差爲準則設計的自適應濾波器的係數能夠由維納-霍甫夫方程解得。
B.維德羅提出的一種方法,能實時求解自適應濾波器係數,其結果接近維納-霍甫夫方程近似解。這種算法稱爲最小均方算法或簡稱 LMS法。這一算法利用最陡降低法,由均方偏差的梯度估計從現時刻濾波器係數向量迭代計算下一個時刻的係數向量
式中ks爲一負數,它的取值決定算法的收斂性, V【ε2(n)】爲均方偏差梯度估計,
自適應濾波器應用於通訊領域的自動均衡、回聲消除、天線陣波束造成,以及其餘有關領域信號處理的參數識別、噪聲消除、譜估計等方面。對於不一樣的應用,只是所加輸入信號和指望信號不一樣,基本原理則是相同的。(以上部分能夠跳過)
上面這段話代表,須要求解的迴音路徑函數F就是一個自適應濾波器W(n)收斂的過程。所加輸入信號x(n)是fe,指望信號是echo,自適應濾波器收斂後的W(n)就是迴音路徑函數F。 收斂以後,當實際迴音發生,咱們把fe經過函數W(n),就能夠獲得一個很準確的echo,把混合信號直接減去echo,獲得實際須要發送的語音speech,完成回聲消除任務。
值得注意的兩點:
一、 自適應濾波器收斂階段,指望信號是徹底的echo,不能混雜有speech。由於speech和fe是沒有關係的,會擾亂W(n)的收斂過程。也就是說要求回聲消除算法開始運轉後收斂要很是快,最好對方還來不及說話,你一說就收斂好了;收斂好以後,若是對方開始說話,也就是有speech混合過來,這個W(n)係數就不要變化了,須要穩定下來。
二、 迴音路徑多是變化的,一旦出現變化,回聲消除算法要能判斷出來,由於自適應濾波器學習要從新開始,也就是W(n)須要一個新的收斂過程,以逼近新的迴音路徑函數F。
基本上來講,上面這兩點是兩難的,一個須要自適應濾波器收斂後保持係數穩定,以保證不受speech說話干擾,另外一個須要自適應濾波器隨時保持更新狀態,以保證可以追蹤變化的迴音路徑。這樣一來,僅從數學算法層面,回聲消除已是難上加難!簡單地說,回聲消除自適應濾波器的設計具備兩個互相矛盾的特性,也就是快速收斂和高度的穩定性,如何同時實現這兩項特性,正是設計上的主要挑戰。
通過上面的分析,相信你們對回聲消除的原理和技術有了深入的理解,這是一門即容易理解又難以實現的技術。
從應用平臺來看,根據筆者多年的經驗,能夠把回聲消除分爲兩大類:基於DSP等實時平臺的回聲消除技術和基於Windows等非實時平臺的回聲消除技術。二者的技術難度和重點是不同的。
3、基於DSP平臺的回聲消除技術
回聲消除技術傳統的應用領域是各類嵌入式設備,包括各類電信網絡設備和終端設備。網絡設備好比交換機,網關等等,終端則包括移動電話終端,視頻會議終端等。現代通信產品裏面大量應用了回聲消除技術,包括在咱們看獲得的終端產品(好比手機)和看不到的局端產品(好比交換機)。這種嵌入式設備的共同點就是採用各類型號的DSP芯片做爲回聲消除的載體。一個有效的回聲消除算法須要持續的在一顆DSP芯片上面運行,會遇到如下方面的難點:
實時性與高效性,由於DSP芯片資源有限。雖然自從二十世紀七十年代DSP應用以來,突飛猛進的硬件芯片技術使許多沉睡在教科書上的信號處理理論算法大規模應用,可是回聲消除算法須要的資源仍是大得驚人。以視頻會議系統,大規模的會議室能夠產生超過512ms的迴音,要消除這麼長延時的迴音,即便按照8k赫茲採樣率計算,自適應濾波器W(n)的長度都會達到4096個點,這樣一方面須要很是大的存儲空間來存儲W(n),另外一方面,W(n)的更新須要的計算量也是成倍增加,同時,W(n)的收斂難度也在加大,傳統自適應濾波器的效率很難保證。對於電信設備中的應用,雖然回聲消除不須要這麼長的延時,可是在交換機等設備中,成本和效率就是生命,全部的處理算法都是按路或按線計算的,對算法的優化效率提出了無止境的要求。相對而言,只有像車載免提這種應用對效率要求不那麼高,由於車內空間小,迴音延時有限,又不要求多路應用。
傳統的回聲消除技術是從國外二十世紀七十年代的早期算法發展而來,這類技術的採用一直至關昂貴,提供電信級回聲消除硬件應用(包括芯片或者設備)的廠家都是國外的。對於移動網絡用戶來講,語音品質一直是他們最關切的議題,對電信業者來講,語音也還是他們最能獲利的服務項目,所以語音的品質是不容妥協的。爲了知足今日與將來的網路需求,回聲消除技術的挑戰正在於如何有效地下降成本並持續改善語音品質。
算法級的DSP軟件解決方案,也是解決嵌入式設備迴音問題的一種途徑,對用戶也有必定的靈活性,用戶只須要把回聲消除模塊集成到本身的DSP軟件中,再簡單調整幾個相關參數,就能達到較好的回聲消除效果。
目前基於DSP的回聲消除算法已經比較成熟,市場上也有一批專門的算法/芯片公司的可以對外提供已經優化好的基於DSP的軟件回聲消除模塊:如俄羅斯Spririt DSP、加拿大Octastic Semiconductor、瑞典GIPS、國內科萊特斯科技Conatus Technologies以及美國Adaptive Digital、和GAO Research、英國CSR等等,另外還有美國Fortemedia、Acoustic Technologies和日本OKI等能夠提供專用的回聲消除DSP芯片。其中性能較好的有Octastic、Conatus、和Spririt這三家,Octastic能夠提供完整的從專用芯片、板卡到DSP算法的完整方案,而Conatus和Spririt的回聲消除效果更好,值得一提的是Conatus公司是目前市面上惟一提供針對專業視訊會議應用寬帶回聲消除模塊的公司,其音頻採樣率能夠達到48k赫茲。
4、基於Windows平臺的回聲消除技術
回聲消除技術最新的應用領域是基於Windows平臺的各類VoIP應用,好比軟件視頻會議,VoIP軟件電話等。當回聲消除算法應用到Windows平臺,相對於傳統的DSP平臺,既帶來優點,也帶來了新的難點。高效性在Windows平臺已經不是問題,如今的pc機,擁有豐富的cpu資源和海量的內存資源,再複雜的回聲消除算法均可以運行自如。可是,新增長的麻煩比帶來的好處要多。
首先,Windows平臺是一個非實時的平臺,音頻的採集和播放對回聲消除算法而言,也是非實時的。和DSP平臺不同,DSP平臺能夠直接控制AD/DA芯片的採集播放,得到實時的音頻流(不存在同步問題),可是Windows平臺下,應用程序很難在底層直接控制聲卡的採集播放,得到的是非實時的音頻流,從而帶來了採集和播放音頻流的同步問題。
實際應用時,傳給回聲消除算法的兩個聲音信號(採集的迴音信號ne和播放的參考信號fe),必須同步得很是的好。就是說,本地接收到遠端說的話之後,要把這些話音數據傳給回聲消除算法作參考,這是一個算法須要的輸入信號;而後再傳給聲卡,聲卡放出來後通過迴音路徑,這時,本地再採集,而後傳給回聲消除算法,這是算法須要的另外一個輸入信號。這裏的同步是指:兩個信號雖然存在延時,但這個延時必須固定,在時序上要保持連貫,不能一個信號多來幾個幀,另一個信號少來幾個幀。若是傳給回聲消除算法的兩個信號同步得很差,即兩個信號發生幀錯位,就沒有辦法進行消除了。由於這時系統會變成了非因果系統,好比指望信號收到了,參考信號還沒來,時間上都沒有因果關係,確定是沒有辦法消除的。
實際狀況是,在通常的VoIP軟件中,接收對方的聲音並傳到聲卡中播放是在一個線程中進行的,而採集本地的聲音並傳送到對方又是在另外一個線程中進行的,而聲學回聲消除算法在對採集到的聲音進行回聲消除的同時,還須要播放線程中的數據做爲參考,而要同步這兩個線程中的數據是很是重要的,由於稍稍有些不一樣步,聲學回聲消除算法中的自適應濾波器就會發散,不但消除不了迴音,還會破壞原始採集到的聲音,使聲音難以分辨。
另外,pc機器的聲卡種類繁多,各類各樣的聲卡特性進一步加重了同步問題的複雜性。因此,同步和聲卡等問題對回聲消除算法的內部特性提出了更多苛刻的要求。
從上面分析來看,因爲Windows平臺的非實時性,基於Windows平臺的回聲消除技術比DSP平臺要可貴多。
在PC平臺語音通信領域,目前公認音質作得比較好的國外軟件是Skype,記得幾年前Skype一直是在用瑞典一家叫GIPS(Global IP Sound)公司的語音引擎技術。GIPS是最先介入PC平臺語音通信領域的廠商之一,在改領域具備必定的權威性,其主要優點表如今對IP網絡的延時、抖動和丟包等處理較好,基於Windows平臺的迴音消除也作得不錯,不過最近的新版本Skype上已經看不到GIPS的標誌了,聽說是由於Skype本身研發了一套新的更好的語音引擎的緣故。 目前你們接觸最多的採用了GIPS語音引擎技術的通信軟件就是騰訊QQ了,其超級語音的效果廣泛評價都還不錯。另外微軟通過多年的研發,其最新版本的MSN語音特別是迴音消除效果終於有了質的提高,目前網上評價也還不錯。另外還有一些專業廠商也對外提供包含迴音消除功能的語音引擎,如俄羅斯的Spirit DSP、美國的GH Innovation和國內的科萊特斯科技(Conatus Technologies)以及賽聲科技(Soft Acoustic)等等。除此以外,網絡上還能夠下載到一個很好的開源的語音軟件Speex也提供了迴音消除功能。爲了進一步瞭解目前PC Windows平臺迴音消除技術的業界水平,筆者對各家的迴音消除技術作一個詳細的橫向對比測試(全部測試都是免提狀態)
爲了對比,各家語音引擎的版本信息列舉以下:
國外廠商:
Skype V3.8.4.182
Spirit DSP(廠家DEMO)
GIPS(QQ 2009beta)
Micorsoft (Windows Live Messenger 2009 V14.0.8064.2006)
GH Innovation(廠家DEMO)
國內廠商:
Conatus Technologies(廠家DEMO)
Soft Acoustic(廠家DEMO)
開源算法:
Speex(V1.2RC1 本身寫了測試軟件)
測試結果:
測試項目
|
Skype |
MSN |
Conatus |
Spirit |
Speex |
SoftAcoustic |
GH I |
|
筆記本免提模式,外接麥克風和音箱應用模式的適應性 |
兩種模式都無迴音 |
筆記本免提模式有時一直有較小回音 |
筆記本免提模式偶爾有較小回音 |
兩種模式都無迴音 |
筆記本免提模式有時一直有較小回音 |
兩種模式都有一直較小回音 |
兩種模式有時都會出現較大回音 |
筆記本免提模式一直有很小回音 |
單方講話效果 |
無迴音,效果很好 |
基本無迴音,效果好 |
基本無迴音,效果好 |
無迴音,效果很好 |
基本無迴音,效果好 |
一直有較小回音,效果差 |
有時有很大回音,效果差 |
基本無迴音,效果好 |
雙方同時講話效果 |
雙方交流流暢無迴音,對方聲音偶爾有輕微斷續 |
雙方交流流暢,但對方聲音中會夾雜着輕微迴音 |
雙方交流流暢,但對方聲音中會夾雜着一些迴音 |
雙方交流流暢無迴音,對方聲音偶爾有輕微斷續 |
雙方交流流暢,但對方聲音中間會夾雜着一些迴音 |
雙方交流比較流暢,但一直聽到一個較小的迴音 |
雙方交流不流暢,對方聲音常常會斷續 |
雙方交流無迴音,但對方聲音很小很難聽清楚 |
麥克風和揚聲器相對的位置改變等 |
收斂比較快,基本沒有迴音出現。 |
收斂比較快,基本沒有迴音出現。 |
收斂比較快,基本沒有迴音出現。 |
收斂比較快,基本沒有迴音出現。 |
收斂比較快,基本沒有迴音出現。 |
收斂速度慢,有好幾句迴音 |
收斂速度慢,有好幾句迴音 |
收斂比較快,基本沒有迴音出現。 |
CPU重載(CPU負載達到100%)時效果 |
XP和Vista下聲音都流暢,基本不會出現迴音和聲音斷續現象 |
XP和Vista下聲音都流暢,基本不會出現迴音和聲音斷續現象 |
XP下聲音流暢,基本不會出現迴音;Vista下聲音斷續,偶爾會出現迴音 |
XP和Vista下聲音都流暢,基本不會出現迴音和聲音斷續現象 |
XP下聲音流暢,基本不會出現迴音;Vista下聲音斷續,偶爾會出現迴音 |
此項未測 |
XP下聲音流暢,基本不會出現迴音;Vista下聲音斷續,偶爾會出現迴音 |
XP下聲音流暢,基本不會出現迴音;Vista下不加負載聲音都是斷續的 |
PC和聲卡適應性 |
穩定,基本都能消除迴音 |
穩定,基本都能消除迴音 |
比較穩定,偶爾有些筆記本免提時有迴音 |
穩定,基本都能消除迴音 |
穩定,基本都能消除迴音 |
不穩定,有時沒法消除迴音 |
不穩定,常常沒法消除迴音 |
穩定,基本都能消除迴音 |
噪聲抑制
|
噪聲抑制效果弱 |
噪聲抑制效果通常 |
噪聲抑制效果弱 |
噪聲抑制效果強 |
噪聲抑制效果通常 |
噪聲抑制效果強 |
噪聲抑制效果強 |
噪聲抑制效果強 |
自動硬件增益控制和免提時能達到的最大播放音量 |
支持,音量較大 |
支持,音量較小 |
支持,音量適中 |
支持,音量適中 |
支持,音量較小 |
不支持 |
支持,音量較小 |
支持,音量很是小 |
總體效果評價(0-10分評分) |
很好,基本沒有迴音,雙方交流很順暢,9分 |
較好,有的筆記本免提時偶爾有迴音且音量較小,雙方交流比較順暢,7.5分 |
較好,有的筆記本免提時偶爾有迴音,雙方交流順暢,8分 |
很好,基本沒有迴音,音量比skype略小,雙方交流很順暢,8.5分 |
較好,有的筆記本免提效果稍差且音量比較小,vista效果稍差,7分 |
很差,一直有個較小的殘餘迴音,雙方交流困難,3分 |
很差,常常有完整的迴音,感受不穩定,雙方交流比較困難,5分 |
通常,沒有迴音,可是音量過小,雙方交流困難,且VISTA下聲音斷續,5.5分 |
測試項目
|
Skype |
MSN |
Conatus |
Spirit |
Speex |
SoftAcoustic |
GH I |
能夠看出,Skype、 Conatus和 QQ(GIPS)的效果最好, MSN和Spirit的效果還不錯,而GH Innovation、Soft Acoustic效果通常,Speex的效果較差。
有些聲學回音消除算法在作完迴音消除後,還會殘餘一部分迴音沒有完全消除乾淨,這時候就須要再使用殘餘迴音消除算法過濾掉。
線路迴音是因爲物理電子線路的二四線匹配耦合引發的。
因爲2-4線轉換引入的線路迴音:
在ADSL Modem和交換機上都存在2-4線轉換的電路,因爲電路存在不匹配的問題,會有一部分的信號被反饋回來,造成了迴音。若是在交換機側不加回音抵消功能,打電話的人就會本身聽到本身的聲音。
噪聲抑制又稱爲降噪,是根據音頻數據的特色,將屬於環境背景噪音的部分識別出來,並從音頻數據幀中過濾掉。
噪音抑制算法通常有兩種,一種叫單麥克風噪音抑制,簡稱單麥降噪,另外一種叫雙麥克風噪音抑制,簡稱雙麥降噪。
單麥克風噪音抑制算法的原理就是:將單個麥克風採樣到的信號進行分析,根據一些預約義的環境背景噪音特徵,對信號的內容進行匹配,而後將匹配成功的內容過濾掉。
雙麥克風噪音抑制算法的原理就是:一個麥克風爲普通的用戶通話時使用的麥克風,用於採樣語音信號,而另外一個配置在機身頂端的麥克風,用於採樣環境背景噪音信號,而後根據採樣到的環境背景噪音信號,將語音信號中採樣到的環境背景噪音過濾掉。這種算法通常只能在聽筒模式下使用,不能在免提模式下使用,由於免提模式下兩個麥克風採樣到的信號都包含語音。
噪音抑制效果演示:
噪音抑制前:
噪音抑制後:
混響音產生的過程:當語音信號在封閉的房間內傳播時,因爲房間牆壁、室內物體的反射、吸取,語音信號會經過多種路徑傳達到麥克風,這時麥克風接收到的語音信號按時間前後順序可分爲三部分:直達音、早期反射音(只通過一兩次的反射,能量較大、時延較短的反射音)、混響音(通過屢次反射之後到達的數目衆多、能量較小、時延較長的反射音羣)。
早期反射音是指未達到穩定狀態時的反射音,也就是在直達音以後混響音開始衰減以前的這段時間差內的反射音。直達音之後50ms之內到達的早期反射音有增強直達音和提升清晰度的做用,能夠被接受做爲直達音的一部分。
混響音是指早期反射音以後到達的反射音羣。它會引發語音幅值的變化、相位的延時、共振峯的偏移以及產生其它的譜峯、拖尾,還會形成語言音節的相互掩蔽,從而下降了語音清晰度和可懂度。
通常在封閉的房間內使用免提打電話時,若是麥克風與聲源之間的距離較遠,混響音就會比較強,此時就須要作混響音消除,若是不在這種狀況下打電話時就不須要作混響音消除了。
在語音對話中,要是當一方沒有說話時,就不會產生流量就行了。語音活動檢測就是用於這個目的的。語音活動檢測一般也集成在編碼模塊中。語音活動檢測算法結合前面的噪聲抑制算法,能夠識別出當前是否有語音活動,若是沒有語音活動,就能夠編碼輸出一個特殊的的編碼幀(好比長度爲0)。
特別是在多人視頻會議中,一般只有一我的在發言,這種狀況下,利用語音活動檢測技術而節省帶寬仍是很是可觀的。
自動增益控制是指,當較弱信號輸入時,能夠將其放大到指定幅度,當較強信號輸入時,能夠將其下降到到指定幅度。
因爲不一樣設備的麥克風靈敏度不同,致使採樣到的信號幅度就會有偏大或者偏小的狀況,最終播放時就會有些人聲音大、有些人聲音小,這種狀況下經過使用自動增益控制算法,將全部人的音頻信號都控制在同一級別的幅度上,這樣播放時的聲音都是同樣大了。
不連續傳輸是指,在網絡傳輸編碼後的音頻數據幀時,若是編碼器發現某一些音頻數據幀沒有任何信息,編碼器就會返回一個特殊值來告訴程序,程序就經過這個特殊值來判斷能夠不發送哪些編碼後的音頻數據幀,而後接收方就會誤覺得這些數據包都丟失了,那麼接收方就會使用數據包丟失隱藏算法來猜想這些音頻數據幀,因爲發送方肯定這些音頻數據幀沒有任何信息,因此猜想出來的音頻數據幀也就會沒有任何信息,這樣就節省了網絡流量。
因爲網絡環境可能不穩定,形成網絡延遲一會大一會小,俗稱網絡抖動。在網絡抖動狀況下,經過網絡傳輸音頻數據幀時,即便發送方是定時發送音頻數據幀的(好比每20ms發送一個包),接收方也沒法定時收到,可能一段時間內一個包都收不到,也可能一段時間內收到好幾個包,最終致使接收方播放時聲音出現一卡一卡的。所以,就須要使用自適應抖動緩衝區先將接收到的音頻數據幀緩衝起來,當緩衝到必定數量後,才從最老的幀一個一個依次開始取出,這樣接收方聽到的聲音就是連續的了。
自適應抖動緩衝區的緩衝深度不是一直不變的,它取決於網絡抖動的程度,當網絡抖動增大時,緩衝深度就會增大,音頻播放的延遲也就越大,當網絡抖動減少時,緩衝深度就會減少,音頻播放的延遲也就越小。因此,自適應抖動緩衝區就是利用了較高的延遲來換取聲音的流暢播放,由於相比聲音一卡一卡的來講,較高的延遲和流暢的聲音,其主觀感覺要更好。
自適應抖動緩衝區還能夠將亂序到達的數據從新排序
數據包丟失隱藏是指,在網絡傳輸編碼後的音頻數據幀時,若是某一個編碼後的音頻數據幀丟失了,那麼接收方能夠根據曾經接收到全部音頻數據幀猜想出已丟失的解碼後的音頻數據幀。
例如,某一個Speex格式音頻數據幀丟失了,那麼接收方就能夠直接用Speex解碼器猜想出這個已丟失的PCM格式音頻數據幀。
前向糾錯是指,在網絡傳輸編碼後的音頻數據幀時,若是某一個編碼後的音頻數據幀丟失了,但其後一個編碼後的音頻數據幀接收到了,那麼接收方能夠根據後一個編碼後的音頻數據幀恢復出其前一個解碼後的音頻數據幀。
例如,某一個Opus格式音頻數據幀丟失了,但其後一個Opus格式音頻數據幀接收到了,那麼接收方就能夠用Opus解碼器,根據後一個Opus格式音頻數據幀恢復出其前一個PCM格式音頻數據幀。
在多人語音聊天時,咱們須要同時播放來自於多我的的語音數據,而聲卡播放的緩衝區只有一個,因此,須要將多路語音混合成一路,這就是混音算法要作的事情。即便,你能夠想辦法繞開混音而讓多路聲音同時播放,那麼對於迴音消除的目的而言,也必需混音成一路播放,不然,迴音消除最多就只能消除多路聲音中的某一路。
混音能夠在客戶端進行,也能夠在服務端進行(可節省下行的帶寬)。若是使用了P2P通道,那麼混音就只能在客戶端進行了。若是是在客戶端混音,一般,混音是播放以前的最後一個環節。
實例:
實話實說,這個混音算法是我從網上找到的,不過效果仍是挺不錯的,公式就是
C = A + B - (A * B >> 0x10)
A和B就是兩路不一樣的音頻數據,C就是混音後的音頻數據,固然,處理後,還須要對C進行防止數據溢出的處理,不然,可能會有破音。
若是是16bit音頻數據,就是:
if (C > 32767) C = 32767;
else if (C < -32768) C = -32768;
若是是float音頻數據,就是:
if (C > 1) C = 1;
else if (C < -1) C = -1;
這個算法針對的是16bit的音頻採樣數據,我實驗的結果是:對float音頻採樣數據,一樣有不錯的效果。
重採樣是指將已採樣的音頻數據進行從新採樣,從而改變它的採樣頻率。
例如,已有一段8000Hz採樣頻率的音頻數據,可是聲卡最低支持播放16000Hz採樣頻率的音頻數據,那麼就要用重採樣算法將這段音頻數據重採樣成16000Hz。
自動語音識別,簡稱語音識別,就是將人類語音中的語句內容轉換爲計算機可顯示的字符信息。
例如,有人說"撥打電話給114",計算機就會根據這段聲波識別出這句的內容是"撥打電話給114",而後若是有軟件設定好了"撥打電話給"這樣的內容就是調用打電話接口,那麼計算機就會撥號114。
語音合成,也稱文語轉換,就是將計算機可顯示的字符信息轉變爲能夠人類聽得懂的語音。
例如,計算機中有一段字符"你好,我是人工智能機器人。",計算機就能夠將這句換轉換爲語音信號播放出來給人類聽,而且人類還能夠聽懂。
多速率是指容許編解碼器能夠在任什麼時候候動態改變比特率。
嵌入式是指編解碼器會將窄帶比特流嵌入到寬帶比特流中。
模數轉換器、Analog to Digital Converter、ADC
數模轉換器、Digital to Analog Converter、DAC
數字信號處理、Digital Signal Processing、DSP
數字信號處理器、Digital Signal Processor、DSP
聲學回音消除、Acoustic Echo Cancellation、AEC
聲學回音消除器、Acoustic Echo Canceller、AEC
殘餘迴音消除、Residual Echo Cancellation、REC
殘餘迴音消除器、Residual Echo Canceller、REC
噪音抑制、降噪、Denoise、Noise Suppression、NS
混響消除、Dereverberation、De-Reverberation、Dereverb、DR
自適應抖動緩衝區、Adaptive Jitter Buffer、AJB
自適應抖動緩衝器、Adaptive Jitter Buffer、AJB
Speex專用自適應抖動緩衝器、Speex Adaptive Jitter Buffer、SpeexAJB
預處理、Preprocess
預處理器、Preprocessor
數據包丟失隱藏、Packet Loss Concealment、PLC
非連續傳輸、Discontinuous transmission、DTX
強化立體聲編碼、Intensity Stereo Encoding、ISE
固定比特率、Constant Bit Rate、CBR
可變比特率、Variable Bit Rate、VBR
平均比特率、Average Bit Rate、ABR
非連續傳輸、Discontinuous transmission、DTX
定點執行、Fixed-point implementation
浮點執行、Floating-point implementation
自動增益控制、Automatic Gain Control、AGC
語音活動檢測、Voice Activity Detection、VAD
多速率、multi-rate
嵌入式、Embedded
重採樣、Resample
公式:20log10(abs(pcm)/pow(2, bitdeep-1)
pcm: 一個採樣單元數據,-32768≤pcm≤32767
bitdeep: 位數
一款跨平臺、免費開源的錄音、編輯聲音編輯器。Audacity讓你輕鬆編輯音樂文件無負擔,提供了理想的音樂文件功能自帶的聲音效果包括回聲,更改節拍,減小噪音,而內建的剪輯、複製、混音與特效功能,更可知足通常的編輯需求。
Adobe Audition是專業的音頻編輯工具,提供音頻混合、編輯、控制和效果處理功能。它支持128條音軌、多種音頻特效和多種音頻格式,能夠很方便地對音頻文件進行修改和合並。使用它,您可輕鬆建立音樂、製做廣播短片。該軟件支持簡體中文,請您在安裝過程當中注意選擇。
RecForge II是一款最華麗音質超棒功能強大的錄音機,第一代產品已經很好了,試試第二代吧,RecForge II是一個功能強大的錄音機(錄音機和編輯器)爲Android。它容許錄製,播放,編輯和共享的聲音,聲音,筆記,的音樂或任何其餘音頻媒體。