遠場(far-field)語音識別的主流技術有哪些?

以amazon echo為首的一批智能硬體正在崛起,這些硬體實現語音識別功能時面臨的一個挑戰性的問題就是如何降低遠場麥克風造成的噪音(noise)、回聲(reverberation)和自回聲(echo),希望有大牛來介紹一下這個領域的主流應用技術和發展方向。


我的研究領域是麥克風陣列信號處理,從2013年開始做遠場語音識別的信號處理部分,目前也有了一些經驗,分享下我的看法,歡迎指正。

我認為遠場語音識別技術難點可以分為3個部分,第一個是多通道同步採集硬體研發,第二個是前端麥克風陣列降噪演算法,第三個是後端語音識別與前端信號處理演算法的匹配。

首先多通道同步採集硬體是研究前端降噪演算法的前提,只有先拿到一些麥克風陣列的數據,才能根據實際採集的數據進行演算法的研發和調優。目前市面上主流的codec晶元最多支持4通道同步採集,這對於麥克風陣列來說是不夠的,比如echo音響,採用了7個麥克風,再加上一個喇叭的參考信號,所以它至少需要8通道同步採集,即2個4通道的codec晶元。為了使兩個codec晶元同步,需要一顆FPGA晶元來協助完成,同時麥克風還需要一些配套的模擬濾波放大電路,中間有很多都是經驗性的東西,並且在echo以前,消費電子上很少有集成4個麥克風的情況,所以研究的人很少,這也增加了該硬體的研發難度。當然如果僅僅是為了研究可以直接購買一些多通道同步採集設備,節省硬體研發周期。

其次是麥克風陣列降噪演算法的研發。目前影響遠場語音識別的難點是播放狀態下打斷,房間混響和非平穩雜訊干擾等。播放狀態下打斷是指設備在播放音樂或tts的時候可以對它再次下達指令,這就需要回聲消除技術,將設備自身播放的聲音從麥克風接收到的信號除去,這個技術在手機上已經非常成熟了,比如上面@Kent Zhang提到的speex和webrtc的開源軟體中都有該演算法,但這兩個開源軟體為了達到更大的回聲抑制效果,使用了大量的非線性處理手段,因此如果直接用在遠場語音識別領域,效果並不好(我們已經做過測試)。在研究中我也發現,語音識別引擎對於語音信號的非線性處理非常敏感,簡單的說就是語音失真少一些即使背景雜訊有殘留,也不會影響語音識別率。房間混響會造成麥克風接收到的信號有很長的拖尾,讓人聽起來感覺發悶,在實際中人耳具有自動解混響的能力,所以人在實際房間中相互交流並沒有影響反而覺得聲音飽滿,但是這個對於語音識別來說是致命的,我覺得可能的原因是房間的衝擊響應太長,一般有400ms-1000ms,而語音識別一幀的長度只有50ms,即使DNN有記憶能力,但也有限,所以在混響中語音識別率下降。遠場語音識別以前,由於需求不大,對於去混響研究的不多,一般以倒譜平均、譜減法為主,但這類方法對遠場語音識別率提升不大,目前比較好的去混響演算法是日本NTT部門研究的多步線性預測方法,有興趣的可以嘗試一下。非平穩雜訊干擾主要是利用波束形成去除,在做波束形成之前需要先知道說話人的方向,這就需要測向功能,即波達方向估計,學術上的論文一般研究如何提高測向的精度和解析度,但這些指標在實際中意義不大,實際中更需要解決的是如何在混響的條件下提高波達方向估計的魯棒性。知道方向之後,就可以做波束形成,抑制周圍的非平穩雜訊,由於消費產品價格和尺寸的限制,麥克風的個數間距有限,因此必須用自適應波束形成演算法,簡單說就是保護主方向說話人的同時,自動在雜訊方向形成零點,對雜訊進行抑制。經過測試,波束形成演算法可以大幅提高語音識別率。

