1. 河豚號(hào) > 生活百科 >

tts系統(tǒng)的五個(gè)主要組成部分(全方面了解tts系統(tǒng)知識(shí))

編者按:在電影《Her》中,男主憑著一個(gè)小巧的真無(wú)線耳機(jī),就解鎖了一個(gè)溫柔又風(fēng)趣的「女朋友」薩曼薩。不過(guò),在現(xiàn)實(shí)生活中,和語(yǔ)音助手談戀愛(ài)還是一件十分遙遠(yuǎn)的事情——刨去現(xiàn)階段的語(yǔ)音助手們雙商水平還有限,語(yǔ)音助手的語(yǔ)言表達(dá)能力還遠(yuǎn)遠(yuǎn)達(dá)不到我們理想狀態(tài)。

為啥你的機(jī)器人女友說(shuō)話不像薩曼薩?本文中,Rokid A-Lab 語(yǔ)音合成算法工程師鄭杰文將從語(yǔ)音合成技術(shù)談起,給大家分析其中原因。

作者介紹:鄭杰文,愛(ài)丁堡大學(xué)人工智能碩士,師從國(guó)際著名語(yǔ)音合成專家Simon King教授。 現(xiàn)任職Rokid ALab 語(yǔ)音合成算法工程師,負(fù)責(zé)語(yǔ)音合成引擎架構(gòu)設(shè)計(jì),后端聲學(xué)模型開(kāi)發(fā)等工作。

TTS背后的技術(shù)原理——前端和后端系統(tǒng)

讓語(yǔ)音助手說(shuō)話的技術(shù)叫 TTS(text-to-speech),也就是語(yǔ)音合成。

打造自然、真實(shí)、悅耳的 TTS,是 AI 領(lǐng)域的科學(xué)家和工程師一直努力的方向。但前進(jìn)過(guò)程中總會(huì)碰到各種「攔路虎」,它們究竟是什么? 我們先從 TTS 的基礎(chǔ)原理講起。

TTS 技術(shù)本質(zhì)上解決的是「從文本轉(zhuǎn)化為語(yǔ)音的問(wèn)題」,通過(guò)這種方式讓機(jī)器開(kāi)口說(shuō)話。

 

深度解讀 TTS 技術(shù)的原理及挑戰(zhàn)

 

圖 1 語(yǔ)音合成,一個(gè)從文本轉(zhuǎn)化為語(yǔ)音的問(wèn)題

但這個(gè)過(guò)程并不容易,為了降低機(jī)器理解的難度,科學(xué)家們將這個(gè)轉(zhuǎn)化過(guò)程拆分成了兩個(gè)部分——前端系統(tǒng)和后端系統(tǒng)。

 

深度解讀 TTS 技術(shù)的原理及挑戰(zhàn)

 

圖 2 前端和后端一起組成的TTS

前端負(fù)責(zé)把輸入的文本轉(zhuǎn)化為一個(gè)中間結(jié)果,然后把這個(gè)中間結(jié)果送給后端,由后端生成聲音。

接下來(lái),我們先來(lái)了解一下前端和后端系統(tǒng)是如何分工協(xié)作的?

生成「語(yǔ)言學(xué)規(guī)格書(shū)」的前端系統(tǒng)

小時(shí)候我們?cè)谡J(rèn)字之前需要先學(xué)習(xí)拼音,有了拼音,我們就可以用它去拼讀我們不認(rèn)識(shí)的字。對(duì)于 TTS 來(lái)說(shuō),前端系統(tǒng)從文本轉(zhuǎn)化出的中間結(jié)果就好像是拼音。

不過(guò),光有拼音還不行,因?yàn)槲覀円首x的不是一個(gè)字,而是一句一句的話。如果一個(gè)人說(shuō)話的時(shí)候不能正確的使用抑揚(yáng)頓挫的語(yǔ)調(diào)來(lái)控制自己說(shuō)話的節(jié)奏,就會(huì)讓人聽(tīng)著不舒服,甚至誤解說(shuō)話人想要傳達(dá)的意思。所以前端還需要加上這種抑揚(yáng)頓挫的信息來(lái)告訴后端怎么正確的「說(shuō)話」。

