吳樹(shù)興,張秀琴(北京信息職業(yè)技術(shù)學(xué)院,北京100015)
在語(yǔ)音識(shí)別和語(yǔ)音合成技術(shù)中,經(jīng)常需要構(gòu)建大規(guī)模訓(xùn)練語(yǔ)料庫(kù)[1-6]。人工進(jìn)行錄制是建設(shè)語(yǔ)料庫(kù)的常用方法,但這種方法建設(shè)周期長(zhǎng)、投入的人力巨大[7-9]。近年來(lái),許多學(xué)者嘗試將語(yǔ)音識(shí)別技術(shù)引入到語(yǔ)料庫(kù)建設(shè)中來(lái)[10-11],其建設(shè)周期大幅縮短,同時(shí)減少了人力,但在語(yǔ)料庫(kù)數(shù)據(jù)量非常大時(shí),對(duì)錯(cuò)誤進(jìn)行人工調(diào)整也是非常耗時(shí)的。隨著互聯(lián)網(wǎng)的發(fā)展,音頻資源越來(lái)越豐富,同時(shí)獲取也更加方便、快捷,例如各種評(píng)書(shū)故事資源、各種講故事欄目資料,可以充分利用這些語(yǔ)音資源和文本資料來(lái)構(gòu)建語(yǔ)料庫(kù),但需要對(duì)這些資源重新進(jìn)行加工處理。其中,將大段語(yǔ)料分成多個(gè)句子在構(gòu)建語(yǔ)料庫(kù)中是必不可少的,實(shí)現(xiàn)自動(dòng)、準(zhǔn)確的切分[12-13],能夠減小人工進(jìn)行校正的工作量,縮短建設(shè)周期[14]。
在大規(guī)模語(yǔ)料庫(kù)的構(gòu)建中,需要把較長(zhǎng)內(nèi)容的語(yǔ)音文件分割成一定字?jǐn)?shù)要求的語(yǔ)音數(shù)據(jù)文件和對(duì)應(yīng)的文本文件,關(guān)鍵是除了分別將語(yǔ)音文件和對(duì)應(yīng)文本進(jìn)行正確切分外,還能夠?qū)⑶蟹值恼Z(yǔ)音文件與文本內(nèi)容準(zhǔn)確無(wú)誤地相對(duì)應(yīng)。下面將具體描述本文所提出的一種比較有效的漢語(yǔ)語(yǔ)句自動(dòng)切分方法。
漢語(yǔ)語(yǔ)句自動(dòng)切分方法的目標(biāo)是將較長(zhǎng)的語(yǔ)音文件和對(duì)應(yīng)的文本文件分割為較短的多個(gè)語(yǔ)音文件和相應(yīng)文本文件,并且每個(gè)語(yǔ)音文件的起始部分和結(jié)束部分需要具有一定的靜音段。實(shí)現(xiàn)的主要思想是首先按照文本字?jǐn)?shù)預(yù)估數(shù)據(jù)長(zhǎng)度,在整個(gè)語(yǔ)音數(shù)據(jù)中預(yù)估數(shù)據(jù)段之后開(kāi)始搜尋靜音位置,確定靜音位置后,在這段數(shù)據(jù)上采用能熵比法進(jìn)行元音主體數(shù)目的判斷,找到對(duì)應(yīng)文本所包含字?jǐn)?shù)的語(yǔ)音段,最后再確定精確的靜音位置,完成句子的切分。
圖1給出了該方法的總體框圖結(jié)構(gòu),從圖1中可以看出,該漢語(yǔ)語(yǔ)句自動(dòng)切分方法的總體結(jié)構(gòu)由語(yǔ)音數(shù)據(jù)初始處理模塊、文本分句模塊、噪聲與信號(hào)門(mén)限估計(jì)模塊、初始單字占用時(shí)間估計(jì)模塊、數(shù)據(jù)截取模塊、元音主體數(shù)目統(tǒng)計(jì)模塊、單字占用時(shí)間預(yù)測(cè)模塊、數(shù)據(jù)切分模塊等組成。各個(gè)模塊功能和作用如下:
a)語(yǔ)音數(shù)據(jù)初始處理模塊:該模塊負(fù)責(zé)讀入要切分的語(yǔ)音數(shù)據(jù),主要進(jìn)行幅度歸一化處理,遲滯處理,通過(guò)算術(shù)平均做數(shù)據(jù)平滑處理,得到與輸入語(yǔ)音數(shù)據(jù)長(zhǎng)度相等的數(shù)據(jù)Out_max_ave,最后將處理好的數(shù)據(jù)輸出給噪聲與信號(hào)門(mén)限估計(jì)模塊、初始單字占用時(shí)間估計(jì)模塊、數(shù)據(jù)截取模塊、元音主體數(shù)目統(tǒng)計(jì)模塊和數(shù)據(jù)切分模塊。
b)文本分句模塊:該模塊將一個(gè)較長(zhǎng)的漢語(yǔ)文本按照要求切分成若干句子,每個(gè)句子存儲(chǔ)為一個(gè)文件,統(tǒng)計(jì)出整個(gè)漢語(yǔ)文本的字?jǐn)?shù)輸出給初始單字占用時(shí)間估計(jì)模塊,同時(shí)統(tǒng)計(jì)每個(gè)句子的字?jǐn)?shù)輸出給數(shù)據(jù)截取模塊和元音主體數(shù)目統(tǒng)計(jì)模塊。
c)噪聲與信號(hào)門(mén)限估計(jì)模塊:依據(jù)語(yǔ)音數(shù)據(jù)初始處理模塊得到的數(shù)據(jù)來(lái)確定噪聲與信號(hào)的門(mén)限值。為初始單字占用時(shí)間估計(jì)模塊、數(shù)據(jù)截取模塊、元音主體數(shù)目統(tǒng)計(jì)模塊、數(shù)據(jù)切分模塊4個(gè)模塊提供噪聲與信號(hào)的門(mén)限值T1。
d)初始單字占用時(shí)間估計(jì)模塊:依據(jù)語(yǔ)音數(shù)據(jù)初始處理模塊的輸出數(shù)據(jù)、噪聲與信號(hào)估計(jì)門(mén)限值以及文本分句模塊統(tǒng)計(jì)的總字?jǐn)?shù)來(lái)估算初始單字占用時(shí)間。
e)數(shù)據(jù)截取模塊:將初始單字占用時(shí)間、Out_max_ave、T1,數(shù)據(jù)切分模塊得到的前一句切分?jǐn)?shù)據(jù)結(jié)束點(diǎn)和待切分句子字?jǐn)?shù)作為輸入數(shù)據(jù),粗略估計(jì)待切分句子的切分點(diǎn),輸出到元音主體數(shù)目統(tǒng)計(jì)模塊。
f)元音主體數(shù)目統(tǒng)計(jì)模塊:該模塊通過(guò)對(duì)元音主體數(shù)目的統(tǒng)計(jì)來(lái)對(duì)待切分句子的切分點(diǎn)進(jìn)行語(yǔ)句級(jí)評(píng)估。模塊中主要使用能熵比法進(jìn)行端點(diǎn)檢測(cè)和元音主體數(shù)目估計(jì),具體實(shí)現(xiàn)請(qǐng)參見(jiàn)文獻(xiàn)[15]和[16]。
g)數(shù)據(jù)切分模塊:依據(jù)Out_max_ave、T1和元音主體數(shù)目統(tǒng)計(jì)模塊輸出的靜音位置點(diǎn),計(jì)算出待切分句子的精確切分位置,然后從整個(gè)原始數(shù)據(jù)中截取數(shù)據(jù),存儲(chǔ)為語(yǔ)音數(shù)據(jù)文件。
該方法具體實(shí)現(xiàn)時(shí),首先,需要準(zhǔn)備好待切分的語(yǔ)音數(shù)據(jù)和對(duì)應(yīng)的漢語(yǔ)文本文件,對(duì)這些文件進(jìn)行統(tǒng)一編號(hào)和命名,放在指定文件夾里,并建立存儲(chǔ)切分文件的文件夾。使用C語(yǔ)言、Matlab語(yǔ)言、Python語(yǔ)言等易于編程的語(yǔ)言來(lái)實(shí)現(xiàn)該切分方法,根據(jù)文件數(shù)量設(shè)置循環(huán)次數(shù)。下面是一個(gè)數(shù)據(jù)的切分處理過(guò)程,可以分成以下8個(gè)步驟來(lái)實(shí)現(xiàn)。