最後就是語音識別引擎要和前端降噪演算法進行匹配。目前的識別演算法還是訓練數據和測試數據越匹配效果越好。目前各家的語音識別引擎主要是利用手機上收集的語音進行訓練的,因此只適用於近講情況。同樣道理,為了提升遠場語音識別,就需要用遠場的語音數據訓練聲學模型,而遠場語音數據又太複雜(混響、雜訊),這就需要信號處理的手段讓數據盡量變的單一一些,最佳的方法就是利用麥克風陣列採集的信號經過前端降噪演算法後的數據去訓練語音識別引擎,效果應該會有大幅提升。

此外,目前遠場語音識別也分為兩派,一派認為利用深度學習的辦法也可以實現去混響降雜訊的目的,另外一派是用麥克風陣列信號處理的方法去除混響和雜訊,從目前的產品上看麥克風陣列信號處理的方式在實際中用的更多一些,echo用了7個麥克風,叮咚用了8個麥克風,google home也用了兩個麥克風。個人覺得在遠場語音識別這塊,麥克風陣列信號處理還是一定需要的,因為人有這麼聰明的大腦還長了兩個耳朵,而目前DNN和人腦差別又很大,所以更需要多個麥克風做輔助,相信隨著DNN的發展應該有一天可以只用兩個麥克風就可以徹底解決遠場語音識別問題,但這個時間估計還會很長。


我不是大牛!我不是大牛!我不是大牛!

作為一個信號處理稍微接觸過點的小白,我稍微來說兩句。

遠場麥克風是啥我不知道。

不過雜訊,回聲,自然回聲坑我多慘我還是有切身體會的。

稍微說一句,傳統國內IT人很有可能小看這些工業問題。至少我那邊澳洲阿大碩士亮蛋老大是小看了的。差點掛在安卓的回聲問題上。

這些信號處理技術,一直是核心技術。

就以我最熟悉的回聲問題為例

目前開源的軟體解決方案有兩個,Speex和webrtc,其中webrtc是谷歌搞的,據說花大錢收購了GIPS的技術用在這裡面,不過似乎開源版本還不夠好,回聲消除不夠完善。

speex整個就不好使,似乎其中的dsp重採樣器都不行。

於是當時我做項目的時候就去聯繫了下回聲消除群裡面那些真大神,其中第一家似乎很牛逼,他們的意思是,先別問回聲消除技術要多少錢,先說說你們有多少錢 o(╯□╰)o

第二家還算實惠,做的demo我評測了下覺得不錯,幾十萬的價。

但是,咱公司根本沒錢,別tm說幾十萬了,幾萬餘錢都沒有,於是我改了下webrtc用進去,勉強擺平了部分安卓手機回聲的問題。

還有,回聲消除技術適配安卓手機是個大坑!webrtc就這問題難搞。

那麼再說說硬體方案,硬體方案相比軟體方案對小企業要便宜些,硬體直接賣晶元,幾塊錢到幾十塊錢不等,成本按出貨量看,這方面略出名的,我們用了的就是Fortmedia富迪科技的晶元。他家的特色似乎就是語音處理技術,其中雙麥克風進行固定空間位置音頻降噪似乎是獨有的,也就是就兩麥克風正對著的一定區域聲音可以進去,其他位置都能濾掉。

並且他家音頻處理晶元一系列的,從低端純模擬IO到高端數字IO都有。

但是不知道是不是做硬體的合作乙方沒怎麼使勁,回聲消除的效果還是不行。

現在市面上的各種產品,做音頻降噪,回聲消除的行業領先的,似乎就是skype。

YY語音在這方面也有加點。

PS一句,微信似乎是用webrtc改的,不信自己unzip wx.apk strings `find . | grep .so ` | grep aec


風雨兼程17載,中國人工智慧公司中的甲骨文——捷通華聲! http://www.aicloud.com/Public/img/readhover.png

人工智慧在廣闊的領域實現了技術突破,讓AI的表現形式(載體)上,完成了交互體驗升級換代,比如視覺領域裡的避障技術、圖像識別領域裡的人臉識別,還有語音領域中的語音交互。而語音交互主要涉及語音識別、語義理解、機器翻譯、語音合成和麥克風陣列。我們以麥克風陣列為例,看看它是如何被捷通華聲攻克?

