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