胡 凡,李維華,伏思達,覃家鴻,李忠憓
(合肥工業大學,合肥 230001)
語音識別的發展最早開始于上世紀50年代的貝爾實驗室,Davis等科學家研究出可以識別出10個英文數字的實驗裝置。60年代的一系列數字信號處理方法推動了語音識別的發展,如FFT。同時,伴隨著計算機技術的發展,語音識別逐漸從硬件工作轉移到軟件工作,這時的語音識別發展很快,但人們很快就意識到語音識別的困難加深。此后,70年代日本學著提出的動態時間規整技術(DTW)解決不等長語音的對整匹配問題,以及80年代提出的隱馬爾可夫模型法(HMM),都是現階段語音識別的重要算法。
首先是對于語音信號的采集,本系統使用電容式咪頭采集音頻,但MIC的輸出電壓只有幾毫伏到十幾毫伏,所以需要加放大電路,可采用三極管或者運放放大。本系統采用三極管阻容耦合二級放大電路,需要注意的是咪頭需要一個工作電壓,所以直接將VCC接到咪頭的正極,然后第一級的耦合電容設置為10uf,這個對三極管基極充電時間有影響,它和集電極的電阻一同構成了RC充電電路,且10uf的電容會把音頻信號耦合到基極上,咪頭采集到的信號控制在3.3V以內。單片機是無法識別模擬電信號的,所以需要用到A/D采樣;人說話的語音信號大多數有效信號集中在100HZ-3400HZ,所以根據香農采樣定理,只要A/D采樣頻率大于等于6800HZ即可,這對于我們STM32F1系列單片機來說是完全可以實現的,接著考慮A/D精度,STM32F1ZET6擁有1~3個12 位逐次逼近型的模擬數字轉換器,對于Vref=3.3v來說其最小誤差為0.8mv,這是完全可以接受的,這就實現了語音模擬信號的采樣量化。
經過研究,人的發生器官也相當于一個時變線性系統,在8000Hz以上頻率時,會有大約6dB/倍頻的頻率衰減,所以為了平滑頻率,需要對信號進行高頻預加重,即運用一個6dB/倍頻的一階數字濾波器。
很容易理解語音信號具有短時性,但從另一方面看,語音的形成過程與發音器官的運動密切相關的,且發生器官的運動比起聲音振動速度來說是緩慢的,所以在一個短時間范圍內可以認為其變化很小,借此,我們對語音信號進行短時分析(分幀),一般語音信號在10ms-30ms之間保持穩定,我們去每幀長度為20ms,且為了使語音信號的連續性,每一幀之間混疊窗長的一半;窗函數的選擇大致有矩形窗、漢寧窗、哈明窗等,而窗函數的選擇要求一般包含兩點:一是盡量減少窗函數的旁瓣高度,使能量集中在主瓣。二是主瓣寬度盡量窄,以獲得較陡的過渡帶;介于以上條件,我們選擇哈明窗。由于幀與幀連接處的信號因為加窗而弱化,如果沒有幀移,這部分信息就丟失了。
當系統接收到一段完整的語音信號時,去除語音段前后的噪聲對于我們語音參數提取具有重要意義。經研究,當我們在發出語音時,清音和濁音會不斷的出現,發現濁音的短時能量明顯比環境噪聲高,清音的短時平均過零率與環境噪聲也有明顯的區別,所以利用這個特性,設定短時能量和短時平均過零率的門限值,當某一幀的短時能量或短時平均過零率大于門限值,則可認為進入有效語音段,設定為語音起點,當某一幀的短時能量和短時平均過零率都小于門限值時,認為這是語音末點。
在音頻信號的采集過程中,模擬信號通過 A/D 轉換后成為數字信號。數字信號為時域的信號,而一般信號分析的方法都是在頻域進行分析,所以需要通過傅里葉變換將時域信號轉變為頻域信號,然后提取其中能反映語音本質特征的參數來進行語音識別。進過幾十年的發展,語音特征提取算法大致有三類:
基于線性預測分析的提取方法(LPCC)、基于頻譜分析的提取方法(MFCC)、基于其他數字信號處理技術的特征分析方法,本系統采用基于頻譜分析的提取方法,Mel頻率倒譜頻系數MFCC。MFCC特征提取包含兩個關鍵步驟:一是轉化到梅爾頻率。二是進行倒譜分析。梅爾刻度和頻率的赫茲的關系如下:M=2595*log10(1+f/700),由公式可知道梅爾刻度和頻率之間是對數關系,低頻部分梅爾刻度的分辨率高,高頻部分梅爾刻度的分辨率低,這跟人耳的聽覺特性是相符的。所以對于有效語音段,進行離散傅里葉變化(DFT),將頻譜信號通過一組Mel尺度的三角形濾波器組,定義一個有M個濾波器的濾波器組,M通常取22-26。
各f(m)之間在赫茲軸上的間隔隨著m值的減小而縮小,隨著m值的增大而增寬,但在梅爾刻度卻是等距離。最后就是離散余弦變換,進行反傅里葉變換然后通過低通濾波器獲得最后的低頻信號,這樣能量會集中在低頻部分。每個三角濾波器會有一個輸出,通過以上計算實現了每幀數據從N(FFT點數)點到M點的降維,大大減小了計算量,減小了內存開銷、縮減了運算時間。
現階段,語音識別用到的模型匹配方法主要有動態時間規整(DTW)、隱馬爾可夫模型(HMM)和人工神經網絡。本系統用于孤立詞識別,相比較兩算法,HMM需要大量數據,復雜程度遠大于DTW,所以在孤立詞語音識別中,DTW 算法得到更廣泛的應用。筆者覺得,對于一個算法的理解,首先得從它的物理意義開始,在網上很多人的博客里都對這個算法有過通俗的解釋,并配以實例,在這我就不多加說明了。主要步驟為初始化矩陣,計算每個數據之間的“距離”,計算累計匹配距離,匹配距離最小的特征模板與輸入特征有最大的相似性。
這是在IDE平臺上模擬試驗的DTW算法:

首先,一段短時語音信號長度大約為2s以內,我們以8khz的ADC采用頻率去采樣得到的最大點數為16000,因為STM32F1為12位ADC,所以每個點的數據相當于兩個字節,總的算來需要16000*2=32000字節,對于擁有64KB RAM的STM32F103ZET6來說在內存上是可以實現的。ST官方固件庫提供的16位、1024點FFT用時2.138 ms,20ms為一幀,算下來總共有100幀,也就是100次1024點的FFT計算,總用時就是213.8ms,加上其他地方的指令、算法運算時間,識別一個指令應該在0.5s以內。至于每幀20ms,按照8khz的采樣頻率只能得到160個點,采用1024點FFT則需要在尾部補864個零,因為由公式(delta f)=fs/N 補零可以提高頻率分辨率。且考慮到ADC采樣次數比較多,所以采集到的數據采用DMA的方式傳輸到設定的數組,這樣可以節省指令執行時間。從工程的初始化開始,先是設定單片機運行頻率(72MHZ),延時函數初始化(SysTick),ADC、DMA、按鍵函數部分以及需要用到的引腳的初始化,main()中的主要為一個按鍵函數來實現何時進行模板訓練,何時進行語音識別。工程的主要部分為端點檢測、MFCC語音特征提取、以及特征提算DTW的代碼實現。想著重提出來說的是DTW算法,算法基于動態規劃(DP)的思想,用于于長度不等的序列如何匹配。直接的理解,是warping一個序列后可以與另一個序列重合。這個時候兩個序列中所有對應點的距離之和是最小為零。所以從直觀上理解,warping的正確性一般指每一個相對應的特征點的對齊,我想這也是動態時間規整算法的核心。這個解釋應該很宏觀,理解了物理意義,這個算法也變的簡單起來。
對于它的起源(DP)我們不去過多的訴說,而它廣闊的應用前景,結合cpp面向對象的特性,我想我們可以把這個warping運用的很只能,就像對于人的情感、關系,將兩個人綜合特征的顯現進行“匹配”,或是兩代人之間的種種特征(貌似很像DNA檢測,不過一個是唯物,一個是格物),這是對“對象”的一個小小改變。
[1]董辰輝,彭雪峰.MATLAB 2008 全程指南.北京:電子工業出版社[M],2009 年 3 月 .
[2]張雪英.數字語音處理及 MATLAB 仿真.北京:電子工業出版社[M],2011年 7 月 .
[3]宋知用.MATLAB在語音信號分析與合成中的應用.北京:北京航空航天大學出版社[M],2013 年 11 月.
[4]顧亞強.非特定人語音識別關鍵技術研究[J].國防科技大學碩士學位論文,2009 年 11 月 .
[5]徐科軍,黃云志,林逸榕,陳強.信號分析處理(第二版).北京:清華大學出版 [M],2006 年 4 月 .
[6]汪冰.小詞匯非特定人的孤立詞語音識別系統的研究與設計[J].廣東工業大學碩士學位論文,2008 年 5 月.