http://oam.tianxing.com:8889/web/img/news/201704/21/20170421114715.jpg

神秘的麥克風陣列,是什麼樣一種技術?

麥克風陣列(Smart Microphone Array),從字面上,指的是麥克風的排列。也就是說由一定數目的聲學感測器(一般是麥克風)組成,用來對聲場的空間特性進行採樣並處理的系統。一般應用於語音處理的按一定規則排列的多個麥克風系統,也可以簡單理解為2個以上麥克風組成的錄音系統。

麥克風陣列一般來說有直線形、環線形和球狀之分,嚴謹的應該說成一字、十字、平面、螺旋、球形及無規則陣列等。至於麥克風陣列的陣元數量,也就是麥克風數量,可以從2個到上千個不等。

http://oam.tianxing.com:8889/web/img/news/201704/21/20170421114724.jpg

看捷通華聲如何攻克麥克風陣列的四大難點!

如此複雜的麥克風陣列主要應用於工業和國防領域,消費領域(例如機器人領域)考慮到成本會簡化很多,但也需要攻克四大技術難點:

01噪音抑制:太嘈雜了,聽不清!

語音識別在有些場合需要完全去除雜訊,通話系統中則需要的技術則是雜訊去除。這裡說的雜訊一般指環境雜訊,比如空調雜訊,這類雜訊通常不具有空間指向性,能量也不是特別大,不會掩蓋正常的語音,只是影響了語音的清晰度和可懂度。一般情況下,不怎麼做強雜訊環境下的處理,只需滿足日常場景的語音交互就夠了。

02聲源定位:聲音太多,在哪裡?

現實中,聲源的位置是不斷變化的,這對於麥克風收音來說,是個障礙。麥克風陣列則可以進行聲源定位,聲源定位技術是指使用麥克風陣列來計算目標說話人的角度和距離,從而實現對目標說話人的跟蹤以及後續的語音定向拾取,是人機交互、音視頻會議等領域非常重要的前處理技術。所以麥克風陣列技術不限制說話人的運動,不需要移動位置以改變其接收方向,具有靈活的波束控制、較高的空間解析度、高的信號增益與較強的抗干擾能力等特點,因而成為智能語音處理系統中捕捉說話人語音的重要手段。

03混響消除:享受混響,卻麻煩!

一般我們聽音樂時,希望有混響的效果,這是聽覺上的一種享受。合適的混響會使得聲音圓潤動聽、富有感染力。

混響(Reverberation)現象指的是聲波在室內傳播時,要被牆壁、天花板、地板等障礙物形成反射聲,並和直達聲形成疊加;而當聲源停止發聲後,聲波在房間內要經過多次反射和吸收,似乎若干個聲波混合持續一段時間。

混響會嚴重影響語音信號處理,比如互相關函數或者波束主瓣,降低測向精度。由於混響則會使得不同步的語音相互疊加,帶來了音素的交疊掩蔽效應(Phoneme Overlap Effect),從而嚴重影響語音識別效果。

http://oam.tianxing.com:8889/web/img/news/201704/21/20170421114734.jpg

混響去除的效果很大程度影響了語音識別的效果,因此利用麥克風陣列去混響的主要方法有以下幾種:

a.基於盲語音增強的方法(Blind signal enhancement approach),即將混響信號作為普通的加性雜訊信號,在這個上面應用語音增強演算法。

b.基於波束形成的方法(Beamforming based approach),通過將多麥克風對收集的信號進行加權相加,在目標信號的方向形成一個拾音波束,同時衰減來自其他方向的反射聲。

c.基於逆濾波的方法(An inverse filtering approach),通過麥克風陣列估計房間的房間衝擊響應(Room Impulse Response, RIR),設計重構濾波器來補償來消除混響。