我們將這種抑揚(yáng)頓挫的信息稱之為韻律(Prosody)。韻律是一個(gè)非常綜合的信息,為了簡(jiǎn)化問(wèn)題,韻律又被分解成了如停頓,重讀等信息。停頓就是告訴后端在句子的朗讀中應(yīng)該怎么停,重讀就是在朗讀的時(shí)候應(yīng)該著重強(qiáng)調(diào)那一部分。這些所有的信息綜合到一起,我們可以叫」語(yǔ)言學(xué)規(guī)格書(shū)」。

 

深度解讀 TTS 技術(shù)的原理及挑戰(zhàn)

 

圖 3.前端通過(guò)生成「語(yǔ)言書(shū)規(guī)格書(shū)」來(lái)告訴后端我們想要合成什么樣的內(nèi)容。

前端就像一個(gè)語(yǔ)言學(xué)家,把給它的純文本做各種各樣的分析,然后給后端開(kāi)出一份規(guī)格書(shū),告訴后端應(yīng)該合成什么樣的聲音。

在實(shí)際的系統(tǒng)中,為了讓機(jī)器能正確的說(shuō)話,這份兒「規(guī)格書(shū)」遠(yuǎn)遠(yuǎn)比我們這里描述的要復(fù)雜。

扮演「發(fā)音人」的后端系統(tǒng)

當(dāng)后端系統(tǒng)拿到「語(yǔ)言學(xué)規(guī)格書(shū)」后,目標(biāo)是生成盡量符合這個(gè)規(guī)格書(shū)里描述的聲音。

當(dāng)然,機(jī)器是不能憑空直接生成一個(gè)聲音的。在這之前,我們還需要在錄音棚里錄上幾個(gè)到幾十個(gè)小時(shí)不等的音頻數(shù)據(jù)(根據(jù)技術(shù)不同,使用的數(shù)據(jù)量會(huì)不同),然后用這些數(shù)據(jù)來(lái)做后端系統(tǒng)。

目前主流的后端系統(tǒng)有兩種方法:一種是基于波形拼接的方法,一種是基于參數(shù)生成的方法。

波形拼接的方法思路很簡(jiǎn)單:那就是把事先錄制好的音頻存儲(chǔ)在電腦上,當(dāng)我們要合成聲音的時(shí)候,我們就可以根據(jù)前端開(kāi)出的「規(guī)格書(shū)」,來(lái)從這些音頻里去尋找那些最適合規(guī)格書(shū)的音頻片段,然后把片段一個(gè)一個(gè)的拼接起來(lái),最后就形成了最終的合成語(yǔ)音。

比如:我們想要合成「你真好看」這句話,我們就會(huì)從數(shù)據(jù)庫(kù)里去尋找「你、真、好、看」這四個(gè)字的音頻片段,然后把這四個(gè)片段拼接起來(lái)。

 

深度解讀 TTS 技術(shù)的原理及挑戰(zhàn)

 

圖表 4 使用拼接法合成「你真好看」

當(dāng)然,實(shí)際的拼接并沒(méi)有這么簡(jiǎn)單,首先要選擇拼接單元的粒度,選好粒度還需要設(shè)計(jì)拼接代價(jià)函數(shù)等。

參數(shù)生成法和波形拼接法的原理很不相同,使用參數(shù)生成法的系統(tǒng)直接使用數(shù)學(xué)的方法,先從音頻里總結(jié)出音頻最明顯的特征,然后使用學(xué)習(xí)算法來(lái)學(xué)習(xí)一個(gè)如何把前端語(yǔ)言學(xué)規(guī)格書(shū)映射到這些音頻特征的轉(zhuǎn)換器。

一但我們有了這個(gè)從語(yǔ)言學(xué)規(guī)格書(shū)到音頻特征的轉(zhuǎn)換器,在同樣合成「你真好看」這四個(gè)字的時(shí)候,我們先使用這個(gè)轉(zhuǎn)換器轉(zhuǎn)換出音頻特征,然后用另一個(gè)組件,把這些音頻特征還原成我們可以聽(tīng)到的聲音。在專業(yè)領(lǐng)域里,這個(gè)轉(zhuǎn)換器叫「聲學(xué)模型」,把聲音特征轉(zhuǎn)化為聲音的組件叫「聲碼器」。

為啥你的 AI 語(yǔ)音助手說(shuō)話不像人?