圖1 一種漢語(yǔ)語(yǔ)句自動(dòng)切分方法總體框圖結(jié)構(gòu)
第1步,首先處理文本文件,將一個(gè)漢語(yǔ)文本按照要求切分成若干句子,每個(gè)句子存儲(chǔ)為一個(gè)文件。例如要求切分的每個(gè)句子要大于等于5個(gè)漢字,遇到句子結(jié)束標(biāo)點(diǎn)符號(hào)時(shí)則不限制字?jǐn)?shù),這步操作由文本分句模塊來(lái)實(shí)現(xiàn)。然后將要切分的語(yǔ)音數(shù)據(jù)輸入到語(yǔ)音數(shù)據(jù)初始處理模塊中,做幅度歸一化處理和遲滯處理,再將前后若干個(gè)數(shù)據(jù)取算術(shù)平均值作為該點(diǎn)的輸出數(shù)據(jù)記為Out_max_ave。
第2步,將Out_max_ave輸入到噪聲與信號(hào)門(mén)限估計(jì)模塊中,采用試探法來(lái)確定門(mén)限值,設(shè)門(mén)限值為k×0.001,k為正整數(shù),將k由小至大設(shè)定不同的值,得到不同的門(mén)限值,對(duì)整個(gè)語(yǔ)音文件的語(yǔ)音部分采樣點(diǎn)數(shù)使用計(jì)數(shù)器進(jìn)行統(tǒng)計(jì),計(jì)算不同門(mén)限值下語(yǔ)音采樣點(diǎn)數(shù)變化率,當(dāng)這個(gè)變化率較小時(shí),說(shuō)明門(mén)限值是穩(wěn)定的,也就說(shuō)明對(duì)應(yīng)的k值是合適的,此時(shí)的k×0.001就是要尋找的噪聲與信號(hào)估計(jì)門(mén)限T1。
第3步,使用語(yǔ)音數(shù)據(jù)Out_max_ave、噪聲與信號(hào)估計(jì)門(mén)限T1和文本分句模塊輸出的總字?jǐn)?shù)T_num,計(jì)算初始單字占用時(shí)間。將語(yǔ)音數(shù)據(jù)Out_max_ave所有的點(diǎn),只要大于T1就認(rèn)為是語(yǔ)音數(shù)據(jù)部分,使用計(jì)數(shù)器統(tǒng)計(jì)語(yǔ)音部分的采樣點(diǎn)數(shù)M,使用公式Dur_s=M/fs/T_num,得到初始單字占用時(shí)間,其中,fs是采樣率。
第4步,將語(yǔ)音數(shù)據(jù)Out_max_ave、T1、上一步得到的初始單字占用時(shí)間Dur_s和待切分句子字?jǐn)?shù)Num_s輸入至數(shù)據(jù)截取模塊,獲得待切分句子的切分點(diǎn)。其方法是對(duì)數(shù)據(jù)Out_max_ave從頭向后搜索,當(dāng)大于門(mén)限值T1的采樣點(diǎn)總數(shù)大于等于Num_s×Dur_s×2×fs時(shí),該采樣點(diǎn)為待切分句子的結(jié)束點(diǎn),記為pos_end,跳轉(zhuǎn)至第6步。
第5步,將語(yǔ)音數(shù)據(jù)Out_max_ave、T1、前一句語(yǔ)音數(shù)據(jù)、前一句切分?jǐn)?shù)據(jù)結(jié)束點(diǎn)Pre_pos和待切分句子字?jǐn)?shù)輸入至數(shù)據(jù)截取模塊,獲得待切分句子的切分點(diǎn)。
a)統(tǒng)計(jì)前一句語(yǔ)音數(shù)據(jù)的語(yǔ)音采樣點(diǎn)數(shù)(值大于T1),記為 v_counter_s,用 t1=v_counter_s/fs/Num_s得到前一句的平均單字占用時(shí)間,這里字?jǐn)?shù)Num_s是由文本分句模塊計(jì)算的前一句的字?jǐn)?shù)。
b)然后根據(jù)計(jì)算得到的平均單字占用時(shí)間來(lái)預(yù)測(cè)當(dāng)前句所占用時(shí)間。如果當(dāng)前句之前的第3句占用時(shí)間為t3,當(dāng)前句之前的第2句所占用時(shí)間為t2,當(dāng)前句之前的第1句所占用時(shí)間為t1,預(yù)測(cè)當(dāng)前句單字占用時(shí)間為(如果當(dāng)前句是第2句,則t=t,如果當(dāng)前句是第3句,則),因此,得到當(dāng)1前句所占用時(shí)間為t_cur=t×Num_s×1.3,其中,Num_s為當(dāng)前句字?jǐn)?shù),系數(shù)1.3是為了保證能夠取到足夠的數(shù)據(jù)量。這一部分對(duì)應(yīng)著數(shù)據(jù)截取模塊中的單字占用時(shí)間預(yù)測(cè)。
c)從數(shù)據(jù)切分模塊輸出的前一句語(yǔ)音數(shù)據(jù)的結(jié)束點(diǎn)Pre_pos開(kāi)始向后搜索Out_max_ave,使用T1作為門(mén)限,找到待切分句子的結(jié)束點(diǎn)(當(dāng)大于T1的采樣點(diǎn)總數(shù)大于等于t_cur時(shí)),記為Pos_end。
第6步,從上一步得到的pos_end位置開(kāi)始向采樣點(diǎn)索引減小方向?qū)φZ(yǔ)音數(shù)據(jù)Out_max_ave進(jìn)行搜索,如果搜索到連續(xù)1 s Out_max_ave的值小于T1,停止搜索,該位置即為靜音段,記為v_end,將前一句語(yǔ)音數(shù)據(jù)的結(jié)束點(diǎn)Pre_pos作為起始點(diǎn),v_end作為結(jié)束點(diǎn)截取數(shù)據(jù),輸入到元音主體數(shù)目統(tǒng)計(jì)模塊中,得到這段數(shù)據(jù)的元音主體個(gè)數(shù),由于音節(jié)數(shù)目與元音主體數(shù)目是一致的,也就得到了這一段數(shù)據(jù)的字?jǐn)?shù),將這一字?jǐn)?shù)與文本統(tǒng)計(jì)出的字?jǐn)?shù)進(jìn)行比較,如果這一字?jǐn)?shù)大于文本統(tǒng)計(jì)出的字?jǐn)?shù),繼續(xù)向采樣點(diǎn)索引減小方向搜索,先搜索語(yǔ)音段,如果搜索到連續(xù)0.05 s Out_max_ave的值大于T1,該位置即為語(yǔ)音段,繼續(xù)向采樣點(diǎn)索引減小方向搜索靜音段,如果搜索到連續(xù)0.3 s Out_max_ave的值小于T1,停止搜索,該位置即為靜音段,將該位置記為Sil_pos,去掉該點(diǎn)后邊的數(shù)據(jù),得到的數(shù)據(jù)段,輸入到元音主體數(shù)目統(tǒng)計(jì)模塊中,得到這段數(shù)據(jù)的元音主體個(gè)數(shù),繼續(xù)將這一字?jǐn)?shù)與文本統(tǒng)計(jì)出的字?jǐn)?shù)進(jìn)行比較,如果這一字?jǐn)?shù)大于文本統(tǒng)計(jì)出的字?jǐn)?shù),則重復(fù)這一過(guò)程,如果小于,則停止。找到與文本統(tǒng)計(jì)出的字?jǐn)?shù)最接近的元音主體數(shù)目,相應(yīng)的靜音段即為所尋找的靜音段,更新Sil_pos值。
第7步,將第6步得到的靜音段的位置點(diǎn)Sil_pos,輸入到數(shù)據(jù)切分模塊。在數(shù)據(jù)切分模塊中,由位置點(diǎn)Sil_pos開(kāi)始分別向采樣點(diǎn)索引減小方向和采樣點(diǎn)索引增大方向搜索,如果搜索到連續(xù)0.1 s Out_max_ave的值大于T1,則認(rèn)為搜索到語(yǔ)音段邊界,較小索引值記為begin_s,較大索引值記為end_s,中間索引值(be?gin_s+end_s)/2向下取整作為當(dāng)前句語(yǔ)音數(shù)據(jù)的結(jié)束點(diǎn),將前一句語(yǔ)音數(shù)據(jù)的結(jié)束點(diǎn)Pre_pos作為當(dāng)前句語(yǔ)音數(shù)據(jù)的起始點(diǎn)(如果當(dāng)前句是首句,則當(dāng)前句語(yǔ)音數(shù)據(jù)的起始點(diǎn)即為原始數(shù)據(jù)的起始點(diǎn)),從整個(gè)原始數(shù)據(jù)中截取數(shù)據(jù),存儲(chǔ)為當(dāng)前句的語(yǔ)音數(shù)據(jù)文件。最后使用當(dāng)前句語(yǔ)音數(shù)據(jù)的結(jié)束點(diǎn)來(lái)更新Pre_pos。
第8步,如果整個(gè)數(shù)據(jù)都被切分完成,則結(jié)束,否者重復(fù)執(zhí)行第5步至第7步。
為了驗(yàn)證前面所提出的漢語(yǔ)語(yǔ)句自動(dòng)切分方法,對(duì)單田芳的評(píng)書(shū)資源《白眉大俠》進(jìn)行切分,該評(píng)書(shū)一共有320集,每集對(duì)應(yīng)一個(gè)語(yǔ)音文件和一個(gè)文本文件,每集大約20多分鐘,共100多小時(shí)的語(yǔ)音資料。
要求切分的每個(gè)句子要大于等于5個(gè)字,遇到句子結(jié)束標(biāo)點(diǎn)符號(hào)時(shí)則不限制字?jǐn)?shù),按照此要求,每一集只有把全部的句子正確切分出來(lái)才算正確切分,首先對(duì)320集的語(yǔ)音文件和文本文件使用相同的參數(shù),進(jìn)行切分,能夠成功完成切分297集,23集發(fā)生錯(cuò)誤,成功率為92.8%,稱(chēng)為一次成功率,我們?cè)賹?duì)發(fā)生錯(cuò)誤的23集,每一集調(diào)整合適的參數(shù),使得能夠進(jìn)行正確切分,最終可以成功完成切分11集,12集無(wú)法自動(dòng)進(jìn)行切分,成功率為96.3%,稱(chēng)為二次成功率。
將這12集進(jìn)行手動(dòng)切分,使用Matlab工具將語(yǔ)音數(shù)據(jù)讀入,找到位于文件中間段落間停頓(也稱(chēng)為靜音段)較大的位置,取該靜音段的中間位置作為切分點(diǎn),將該文件一分為二,然后再將這個(gè)靜音段之前一句和之后的一句話聽(tīng)辨出來(lái),根據(jù)所聽(tīng)辨出的文字,在對(duì)應(yīng)的文本文件中找到該靜音段所對(duì)應(yīng)的位置,將對(duì)應(yīng)的文本文件按照這個(gè)位置一分為二,這樣就將語(yǔ)音文件和對(duì)應(yīng)的文本文件各自分成了2個(gè)文件,并進(jìn)行存儲(chǔ),無(wú)法自動(dòng)切分成功的12集語(yǔ)音數(shù)據(jù)和對(duì)應(yīng)文本數(shù)據(jù),按照此方法進(jìn)行切分,共形成24個(gè)語(yǔ)音文件和24個(gè)文本文件,然后再使用自動(dòng)切分算法進(jìn)行自動(dòng)切分,仍然有5個(gè)文件發(fā)生錯(cuò)誤,對(duì)這5個(gè)文件再進(jìn)行人工切分,每個(gè)文件仍然一分為二,形成10個(gè)語(yǔ)音文件,再對(duì)文本文件進(jìn)行切分,也形成10個(gè)對(duì)應(yīng)文本文件,再進(jìn)行自動(dòng)切分,…,直至完成所有句子的切分。
最后共切分出125 928個(gè)句子,整個(gè)過(guò)程共耗時(shí)45 h,時(shí)間主要用在參數(shù)調(diào)整和手動(dòng)切分上。在手動(dòng)切分過(guò)程中發(fā)現(xiàn)最終有32個(gè)句子仍然無(wú)法切分出正確結(jié)果,這些語(yǔ)音文件和文本不采用,產(chǎn)生這些錯(cuò)誤的原因是語(yǔ)音中存在其他干擾,因此無(wú)法進(jìn)行切分。
本文提出了一種用于大規(guī)模語(yǔ)料庫(kù)構(gòu)建中的漢語(yǔ)語(yǔ)句自動(dòng)切分方法。它可以把較長(zhǎng)內(nèi)容的語(yǔ)音文件切分成一定字?jǐn)?shù)要求的多個(gè)語(yǔ)音數(shù)據(jù)文件和對(duì)應(yīng)的文本文件。使用該方法,對(duì)100多小時(shí)的語(yǔ)音文件和文本文件進(jìn)行了切分,實(shí)驗(yàn)結(jié)果表明,這里所提出的語(yǔ)句自動(dòng)切分方法相比于傳統(tǒng)的錄音方案和語(yǔ)音識(shí)別再進(jìn)行人工調(diào)整的方案,準(zhǔn)確率高,并且人工參與的工作量非常小,適合快速構(gòu)建語(yǔ)料庫(kù)。另外,該方法在參數(shù)的適應(yīng)性方面仍然存在改進(jìn)的空間。