良好的麥克風陣列的去混響技術能很好的對房間的混響情況進行自適應的估計,從而很好的進行純凈信號的還原,顯著的提升了語音聽感和識別效果,在測試對比中,多種混響時間下識別效果接近手機近講水平。

嚴格來說,這裡說的「回聲消除」不應該叫回聲,應該叫「自雜訊」。回聲是混響的延伸概念,這兩者的區別就是回聲的時延更長。一般來說,超過100毫秒時延的混響,人類能夠明顯區分出,似乎一個聲音同時出現了兩次,我們就叫做回聲,比如天壇著名的回聲壁。實際上,這裡所指的是語音交互設備自己發出的聲音,比如Echo音箱,當播放歌曲的時候若叫Alexa,這時候麥克風陣列實際上採集了正在播放的音樂和用戶所叫的Alexa聲音,顯然語音識別無法識別這兩類聲音。回聲消除就是要去掉其中的音樂信息而只保留用戶的人聲,之所以叫回聲消除,只是延續大家的習慣而已,其實是不恰當的。

04雲端識別:聲音很多,卻好用!

麥克風陣列增益,主要是解決拾音距離的問題,若信號較小,語音識別同樣不能保證,通過陣列處理可以適當加大語音信號的能量。

而波束形成是指將一定幾何結構排列的麥克風陣列的各麥克風輸出信號經過處理(例如加權、時延、求和等)形成空間指向性的方法。波束形成主要是抑制主瓣以外的聲音干擾,這裡也包括人聲,比如幾個人圍繞機器人談話的時候,機器人只會識別其中一個人的聲音;但對於機器人來說,能同時識別不同距離和不同方位的聲源,變得尤為重要——這也代表了人工智慧的語音交互領域趨於成熟!

對於語音交互中的模型匹配,主要是和語音識別以及語義理解進行匹配,使得語音交互成為一個完整的信號鏈,從麥克風陣列開始的語音流不可能割裂的存在,必然需要模型匹配在一起。實際上,效果較好的語音交互專用麥克風陣列,通常是兩套演算法,一套內嵌於硬體實時處理,另外一套服務於雲端匹配語音處理;而「本地+雲端」中,成立於世紀之交2000年的捷通華聲是一家專註於智能語音、智能圖像、生物特徵識別、語義理解等人工智慧技術的研究與應用,全面發展人工智慧雲服務的高新技術企業。

捷通華聲的靈雲平台在2014年面向人工智慧產業全面開放,並以「雲 + 端」方式,為產業界提供語音合成(TTS)、語音識別(ASR)、聲紋識別(VPR)、手寫識別(HWR)、光學字元識別(OCR)、指紋識別(FPR)、機器翻譯(MT)、自然語言理解(NLU)等全方位的人工智慧雲服務;服務於百度導航、搜狗導航、小米、樂視、京東商場、攜程網、去哪兒網、賓士、中國農業銀行、導航犬、嘀嘀打車、快的打車、漢字英雄、天行聽書、天行輸入法、觸寶輸入法等知名公司。


跟其他大牛聊過很多,可惜我不懂電聲,只能從門外略窺一二。

Echo 為了實現遠場語音識別,用了單獨的麥克風陣列模塊來拾取語音,陣列上有7顆麥克風,可以360度拾取語音。

國內其他語音識別公司也在推出自己的麥克風陣列模塊,4麥克風,8麥克風,但基本上都通過以下方法來實現遠場拾音:

1.Beamforming

2.DOA(聲源定位)

3.降噪

4.回聲抑制

5.De-Reverbration

6.(可能還有其他的,我不懂...)

然後將多路語音處理後合成一路,上傳伺服器或本地語音識別,再具體我就說不清楚了,畢竟不是搞這個的...

如果題主想做一個類似Echo的東西,可以買到現成的方案來做(避免廣告嫌疑我就不提是哪家的),至少已經是已經可以用錢解決的問題,很多服務機器人上都已經在用了。

