吳樹興,張秀琴(北京信息職業(yè)技術(shù)學(xué)院,北京100015)
在語音識別和語音合成技術(shù)中,經(jīng)常需要構(gòu)建大規(guī)模訓(xùn)練語料庫[1-6]。人工進(jìn)行錄制是建設(shè)語料庫的常用方法,但這種方法建設(shè)周期長、投入的人力巨大[7-9]。近年來,許多學(xué)者嘗試將語音識別技術(shù)引入到語料庫建設(shè)中來[10-11],其建設(shè)周期大幅縮短,同時減少了人力,但在語料庫數(shù)據(jù)量非常大時,對錯誤進(jìn)行人工調(diào)整也是非常耗時的。隨著互聯(lián)網(wǎng)的發(fā)展,音頻資源越來越豐富,同時獲取也更加方便、快捷,例如各種評書故事資源、各種講故事欄目資料,可以充分利用這些語音資源和文本資料來構(gòu)建語料庫,但需要對這些資源重新進(jìn)行加工處理。其中,將大段語料分成多個句子在構(gòu)建語料庫中是必不可少的,實現(xiàn)自動、準(zhǔn)確的切分[12-13],能夠減小人工進(jìn)行校正的工作量,縮短建設(shè)周期[14]。
在大規(guī)模語料庫的構(gòu)建中,需要把較長內(nèi)容的語音文件分割成一定字?jǐn)?shù)要求的語音數(shù)據(jù)文件和對應(yīng)的文本文件,關(guān)鍵是除了分別將語音文件和對應(yīng)文本進(jìn)行正確切分外,還能夠?qū)⑶蟹值恼Z音文件與文本內(nèi)容準(zhǔn)確無誤地相對應(yīng)。下面將具體描述本文所提出的一種比較有效的漢語語句自動切分方法。
漢語語句自動切分方法的目標(biāo)是將較長的語音文件和對應(yīng)的文本文件分割為較短的多個語音文件和相應(yīng)文本文件,并且每個語音文件的起始部分和結(jié)束部分需要具有一定的靜音段。實現(xiàn)的主要思想是首先按照文本字?jǐn)?shù)預(yù)估數(shù)據(jù)長度,在整個語音數(shù)據(jù)中預(yù)估數(shù)據(jù)段之后開始搜尋靜音位置,確定靜音位置后,在這段數(shù)據(jù)上采用能熵比法進(jìn)行元音主體數(shù)目的判斷,找到對應(yīng)文本所包含字?jǐn)?shù)的語音段,最后再確定精確的靜音位置,完成句子的切分。
圖1給出了該方法的總體框圖結(jié)構(gòu),從圖1中可以看出,該漢語語句自動切分方法的總體結(jié)構(gòu)由語音數(shù)據(jù)初始處理模塊、文本分句模塊、噪聲與信號門限估計模塊、初始單字占用時間估計模塊、數(shù)據(jù)截取模塊、元音主體數(shù)目統(tǒng)計模塊、單字占用時間預(yù)測模塊、數(shù)據(jù)切分模塊等組成。各個模塊功能和作用如下:
a)語音數(shù)據(jù)初始處理模塊:該模塊負(fù)責(zé)讀入要切分的語音數(shù)據(jù),主要進(jìn)行幅度歸一化處理,遲滯處理,通過算術(shù)平均做數(shù)據(jù)平滑處理,得到與輸入語音數(shù)據(jù)長度相等的數(shù)據(jù)Out_max_ave,最后將處理好的數(shù)據(jù)輸出給噪聲與信號門限估計模塊、初始單字占用時間估計模塊、數(shù)據(jù)截取模塊、元音主體數(shù)目統(tǒng)計模塊和數(shù)據(jù)切分模塊。
b)文本分句模塊:該模塊將一個較長的漢語文本按照要求切分成若干句子,每個句子存儲為一個文件,統(tǒng)計出整個漢語文本的字?jǐn)?shù)輸出給初始單字占用時間估計模塊,同時統(tǒng)計每個句子的字?jǐn)?shù)輸出給數(shù)據(jù)截取模塊和元音主體數(shù)目統(tǒng)計模塊。
c)噪聲與信號門限估計模塊:依據(jù)語音數(shù)據(jù)初始處理模塊得到的數(shù)據(jù)來確定噪聲與信號的門限值。為初始單字占用時間估計模塊、數(shù)據(jù)截取模塊、元音主體數(shù)目統(tǒng)計模塊、數(shù)據(jù)切分模塊4個模塊提供噪聲與信號的門限值T1。
d)初始單字占用時間估計模塊:依據(jù)語音數(shù)據(jù)初始處理模塊的輸出數(shù)據(jù)、噪聲與信號估計門限值以及文本分句模塊統(tǒng)計的總字?jǐn)?shù)來估算初始單字占用時間。
e)數(shù)據(jù)截取模塊:將初始單字占用時間、Out_max_ave、T1,數(shù)據(jù)切分模塊得到的前一句切分?jǐn)?shù)據(jù)結(jié)束點和待切分句子字?jǐn)?shù)作為輸入數(shù)據(jù),粗略估計待切分句子的切分點,輸出到元音主體數(shù)目統(tǒng)計模塊。
f)元音主體數(shù)目統(tǒng)計模塊:該模塊通過對元音主體數(shù)目的統(tǒng)計來對待切分句子的切分點進(jìn)行語句級評估。模塊中主要使用能熵比法進(jìn)行端點檢測和元音主體數(shù)目估計,具體實現(xiàn)請參見文獻(xiàn)[15]和[16]。
g)數(shù)據(jù)切分模塊:依據(jù)Out_max_ave、T1和元音主體數(shù)目統(tǒng)計模塊輸出的靜音位置點,計算出待切分句子的精確切分位置,然后從整個原始數(shù)據(jù)中截取數(shù)據(jù),存儲為語音數(shù)據(jù)文件。
該方法具體實現(xiàn)時,首先,需要準(zhǔn)備好待切分的語音數(shù)據(jù)和對應(yīng)的漢語文本文件,對這些文件進(jìn)行統(tǒng)一編號和命名,放在指定文件夾里,并建立存儲切分文件的文件夾。使用C語言、Matlab語言、Python語言等易于編程的語言來實現(xiàn)該切分方法,根據(jù)文件數(shù)量設(shè)置循環(huán)次數(shù)。下面是一個數(shù)據(jù)的切分處理過程,可以分成以下8個步驟來實現(xiàn)。
圖1 一種漢語語句自動切分方法總體框圖結(jié)構(gòu)
第1步,首先處理文本文件,將一個漢語文本按照要求切分成若干句子,每個句子存儲為一個文件。例如要求切分的每個句子要大于等于5個漢字,遇到句子結(jié)束標(biāo)點符號時則不限制字?jǐn)?shù),這步操作由文本分句模塊來實現(xiàn)。然后將要切分的語音數(shù)據(jù)輸入到語音數(shù)據(jù)初始處理模塊中,做幅度歸一化處理和遲滯處理,再將前后若干個數(shù)據(jù)取算術(shù)平均值作為該點的輸出數(shù)據(jù)記為Out_max_ave。
第2步,將Out_max_ave輸入到噪聲與信號門限估計模塊中,采用試探法來確定門限值,設(shè)門限值為k×0.001,k為正整數(shù),將k由小至大設(shè)定不同的值,得到不同的門限值,對整個語音文件的語音部分采樣點數(shù)使用計數(shù)器進(jìn)行統(tǒng)計,計算不同門限值下語音采樣點數(shù)變化率,當(dāng)這個變化率較小時,說明門限值是穩(wěn)定的,也就說明對應(yīng)的k值是合適的,此時的k×0.001就是要尋找的噪聲與信號估計門限T1。
第3步,使用語音數(shù)據(jù)Out_max_ave、噪聲與信號估計門限T1和文本分句模塊輸出的總字?jǐn)?shù)T_num,計算初始單字占用時間。將語音數(shù)據(jù)Out_max_ave所有的點,只要大于T1就認(rèn)為是語音數(shù)據(jù)部分,使用計數(shù)器統(tǒng)計語音部分的采樣點數(shù)M,使用公式Dur_s=M/fs/T_num,得到初始單字占用時間,其中,fs是采樣率。
第4步,將語音數(shù)據(jù)Out_max_ave、T1、上一步得到的初始單字占用時間Dur_s和待切分句子字?jǐn)?shù)Num_s輸入至數(shù)據(jù)截取模塊,獲得待切分句子的切分點。其方法是對數(shù)據(jù)Out_max_ave從頭向后搜索,當(dāng)大于門限值T1的采樣點總數(shù)大于等于Num_s×Dur_s×2×fs時,該采樣點為待切分句子的結(jié)束點,記為pos_end,跳轉(zhuǎn)至第6步。
第5步,將語音數(shù)據(jù)Out_max_ave、T1、前一句語音數(shù)據(jù)、前一句切分?jǐn)?shù)據(jù)結(jié)束點Pre_pos和待切分句子字?jǐn)?shù)輸入至數(shù)據(jù)截取模塊,獲得待切分句子的切分點。
a)統(tǒng)計前一句語音數(shù)據(jù)的語音采樣點數(shù)(值大于T1),記為 v_counter_s,用 t1=v_counter_s/fs/Num_s得到前一句的平均單字占用時間,這里字?jǐn)?shù)Num_s是由文本分句模塊計算的前一句的字?jǐn)?shù)。
b)然后根據(jù)計算得到的平均單字占用時間來預(yù)測當(dāng)前句所占用時間。如果當(dāng)前句之前的第3句占用時間為t3,當(dāng)前句之前的第2句所占用時間為t2,當(dāng)前句之前的第1句所占用時間為t1,預(yù)測當(dāng)前句單字占用時間為(如果當(dāng)前句是第2句,則t=t,如果當(dāng)前句是第3句,則),因此,得到當(dāng)1前句所占用時間為t_cur=t×Num_s×1.3,其中,Num_s為當(dāng)前句字?jǐn)?shù),系數(shù)1.3是為了保證能夠取到足夠的數(shù)據(jù)量。這一部分對應(yīng)著數(shù)據(jù)截取模塊中的單字占用時間預(yù)測。
c)從數(shù)據(jù)切分模塊輸出的前一句語音數(shù)據(jù)的結(jié)束點Pre_pos開始向后搜索Out_max_ave,使用T1作為門限,找到待切分句子的結(jié)束點(當(dāng)大于T1的采樣點總數(shù)大于等于t_cur時),記為Pos_end。
第6步,從上一步得到的pos_end位置開始向采樣點索引減小方向?qū)φZ音數(shù)據(jù)Out_max_ave進(jìn)行搜索,如果搜索到連續(xù)1 s Out_max_ave的值小于T1,停止搜索,該位置即為靜音段,記為v_end,將前一句語音數(shù)據(jù)的結(jié)束點Pre_pos作為起始點,v_end作為結(jié)束點截取數(shù)據(jù),輸入到元音主體數(shù)目統(tǒng)計模塊中,得到這段數(shù)據(jù)的元音主體個數(shù),由于音節(jié)數(shù)目與元音主體數(shù)目是一致的,也就得到了這一段數(shù)據(jù)的字?jǐn)?shù),將這一字?jǐn)?shù)與文本統(tǒng)計出的字?jǐn)?shù)進(jìn)行比較,如果這一字?jǐn)?shù)大于文本統(tǒng)計出的字?jǐn)?shù),繼續(xù)向采樣點索引減小方向搜索,先搜索語音段,如果搜索到連續(xù)0.05 s Out_max_ave的值大于T1,該位置即為語音段,繼續(xù)向采樣點索引減小方向搜索靜音段,如果搜索到連續(xù)0.3 s Out_max_ave的值小于T1,停止搜索,該位置即為靜音段,將該位置記為Sil_pos,去掉該點后邊的數(shù)據(jù),得到的數(shù)據(jù)段,輸入到元音主體數(shù)目統(tǒng)計模塊中,得到這段數(shù)據(jù)的元音主體個數(shù),繼續(xù)將這一字?jǐn)?shù)與文本統(tǒng)計出的字?jǐn)?shù)進(jìn)行比較,如果這一字?jǐn)?shù)大于文本統(tǒng)計出的字?jǐn)?shù),則重復(fù)這一過程,如果小于,則停止。找到與文本統(tǒng)計出的字?jǐn)?shù)最接近的元音主體數(shù)目,相應(yīng)的靜音段即為所尋找的靜音段,更新Sil_pos值。
第7步,將第6步得到的靜音段的位置點Sil_pos,輸入到數(shù)據(jù)切分模塊。在數(shù)據(jù)切分模塊中,由位置點Sil_pos開始分別向采樣點索引減小方向和采樣點索引增大方向搜索,如果搜索到連續(xù)0.1 s Out_max_ave的值大于T1,則認(rèn)為搜索到語音段邊界,較小索引值記為begin_s,較大索引值記為end_s,中間索引值(be?gin_s+end_s)/2向下取整作為當(dāng)前句語音數(shù)據(jù)的結(jié)束點,將前一句語音數(shù)據(jù)的結(jié)束點Pre_pos作為當(dāng)前句語音數(shù)據(jù)的起始點(如果當(dāng)前句是首句,則當(dāng)前句語音數(shù)據(jù)的起始點即為原始數(shù)據(jù)的起始點),從整個原始數(shù)據(jù)中截取數(shù)據(jù),存儲為當(dāng)前句的語音數(shù)據(jù)文件。最后使用當(dāng)前句語音數(shù)據(jù)的結(jié)束點來更新Pre_pos。
第8步,如果整個數(shù)據(jù)都被切分完成,則結(jié)束,否者重復(fù)執(zhí)行第5步至第7步。
為了驗證前面所提出的漢語語句自動切分方法,對單田芳的評書資源《白眉大俠》進(jìn)行切分,該評書一共有320集,每集對應(yīng)一個語音文件和一個文本文件,每集大約20多分鐘,共100多小時的語音資料。
要求切分的每個句子要大于等于5個字,遇到句子結(jié)束標(biāo)點符號時則不限制字?jǐn)?shù),按照此要求,每一集只有把全部的句子正確切分出來才算正確切分,首先對320集的語音文件和文本文件使用相同的參數(shù),進(jìn)行切分,能夠成功完成切分297集,23集發(fā)生錯誤,成功率為92.8%,稱為一次成功率,我們再對發(fā)生錯誤的23集,每一集調(diào)整合適的參數(shù),使得能夠進(jìn)行正確切分,最終可以成功完成切分11集,12集無法自動進(jìn)行切分,成功率為96.3%,稱為二次成功率。
將這12集進(jìn)行手動切分,使用Matlab工具將語音數(shù)據(jù)讀入,找到位于文件中間段落間停頓(也稱為靜音段)較大的位置,取該靜音段的中間位置作為切分點,將該文件一分為二,然后再將這個靜音段之前一句和之后的一句話聽辨出來,根據(jù)所聽辨出的文字,在對應(yīng)的文本文件中找到該靜音段所對應(yīng)的位置,將對應(yīng)的文本文件按照這個位置一分為二,這樣就將語音文件和對應(yīng)的文本文件各自分成了2個文件,并進(jìn)行存儲,無法自動切分成功的12集語音數(shù)據(jù)和對應(yīng)文本數(shù)據(jù),按照此方法進(jìn)行切分,共形成24個語音文件和24個文本文件,然后再使用自動切分算法進(jìn)行自動切分,仍然有5個文件發(fā)生錯誤,對這5個文件再進(jìn)行人工切分,每個文件仍然一分為二,形成10個語音文件,再對文本文件進(jìn)行切分,也形成10個對應(yīng)文本文件,再進(jìn)行自動切分,…,直至完成所有句子的切分。
最后共切分出125 928個句子,整個過程共耗時45 h,時間主要用在參數(shù)調(diào)整和手動切分上。在手動切分過程中發(fā)現(xiàn)最終有32個句子仍然無法切分出正確結(jié)果,這些語音文件和文本不采用,產(chǎn)生這些錯誤的原因是語音中存在其他干擾,因此無法進(jìn)行切分。
本文提出了一種用于大規(guī)模語料庫構(gòu)建中的漢語語句自動切分方法。它可以把較長內(nèi)容的語音文件切分成一定字?jǐn)?shù)要求的多個語音數(shù)據(jù)文件和對應(yīng)的文本文件。使用該方法,對100多小時的語音文件和文本文件進(jìn)行了切分,實驗結(jié)果表明,這里所提出的語句自動切分方法相比于傳統(tǒng)的錄音方案和語音識別再進(jìn)行人工調(diào)整的方案,準(zhǔn)確率高,并且人工參與的工作量非常小,適合快速構(gòu)建語料庫。另外,該方法在參數(shù)的適應(yīng)性方面仍然存在改進(jìn)的空間。