WORLD是一個(gè)基于C語言的開源語音合成系統(tǒng),語音合成主要包括波形拼接和參數(shù)合成兩種方法,WORLD是一種基于vocoder的參數(shù)合成方法,它相比于STRAIGHT的優(yōu)勢(shì)是減少了計(jì)算復(fù)雜度,并且可以應(yīng)用于實(shí)時(shí)的語音合成。由于STRAIGHT不是開源的系統(tǒng),并且在WORLD論文中已經(jīng)對(duì)比了WORLD相比于STRAIGHT無論是在合成的音頻質(zhì)量上還是合成速度上都處于領(lǐng)先優(yōu)勢(shì),所以這里我不準(zhǔn)備介紹STRAIGHT,我們今天主要講一下WORLD語音合成系統(tǒng)的原理以及使用方法。
WORLD系統(tǒng)如下圖所示,包含三個(gè)模塊,分別是DIO、CheapTrick、PLATINUM,其中DIO的作用是用來估計(jì)一段波形的Fundamental Frequency(簡(jiǎn)稱F0),CheapTrick算法是根據(jù)波形和F0來計(jì)算spectral envelope,PLATINUM算法是基于波形、F0和spectral envelope來計(jì)算aperiodic parameter,下面我們來分別看這些參數(shù)的計(jì)算原理。
1. F0的計(jì)算
F0在維基百科中的定義是:當(dāng)發(fā)聲體由于振動(dòng)而發(fā)出聲音時(shí),聲音一般可以分解為許多單純的正弦波,所有的自然聲音基本都是由許多頻率不同的正弦波組成的,其中頻率最低的正弦波即為基音,而其他頻率較高的正弦波則為泛音,即這些不同正弦波中的最低頻率稱為基頻。F0是一種非常常用的可以表示聲音的特征,在WORLD中,F(xiàn)0的計(jì)算是基于DIO算法,DIO算法主要包含如下三個(gè)步驟:
第一步:使用不同的截止頻率的低通濾波器,如果濾波后的信號(hào)只包含基頻,那么它就是一個(gè)正弦波,由于事先我們對(duì)F0并不知曉,需要多次試探,所以在這一步中會(huì)有很多不同截止頻率的濾波器被使用;
第二步:計(jì)算每一個(gè)濾波后的信號(hào)中的候選基頻以及可信度,由于只包含基頻的信號(hào)應(yīng)該是一個(gè)正弦波,因此如下圖所示,四個(gè)區(qū)間的跨度應(yīng)該基本相等,我們可以計(jì)算四個(gè)跨度的平均值,用這個(gè)值的倒數(shù)來表示候選基頻。同時(shí),計(jì)算這四個(gè)跨度的標(biāo)準(zhǔn)差來作為衡量基頻可信度的指標(biāo),標(biāo)準(zhǔn)差越大,說明跨度長短差異較大,那么取此頻率作為基頻的可信度就較低。
第三步:選取可信度最高的候選基頻作為最終的基頻。
2. 用于估計(jì)頻譜包絡(luò)的CheapTrick算法
首先,我們需要明白什么是語音的頻譜包絡(luò),語音是一個(gè)時(shí)序信號(hào),例如對(duì)于一個(gè)采樣頻率為16kHz的音頻文件,意味著在這個(gè)音頻中,每一秒包含16000個(gè)采樣點(diǎn),這些采樣點(diǎn)在計(jì)算機(jī)中以某種數(shù)據(jù)形式進(jìn)行存儲(chǔ)著(例如常見的有16bit整型),當(dāng)我們使用矩形窗函數(shù)對(duì)一段音頻進(jìn)行處理,它就被劃分成多個(gè)幀,于是得到了多個(gè)子序列,然后對(duì)每個(gè)子序列進(jìn)行傅里葉變換操作,就得到了頻率-振幅圖,將這些圖在時(shí)間維度上展現(xiàn)出來,就得到了這個(gè)語音文件的spectrogram。一張實(shí)際的spectrogram如下圖所示。
頻譜包絡(luò)實(shí)際上是在一個(gè)頻率-振幅圖中,將每個(gè)頻率共振峰用平滑的曲線連接起來,而這個(gè)平滑的曲線就是語音的頻譜包絡(luò),下圖展示了頻譜包絡(luò)在頻譜圖中的位置。
確定這個(gè)頻譜包絡(luò)的算法有很多,例如常見的是倒譜法(Cepstrum,有趣的是,cepstrum與spectrum兩個(gè)單詞只是開頭四個(gè)字母翻轉(zhuǎn)了位置而已,這其實(shí)也暗示了它們的物理含義有某種巧合的關(guān)聯(lián)...),在WORLD中,使用的是CheapTrick算法來估計(jì)頻譜包絡(luò),該算法工作流程如下:
首先,對(duì)信號(hào)添加Hanning window,然后對(duì)windowed之后的信號(hào)計(jì)算其功率,公式如下(1)所示;
其次,使用矩形窗函數(shù)對(duì)功率譜進(jìn)行平滑化,公式如下(2)所示;
最后,計(jì)算功率譜的倒譜,并做倒譜提升,公式如下(3)(4)(5)(6)所示;
最終得到的Pl(w)就是我們所需要的頻譜包絡(luò)。
3. Aperiodic參數(shù)提取算法
aperiodic是與混合激勵(lì)相關(guān)的參數(shù),為了獲得自然的聲音,激勵(lì)源不能只使用周期信號(hào),也需要包含一些非周期信號(hào)。在WORLD中,aperiodic參數(shù)可以直接基于波形、F0、頻譜包絡(luò)來計(jì)算得到。這種算法叫做PLATINUM,它的工作流程如下:
首先,對(duì)波形添加寬度為2T0的窗函數(shù),并計(jì)算得到其頻譜X(w);將X(w)除以最小相譜Sm(w)得到Xp(w),公式如(11)所示;對(duì)Xp(w)進(jìn)行逆iFFT,即可得到激勵(lì)信號(hào),公式如(10)所示;
最終的語音合成是通過將最小相譜與激勵(lì)信號(hào)進(jìn)行卷積得到。
最后,來看一下如何調(diào)用WORLD來合成一段語音以及合成的效果。WORLD源代碼是基于C語言的,但是WORLD也有一個(gè)Python wrapper庫——PyWorld,為了代碼簡(jiǎn)潔起見,這里我們使用PyWorld來演示。
在終端運(yùn)行pip install pyworld以及pip install soundfile即可安裝PyWorld庫,該庫中提供了一個(gè)demo代碼,可以用來演示語音合成。下面一段代碼就是使用WORLD庫來提取音頻特征,并將此特征基于vocoder合成新的音頻,原始音頻和新的音頻的波形圖對(duì)比如下圖所示。
#獲取音頻的采樣點(diǎn)數(shù)值以及采樣率x, fs = sf.read('utterance/vaiueo2d.wav')#使用DIO算法計(jì)算音頻的基頻F0_f0, t = pw.dio(x, fs, f0_floor=50.0, f0_ceil=600.0, channels_in_octave=2, frame_period=args.frame_period, speed=args.speed)#使用CheapTrick算法計(jì)算音頻的頻譜包絡(luò)_sp = pw.cheaptrick(x, _f0, t, fs)#計(jì)算aperiodic參數(shù)_ap = pw.d4c(x, _f0, t, fs)#基于以上參數(shù)合成音頻_y = pw.synthesize(_f0, _sp, _ap, fs, args.frame_period)#寫入音頻文件sf.write('test/y_without_f0_refinement.wav', _y, fs)
下圖是原始波形與合成后音頻的波形對(duì)比,上圖是原始波形,下圖是合成后的音頻波形,可以看到,基本保持一致。由于公眾號(hào)文章只能上傳一段音頻,因此這里我只能上傳合成后的音頻。
WORLD語音合成系統(tǒng)可以根據(jù)F0、spectral envelope、aperiodic三個(gè)參數(shù)來合成一段語音,因此,在前沿的語音合成研究中,會(huì)通過深度學(xué)習(xí)技術(shù)學(xué)習(xí)到一段文本所對(duì)應(yīng)的這三個(gè)特征,然后借助WORLD合成為語音。
-
算法
+關(guān)注
關(guān)注
23文章
4587瀏覽量
92501 -
C語言
+關(guān)注
關(guān)注
180文章
7594瀏覽量
135858 -
語音合成
+關(guān)注
關(guān)注
2文章
87瀏覽量
16132 -
頻譜
+關(guān)注
關(guān)注
7文章
874瀏覽量
45553
原文標(biāo)題:開源的語音合成系統(tǒng)WORLD介紹以及使用方法
文章出處:【微信號(hào):DeepLearningDigest,微信公眾號(hào):深度學(xué)習(xí)每日摘要】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論