另外手動@Kent Zhang,我聽說微信或者QQ回聲消除確實消不幹凈,主要是因為時鐘不同步的問題,大牛說麥克風陣列上消除回聲的辦法就是用ADC去採樣喇叭功放,跟麥克風采用同一個時鐘源,可以輕鬆解決採樣率和時鐘同步的問題,就消得很乾凈。


我們用單麥克風硬體, 可以做到4/6麥克風陣列的效果, 除了沒有聲源定位。

麥克風陣列目前階段還是demo, 成本巨高無比。單麥克的低成本、不差的體驗會是一個折中的解決方案。

補充:

學術派和工程派的思路很不一樣;

demo和產品也不一樣;

方案商給的和品牌商要的也不一樣;

Finally, 產品是不是消費者剛需?

我們就是一家非常接地氣兒的研發團隊, 耐心打磨語音產品, 不斷迭代給消費者提供 更好的體驗。 更重要的是, 我們一般不是很care媒體講的各種趨勢, 也不會盲從大公司去火拚, 是的我們有自己的產品定位和品牌思路。


也在搞這個方向,把目所能及的資料都刨了一遍,還是有挺多開源的項目可以拿過來用。

回聲消除 AEC

AEC演算法時域有LMS、NLMS、AP、APSA等,從左到右,收斂速度由慢到快, 但考慮到計算量,基本都用頻域的 AEC,比如 Speex 用的 MDF。

AEC常見於兩種場景:

  1. 語音通話中,儘可能的把回聲消除
  2. 語音交互中,保持語音不失真的條件下,消除回聲

WebRTC的AEC是針對場景1的,有非線性處理,回聲消得比較乾淨,但語音失真嚴重。Speex的AEC可以不用其非線性處理部分,用在場景2。

Speex 的AEC 見 xiph/speexdsp

有嘗試把 WebRTC 的 Audio Processing 部分和Speex的AEC部分封裝到python,見 python-webrtc-audio-processing 和 speexdsp-python

雜訊抑制 NS

WebRTC的NS還不錯

聲源定位 DOA

考慮到實時性,DOA通常用的是GCC-PHAT或SRP-PHAT。Github上有很多代碼,搜一下就可以找到。複雜環境(比如多個聲源)比較難判斷目標方向。或許要追蹤多個聲源,或許多個beamforming + 多個kws可以。

波束成型 Beamforming

最簡單是 delaysum,常見的有MVDR和GSC,這些都依賴準確DOA,而DOA又比較難估計準備,囧!

最近在看CGMM-MVDR-Beamforming,這個不需要DOA,希望可以用上。

Github 上有 CGMM-MVDR 的 Matlab 代碼實現,見 snsun/cgmm_mvdr

人聲檢測 VAD

WebRTC 的 VAD 在不太嘈雜的環境還可以,越來越多的是神經網路了,可以看看這篇介紹 VAD


從技術上來說基本上就是如下技術,統稱為前處理技術:

1.Beamforming
2.DOA(聲源定位)
3.降噪
4.回聲抑制
5.De-Reverbration

因為現在語言識別基本上都是基於大數據學習提示識別率, 而且目前產品大多數集中在家庭和汽車中, 這些場景普通的平穩雜訊基本上在訓練數據中加入這些雜訊訓練就可以,所以雜訊抑制基本上對識別率提升作用不會太大,其主要作用的是麥克風陣列進行空間指向性提升目標信號增益,並且同時也具備一定的去混響作用。 而回聲抑制主要是針對智能音箱或者智能電視場景,可以得到參考信號場景效果明顯。

如果前處理技術結合識別引擎一起,處理後的數據參與訓練,整體效果最佳。


主流技術目前知道但是還不夠系統,今年畢設是讓echo能準確定位講話人的信息,從而達到講話人說:echo把離我最近的燈打開。然後echo就會去做的效果。本科能拿到這個題目,我也是蠻激動的。一年時間,等做完了來答。


推薦閱讀:

從人工智慧技術的角度如何評價 Google home、Amazon Echo、Rokid 這三款產品?

TAG:人工智慧 | 語音識別 | 數字信號處理 | AmazonEcho |