如果簡(jiǎn)單的給這個(gè)問(wèn)題一個(gè)答案的話,主要有兩個(gè)方面的原因:

1.你的 AI 會(huì)犯錯(cuò)。為了合成出聲音,AI 需要做一連串的決定,一但這些決定出錯(cuò),就會(huì)導(dǎo)致最終合成出來(lái)的聲音有問(wèn)題,有強(qiáng)烈的機(jī)械感,聽(tīng)著不自然。TTS 的前端系統(tǒng)和后端系統(tǒng)都有犯錯(cuò)的可能。

2.使用 AI 合成聲音時(shí),工程師對(duì)這個(gè)問(wèn)題過(guò)度簡(jiǎn)化,導(dǎo)致沒(méi)有準(zhǔn)確的刻畫(huà)聲音生成的過(guò)程。這種簡(jiǎn)化一方面是來(lái)自于我們?nèi)祟愖约簩?duì)語(yǔ)言,和人類語(yǔ)音生成的認(rèn)識(shí)還不足夠;另外一方面也來(lái)自于商用語(yǔ)音合成系統(tǒng)在運(yùn)轉(zhuǎn)的時(shí)候要對(duì)成本控制進(jìn)行考量。

下面我們具體來(lái)聊聊造成 AI 語(yǔ)音助手說(shuō)話不自然的前端錯(cuò)誤和后端錯(cuò)誤問(wèn)題。

前端錯(cuò)誤

前端系統(tǒng),做為一個(gè)語(yǔ)言學(xué)家,是整個(gè)TTS系統(tǒng)里最復(fù)雜的部分。為了從純文本生成出最后的「語(yǔ)言學(xué)規(guī)格書(shū)」,這個(gè)語(yǔ)言學(xué)家做的事情要比我們想像的多得多。

 

深度解讀 TTS 技術(shù)的原理及挑戰(zhàn)

 

圖表 5 典型的前端處理流程

一個(gè)典型的前端處理流程是:

文本結(jié)構(gòu)分析:我們給系統(tǒng)輸入一個(gè)文本,系統(tǒng)要先判斷這個(gè)文本是什么語(yǔ)言,只有知道是什么語(yǔ)言才知道接下來(lái)如何處理。然后把文本劃分成一個(gè)一個(gè)的句子。這些句子再送給后面的模塊處理。

文本正則:在中文場(chǎng)景下,文本正則的目的是把那些不是漢字的標(biāo)點(diǎn)或者數(shù)字轉(zhuǎn)化為漢字。比如「這個(gè)操作666啊」,系統(tǒng)需要把「666」轉(zhuǎn)化為「六六六」。

文本轉(zhuǎn)音素:也就是把文本轉(zhuǎn)化為拼音,由于中文中多音字的存在,所以我們不能直接通過(guò)像查新華字典一樣的方法去找一個(gè)字的讀音,必須通過(guò)其他輔助信息和一些算法來(lái)正確的決策到底要怎么讀。這些輔助信息就包括了分詞和每個(gè)詞的詞性。

韻律預(yù)測(cè):用于決定讀一句話時(shí)的節(jié)奏,也就是抑揚(yáng)頓挫。但是一般的簡(jiǎn)化的系統(tǒng)都只是預(yù)測(cè)句子中的停頓信息。也就是一個(gè)字讀完后是否需要停頓,停頓多久的決策。

從上面四個(gè)步驟可以看出,任何步驟都是有可能出錯(cuò)的,一但出錯(cuò),生成的語(yǔ)言學(xué)規(guī)格書(shū)就會(huì)錯(cuò),導(dǎo)致后端合成的聲音也會(huì)錯(cuò)。一個(gè)TTS系統(tǒng),典型的前端錯(cuò)誤有以下幾種類型:

1、文本正則錯(cuò)誤

由于我們的書(shū)寫(xiě)形式和朗讀形式是不一樣的,所以在前端非常早期的階段,需要把書(shū)寫(xiě)形式轉(zhuǎn)化為我們實(shí)際朗讀的形式。這個(gè)過(guò)程在專業(yè)領(lǐng)域里叫「文本正則」。比如我們前面說(shuō)到的「666」

要轉(zhuǎn)為「六六六」。我們非常容易感受到 TTS 系統(tǒng)中文本正則的錯(cuò)誤。比如下面這句:

我花了 666 塊住進(jìn)了一個(gè)房號(hào)是 666 的房間。

666對(duì)比朗讀.wav0:04來(lái)自深圳灣

我們知道前面的「666」應(yīng)該讀成「六百六十六」,后面的「666」應(yīng)該要讀「六六六」。但是TTS系統(tǒng)卻很容易搞錯(cuò)。

另外一個(gè)例子:

我覺(jué)得有 2-4 的把握,這場(chǎng)比分是 2-4。

這兩個(gè)「2-4」到底應(yīng)該是讀「二到四」,「兩到四」,還是「二比四」呢?你應(yīng)該一眼就能知道到底怎么樣讀才是正確的。但是,對(duì)于前端系統(tǒng)來(lái)說(shuō),這又是一個(gè)難題。

2、注音錯(cuò)誤

中文是一門(mén)博大精深的語(yǔ)言,正確的朗讀它可并沒(méi)有好么容易。其中一個(gè)比較棘手的問(wèn)題就是,面對(duì)多音字時(shí),到底應(yīng)該選擇哪一個(gè)音來(lái)朗讀呢?

比如這兩句:「我的頭發(fā)又長(zhǎng)長(zhǎng)了。」和「我的頭發(fā)長(zhǎng)長(zhǎng)的。」這里的「長(zhǎng)」到底應(yīng)該是讀二聲的「chang」還是讀四聲的「zhang」呢?

當(dāng)然,人可以很輕松的挑選出正確的答案。那么下面這一句呢:

人要是行,干一行行一行,行行都行,要是不行,干一行不行一行,行行不行。

可能你也要略加思索,才能讀對(duì)這中間的所有「行」。對(duì)于 AI 來(lái)說(shuō)就更難了。

你可能時(shí)不時(shí)的就能聽(tīng)到AI助手在朗讀多音字時(shí)讀錯(cuò)了,這種錯(cuò)誤很容易就被你的耳朵捕捉到,并讓你立刻有一個(gè)印象:「這絕對(duì)不是真人在說(shuō)話~」。

當(dāng)然,多音字錯(cuò)誤只是注音錯(cuò)誤中的一種,還有其他的一些錯(cuò)誤,如輕聲,兒化音,音調(diào)變調(diào)等??傊?,準(zhǔn)確的讓你的AI助手朗讀所有的內(nèi)容并不容易。

3、韻律錯(cuò)誤

如前面所說(shuō),為了更準(zhǔn)確的傳遞信息,人在說(shuō)一句話的時(shí)候需要有節(jié)奏感。如果一個(gè)人在說(shuō)話的時(shí)候中間不做任何的停頓,會(huì)讓我們很難理解他說(shuō)的意思,甚至我們會(huì)覺(jué)得這個(gè)人不禮貌。我們的科學(xué)家,工程師,都在想方設(shè)法的讓TTS朗讀得更具備節(jié)奏感一些,更禮貌一些。但是在很多時(shí)候TTS的表現(xiàn)卻總是差強(qiáng)人意。

這是因?yàn)檎Z(yǔ)言的變化太豐富了,根據(jù)不同的上下文,甚至不同的場(chǎng)合,我們的朗讀的韻律節(jié)奏都不太一樣。韻律中,最重要的就是討論一句話的停頓節(jié)奏,因?yàn)橥nD是一句話朗讀正確的基礎(chǔ),如果停頓不對(duì),錯(cuò)誤很容易被人耳朵抓住。

比如這句:;為你切換單曲循環(huán)模式」。如果我們用「|」來(lái)表示停頓,那么一個(gè)正常的人朗讀的停頓節(jié)奏一般是這樣的:「為你切換 | 單曲循環(huán)模式」。

但是如果一但你的 AI 助手說(shuō)「為你切 | 換單曲循環(huán)模式」這種奇怪的節(jié)奏感時(shí),你內(nèi)心可能是奔潰的。

后端錯(cuò)誤

聊完前面這個(gè)「經(jīng)常犯錯(cuò)的語(yǔ)言學(xué)家」,我們?cè)賮?lái)看看后端:這個(gè)按照「語(yǔ)言學(xué)家」給的 「規(guī)格書(shū)」來(lái)讀稿子的「發(fā)音人」。

