語(yǔ)音識(shí)別技術(shù),廣泛來(lái)說(shuō)是指語(yǔ)意識(shí)別和聲紋識(shí)別;從狹義上來(lái)說(shuō)指語(yǔ)音語(yǔ)義的理解識(shí)別,也稱(chēng)為自動(dòng)語(yǔ)音識(shí)別(ASR)。其關(guān)鍵技術(shù)包括選擇識(shí)別單元、語(yǔ)音端點(diǎn)檢測(cè)、特征參數(shù)提取、聲學(xué)模型及語(yǔ)音模型的建立。語(yǔ)音識(shí)別技術(shù)目前在桌面系統(tǒng)、智能手機(jī)、導(dǎo)航設(shè)備等嵌入式領(lǐng)域均有一定程度的應(yīng)用。其主要技術(shù)難題是識(shí)別系統(tǒng)的適應(yīng)性較差、受背景噪聲影響較大,未來(lái)的發(fā)展方向應(yīng)是無(wú)限詞匯量連續(xù)語(yǔ)音非特定人語(yǔ)音識(shí)別系統(tǒng)。
(1)信號(hào)處理及特征提取模塊
該模塊的主要任務(wù)是從輸入信號(hào)中提取特征,供聲學(xué)模型處理。同時(shí),它一般也包括了一些信號(hào)處理技術(shù),以盡可能降低環(huán)境噪聲、信道、說(shuō)話人等因素對(duì)特征造成的影響。
(2)統(tǒng)計(jì)聲學(xué)模型
典型系統(tǒng)多采用基于一階隱馬爾科夫模型進(jìn)行建模。
(3)發(fā)音詞典
發(fā)音詞典包含系統(tǒng)所能處理的詞匯集及其發(fā)音。發(fā)音詞典實(shí)際提供了聲學(xué)模型建模單元與語(yǔ)言模型建模單元間的映射。
(4)語(yǔ)言模型
語(yǔ)言模型對(duì)系統(tǒng)所針對(duì)的語(yǔ)言進(jìn)行建模。理論上,包括正則語(yǔ)言,上下文無(wú)關(guān)文法在內(nèi)的各種語(yǔ)言模型都可以作為語(yǔ)言模型,但目前各種系統(tǒng)普遍采用的還是基于統(tǒng)計(jì)的N元文法及其變體。
(5)解碼器
解碼器是語(yǔ)音識(shí)別系統(tǒng)的核心之一,其任務(wù)是對(duì)輸入的信號(hào),根據(jù)聲學(xué)、語(yǔ)言模型及詞典,尋找能夠以最大概率輸出該信號(hào)的詞串,從數(shù)學(xué)角度可以更加清楚的了解上述模塊之間的關(guān)系。
當(dāng)今語(yǔ)音識(shí)別技術(shù)的主流算法,主要有基于動(dòng)態(tài)時(shí)間規(guī)整(DTW)算法、基于非參數(shù)模型的矢量量化(VQ)方法、基于參數(shù)模型的隱馬爾可夫模型(HMM)的方法、基于人工神經(jīng)網(wǎng)絡(luò)(ANN)和支持向量機(jī)等語(yǔ)音識(shí)別方法。
對(duì)于語(yǔ)音識(shí)別技術(shù)實(shí)現(xiàn)的描述是相當(dāng)完整的,而且其可以作為語(yǔ)音識(shí)別技術(shù)在資源緊缺型嵌入式平臺(tái)實(shí)現(xiàn)的一個(gè)較好的參考。
語(yǔ)音識(shí)別技術(shù)介紹
1.應(yīng)用分類(lèi)
(1)特定人與非特定人識(shí)別,特定人識(shí)別相對(duì)簡(jiǎn)單,訓(xùn)練者的識(shí)別率高,但非訓(xùn)練者的識(shí)別率很低。而非特定人不受此影響,但實(shí)現(xiàn)復(fù)雜,識(shí)別率也相對(duì)低一些。
(2)語(yǔ)音識(shí)別與身份識(shí)別,前者提取各個(gè)命令者發(fā)出的語(yǔ)音的共性特征,而后者提取差異性特征?;谡Z(yǔ)音的身份識(shí)別主要應(yīng)用于門(mén)禁等安全領(lǐng)域。語(yǔ)音識(shí)別廣泛應(yīng)用于詞語(yǔ)識(shí)別,工業(yè)控制等領(lǐng)域。
(3)連續(xù)與非連續(xù)(孤立詞)語(yǔ)音識(shí)別,很明顯,連續(xù)語(yǔ)音識(shí)別難度較大。嵌入式產(chǎn)品集中在孤立詞語(yǔ)音識(shí)別方面。
(4)小詞匯量和大詞匯量語(yǔ)音識(shí)別。兩者選擇的方法是不一樣的,會(huì)在識(shí)別率和識(shí)別速度上折中考慮。
(5)關(guān)鍵詞識(shí)別,如在一段語(yǔ)音中抽取帶有某個(gè)關(guān)鍵詞的句子,或者根據(jù)哼的曲子旋律去搜索對(duì)應(yīng)的歌曲等等。
本系統(tǒng)受限80251的計(jì)算和存儲(chǔ)性能,主要實(shí)現(xiàn)基于特定人的孤立詞語(yǔ)音識(shí)別。
2. 實(shí)現(xiàn)原理
語(yǔ)音識(shí)別主要包括:預(yù)處理、特征提取、訓(xùn)練和識(shí)別四個(gè)部分。
預(yù)處理主要包括去噪、預(yù)加重(去除口鼻輻射)、端點(diǎn)檢測(cè)(檢測(cè)有效語(yǔ)音段)等過(guò)程。
特征提取是對(duì)經(jīng)過(guò)預(yù)處理后的語(yǔ)音信號(hào)進(jìn)行特征參數(shù)分析。該過(guò)程就是從原始語(yǔ)音信號(hào)中抽取出能夠反映語(yǔ)音本質(zhì)的特征參數(shù),形成特征矢量序列。主要的特征參數(shù)包括:線性預(yù)測(cè)編碼參數(shù)(LPC)、線性預(yù)測(cè)倒譜參數(shù)(LPCC)、MEL倒譜參數(shù)(MFCC)等。
語(yǔ)音模式庫(kù):即聲學(xué)參數(shù)模板,它是用聚類(lèi)分析等方法,從一個(gè)講話者或多個(gè)講話者多次重復(fù)的語(yǔ)音參數(shù)中經(jīng)過(guò)長(zhǎng)時(shí)間訓(xùn)練得到的。
語(yǔ)音模式匹配:將輸入語(yǔ)音的特征參數(shù)同訓(xùn)練得到的語(yǔ)音模式庫(kù)進(jìn)行比較分析,從而得到識(shí)別結(jié)果。常用的方法包括:動(dòng)態(tài)時(shí)間規(guī)整(DTW)、神經(jīng)網(wǎng)絡(luò)(ANN)、隱馬爾科夫(HMM)等。DTW比較簡(jiǎn)單實(shí)用,適用于孤立詞語(yǔ)音識(shí)別。HMM比較復(fù)雜,適用于大詞匯量連續(xù)語(yǔ)音識(shí)別。
三、嵌入式語(yǔ)音識(shí)別難點(diǎn)
語(yǔ)音識(shí)別的關(guān)鍵是識(shí)別率的高低。PC語(yǔ)音識(shí)別的識(shí)別率主要受限于系統(tǒng)選擇的方法,如端點(diǎn)檢測(cè)的精確度、特征參數(shù)的有效性、模式匹配方法的有效性等。而嵌入式的語(yǔ)音識(shí)別不僅受選擇方法的影響,而且受算法運(yùn)算精度的影響。PC機(jī)主要采用浮點(diǎn)數(shù),而嵌入式主要是采用定點(diǎn)算法,因此運(yùn)算精度、誤差控制非常重要。語(yǔ)音識(shí)別算法包括多個(gè)模塊,多個(gè)算法運(yùn)算過(guò)程,累積誤差對(duì)結(jié)果的影響是致命的。所以在算法設(shè)計(jì)過(guò)程中必須要仔細(xì)考慮定點(diǎn)數(shù)值的精度,既要盡量提高精度,又要防止運(yùn)算結(jié)果溢出。
嵌入式語(yǔ)音識(shí)別還需要考慮識(shí)別速度。PC機(jī)運(yùn)行速度比較快,中等詞匯量語(yǔ)音識(shí)別的用戶體驗(yàn)還是蠻好的。但在嵌入式語(yǔ)音識(shí)別中,詞匯量的大小對(duì)用戶體驗(yàn)的影響是相當(dāng)嚴(yán)重的。即使識(shí)別率高,但識(shí)別速度很慢,那這個(gè)產(chǎn)品很難推廣。所以嵌入式語(yǔ)音識(shí)別需要在識(shí)別率和識(shí)別速度上折中考慮。識(shí)別速度不僅受限于選取算法的運(yùn)算復(fù)雜度,還受嵌入式硬件的影響,如數(shù)據(jù)空間大小。如果數(shù)據(jù)RAM空間不夠大,那就需要以其他介質(zhì)(如FLASH/CARD)作為緩存。后續(xù)處理頻繁范圍該介質(zhì)將會(huì)嚴(yán)重影響識(shí)別速度。所以識(shí)別速度也受限于硬件條件。
四、80251平臺(tái)語(yǔ)音識(shí)別的硬件條件及其考慮
1. 80251平臺(tái)語(yǔ)音識(shí)別的硬件條件
這里我們假定SOC集成了251內(nèi)核,而其能實(shí)現(xiàn)錄音的功能,這是語(yǔ)音識(shí)別的最基本要求。語(yǔ)音識(shí)別的硬件條件就是系統(tǒng)分配給錄音應(yīng)用的所有資源。
錄音應(yīng)用的資源一般包括:
1) audio buffer(512字節(jié)),其主要是作為audio錄音時(shí)采樣處理后的數(shù)據(jù)緩存,即采樣后audio會(huì)把512字節(jié)錄音數(shù)據(jù)放到該BUFFER,應(yīng)用再調(diào)用文件系統(tǒng)寫(xiě)接口把該BUFFER數(shù)據(jù)寫(xiě)到FLASH。
2) EDATA變量數(shù)據(jù)空間(1024字節(jié)),其主要是錄音應(yīng)用和中間件模塊的變量數(shù)據(jù)空間。錄音應(yīng)用和中間件已經(jīng)用掉622字節(jié),剩下402字節(jié)。
3) PCMRAM(12K字節(jié)), 其主要是用于錄音時(shí)的數(shù)據(jù)采樣處理。
4) 代碼空間(9K字節(jié)),錄音應(yīng)用和中間件代碼運(yùn)行空間。
2. 80251平臺(tái)語(yǔ)音識(shí)別可用資源
在80251平臺(tái)上實(shí)現(xiàn)語(yǔ)音識(shí)別就需要在錄音應(yīng)用基礎(chǔ)上增加語(yǔ)音識(shí)別功能,因此語(yǔ)音識(shí)別需要與錄音應(yīng)用共享以上資源。語(yǔ)音識(shí)別分預(yù)處理、特征提取、訓(xùn)練和匹配識(shí)別四個(gè)子過(guò)程,四個(gè)子過(guò)程在運(yùn)行的時(shí)間上是不重復(fù)的。以下根據(jù)各個(gè)子過(guò)程的運(yùn)行時(shí)間考慮以上資源的復(fù)用性??紤]到80251采用硬件BANK機(jī)制,所以語(yǔ)音識(shí)別的代碼空間不受影響。因此著重考慮數(shù)據(jù)空間的復(fù)用性。另外,語(yǔ)音識(shí)別一般是對(duì)PCM數(shù)據(jù)進(jìn)行處理,80251的PCM數(shù)據(jù)的量化比特?cái)?shù)為16BIT,即2個(gè)字節(jié)。人的有效語(yǔ)音頻率在4KHZ以下,所以采用率選擇8KHZ,滿足奈奎斯特采樣定理。
預(yù)處理的預(yù)加重比較簡(jiǎn)單,是一個(gè)低通濾波器,不需占用額外的數(shù)據(jù)空間。對(duì)于去噪,本系統(tǒng)暫時(shí)不予考慮。預(yù)處理主要的部分在于語(yǔ)音端點(diǎn)檢測(cè),即去除靜音段,保留有效語(yǔ)音段。類(lèi)似于錄音中的聲控錄音,但語(yǔ)音識(shí)別的語(yǔ)音端點(diǎn)檢測(cè)比聲控錄音更加復(fù)雜,也要求更加精確。本系統(tǒng)采用實(shí)時(shí)在線的端點(diǎn)檢測(cè)算法,因此在端點(diǎn)檢測(cè)過(guò)程(即在偵聽(tīng)命令的錄音過(guò)程)需要實(shí)時(shí)地對(duì)audio buffer的數(shù)據(jù)進(jìn)行處理,檢測(cè)是否為有效語(yǔ)音。在這個(gè)過(guò)程,audio buffer和PCMRAM都是不可使用的。能夠使用的就是402字節(jié)的EDATA空間。由于語(yǔ)音識(shí)別各個(gè)過(guò)程都要進(jìn)行分幀處理(后續(xù)再講),本系統(tǒng)設(shè)定每幀128點(diǎn),因此需要申請(qǐng)一個(gè)256字節(jié)的幀處理BUFFER。剩下402-256 = 146字節(jié)作為語(yǔ)音識(shí)別的變量數(shù)據(jù)空間。
在端點(diǎn)檢測(cè)過(guò)程中,根據(jù)當(dāng)前幀的短時(shí)能量或者過(guò)零率確認(rèn)語(yǔ)音開(kāi)始時(shí),對(duì)該幀數(shù)據(jù)的處理有兩種,一是將當(dāng)前512字節(jié)數(shù)據(jù)(一個(gè)扇區(qū))COPY到一段語(yǔ)音BUFFER,另一種是調(diào)用文件系統(tǒng)寫(xiě)接口寫(xiě)到FLASH中。對(duì)于前者,其速度肯定優(yōu)于后者,因?yàn)槠洳恍枰谔幚淼倪^(guò)程中調(diào)用文件系統(tǒng)接口。還有,突然的脈沖噪聲也會(huì)讓系統(tǒng)誤認(rèn)為語(yǔ)音的開(kāi)始,所以在確認(rèn)噪聲后又需重新開(kāi)始檢查。如果有一塊大的語(yǔ)音BUFFER,語(yǔ)音識(shí)別的性能將會(huì)大幅提高。一般認(rèn)為一個(gè)人說(shuō)出的孤立詞語(yǔ)音持續(xù)時(shí)間在2秒以?xún)?nèi),即2×8000×2 ≈ 32K字節(jié)。但80251平臺(tái)明顯沒(méi)有這個(gè)資源。所以選擇了將當(dāng)前扇區(qū)數(shù)據(jù)寫(xiě)入文件,即用FLASH作為語(yǔ)音BUFFER使用。另外,80251文件有個(gè)缺陷,寫(xiě)操作不能調(diào)用FSEEK。這樣會(huì)帶來(lái)端點(diǎn)檢測(cè)速度的下降。如前所講,脈沖噪聲會(huì)滿足語(yǔ)音開(kāi)始的條件,因此脈沖噪聲起始點(diǎn)之后的一段聲音數(shù)據(jù)都會(huì)寫(xiě)入到FLASH文件中,檢測(cè)算法后來(lái)發(fā)現(xiàn)前面是脈沖噪聲會(huì)將之前的數(shù)據(jù)沖掉,沖頭再寫(xiě)。如果能調(diào)用FSEEK,那一條語(yǔ)句就完成。但因?yàn)樵撊毕荩虼诵枰{(diào)用FSCLOSE關(guān)閉文件,再調(diào)用FS_REMOVE刪除文件,接著調(diào)用FS_CREATE重新創(chuàng)建一個(gè)文件。
語(yǔ)音識(shí)別后面的3個(gè)子過(guò)程運(yùn)行在非錄音時(shí)態(tài),因此可以利用audio buffer和PCMRAM。由于后續(xù)的處理過(guò)程都需要從FLASH的文件中讀取數(shù)據(jù)來(lái)處理,每次一個(gè)扇區(qū),所以用audio buffer作為緩沖。因此語(yǔ)音識(shí)別的后續(xù)過(guò)程可采用的數(shù)據(jù)空間即是12K字節(jié)的PCMRAM。
語(yǔ)音識(shí)別的特征提取過(guò)程主要需要一個(gè)緩沖特征參數(shù)的BUFFER。其他需要申請(qǐng)的BUFFER都可以放到FAR DATA空間(即代碼空間當(dāng)數(shù)據(jù)用,但只允許當(dāng)前BANK代碼能夠使用)。如果在對(duì)語(yǔ)音分幀進(jìn)行特征提取并立刻寫(xiě)數(shù)據(jù)到FLASH特征文件,那也不需要緩沖特征參數(shù)的BUFFER,但目前80251平臺(tái)的文件系統(tǒng)暫不支持一邊讀一邊寫(xiě),所以必須給特征參數(shù)分配緩存BUFFER,等每個(gè)語(yǔ)音命令處理后再一起寫(xiě)進(jìn)FLASH特征文件。以一個(gè)命令語(yǔ)音最長(zhǎng)2秒計(jì),幀移為64點(diǎn),則共有2×8000/64 = 250幀,而每幀數(shù)據(jù)的LPC特征參數(shù)個(gè)數(shù)選16(即算法選16階LPC,每個(gè)參數(shù)2個(gè)字節(jié)),因此共需250×16×2 = 8000字節(jié)??紤]到在做模式匹配識(shí)別時(shí)需要緩沖模塊庫(kù)的一個(gè)參考詞條的特征參數(shù)和待識(shí)別詞條的特征參數(shù),2個(gè)8000字節(jié)將超過(guò)12K的PCMRAM。所以特征參數(shù)的緩沖BUFFER最多只能分配6K。有兩個(gè)選擇,一是特征參數(shù)個(gè)數(shù)選16,那最大的有效語(yǔ)音持續(xù)時(shí)間為:6×1024/(2×16×(8000/64) = 1.536秒。正常一個(gè)人說(shuō)一個(gè)命令的時(shí)間約束是可以滿足在1.5秒以?xún)?nèi)的。另一個(gè)辦法是縮小每幀數(shù)據(jù)的LPC參數(shù)個(gè)數(shù),一般語(yǔ)音識(shí)別選12階,本程序?yàn)榱颂幚砀?,選的是16階。如果選8階那會(huì)更快,但精度下降。
語(yǔ)音識(shí)別的模式匹配過(guò)程主要是需要以上講述的兩個(gè)緩沖特征參數(shù)的BUFFER。由于采用DTW算法,因此算法涉及的中間緩存都分配在FAR DATA空間。
綜上所述,80251平臺(tái)能夠在速度受限的情況下實(shí)現(xiàn)語(yǔ)音識(shí)別功能。
五、語(yǔ)音識(shí)別算法設(shè)計(jì)
六、PC端語(yǔ)音識(shí)別算法設(shè)計(jì)
任何一個(gè)移植到嵌入式平臺(tái)的算法都應(yīng)該在PC環(huán)境上調(diào)試驗(yàn)證通過(guò)后再進(jìn)行移植,而為了移植的高效,PC環(huán)境的算法設(shè)計(jì)應(yīng)該建立在熟悉目標(biāo)平臺(tái)的硬件結(jié)構(gòu)和編譯集成環(huán)境的基礎(chǔ)上。盡可能深刻地熟悉兩者,將為后面的移植帶來(lái)極大的好處,否則事倍功半。
1.模擬80251錄音過(guò)程進(jìn)行端點(diǎn)檢測(cè)
PC機(jī)用讀文件的形式模擬80251錄音的過(guò)程,詳細(xì)的端點(diǎn)檢測(cè)過(guò)程如下圖:
為了數(shù)據(jù)的一致性,PC機(jī)調(diào)試的文件都是80251錄出來(lái)的錄音文件(8K,PCM,16BIT,單聲道)。另外,因?yàn)?0251是分BANK處理語(yǔ)音識(shí)別的四個(gè)子過(guò)程,為了讓各個(gè)模塊去耦合,在WAV文件頭的一些保留區(qū)寫(xiě)入語(yǔ)音端點(diǎn)檢測(cè)的有效幀數(shù)。這樣參數(shù)提取過(guò)程就可以從文件中直接讀出該參數(shù)并進(jìn)行處理。
80251錄音結(jié)束時(shí)會(huì)自動(dòng)準(zhǔn)備好文件頭所屬的一個(gè)扇區(qū)數(shù)據(jù),而這個(gè)文件頭是包括直接的靜音段,所以最后寫(xiě)入文件頭時(shí)需要對(duì)文件頭的一些參數(shù)(如文件長(zhǎng)度)進(jìn)行修改再寫(xiě)入。
其實(shí),語(yǔ)音數(shù)據(jù)完全可以作為一個(gè)單獨(dú)的二進(jìn)制文件存在,并不需要文件頭信息。但為了調(diào)試的有效性,仍然寫(xiě)入正確的文件頭,這樣語(yǔ)音端點(diǎn)檢測(cè)結(jié)果仍然是一個(gè)WAV文件,通過(guò)聽(tīng)這個(gè)WAV文件就知道算法是否有效。
算法的結(jié)果如果能夠圖形化那會(huì)比較直觀,所以借助了MATLAB工具進(jìn)行畫(huà)圖,以輔助調(diào)試,加快調(diào)試進(jìn)度。
2.數(shù)據(jù)處理精度
80251平臺(tái)的PCM數(shù)據(jù)為16比特量化,但事實(shí)上語(yǔ)音處理時(shí)采用8比特量化就足夠了。因此對(duì)錄音數(shù)據(jù)的處理都是取高8位。這樣減少了一半的運(yùn)算量,也防止計(jì)算溢出。
雖然采用高8位數(shù)據(jù)進(jìn)行處理,但為了程序的整體運(yùn)算平滑過(guò)渡,仍然用一個(gè)16位有符號(hào)短整型去表述每一個(gè)采樣點(diǎn)。VC為short int,80251為signed int。其獲取的特征參數(shù)也選用16位有符號(hào)短整型去表述。而在運(yùn)算過(guò)程有時(shí)會(huì)采用32位有符號(hào)整型以提高運(yùn)算精度。
3.類(lèi)型移植
如上節(jié)所講,為了方便移植,必須讓VC中程序的變量和KEIL代碼的變量的類(lèi)型一致。因此在VC中需要重定義一份KEIL環(huán)境的typeext.h文件。如:
#define int16signed short int
#define int32signed int
等等。
這樣VC的主要算法可以不做任何改動(dòng)就可以放入KEIL環(huán)境進(jìn)行編譯調(diào)試。
4.浮點(diǎn)算法定點(diǎn)化
這是語(yǔ)音識(shí)別的最關(guān)鍵部分。如果在浮點(diǎn)算法定點(diǎn)化的過(guò)程中控制好累積誤差,是本系統(tǒng)最關(guān)鍵的問(wèn)題。第四部分所闡述的算法都是浮點(diǎn)算法。PC上語(yǔ)音識(shí)別的識(shí)別率很高很大程度一部分原因是因?yàn)槠溥x擇復(fù)雜的算法,另一部分原因是因?yàn)樗褂酶↑c(diǎn)數(shù),較好地控制了累積誤差。其所有的參數(shù)均通過(guò)歸一化使得運(yùn)算都在-1到1之間進(jìn)行。
浮點(diǎn)庫(kù)對(duì)于嵌入式平臺(tái)是一個(gè)極大的負(fù)擔(dān),而且運(yùn)算速度很慢。所以嵌入式產(chǎn)品的關(guān)鍵也在于浮點(diǎn)算法定點(diǎn)化過(guò)程中如何更好地控制誤差??刂普`差的一個(gè)很有效的方法就是提高數(shù)據(jù)運(yùn)算精度,但是一味地提高運(yùn)算精度會(huì)導(dǎo)致運(yùn)算溢出,所以必須在兩者之間折中考慮,以獲得一個(gè)平衡。
調(diào)試此部分功能時(shí)曾遇到一個(gè)很大的困難就是求取LPC參數(shù)時(shí)的對(duì)E的處理,因?yàn)槠湓谘h(huán)過(guò)程中曾被作為除數(shù)進(jìn)行處理,如果在循環(huán)的過(guò)程中沒(méi)做好誤差控制,那其就會(huì)在某次運(yùn)算過(guò)程中為0,所以造成結(jié)果溢出。調(diào)試過(guò)程還算比較艱辛,曾經(jīng)讓自己想起要不用浮點(diǎn)庫(kù)試試。但最后還是堅(jiān)持下來(lái)用定點(diǎn)算法繼續(xù)調(diào)試。
針對(duì)本系統(tǒng)的算法,浮點(diǎn)算法定點(diǎn)化過(guò)程主要做了以下幾個(gè)方面的考慮。
1. 如5.2節(jié)所講,錄音數(shù)據(jù)采用高8位進(jìn)行處理。
2. LPC算法的自相關(guān)系統(tǒng)進(jìn)行歸一化處理,取12比特有效數(shù)據(jù),即R(0) = 4096。而且在運(yùn)算過(guò)程中若發(fā)現(xiàn)累積和大于0x7fff時(shí)就進(jìn)行相應(yīng)移位,保證累積和在0x7fff以?xún)?nèi)。因?yàn)樗凶韵嚓P(guān)系統(tǒng)同時(shí)除以一個(gè)值,對(duì)后面的結(jié)果沒(méi)有影響。
3. LPC算法的E取32位有符號(hào)數(shù),算法運(yùn)算的中間變量也取32位。
4. LPC算的a,k等參數(shù)取12位有效數(shù)值,即在4096以?xún)?nèi)。
5. LPC算法中的除法精度到0.5以?xún)?nèi),即考慮余數(shù)與除數(shù)的關(guān)系。
6. DTW算法運(yùn)算使用32位運(yùn)算精度。
浮點(diǎn)算法定點(diǎn)化調(diào)試的一個(gè)好的經(jīng)驗(yàn)時(shí)在VC中用兩個(gè)工程分別實(shí)現(xiàn)浮點(diǎn)算法和定點(diǎn)算法,然后跟蹤每一步的運(yùn)算結(jié)果。發(fā)現(xiàn)誤差過(guò)大就及時(shí)修改調(diào)整。
5.速度優(yōu)化
算法設(shè)計(jì)時(shí)考慮到80251的乘除運(yùn)算能力有限,所以盡肯能地采用移位,查表操作,以提高運(yùn)算速度。舉例如下:
1. 預(yù)加重等過(guò)程需要乘以0.9375,就先乘120,再右移7位,即除以128。
2. 窗化處理時(shí)如果按公式調(diào)用cos等數(shù)學(xué)函數(shù),那代碼量的增長(zhǎng)和運(yùn)算速度的影響都是致命的。在這里使用查表的方式進(jìn)行處理。即在MATLAB中用hamming(128)得到127點(diǎn)信號(hào)點(diǎn),由于該信號(hào)點(diǎn)是-1到1的小數(shù),所以再將其放大1024倍,將這些數(shù)值保存到一張表中(使用FAR DATA空間),代碼運(yùn)算時(shí)先分別相乘,再右移10位就可以了。所以這里巧妙地避免了除法操作。
七、 80251平臺(tái)語(yǔ)音識(shí)別實(shí)現(xiàn)
1.算法移植
由于PC端的算法已經(jīng)盡可能地考慮了80251的錄音過(guò)程和KEIL C環(huán)境約束,所以算法移植還算比較順利,尤其是語(yǔ)音端點(diǎn)檢測(cè)部分。幾乎不做任何算法改動(dòng)就實(shí)現(xiàn)了該部分功能。當(dāng)然錄音應(yīng)用是需要進(jìn)行調(diào)整的。主要的改動(dòng)主要是UI控制和顯示,以及中間件錄音流程的修改。即在之前的寫(xiě)入操作前加入調(diào)用wav_vad函數(shù)進(jìn)行端點(diǎn)檢測(cè),確定語(yǔ)音開(kāi)始才寫(xiě)進(jìn)FLASH錄音文件。
對(duì)于特征提取、訓(xùn)練識(shí)別部分的調(diào)整,主要是分配好代碼運(yùn)行空間和FAR DATA空間。DTW算法運(yùn)算過(guò)程中的中間變量近1k字節(jié),但由于只有該部分使用,所以都分配在FAR DATA空間。
2. VC和KEIL C的比較
調(diào)試過(guò)程中還是發(fā)現(xiàn)了VC和KEIL C編譯器有不一致的地方。但由于比較隱藏,所以發(fā)現(xiàn)這部分特性也花費(fèi)了不少時(shí)間。列舉幾點(diǎn):
1. int32 m = (int32)(int16 val1* int16 val2);VC會(huì)自動(dòng)把32位的相乘結(jié)果賦給m,而KEIL C是將32位相乘結(jié)果的高16位清零再付給m。這個(gè)好像挺奇怪的,但事實(shí)就是這樣。只有把前面的強(qiáng)制類(lèi)型轉(zhuǎn)換去掉才正確。所以有時(shí)強(qiáng)制類(lèi)型轉(zhuǎn)換也未必是好事。
2. VC中用到的一部分BUFFER會(huì)自動(dòng)初始化為0,而KEIL C中不會(huì)。所以LPC算法運(yùn)算結(jié)果出現(xiàn)偏差。因?yàn)樾C(jī)和PC的識(shí)別率差別很大,所以只好用同一個(gè)文件在小機(jī)上和PC機(jī)上同時(shí)調(diào)試,以跟蹤每一步結(jié)果,最終才發(fā)現(xiàn)這個(gè)問(wèn)題。其實(shí)是編程習(xí)慣不夠好,一般在使用某段BUFFER前都應(yīng)該先清零才行。
3. VC中的short int左移會(huì)向32位擴(kuò)展,而KEIL C左移時(shí)其數(shù)值范圍并沒(méi)有加大,即丟棄超過(guò)16位的數(shù)值,沒(méi)能真正實(shí)現(xiàn)左移相乘的目的。
八、 80251平臺(tái)語(yǔ)音識(shí)別結(jié)果及其分析
80251平臺(tái)語(yǔ)音識(shí)別的識(shí)別率可以控制在93%以上(詞匯量在50以下,憑經(jīng)驗(yàn)),50以上還沒(méi)測(cè)試過(guò)。
-
嵌入式
+關(guān)注
關(guān)注
5060文章
18980瀏覽量
302243 -
神經(jīng)網(wǎng)絡(luò)
+關(guān)注
關(guān)注
42文章
4749瀏覽量
100434 -
語(yǔ)音識(shí)別
+關(guān)注
關(guān)注
38文章
1713瀏覽量
112504
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論