聲明:轉(zhuǎn)載請?jiān)跇?biāo)題標(biāo)明轉(zhuǎn)載梨熙,并添加原文鏈接俗慈。
簡介
這篇博客的主要內(nèi)容是對語音合成 (text to speech)的背景知識進(jìn)行介紹氨淌。 希望可以讓讀者通俗易懂的了解語音合成的工作原理谬泌, 并對為了理解state-of-the-art text to speech 的算法做基礎(chǔ)脖祈。
這個(gè)簡介主要基于這篇論文 “Wavenet: a generative model for raw audio”的附錄介紹的年局。 論文鏈接如下: https://arxiv.org/pdf/1609.03499.pdf, 以及stanford CS224S的課程际看, 鏈接如下 http://web.stanford.edu/class/cs224s/lectures/224s.17.lec14.pdf
什么是語音合成
語音合成是通過文字人工生成人類聲音, 也可以說語音生成是給定一段文字去生成對應(yīng)的人類讀音矢否。 這里聲音是一個(gè)連續(xù)的模擬的信號仲闽。而合成過程是通過計(jì)算機(jī), 數(shù)字信號去模擬僵朗。 這里就需要數(shù)字信號處理模擬信號信息赖欣,詳細(xì)內(nèi)容可參考 [1]。
圖片1验庙, 就是一個(gè)例子用來表示人類聲音的信號圖顶吮。 這里橫軸是時(shí)間, 縱軸是聲音幅度大小粪薛。聲音有三個(gè)重要的指標(biāo)悴了,振幅(amplitude), 周期(period)和頻率(frequency)。 振幅指的是波的高低幅度,表示聲音的強(qiáng)弱湃交,周期和頻率互為倒數(shù)的關(guān)系熟空, 用來表示兩個(gè)波之間的時(shí)間長度,或者每秒震動的次數(shù)搞莺。? 而聲音合成是根據(jù)聲波的特點(diǎn)息罗, 用數(shù)字的方式去生成類似人聲的頻率和振幅, 即音頻的數(shù)字化才沧。了解了音頻的數(shù)字化迈喉,也就知道了我們要生成的目標(biāo)函數(shù)。
音頻的數(shù)字化主要有三個(gè)步驟温圆。
取樣(sampling):在音頻數(shù)字化的過程挨摸,采樣是指一個(gè)固定的頻率對音頻信號進(jìn)行采樣, 采樣的頻率越高捌木, 對應(yīng)的音頻數(shù)據(jù)的保真度就越好油坝。 當(dāng)然嫉戚, 數(shù)據(jù)量越大刨裆,需要的內(nèi)存也就越大。 如果想完全無損采樣彬檀, 需要使用Nyquist sampling frequency帆啃, 就是原音頻的頻率2倍。
量化 (quantization): 采樣的信號都要進(jìn)行量化窍帝, 把信號的幅度變成有限的離散數(shù)值努潘。比如從0 到 1, 只有 四個(gè)量化值可以用0坤学, 0.25疯坤, 0.5, 0.75的話深浮, 量化就是選擇最近的量化值來表示压怠。
編碼 (coding):編碼就是把每個(gè)數(shù)值用二進(jìn)制的方式表示, 比如上面的例子飞苇, 就可以用2bit 二進(jìn)制表示, 00, 01, 10, 11菌瘫。 這樣的數(shù)值用來保存在計(jì)算機(jī)上。
采樣頻率和采樣量化級數(shù)是數(shù)字化聲音的兩個(gè)主要指標(biāo)布卡,直接影響聲音的效果雨让。 對于語音合成也是同樣, 生成更高的采樣頻率和更多多的量化級數(shù)(比如16 bit), 會產(chǎn)生更真實(shí)的聲音忿等。? 通常有三個(gè)采樣頻率標(biāo)準(zhǔn)
1. 44.1kHz 采樣栖忠, 用于高品質(zhì)CD 音樂
2. 22.05kHz 采樣, 用于語音通話, 中品質(zhì)音樂
3. 11.025kHz 采樣庵寞, 用于低品質(zhì)聲音虚汛。
而量化標(biāo)準(zhǔn)一般有8位字長(256階)低品質(zhì)量化 和16位字長(65536階)高品質(zhì)量化。
還有一個(gè)重要參數(shù)就是通道(channel), 一次只采樣一個(gè)聲音波形為單通道皇帮, 一次采樣多個(gè)聲音波形就是多通道卷哩。
所以在語音合成的時(shí)候,產(chǎn)生的數(shù)據(jù)量是 數(shù)據(jù)量=采樣頻率* 量化位數(shù)*聲道數(shù)属拾, 單位是bit/s将谊。 一般聲道數(shù)都假設(shè)為1.。 采樣率和量化位數(shù)都是語音合成里的重要指標(biāo)渐白,也就是設(shè)計(jì)好的神經(jīng)網(wǎng)絡(luò)1秒鐘必須生成的數(shù)據(jù)量尊浓。
語音合成流程
文本分析(text analysis)
文本分析就是把文字轉(zhuǎn)成類似音標(biāo)的東西。 比如下圖就是一個(gè)文本分析纯衍,用來分析 “PG&E will file schedules on April 20. ” 文本分析主要有四個(gè)步驟栋齿, 文字的規(guī)范化, 語音分析襟诸, 還有韻律分析瓦堵。 下面一一道來。?
文本規(guī)范化 (Text normalization )
文本分析首先是要確認(rèn)單詞和句子的結(jié)束歌亲。 空格會被用來當(dāng)做隔詞符. 句子的結(jié)束一般用標(biāo)點(diǎn)符號來確定菇用, 比如問號和感嘆號 (?O菥尽), 但是句號有的時(shí)候要特別處理惋鸥。 因?yàn)橛行﹩卧~的縮寫也包含句號, 比如 str. "My place on Main Str.? is around the corner". 這些特別情況一般都會采取規(guī)則(rule)的方式過濾掉悍缠。
接下來 是把非文字信息變成對應(yīng)的文字卦绣, 比如句子中里有日期, 電話號碼飞蚓, 或者其他阿拉伯?dāng)?shù)字和符號滤港。 這里就舉個(gè)例子, 比如玷坠, I was born April 14. 就要變成蜗搔, I was born April fourteen.? 這個(gè)過程其實(shí)非常繁瑣,現(xiàn)實(shí)文字中充滿了 縮寫八堡,比如CS,? 拼寫錯(cuò)誤樟凄, 網(wǎng)絡(luò)用語, tmr --> tomorrow. 解決方式還是主要依靠rule based method兄渺, 建立各種各樣的判斷關(guān)系來轉(zhuǎn)變缝龄。
語音分析 (Phonetic analysis)
語音分析就是把每個(gè)單詞中的發(fā)音單詞標(biāo)出來, 比如Fig. 3 中的P, 就對應(yīng)p和iy, 作為發(fā)音。 這個(gè)時(shí)候也很容易發(fā)現(xiàn)叔壤,發(fā)音的音標(biāo)和對應(yīng)的字母 不是一一對應(yīng)的關(guān)系瞎饲,反而需要音標(biāo)去對齊 (allignment)。 這個(gè)對齊問題很經(jīng)典炼绘, 可以用很多機(jī)器學(xué)習(xí)的方法去解決嗅战, 比如Expectation–maximization algorithm.
韻律分析 (Prosody analysis)
韻律分析就是英語里的語音語調(diào), 漢語中的抑揚(yáng)頓挫俺亮。 我們還是以英語為例驮捍, 韻律分析主要包含了: 重音 (Accent),邊界 (boundaries),? 音長 (duration)脚曾,主頻率 (F0).
重音(Accent)就是指哪個(gè)音節(jié)發(fā)生重一點(diǎn)东且。 對于一個(gè)句子或者一個(gè)單詞都有重音。 單詞的重音一般都會標(biāo)出來本讥,英語語法里面有學(xué)過珊泳, 比如banana 這個(gè)單詞, 第二個(gè)音節(jié)就是重音拷沸。 而對于句子而言色查,一樣有的單詞會重音,有的單詞會發(fā)輕音堵漱。 一般有新內(nèi)容的名詞综慎, 動詞, 或者形容詞會做重音處理勤庐。 比如下面的英語句子, surprise 就會被重音了好港, 而句子的重音點(diǎn)也會落到單詞的重音上愉镰, 第二個(gè)音節(jié)rised, 就被重音啦。 英語的重音規(guī)則是一套英語語法钧汹,讀者可以自行百度搜索丈探。
I’m a little surprised to hear it characterized as upbeat.
邊界 (Boundaries) 就是用來判斷聲調(diào)的邊界的。 一般都是一個(gè)短語結(jié)束后拔莱,有個(gè)語調(diào)的邊界碗降。 比如下面的句子, For language, 就有一個(gè)邊界塘秦, 而I 后面也是一個(gè)邊界.
For language, I , the author of the blog, like Chinese.
音長(Duration)就是每個(gè)音節(jié)的發(fā)聲長度讼渊。 這個(gè)通俗易懂。 NLP 里可以假定每個(gè)音節(jié)單詞長度相同都是 100ms, 或者根據(jù)英語語法尊剔, 動詞爪幻, 形容詞之類的去確定。 也可以通過大量的數(shù)據(jù)集去尋找規(guī)律。
主頻率 (F0)就是聲音的主頻率挨稿。? 應(yīng)該說做傅里葉轉(zhuǎn)換后仇轻, 值 (magnitude) 最大的那個(gè)。 也是人耳聽到聲音認(rèn)定的頻率奶甘。一個(gè)成年人的聲音主頻率在 100-300Hz 之間篷店。 這個(gè)值可以用 線性回歸來預(yù)測, 機(jī)器學(xué)習(xí)的方法預(yù)測也可以臭家。一般會認(rèn)為船庇,人的聲音頻率是連續(xù)變化的,而且一個(gè)短語說完頻率是下降趨勢侣监。
文本分析就介紹完了鸭轮,這個(gè)方向比較偏語言學(xué), 傳統(tǒng)上是語言學(xué)家的研究方向橄霉,但是隨著人工智能的興起窃爷,這些feature 已經(jīng)不用人為設(shè)計(jì)了,可以用端到端學(xué)習(xí)的方法來解決姓蜂。 比如谷歌的文章 TACOTRON: TOWARDS END-TO-END SPEECH SYNTHESIS 就解救了我們按厘。
https://arxiv.org/pdf/1703.10135.pdf
聲波生成(waveform synthesis)
這個(gè)部分就比較像我們算法工程師的工作內(nèi)容了。 在未來的博客里钱慢, 會詳細(xì)介紹如何用Wavenet 和WaveRNN 來實(shí)現(xiàn)這一步驟的逮京。 今天這個(gè)博客就是簡介一下算法。
這里說所謂的waveform synthesis 就是用這些 語言特征值(text features)去生成對應(yīng)的聲波束莫,也就是生成前文所說的采樣頻率 和 振幅大欣撩蕖(對應(yīng)的數(shù)字信號)。 這里面主要有兩個(gè)算法览绿。
串接合成(concatenative speech synthesis): 這個(gè)方法呢策严, 就是把記錄下來的音節(jié)拼在一起來組成一句話,在通過調(diào)整語音語調(diào)讓它聽起來自然些饿敲。 比較有名的有雙音節(jié)拼接(Diphone Synthesis) 和單音節(jié)拼接(Unit Selection Synthesis)妻导。這個(gè)方法比較繁瑣, 需要對音節(jié)進(jìn)行對齊(alignment)怀各, 調(diào)整音節(jié)的長短之類的倔韭。
參數(shù)合成 (Parametric Synthesis): 這個(gè)方法呢, 需要的內(nèi)存比較小瓢对,是通過統(tǒng)計(jì)的方法來生成對應(yīng)的聲音寿酌。 模型一般有隱馬爾科夫模型 (HMM),還有最近提出的神經(jīng)網(wǎng)絡(luò)算法Wavenet, WaveRNN.?
對于隱馬爾科夫模型的算法沥曹, 一般都會生成梅爾頻率倒譜系數(shù) (MFCC)份名,這個(gè)是聲音的特征值碟联。 感興趣的可以參考這篇博客 去了解 MFCC。
https://www.cnblogs.com/BaroC/p/4283380.html
對于神經(jīng)網(wǎng)絡(luò)的算法來說僵腺, 一般都是生成256 個(gè) quantized values 基于softmax 的分類器鲤孵, 對應(yīng) 聲音的 256 個(gè)量化值。 WaveRNN 和wavenet 就是用這種方法生成的辰如。
學(xué)習(xí)資料
下面是我學(xué)習(xí)語音合成的一些資料普监, 其中stanford cs224s 是強(qiáng)力推薦的,但是這個(gè)講義講的邏輯不是很清楚琉兜, 要反復(fù)看才會懂凯正。
UCSB Digital Speech Processing Course 課程, 聲音信號處理的基礎(chǔ)。 建議讀一遍豌蟋, 鏈接如下廊散,? https://www.ece.ucsb.edu/Faculty/Rabiner/ece259/
Stanford CS224S http://web.stanford.edu/class/cs224s/
WaveRNN,? https://arxiv.org/pdf/1609.03499.pdf
音頻的數(shù)字化, https://wenku.baidu.com/view/68fbf1a4f61fb7360b4c658b.html