前面提到,后端主要有拼接法和參數(shù)法兩種方式?,F(xiàn)在蘋(píng)果,亞馬遜的AI助手Siri和Alexa 使用的是波形拼接的方法。而在國(guó)內(nèi),大多數(shù)公司都是使用參數(shù)法。Rokid的若琪也是使用參數(shù)法,所以我們關(guān)鍵來(lái)看一下參數(shù)法可能的后端錯(cuò)誤。

后端系統(tǒng)在拿到前端給的語(yǔ)言信息后,要做的第一件事情是,決定每個(gè)漢字到底要發(fā)音多長(zhǎng)時(shí)間(甚至是每個(gè)聲母,韻母要發(fā)音多長(zhǎng)時(shí)間)。這個(gè)決定發(fā)音長(zhǎng)短的組件在專業(yè)領(lǐng)域里叫「時(shí)長(zhǎng)模型」。

有了這個(gè)時(shí)間信息后,后端系統(tǒng)就可以通過(guò)我們前面說(shuō)的一個(gè)轉(zhuǎn)換器(也叫聲學(xué)模型)把這個(gè)語(yǔ)言學(xué)規(guī)格書(shū)轉(zhuǎn)化為音頻特征了。然后再用另一個(gè)叫「聲碼器」的組件把這些音頻特征還原成聲音。從時(shí)長(zhǎng)模型到聲學(xué)模型,再到聲碼器,這里面的每一步都可能犯錯(cuò)或者不能完美的生成我們想要的結(jié)果。

一個(gè) TTS 系統(tǒng)里,典型的后端錯(cuò)誤有以下幾種類型:

1、時(shí)長(zhǎng)模型錯(cuò)誤

在一句話朗讀的時(shí)候,根據(jù)上下文語(yǔ)境的不同,每個(gè)字朗讀發(fā)音時(shí)間是不一樣的。TTS系統(tǒng)必須根據(jù)上下文去決定到底哪些字應(yīng)該讀音拖長(zhǎng)一點(diǎn),哪些字應(yīng)該讀短一些,其中一個(gè)比較典型的例子就是語(yǔ)氣詞的朗讀。

通常這些語(yǔ)氣詞由于攜帶了說(shuō)話人的語(yǔ)氣情感,它們的發(fā)音都會(huì)比普通的字要長(zhǎng)一些,比如這句:

嗯。。。我想他是對(duì)的。

這里的「嗯」,在這個(gè)場(chǎng)景下,很明顯需要被拖長(zhǎng),用于表示一種「思考之后的判斷」。

但是并不是所有的「嗯」都要拖這么長(zhǎng),比如這一句:「嗯?你剛才說(shuō)什么?」

這里的「嗯」代表是一種疑問(wèn)的語(yǔ)氣,發(fā)音就要比上面句子中的「嗯」要短得多。如果時(shí)長(zhǎng)模型不能正確的決策出發(fā)音時(shí)長(zhǎng)的話,就會(huì)給人一種不自然感覺(jué)。當(dāng)然,Rokid在語(yǔ)氣詞發(fā)音上也有自己的一套專利方法,用于生成非常自然的語(yǔ)氣詞發(fā)音。在后續(xù)的文章中,我們將會(huì)推一個(gè)專題文章介紹。

2、聲學(xué)模型錯(cuò)誤

最主要的聲學(xué)模型錯(cuò)誤就是遇到在訓(xùn)練后端這個(gè)「發(fā)音人」時(shí),沒(méi)有見(jiàn)過(guò)的發(fā)音。聲學(xué)模型的作用是從訓(xùn)練音庫(kù)里,學(xué)習(xí)到各種「語(yǔ)言學(xué)規(guī)格書(shū)」所對(duì)應(yīng)的語(yǔ)音聲學(xué)特征。如果在合成的時(shí)候遇到了訓(xùn)練過(guò)程中沒(méi)有見(jiàn)過(guò)的語(yǔ)言學(xué)表現(xiàn),那么機(jī)器就不太容易輸出正確的聲學(xué)特征。

