語音識別有近場和遠場之分,且很多場景下都會用到麥克風陣列(micphone array)。所謂麥克風陣列是一組位於空間不同位置的麥克風按一定的形狀規則布置形成的陣列,是對空間傳播聲音信號進行空間采樣的一種裝置,采集到的信號包含了其空間位置信息。近場語音識別將聲波看成球面波,它考慮各麥克風接收信號間的幅度差;遠場語音識別將聲波看成平面波,它忽略各麥克風接收信號間的幅度差,近似認為各接收信號之間是簡單的時延關系。麥克風陣列可分為一維、二維和三維麥克風陣列。一維麥克風陣列,即線性麥克風陣列,各個麥克風位於同一條直線上,常見的為均勻線性陣列(Uniform Linear Array,ULA),如圖1所示(以陣列有四個麥克風為例)。均勻線性陣列是最簡單的陣列拓撲結構,其麥克風之間距離相等、相位及靈敏度一致。線性陣列只能得到信號的水平方向角信息。二維麥克風陣列,即平面麥克風陣列,各個麥克風分布在一個平面上。常見的為均勻圓陣,麥克風均勻的分布在圓周上,如圖1所示(以陣列有四個麥克風為例)。平面陣列可以得到信號的方位角和俯仰角信息。三維麥克風陣列,即立體麥克風陣列,其陣元中心分布在立體空間中,常見的為球陣。由於三維麥克風陣列在消費電子產品中應用相對較少,本文不討論。
圖 1
麥克風陣列涉及到的技術包括去混響、聲源定位、波速形成(beamforming)和單通道降噪等。混響是指聲音信號遇到牆壁、天花板、地面等障礙物形成反射聲,並和直達聲相疊加的現象。去混響就是去除那些疊加的聲音。聲源定位是利用多通道語音信號來計算目標說話人的角度和距離從而實現對目標說話人的跟蹤,嚴格的聲源定位是指同時確定說話人的角度(包括方位角、俯仰角)和距離。在消費級的麥克風陣列中,通常關心的是聲源到達的方向,也就是波達方向(Direction of Arrival,DOA)。波束形成是對信號進行空域濾波,將多個通道的語音數據變成一個波束(即一個通道)的目標聲源,目標聲源的信干噪比(SINR)得到提升。單通道降噪是抑制單個通道上的噪聲。各個模塊的關系如下框圖2所示(以四通道為例):
圖 2
從上圖可以看出,先對每個通道上的語音數據做去混響,同時用每個通道上的語音數據做聲源定位得到說話人的角度(方位角和俯仰角等),然后用去混響后的語音數據和算出的說話人的角度去做波束形成得到單通道的語音數據,最后對單通道的語音數據做降噪給后續模塊使用。我在“遠場關鍵詞識別”項目中主要負責單通道降噪。后來由於人手不夠,我又負責了波束形成的一種算法(有多種算法可以實現波束形成功能,不同的算法用在不同的應用場景中),即DSB(delay and sum beamforming)算法。本文就講講DSB的原理和實現。
波束形成對多通道語音信號進行合並處理,抑制非目標方向的干擾信號,增強目標方向的語音信號。它的輸入是麥克風陣列采集的多通道語音信號,它的輸出是增強后的單通道語音信號。示意如圖3。
圖 3
波束形成的算法一般可分為固定波束形成算法和自適應波束形成算法。固定波束形成算法典型的是DSB(Delay and Sum Beamforming),而自適應波束形成算法典型的是MVDR( (minimum variance distorionless response,最小方差無失真響應)。 DSB可以算是最簡單的波束形成算法了,它主要分兩步,一是各通道語音信號在時間上對齊,二是對各通道語音信號做加權求和,得到單通道語音信號。
先看各通道語音信號在時間上對齊。上文說遠場中近似認為各麥克風接收到的聲波之間是簡單的時延關系,即各麥克風接收到的同一聲波在時間上是有先后順序的,示意如圖4。
圖 4
時間對齊就是使各個麥克風接收的來自目標方向的語音能夠在時間上同步。該步需要事先知道到達時間差(TDOA, Time Difference Of Arrival),到達時間差可以根據聲源定位算法里求出的方位角和俯仰角以及其他的參數求得。 先看均勻線性陣列時間延時的計算。它通常以最先接收到語音信號的麥克風為參考點。如圖5所示,平面波被麥克風接收時與垂直於麥克風直線的方向的夾角為θ,顯然麥克風1最先接收到聲波,就以麥克風1為參考點,麥克風4最后接收到聲波。設麥克風之間的距離為d,所以聲波到麥克風2比麥克風1多走了l距離, l = dsinθ。又設光速為c,所以聲波到達麥克風2比麥克風1延遲了l/c = dsinθ/c 秒。由於是均勻線陣,每個麥克風之間均延時了l/c秒。
圖 5
再看均勻圓陣的時間延時的計算。圖6是均勻圓陣模型:
圖 6
在圖6中,信號源映射到XY平面上與X軸的夾角為方位角,表示為α,信號源與Z軸的夾角為俯仰角,表示為θ。各個麥克風均勻的分布在圓周上,以圓心O為參考點計算延時。圖7中M軸是信號源射入的方向映射到XY平面上,N軸與M軸垂直。
圖 7
可知圓周上的麥克風A與其垂直於M軸的A',聲波到達的時間一樣。A'與圓心O同在M軸上,算A'與O點的延時同均勻線陣。對同一信號源,在N軸右下方的早於圓心O到,在N軸左上方的晚於圓心O到。先求得OA'之間的距離d,延時τ就可以得到了(計算同均勻線陣一樣,τ = dsinθ/c, θ為信號源與Z軸的夾角,即俯仰角)。下面看d怎么求。在均勻圓陣上任何位置上計算d的方法都是一樣的,數學表達式也是一樣的。還是以上圖中的A點為例,如圖8。
圖 8
A點映射到M軸上是點A’,d即為OA’的距離。設共有N個麥克風,A點處為第n個,A處的麥克風的方位角為α(方位角為信號源映射到XY平面上與X軸的夾角),∠AOX = 2*pi*n/N (X軸的方向為角度0), 令β = ∠AOA’= ∠AOX – α= 2*pi*n/N – α。所以OA’= OA*cosβ = R*cos(2*pi*n/N– α),R表示圓陣的半徑。所以延時τ = OA’*sinθ = R*cos(2*pi*n/N – α)sinθ/c。τ > 0表示相對於圓心O信號提前到,τ < 0表示相對於圓心O信號延時到。
各個通道的延時得到了,信號在時間上就可對齊了。設Sn(t)表示第n個通道得到的聲音信號,那么S1(t + τ1)和S2(t + τ2)及Sn(t + τn)等表示做好時間對齊后的信號。信號對齊好后就可以做第二步,即加權求和,表達式如式1:
其中S(t)表示做完加權后的單通道數據,Sn(t + τn)表示各個通道時間對齊后的信號,γn表示權重,最簡單的可以令每個權重值均相同,即γn = 1/N。
原理講完了,是在時域下講的。下面看怎么做軟件實現,實現是在頻域下做的。用到傅里葉變換的性質:令S(t)的傅里葉變換為S(ω),則S(t + τ)的傅里葉變換為S(ω)ejωτ。時域單通道輸出的表達式是式1,對其做傅里葉變換,得到頻域單通道輸出的表達式式2:
其中ωk為一個具體的頻點。得到S(ωk)后再做反傅里葉變換,就是時域的值了。
因此DSB算法實現步驟如下:
1) 對時域的Sn(t)做傅里葉變換得到頻域值Sn(ωk)
2) 根據聲源定位算法得到的方位角和俯仰角以及其他等得到延時τn
3) 根據τn得到導向矢量(steering vector)ejωkτn
4) 根據式2得到S(ωk)
5) 做傅里葉反變換得到S(t)