上一章提到了整個發聲與拾音及存儲的原理。但是在了解ASR的過程中,發現基本上遇到的資料都避不開MFCC特征。
整個ASR的處理流程大緻可以分為下圖:
左側是經典的處理流程,右側是近期流行的流程。發生的變化是,将語言模型以下的部分變成端到端的了。 我們将語言模型以下的部分統一看成是聲學模型就好。
而MFCC主要用在左側的處理流程中,即“特征處理”的輸出結果。 雖然可以看成,端到端的聲學模型出來後,我們已經不需要MFCC了,直接輸入音頻即可。 不過這并不意味着MFCC就沒用了。 在“根據發音确認發音人身份”等許多領域,MFCC還是個很短平快切粗暴有效的特征。 由于MFCC的重要性,和asr相關專業的人士交流時,最好是能提前具備此共識。
MFCC 細節介紹:
MFCC給人的感覺像是孟德爾遺傳定律。在人們還并不确定人耳是如何解析聲音的時候,假設了這是一個傅裡葉變換後的頻域處理過程。然後,最近的醫學研究成果表明,人耳也确實大緻是這麼工作的,對應的器官名字叫耳蝸,或蝸牛。
MFCC雖然名字就4個字母,但其實是內建了很多很多的思考和假設在裡面。 了解過之後,你就不會再後悔大學數學的卷積操作毛用都沒有了。 可謂是人類智慧的一大結晶。
一:整體流程
MFCC整體流程看其來好像有些複雜,但其實拆細了之後,會發現這個很符合常識的。
上圖便是MFCC的主要流程。這裡稍微提到一點,Cepstral 是 spectral的字母倒序,後者是頻譜的意思,前者是倒譜的意思,就是把頻譜倒回來。。。 這個定義确實有些冷。
圖中的DFT和IDFT便是堪稱深刻影響到了人類技術程序的經典技術——離散傅裡葉變換及離散傅裡葉逆變換。 這裡就當成是傅裡葉正逆變換就好。離散主要是因為處理的資料是離散的一個個數值,而不是坐标軸上那種可以無限往下細分的點。
整個處理流程從左上角開始看。 輸入是第一章講到的pcm檔案,可以了解成一個數組,數值的大小表示聲音的強弱。 至于頻率等資訊,是固定值,設定一下就好。
1、pre-emphasis
這個加強裡摻雜着各種各樣的“窗”or過濾器之類字眼的術語,其實原理挺簡單的,那些個“窗”主要是信号處理領域的術語,大意就是對部分頻率段的資料增強幅度。由于是已知的頻率操作,可以根據公式事前轉換為時域的操作(就是直接對pcm資料的操作)
2、滑動視窗
這裡要交代的一個背景資訊是,傅裡葉變換針對的是一個時間片段的值,或者說,是一個數組,而非一個數組中的某個值。是以在提取特征的時候,首先要假設基本的發音單元所占用的時間,然後把這個時間片段的資料拿過來,做傅裡葉變換。 但是怎麼知道某段聲音是從什麼時候開始的呢? ——就是不知道的,這裡采用滑動視窗就好了,差個1、2ms不影響分析的。
整個提取流程,起初是使用了滑動視窗,術語上管這個視窗叫frame。 一個frame的長度一般在20-25ms,然後視窗的移動步長在10ms左右。這也是上圖最左側所展示的内容。 這裡的假設是,聲音的最基本發音單元,至少需要20ms左右的發音時長。
得到關于frame的數組之後,接下來要為每個數組做一下離散傅裡葉變換。 示意過程如下圖:
這一步操作的依據或者說靈感主要來自上圖左上角,就是大家發現,提取了一個個frame後,做下DFT,然後把各個frame對應的DFT資料放到一塊(左上圖中,縱軸是頻域的橫坐标-評率,頻率,橫軸是時間,每個橫坐标上的點對應着一個frame,顔色的深淺代表對應頻率下的幅度。傅裡葉變化的本質就是拿一堆的正弦函數求和去拟合原始資料。這些sin cosin 函數,差別隻在于 周期和幅度)。 把這些DFT之後的frame放到一塊之後,就能明顯的發現:音節在頻域上确實有些區分度的。 左上圖的藍線表示那一段時間内,都是某個頻率下的幅度特别大,這個給了個術語,叫做——共振峰。左上圖的紅線用來區分音節的邊界。
有了靈感之後,滑動視窗+DFT(或者FFT 表示傅裡葉變化)之後,輸出就類似上圖右邊的效果—— 把一個關于frame的數組,轉換成了關于這個frame的傅裡葉變換後結果的數組。數組中,每個元素表示這個頻率值下的幅度。
3、梅爾濾波
工序2已經把資料變成了關于frameDFT之後的數組。既然已經都變成了頻域後的資料,接下來要做的,很直覺的——就是把人耳敏感的頻率下的資料加強,人耳不敏感的頻率下的資料減弱。充分的模拟人耳。
梅爾發現,人耳對各個頻域段的聲音的敏感程度不同,對高頻的敏感度較低,是以,梅爾就做了映射方法, 低頻區給與較多的區分度,高頻區給與較少的資料表示。是以,他的工作可以了解是定義了一個map或者說函數, 如上圖右上角。這函數的橫軸和前面的DFT結果的長度一一對應,然後對每個DFT的結果中的每個元素,乘以對應縱軸上的數值。輸出的結果如上圖右下角。說白了,就是每次拿右上角圖中的一部分乘以DFT之後的資料,得到一個值。 最終把DFT變成一系列Y的數組。
4、提取聲道資訊/倒譜
上圖左展示的是人的發聲過程——氣體從胸腔發出(基音),經過聲道和口腔的改造,最終形成聲音。 而氣體經過聲道改造的過程,恰恰就是數學中的卷積運算過程。 這裡特别像軟體開發中歸納的思想,卷積是一個抽象出來的操作。很多基信号+加工信号構成新信号的操作基本都适用。
前面講到,根據共振峰的位置,大緻就能區分出音節or音素出來。而共振峰主要是Filter or 聲道及口腔帶來的資訊。是以根據抓主幹的哲學指導,想讓特征更鮮明,需要提取Filter部分的資訊。
既然Filter與基音是卷積操作,那麼接下來就是一系列的數學推導騷操作,這裡面依據了一個公式,那就是:時域的卷積 = 頻域的乘積。 而乘積運算左右加log就變成了加法運算。然後就得到了如上圖右下角的效果。然後就發現,取了log後,再對信号做一下傅裡葉變換,就能得到右下圖中左側的效果,感覺在新的頻域裡把屬于基音的頻率去掉就好了。
這樣一下子就簡單了。就是取了log後再搞一次傅裡葉變換。 但這裡實際操作時,由于我們原來已經搞成 DFT結果的數組,針對這部分資料再搞一次傅裡葉變換,數學上等同于再做一次傅裡葉逆變換。。。 大繁至簡的感覺。。是以就看到了處理流程中的IDFT了(離散傅裡葉逆變換)。
5、提取變化資訊delta
delta資訊相對于上面的處理就好了解多了。 大家可以回一下導數是怎麼求的——後一時刻的值 減去 前一時刻的值 然後,除以時間間隔。 那麼到了離散領域, 一階導數就是一階delta。 他就是我們上面求的的數組中的每個元素(注意我們上面數組中的每個值其實已經是個向量了),按位和相鄰的最近的一個元素相減。
然後,二階導就是上面求得的一階導數,再做一次和最近的元素相減的操作。 然後把這兩部得到的結果加入進去就完事了。 很簡單
6、Finish
經過以上的幾部,MFCC最終輸出結果為: 一個數組,數組的每個元素是一個39維的向量。
以上便是本章的内容