一個(gè)常見(jiàn)的例子是兒化音。原則上來(lái)說(shuō),每個(gè)漢語(yǔ)拼音都有對(duì)應(yīng)的兒化音,但在實(shí)際說(shuō)話中有些兒化音被使用到的頻次極低,因此錄制音庫(kù)的時(shí)候通常并不會(huì)覆蓋所有的兒化音,而是僅僅保留最常見(jiàn)的一些。這個(gè)時(shí)候就會(huì)出現(xiàn)一些兒化音發(fā)不出來(lái),或者發(fā)不好的現(xiàn)象。

3、聲碼器錯(cuò)誤

聲碼器的種類比較多,但是比較傳統(tǒng)、比較常見(jiàn)的聲碼器通常都會(huì)用到基頻信息。那什么是基頻呢?基頻就是你在說(shuō)話的時(shí)候聲帶震動(dòng)的快慢程度。這里教你一個(gè)簡(jiǎn)單的方法來(lái)感受自己說(shuō)話的基頻:把自己的除大拇指以外的其他四個(gè)手指按壓到自己的喉嚨部分,然后自己開(kāi)始對(duì)自己隨便說(shuō)話。

這個(gè)時(shí)候你就會(huì)感受到你的喉嚨在震動(dòng),這個(gè)震動(dòng)的信息就是我們的基頻信息。發(fā)濁音時(shí)會(huì)伴隨聲帶振動(dòng),聲帶不振動(dòng)發(fā)出的音稱為清音。輔音有清有濁,而元音一般均為濁音。所以合成語(yǔ)音中元音和濁輔音的位置都應(yīng)該對(duì)應(yīng)有基頻,如果我們前面提到的聲學(xué)模型輸出的基頻出現(xiàn)偏差,聲碼器合成的聲音就會(huì)聽(tīng)起來(lái)很奇怪。

在訓(xùn)練后端這個(gè)「發(fā)音人」時(shí),我們也要通過(guò)算法來(lái)計(jì)算出基頻信息。不好的基頻提取算法可能會(huì)造成基頻丟失、倍頻或者半頻的現(xiàn)象。這些都會(huì)直接影響基頻預(yù)測(cè)模型的效果。如果應(yīng)該有基頻的地方?jīng)]有預(yù)測(cè)出基頻,合成聲音聽(tīng)起來(lái)就是沙啞的,對(duì)聽(tīng)感的影響十分明顯。

一個(gè)好的聲碼器還要處理好基頻和諧波的關(guān)系。如果高頻諧波過(guò)于明顯,在聽(tīng)感上會(huì)造成嗡嗡的聲響,機(jī)械感明顯。

總結(jié)

在這篇文章里,我們介紹了 TTS 的基礎(chǔ)原理,以及分析了語(yǔ)音助手不能像真人一樣說(shuō)話的原因:TTS 在做各種決策中會(huì)犯錯(cuò),導(dǎo)致朗讀出錯(cuò)或者不自然。同時(shí),為了讓電腦可以合成聲音,工程師會(huì)對(duì)文本轉(zhuǎn)語(yǔ)音問(wèn)題做簡(jiǎn)化,導(dǎo)致沒(méi)有準(zhǔn)確的刻畫(huà)聲音生成的過(guò)程。這種簡(jiǎn)化一方面來(lái)自于對(duì)語(yǔ)音語(yǔ)言生成過(guò)程的認(rèn)知局限,同時(shí)也受限制于目前的計(jì)算工具。

盡管現(xiàn)在在這個(gè)領(lǐng)域內(nèi)有很多新的方法,特別是使用深度學(xué)習(xí)(Deep Learning)方法來(lái)直接做文本到語(yǔ)音的轉(zhuǎn)化,而且已經(jīng)展示出來(lái)了非常自然的聲音,但是讓你的 AI 助手完全像人一樣說(shuō)話仍然是一項(xiàng)非常具有挑戰(zhàn)性的工作。Rokid ALab 團(tuán)隊(duì)也致力于與大家一起探索 TTS 技術(shù)的突破與應(yīng)用,期待為用戶帶來(lái)更加自然的聲音。

本文由網(wǎng)上采集發(fā)布,不代表我們立場(chǎng),轉(zhuǎn)載聯(lián)系作者并注明出處:http://m.zltfw.cn/shbk/37500.html

聯(lián)系我們

在線咨詢:點(diǎn)擊這里給我發(fā)消息

微信號(hào):15705946153

工作日:9:30-18:30,節(jié)假日休息