說話人識(shí)別系統(tǒng)中VQ判決模塊的FPGA實(shí)現(xiàn)
摘 要: 目前,基于PC或DSP的系統(tǒng)其處理能力無(wú)法滿足海量語(yǔ)音信號(hào)高速處理需求的增長(zhǎng)。本文分析了VQ(矢量量化)搜索算法的硬件實(shí)現(xiàn)復(fù)雜度,針對(duì)說話人識(shí)別過程中運(yùn)算量最大、耗時(shí)最長(zhǎng)的判決過程,提出了一種基于標(biāo)簽的說話人判決模型實(shí)現(xiàn)方案。該設(shè)計(jì)用FPGA實(shí)現(xiàn),可對(duì)多路電話信道說話人進(jìn)行實(shí)時(shí)判決識(shí)別。
關(guān)鍵詞: 說話人識(shí)別;VQ;標(biāo)簽;多路;FPGA
說話人識(shí)別和指紋識(shí)別、虹膜識(shí)別一樣,屬于生物識(shí)別技術(shù)的一種[1],是通過從語(yǔ)音信號(hào)中提取說話人信息來(lái)鑒別說話人身份的技術(shù)。與其他生物識(shí)別技術(shù)相比,說話人識(shí)別具有更為簡(jiǎn)便、自然、準(zhǔn)確、經(jīng)濟(jì)及可擴(kuò)展性好等眾多優(yōu)勢(shì)。與語(yǔ)音識(shí)別不同,說話人識(shí)別不考慮語(yǔ)音中的字詞意思,強(qiáng)調(diào)說話人的個(gè)性。
說話人識(shí)別由訓(xùn)練和識(shí)別兩個(gè)階段構(gòu)成,圖1為一個(gè)典型的說話人識(shí)別系統(tǒng)結(jié)構(gòu)框圖。其中特征提取單元從輸入語(yǔ)音中提取出能夠反映說話人特征的參數(shù);在訓(xùn)練階段,用合適的模型來(lái)表征這些特征參數(shù),使得模型能夠代表該說話人的語(yǔ)音特性,這一階段一般離線運(yùn)行;在識(shí)別階段,用已經(jīng)建立的參考模型對(duì)測(cè)試語(yǔ)音的特征參數(shù)按一定的相似性測(cè)度和判決規(guī)則進(jìn)行模式匹配,把相似性得分最高者作為識(shí)別結(jié)果。
基于成本和靈活性方面的考慮,當(dāng)前大部分說話人識(shí)別系統(tǒng)都是基于計(jì)算機(jī)軟件或DSP來(lái)構(gòu)建的。但對(duì)于一些大型應(yīng)用,如企業(yè)的客服中心,為提高服務(wù)質(zhì)量和效率,希望自動(dòng)識(shí)別客戶身份;公安部門為調(diào)查取證,需要對(duì)多路電話進(jìn)行實(shí)時(shí)監(jiān)控或?qū)A夸浺綦娫掃M(jìn)行高速處理。對(duì)于這些基于電信網(wǎng)的大容量、實(shí)時(shí)性要求比較高的應(yīng)用,基于PC或DSP的系統(tǒng)其處理能力越來(lái)越不能滿足需求的增長(zhǎng)。本文針對(duì)基于PC或DSP的系統(tǒng)在識(shí)別階段實(shí)時(shí)性較差的問題,提出了一種基于VQ模型的硬件判決實(shí)現(xiàn)結(jié)構(gòu),并用FPGA實(shí)現(xiàn)。
1 VQ模型原理及算法復(fù)雜度分析
1.1 VQ模型原理
基于VQ[2]方法的說話人識(shí)別系統(tǒng)在訓(xùn)練階段把每個(gè)人的訓(xùn)練語(yǔ)音數(shù)據(jù)通過標(biāo)準(zhǔn)的聚類過程生成碼本C,假設(shè)有S個(gè)目標(biāo)說話人,則需要建立S個(gè)碼本。在選定了失真測(cè)度和初始碼本后,通常采用LBG[3]算法生成碼本。識(shí)別時(shí)將測(cè)試輸入語(yǔ)音矢量按此碼本進(jìn)行編碼,以量化產(chǎn)生的失真作為判決標(biāo)準(zhǔn)。L幀測(cè)試語(yǔ)音矢量{xt},t=1,2,…,L的模板匹配得分z為[4]:
其中,測(cè)試是以最小匹配得分作為測(cè)試語(yǔ)音和模型相似程度的判定依據(jù)。
采用VQ模型識(shí)別過程并不需要進(jìn)行時(shí)間對(duì)齊,從而大大減少了系統(tǒng)的復(fù)雜度。對(duì)于文本無(wú)關(guān)的說話人識(shí)別,其識(shí)別率較高,且判斷速度快,對(duì)于計(jì)算量化失真的搜索過程,目前硬件實(shí)現(xiàn)通常采用全搜索算法。
失真測(cè)度采用歐式失真,即均方誤差,特點(diǎn)是易于硬件處理,且符合語(yǔ)音主觀感知的條件,與系統(tǒng)所采用的MFCC參數(shù)相匹配(若采用LPC則不適宜用歐式失真)[5]。
1.2 算法適應(yīng)性修改及運(yùn)算復(fù)雜度分析
1.2.1 算法適應(yīng)性修改
設(shè)碼本為C={c0,c1,c2,…,cN-1},其中每個(gè)碼矢為k維矢量,特征參數(shù)x也是k維矢量。在歐氏失真的條件下,特征參數(shù)x對(duì)碼矢c的失真計(jì)算如下式:
其中e是和碼矢相關(guān)的固定值,在離線生成碼本時(shí)計(jì)算出來(lái),并作為碼本的一部分。由上面的分析可知,求最小距離相當(dāng)于最大化||x·c||。因此,一幀測(cè)試矢量對(duì)一個(gè)碼本的最小距離的搜索過程可等價(jià)地描述為矩陣-矢量相乘,即下式:
式中:C為N行k列碼本矩陣,x為測(cè)試矢量,e為由各碼矢的e值組成的列向量。
對(duì)于一個(gè)碼本來(lái)講,每一幀參數(shù)的量化誤差為:
在進(jìn)行說話人識(shí)別時(shí),假設(shè)需要M幀測(cè)試矢量,則需比較每個(gè)碼本對(duì)這M幀參數(shù)的得分,即各幀的量化誤差的累加和。對(duì)一個(gè)說話人來(lái)講,M值對(duì)每個(gè)碼本都是固定的,因此只需計(jì)算max{xi·c+e}的累加和即可,識(shí)別過程也由搜索最小值轉(zhuǎn)化為搜索最大值。
根據(jù)上面分析可知,測(cè)試矢量和碼字矢量之間的距離可以通過計(jì)算它們之間的內(nèi)積來(lái)實(shí)現(xiàn),而不必用先相減再平方的方式。對(duì)硬件實(shí)現(xiàn)來(lái)講,每次求距離的過程將減少k次減法的運(yùn)算量,可帶來(lái)面積和時(shí)序上的優(yōu)化。
1.2.2 運(yùn)算復(fù)雜度分析
假設(shè)碼本數(shù)為S,碼本容量為N,碼字為k維矢量,下面對(duì)運(yùn)算復(fù)雜度進(jìn)行分析。
由前面的分析可知,一幀測(cè)試矢量對(duì)一個(gè)碼矢的距離計(jì)算量為K次乘法,K-1次加法,再加上e,共K次乘加操作,則一幀測(cè)試矢量對(duì)一個(gè)碼本(N個(gè)碼矢)完成失真計(jì)算的運(yùn)算量:N×k次乘累加,N-1次比較。
計(jì)算M幀測(cè)試矢量對(duì)一個(gè)碼本的距離,共需要:(M×K×k)次乘加,(M×N-1)次比較,另加(M-1)次加操作(完成M個(gè)誤差的累加)。
對(duì)于有S個(gè)說話人(S個(gè)碼本)的系統(tǒng),定義其VQ搜索復(fù)雜度為f,即完成一次說話人判決所需的主要運(yùn)算量,這里只取乘加運(yùn)算,則:
f=S×M×N×k (7)
例如,在本文中,目標(biāo)說話人S=64,碼本容量N取64,k取24維,完成一次識(shí)別的典型M值為1 024,共需要:f=64×1 024×64×24=100 663 296次乘加運(yùn)算。
VQ識(shí)別時(shí)其運(yùn)算復(fù)雜度與上面4個(gè)參數(shù)成線性關(guān)系,對(duì)于碼本來(lái)講,其存儲(chǔ)復(fù)雜度與S、N、k這3個(gè)參數(shù)成線性關(guān)系。
2 硬件實(shí)現(xiàn)結(jié)構(gòu)
2.1 功能描述
系統(tǒng)采用24維MFCC參數(shù)(12維MFCC及12維ΔMFCC),數(shù)據(jù)位寬為32位。因?yàn)檎麄€(gè)系統(tǒng)的典型應(yīng)用為多路電話信道(如E1信道),可完成多路電話語(yǔ)音的同時(shí)處理。為了區(qū)分當(dāng)前參數(shù)屬于哪一話路,采用的方式是給每一幀參數(shù)前加上一個(gè)標(biāo)簽,也是32位寬,內(nèi)容包括話路號(hào)及格式信息,這都由系統(tǒng)前端處理完成。因此VQ判決模塊的實(shí)際輸入數(shù)據(jù)可視為25維參數(shù),以FIFO為接口串行輸入。輸入幀格式如圖2。
當(dāng)某一話路滿足判決條件,即輸入了足夠的參數(shù)(如設(shè)定1 024幀)時(shí),判決模塊將進(jìn)行判決。判決完成后輸出結(jié)果有效信號(hào),持續(xù)若干個(gè)時(shí)鐘周期,使外部系統(tǒng)讀出判決結(jié)果。輸出的判決結(jié)果為32位,高16位為話路號(hào),低16位為碼本號(hào),以告知外部控制系統(tǒng)當(dāng)前輸入中哪一路話出現(xiàn)了哪個(gè)說話人。
為了進(jìn)行實(shí)時(shí)判決,需要在下一幀測(cè)試矢量的最后一個(gè)數(shù)據(jù)到來(lái)之前完成當(dāng)前幀的量化工作,即計(jì)算出當(dāng)前幀與每個(gè)碼本的距離,實(shí)現(xiàn)高速的核心是使用并行乘法。這里的“實(shí)時(shí)”是指從測(cè)試數(shù)據(jù)輸入到判決結(jié)果輸出的過程,只有算法上的延遲,無(wú)需在前面存儲(chǔ)測(cè)試數(shù)據(jù)。
2.2 實(shí)現(xiàn)結(jié)構(gòu)及模塊劃分
圖3為VQ判決模塊的內(nèi)部結(jié)構(gòu)框圖,給出了主要的控制信號(hào)和數(shù)據(jù)。其中包括兩個(gè)接口,一個(gè)測(cè)試數(shù)據(jù)輸入接口,一個(gè)讀碼本接口,測(cè)試數(shù)據(jù)通過FIFO輸入,碼本存儲(chǔ)于外部RAM。整個(gè)架構(gòu)從功能上可分為接口部分、控制部分和運(yùn)算部分。下面具體介紹各子模塊功能,同時(shí)說明整個(gè)模塊的工作流程。
2.2.1 測(cè)試矢量接口
根據(jù)FIFO的空標(biāo)志rdempty,產(chǎn)生讀請(qǐng)求信號(hào)rdreq,讀到的數(shù)據(jù)首先進(jìn)入一個(gè)24級(jí)移位寄存器,并對(duì)讀進(jìn)行計(jì)數(shù)。計(jì)數(shù)值滿24后,發(fā)出tag_ready使能,在下一時(shí)鐘上升沿輸出tag至初始化模塊。第25個(gè)數(shù)讀進(jìn)來(lái)后,clr_tag有效。該模塊接收來(lái)自初始化模塊的load_tv使能信號(hào),持續(xù)一個(gè)時(shí)鐘周期,若load_tv有效,在上升沿時(shí)將移位寄存器組的數(shù)據(jù)讀入寄存器組,實(shí)現(xiàn)串并轉(zhuǎn)換,將測(cè)試矢量送至并行乘單元。功能示意如圖4。
2.2.2 碼本接口
收到初始化模塊的load_code信號(hào)后,開始產(chǎn)生地址和讀信號(hào),按順序讀出碼本數(shù)據(jù)。內(nèi)部也有移位寄存器組和數(shù)據(jù)寄存器組,實(shí)現(xiàn)串并轉(zhuǎn)換,同圖4所示結(jié)構(gòu)相似。讀滿一幀24個(gè)數(shù)之后,產(chǎn)生opr_en使能,在下一時(shí)鐘沿把數(shù)據(jù)加載到寄存器組,并行乘法也將在opr_en有效后的第一個(gè)時(shí)鐘沿開始。opr_en作為基本的使能信號(hào),同時(shí)提供給下一級(jí)的并行乘加模塊和運(yùn)算控制模塊。
2.2.3 初始化子模塊
初始化狀態(tài)機(jī)如圖5所示,分為空閑、初始化和循環(huán)三個(gè)狀態(tài)。根據(jù)讀入的標(biāo)簽數(shù)據(jù)tag,判斷該幀測(cè)試數(shù)據(jù)是否有效,從而決定是否開始運(yùn)算過程。當(dāng)接收的clr_tag有效時(shí),表示該幀的最后一個(gè)數(shù)據(jù)已經(jīng)進(jìn)入移位寄存器,此時(shí)判斷tag是否有效。若有效,則提取tag中的話路號(hào),輸出至運(yùn)算控制模塊,同時(shí)使load_tv、load_code兩個(gè)信號(hào)有效。load_tv為加載測(cè)試矢量使能,load_code為加載碼本使能。
2.2.4 運(yùn)算控制模塊
對(duì)于時(shí)分復(fù)用的多路電話信道,控制模塊首先要根據(jù)標(biāo)簽對(duì)輸入的測(cè)試矢量完成分路計(jì)數(shù)的功能。當(dāng)id_re-ady有效時(shí),讀入話路號(hào)slice_id,進(jìn)行幀計(jì)數(shù),對(duì)應(yīng)到說話人識(shí)別系統(tǒng)前端,就是對(duì)輸入話音進(jìn)行計(jì)時(shí)。計(jì)數(shù)結(jié)果將決定對(duì)當(dāng)前話路是繼續(xù)累加還是進(jìn)行判決。如果計(jì)滿設(shè)定的幀數(shù)M,則使判決信號(hào)rcg_en為高,輸出至累加/判決子模塊。
運(yùn)算控制模塊還要為累加和存儲(chǔ)器產(chǎn)生地址和寫請(qǐng)求信號(hào),地址和寫請(qǐng)求也輸入到累加/判決子模塊。地址的產(chǎn)生依賴于話路號(hào)slice_id和碼本的個(gè)數(shù)S。
2.2.5 并行乘加及比較選擇模塊
并行乘加模塊由24個(gè)乘法器構(gòu)成并行乘法陣列,24個(gè)乘結(jié)果直接輸出到5級(jí)流水式加法器樹,并行乘加結(jié)果為||x·c||+e,在以opr_en為基準(zhǔn)進(jìn)行相應(yīng)延遲后得到的使能信號(hào)的作用下,進(jìn)行流水輸出。這里的乘法是有符號(hào)數(shù)乘法,利用FPGA內(nèi)部的DSP塊實(shí)現(xiàn),在用HDL語(yǔ)言描述時(shí),需指明乘法器輸入為有符號(hào)數(shù)。并行乘法是提高速度的關(guān)鍵,在一個(gè)時(shí)鐘周期內(nèi)即可完成24次乘法,結(jié)果直接相加,加法器樹也在使能信號(hào)作用下以流水線形式輸出。比較選擇模塊由寄存器和比較器構(gòu)成,與并行乘加單元共同完成量化功能,并暫存量化誤差。
2.2.6 累加/判決模塊及緩存結(jié)構(gòu)
累加/判決模塊及緩存結(jié)構(gòu)是實(shí)現(xiàn)分路判決的關(guān)鍵,上面提到的并行乘加和比較選擇模塊實(shí)現(xiàn)的是矢量量化的功能,其目的是得到量化誤差,而接下來(lái)則需要對(duì)量化誤差進(jìn)行累加,并根據(jù)累加和進(jìn)行判決。累加和緩存采用以碼本號(hào)為橫坐標(biāo)、以話路號(hào)為縱坐標(biāo)的二維結(jié)構(gòu),這樣做的好處是在進(jìn)行分路的同時(shí),可以利用地址信息作為判決結(jié)果。圖6以32路話、64個(gè)碼本為例,其中坐標(biāo)為(i,j)的單元格的內(nèi)容為第i路說話人對(duì)第j個(gè)碼本的距離累加和。
為了防止累加和溢出,該部分緩存利用片內(nèi)RAM實(shí)現(xiàn),并采用增加位寬的方式,增加16位,即可提供最多65 536幀的誤差累加而保證無(wú)溢出。利用FPGA可相對(duì)自由的定義數(shù)據(jù)及存儲(chǔ)格式來(lái)處理溢出問題,這是DSP系統(tǒng)無(wú)法比擬的優(yōu)勢(shì)之一。當(dāng)判決使能rcg_en為低時(shí),根據(jù)地址值,將到來(lái)的數(shù)據(jù)累加到相應(yīng)的存儲(chǔ)單元;當(dāng)rcg_en高時(shí),依次讀出該話路所對(duì)應(yīng)的行中每個(gè)存儲(chǔ)單元的值,進(jìn)行比較,同時(shí)保存并更新最大值所對(duì)應(yīng)的地址,作為結(jié)果輸出。
3 仿真與綜合結(jié)果
本系統(tǒng)選擇的目標(biāo)器件為Altera公司的StratixII 系列中的EP2S60F1020C3,配置有36個(gè)36×36bit硬件乘法器,能對(duì)本設(shè)計(jì)中的并行乘加結(jié)構(gòu)提供足夠的支持。設(shè)計(jì)采用Verilog HDL語(yǔ)言描述,利用QuartusII 7.1自帶的綜合工具綜合,用Modelsim6.1進(jìn)行仿真。圖7為模塊聯(lián)調(diào)時(shí)部分信號(hào)的仿真波形圖,顯示了初始化完成新一幀開始運(yùn)算的情況,當(dāng)加載測(cè)試矢量和碼本矢量的使能信號(hào)load_tv和load_code有效后,運(yùn)算開始。其中前面處理單元寫入FIFO的特征參數(shù)為低速數(shù)據(jù),判決模塊在讀滿下一幀之前要處理完當(dāng)前寄存器中的數(shù)據(jù)。
表1為在32路話、64個(gè)碼本、時(shí)鐘約束100M的條件下,利用QuartusII進(jìn)行綜合、布局布線后的主要資源利用率及時(shí)序情況。
從資源利用情況來(lái)看,因?yàn)樵O(shè)計(jì)采用了并行乘法,所以消耗最多的是FPGA內(nèi)置的DSP資源,其次是片上RAM資源,主要用于累加和緩存,當(dāng)話路數(shù)或碼本數(shù)發(fā)生改變時(shí),消耗的RAM資源也會(huì)相應(yīng)變化。整個(gè)系統(tǒng)可穩(wěn)定運(yùn)行于100MHz時(shí)鐘,對(duì)于一個(gè)E1鏈路、64個(gè)碼本,完成一幀測(cè)試矢量量化誤差計(jì)算所需時(shí)間為64×64×10=40960ns,遠(yuǎn)小于完成一個(gè)2M鏈路實(shí)時(shí)判決所需時(shí)間0.5ms(16ms內(nèi)到來(lái)32幀測(cè)試矢量,即每幀最慢處理時(shí)間為0.5ms),留有充足的設(shè)計(jì)裕量,可擴(kuò)展性較好。
隨著FPGA技術(shù)的發(fā)展,其在數(shù)字信號(hào)處理領(lǐng)域的應(yīng)用范圍迅速擴(kuò)大,使得利用FPGA實(shí)現(xiàn)復(fù)雜算法成為現(xiàn)實(shí)。利用VQ原理進(jìn)行說話人識(shí)別,其硬件結(jié)構(gòu)從功能上可分為兩個(gè)部分:矢量量化部分和利用量化誤差累加和進(jìn)行判決的部分。其中矢量量化部分的結(jié)構(gòu)可根據(jù)應(yīng)用需求和所選器件的資源情況靈活改變。例如,若器件的內(nèi)置DSP塊資源緊張,則可以減少乘法器及加法器的數(shù)量,改為乘累加的形式,用兩個(gè)以上時(shí)鐘周期完成一次矢量距離運(yùn)算。本設(shè)計(jì)中矢量量化部分和多路判決部分是相對(duì)獨(dú)立的,量化部分結(jié)構(gòu)改變并不影響判決部分;若話路數(shù)或碼本數(shù)發(fā)生變化,則只需對(duì)累加和緩存大小進(jìn)行調(diào)整即可。
目前,本設(shè)計(jì)已成功應(yīng)用于多路實(shí)時(shí)說話人識(shí)別系統(tǒng),可滿足至少1個(gè)2M鏈路、64個(gè)說話人集合的閉集判決,并可根據(jù)實(shí)際情況擴(kuò)展。
參考文獻(xiàn)
[1] 王炳錫.實(shí)用語(yǔ)音識(shí)別基礎(chǔ)[M].北京:國(guó)防工業(yè)出版社,2005.
[2] 吳樂南.數(shù)據(jù)壓縮[M].北京:電子工業(yè)出版社,2000.
[3] LINDE Y,BUZO A,GRAY R M.An Algorithm for Vector Quantizer Design[J].IEEETransactions on Communications,1980,28(1):84-95.
[4] 王煒.文本無(wú)關(guān)的連續(xù)自然語(yǔ)音的說話人識(shí)別及基于DSP的實(shí)現(xiàn)[D].鄭州:解放軍信息工程大學(xué),2004.
[5] 王炳錫.語(yǔ)音編碼[M].西安:西安電子科技大學(xué)出版社,2002:102-104.
[6] [美]PARHI K K著.VLSI數(shù)字信號(hào)處理系統(tǒng):設(shè)計(jì)與實(shí)現(xiàn).陳弘毅譯.北京:機(jī)械工業(yè)出版社,2004.