為什么你的語音助手說話不像人?關(guān)于TTS技術(shù)原理及挑戰(zhàn)
每一位剛(wan)鐵(nian)直(dan)男(shen),都夢想下班路上偶遇電影《Her》中的機(jī)器人女友薩曼薩。雖然“只聞其聲不見其人”,但僅聽聲音就能感受到各種情感的詮釋。
薩曼薩背后的真人配音來自斯嘉麗約翰遜。有人說,“光聽聲音就已滿足我對她全部的幻想?!?/p>
可以說,消除人與機(jī)器之間的隔閡,拉近之間的距離,聲音是至關(guān)重要的。
而在現(xiàn)實(shí)生活中,AI 語音助手說話還遠(yuǎn)遠(yuǎn)達(dá)不到我們理想的聲音。
為什么你的機(jī)器人女友說話不像斯嘉麗約翰遜?今天,Rokid A-Lab 語音合成算法工程師鄭杰文將從語音合成技術(shù)談起,給大家分析其中原因。以下,Enjoy
TTS背后的技術(shù)原理——前端和后端系統(tǒng)讓語音助手說話的技術(shù)叫 TTS(text-to-speech),也就是語音合成。
打造自然、真實(shí)、悅耳的 TTS,是 AI 領(lǐng)域的科學(xué)家和工程師一直努力的方向。但前進(jìn)過程中總會碰到各種“攔路虎”,它們究竟是什么? 我們先從 TTS 的基礎(chǔ)原理講起。
TTS 技術(shù)本質(zhì)上解決的是“從文本轉(zhuǎn)化為語音的問題”,通過這種方式讓機(jī)器開口說話。
圖 1語音合成,一個(gè)從文本轉(zhuǎn)化為語音的問題
但這個(gè)過程并不容易,為了降低機(jī)器理解的難度,科學(xué)家們將這個(gè)轉(zhuǎn)化過程拆分成了兩個(gè)部分——前端系統(tǒng)和后端系統(tǒng)。
圖 2前端和后端一起組成的TTS
前端負(fù)責(zé)把輸入的文本轉(zhuǎn)化為一個(gè)中間結(jié)果,然后把這個(gè)中間結(jié)果送給后端,由后端生成聲音。
接下來,我們先來了解一下前端和后端系統(tǒng)是如何分工協(xié)作的?
小時(shí)候我們在認(rèn)字之前需要先學(xué)習(xí)拼音,有了拼音,我們就可以用它去拼讀我們不認(rèn)識的字。對于 TTS 來說,前端系統(tǒng)從文本轉(zhuǎn)化出的中間結(jié)果就好像是拼音。
不過,光有拼音還不行,因?yàn)槲覀円首x的不是一個(gè)字,而是一句一句的話。如果一個(gè)人說話的時(shí)候不能正確的使用抑揚(yáng)頓挫的語調(diào)來控制自己說話的節(jié)奏,就會讓人聽著不舒服,甚至誤解說話人想要傳達(dá)的意思。所以前端還需要加上這種抑揚(yáng)頓挫的信息來告訴后端怎么正確的“說話”。
我們將這種抑揚(yáng)頓挫的信息稱之為韻律(Prosody)。韻律是一個(gè)非常綜合的信息,為了簡化問題,韻律又被分解成了如停頓,重讀等信息。停頓就是告訴后端在句子的朗讀中應(yīng)該怎么停,重讀就是在朗讀的時(shí)候應(yīng)該著重強(qiáng)調(diào)那一部分。這些所有的信息綜合到一起,我們可以叫”語言學(xué)規(guī)格書”。
圖 3.前端通過生成“語言書規(guī)格書”來告訴后端我們想要合成什么樣的內(nèi)容。
前端就像一個(gè)語言學(xué)家,把給它的純文本做各種各樣的分析,然后給后端開出一份規(guī)格書,告訴后端應(yīng)該合成什么樣的聲音。
在實(shí)際的系統(tǒng)中,為了讓機(jī)器能正確的說話,這份兒“規(guī)格書”遠(yuǎn)遠(yuǎn)比我們這里描述的要復(fù)雜。
扮演“發(fā)音人”的后端系統(tǒng)當(dāng)后端系統(tǒng)拿到“語言學(xué)規(guī)格書”后,目標(biāo)是生成盡量符合這個(gè)規(guī)格書里描述的聲音。
當(dāng)然,機(jī)器是不能憑空直接生成一個(gè)聲音的。在這之前,我們還需要在錄音棚里錄上幾個(gè)到幾十個(gè)小時(shí)不等的音頻數(shù)據(jù)(根據(jù)技術(shù)不同,使用的數(shù)據(jù)量會不同),然后用這些數(shù)據(jù)來做后端系統(tǒng)。
目前主流的后端系統(tǒng)有兩種方法:一種是基于波形拼接的方法,一種是基于參數(shù)生成的方法。
波形拼接的方法思路很簡單:那就是把事先錄制好的音頻存儲在電腦上,當(dāng)我們要合成聲音的時(shí)候,我們就可以根據(jù)前端開出的“規(guī)格書”,來從這些音頻里去尋找那些最適合規(guī)格書的音頻片段,然后把片段一個(gè)一個(gè)的拼接起來,最后就形成了最終的合成語音。
比如:我們想要合成“你真好看”這句話,我們就會從數(shù)據(jù)庫里去尋找“你、真、好、看”這四個(gè)字的音頻片段,然后把這四個(gè)片段拼接起來。
圖表 4使用拼接法合成“你真好看”
當(dāng)然,實(shí)際的拼接并沒有這么簡單,首先要選擇拼接單元的粒度,選好粒度還需要設(shè)計(jì)拼接代價(jià)函數(shù)等。
參數(shù)生成法和波形拼接法的原理很不相同,使用參數(shù)生成法的系統(tǒng)直接使用數(shù)學(xué)的方法,先從音頻里總結(jié)出音頻最明顯的特征,然后使用學(xué)習(xí)算法來學(xué)習(xí)一個(gè)如何把前端語言學(xué)規(guī)格書映射到這些音頻特征的轉(zhuǎn)換器。
一但我們有了這個(gè)從語言學(xué)規(guī)格書到音頻特征的轉(zhuǎn)換器,在同樣合成“你真好看”這四個(gè)字的時(shí)候,我們先使用這個(gè)轉(zhuǎn)換器轉(zhuǎn)換出音頻特征,然后用另一個(gè)組件,把這些音頻特征還原成我們可以聽到的聲音。在專業(yè)領(lǐng)域里,這個(gè)轉(zhuǎn)換器叫“聲學(xué)模型”,把聲音特征轉(zhuǎn)化為聲音的組件叫“聲碼器”。
為什么你的AI語音助手說話不像人?如果簡單的給這個(gè)問題一個(gè)答案的話,主要有兩個(gè)方面的原因:
你的AI會犯錯(cuò)。為了合成出聲音,AI需要做一連串的決定,一但這些決定出錯(cuò),就會導(dǎo)致最終合成出來的聲音有問題,有強(qiáng)烈的機(jī)械感,聽著不自然。TTS的前端系統(tǒng)和后端系統(tǒng)都有犯錯(cuò)的可能。
使用AI合成聲音時(shí),工程師對這個(gè)問題過度簡化,導(dǎo)致沒有準(zhǔn)確的刻畫聲音生成的過程。這種簡化一方面是來自于我們?nèi)祟愖约簩φZ言,和人類語音生成的認(rèn)識還不足夠;另外一方面也來自于商用語音合成系統(tǒng)在運(yùn)轉(zhuǎn)的時(shí)候要對成本控制進(jìn)行考量。
下面我們具體來聊聊造成AI語音助手說話不自然的前端錯(cuò)誤和后端錯(cuò)誤問題。
前端錯(cuò)誤前端系統(tǒng),做為一個(gè)語言學(xué)家,是整個(gè)TTS系統(tǒng)里最復(fù)雜的部分。為了從純文本生成出最后的“語言學(xué)規(guī)格書”,這個(gè)語言學(xué)家做的事情要比我們想像的多得多。
圖表 5典型的前端處理流程
一個(gè)典型的前端處理流程是:
文本結(jié)構(gòu)分析
我們給系統(tǒng)輸入一個(gè)文本,系統(tǒng)要先判斷這個(gè)文本是什么語言,只有知道是什么語言才知道接下來如何處理。然后把文本劃分成一個(gè)一個(gè)的句子。這些句子再送給后面的模塊處理。
文本正則
在中文場景下,文本正則的目的是把那些不是漢字的標(biāo)點(diǎn)或者數(shù)字轉(zhuǎn)化為漢字。
比如”這個(gè)操作666啊”,系統(tǒng)需要把“666”轉(zhuǎn)化為“六六六”。
文本轉(zhuǎn)音素
也就是把文本轉(zhuǎn)化為拼音,由于中文中多音字的存在,所以我們不能直接通過像查新華字典一樣的方法去找一個(gè)字的讀音,必須通過其他輔助信息和一些算法來正確的決策到底要怎么讀。這些輔助信息就包括了分詞和每個(gè)詞的詞性。
韻律預(yù)測
用于決定讀一句話時(shí)的節(jié)奏,也就是抑揚(yáng)頓挫。但是一般的簡化的系統(tǒng)都只是預(yù)測句子中的停頓信息。也就是一個(gè)字讀完后是否需要停頓,停頓多久的決策。
從上面四個(gè)步驟可以看出,任何步驟都是有可能出錯(cuò)的,一但出錯(cuò),生成的語言學(xué)規(guī)格書就會錯(cuò),導(dǎo)致后端合成的聲音也會錯(cuò)。一個(gè)TTS系統(tǒng),典型的前端錯(cuò)誤有以下幾種類型:
1、文本正則錯(cuò)誤
由于我們的書寫形式和朗讀形式是不一樣的,所以在前端非常早期的階段,需要把書寫形式轉(zhuǎn)化為我們實(shí)際朗讀的形式。這個(gè)過程在專業(yè)領(lǐng)域里叫“文本正則”。比如我們前面說到的“666”
要轉(zhuǎn)為“六六六”。我們非常容易感受到TTS系統(tǒng)中文本正則的錯(cuò)誤。比如下面這句:
“我花了666塊住進(jìn)了一個(gè)房號是666的房間?!保c(diǎn)擊聽音頻)
我們知道前面的“666”應(yīng)該讀成“六百六十六”,后面的“666”應(yīng)該要讀“六六六”。但是TTS系統(tǒng)卻很容易搞錯(cuò)。
另外一個(gè)例子:“我覺得有2-4成的把握,這場比分是2-4?!?/p>
這兩個(gè)“2-4”到底應(yīng)該是讀“二到四”,“兩到四”,還是“二比四”呢?你應(yīng)該一眼就能知道到底怎么樣讀才是正確的。但是,對于前端系統(tǒng)來說,這又是一個(gè)難題。
2、注音錯(cuò)誤
中文是一門博大精深的語言,正確的朗讀它可并沒有好么容易。其中一個(gè)比較棘手的問題就是,面對多音字時(shí),到底應(yīng)該選擇哪一個(gè)音來朗讀呢?
比如這兩句:“我的頭發(fā)又長長了?!焙汀拔业念^發(fā)長長的?!边@里的“長”到底應(yīng)該是讀二聲的“chang”還是讀四聲的“zhang”呢?
當(dāng)然,人可以很輕松的挑選出正確的答案。那么下面這一句呢:
人要是行,干一行行一行,行行都行,要是不行,干一行不行一行,行行不行。(點(diǎn)擊聽音頻)
可能你也要略加思索,才能讀對這中間的所有“行”。對于AI來說就更難了。
你可能時(shí)不時(shí)的就能聽到AI助手在朗讀多音字時(shí)讀錯(cuò)了,這種錯(cuò)誤很容易就被你的耳朵捕捉到,并讓你立刻有一個(gè)印象:“這絕對不是真人在說話~”。
當(dāng)然,多音字錯(cuò)誤只是注音錯(cuò)誤中的一種,還有其他的一些錯(cuò)誤,如輕聲,兒化音,音調(diào)變調(diào)等。總之,準(zhǔn)確的讓你的AI助手朗讀所有的內(nèi)容并不容易。
3、韻律錯(cuò)誤
如前面所說,為了更準(zhǔn)確的傳遞信息,人在說一句話的時(shí)候需要有節(jié)奏感。如果一個(gè)人在說話的時(shí)候中間不做任何的停頓,會讓我們很難理解他說的意思,甚至我們會覺得這個(gè)人不禮貌。我們的科學(xué)家,工程師,都在想方設(shè)法的讓TTS朗讀得更具備節(jié)奏感一些,更禮貌一些。但是在很多時(shí)候TTS的表現(xiàn)卻總是差強(qiáng)人意。
這是因?yàn)檎Z言的變化太豐富了,根據(jù)不同的上下文,甚至不同的場合,我們的朗讀的韻律節(jié)奏都不太一樣。韻律中,最重要的就是討論一句話的停頓節(jié)奏,因?yàn)橥nD是一句話朗讀正確的基礎(chǔ),如果停頓不對,錯(cuò)誤很容易被人耳朵抓住。
比如這句:”為你切換單曲循環(huán)模式”。如果我們用“|”來表示停頓,那么一個(gè)正常的人朗讀的停頓節(jié)奏一般是這樣的:“為你切換|單曲循環(huán)模式”。
但是如果一但你的AI助手說“為你切|換單曲循環(huán)模式”這種奇怪的節(jié)奏感時(shí),你內(nèi)心可能是奔潰的。
后端錯(cuò)誤聊完前面這個(gè)“經(jīng)常犯錯(cuò)的語言學(xué)家”,我們再來看看后端:這個(gè)按照“語言學(xué)家”給的 “規(guī)格書”來讀稿子的“發(fā)音人”。
前面提到,后端主要有拼接法和參數(shù)法兩種方式?,F(xiàn)在蘋果,亞馬遜的AI助手Siri和Alexa 使用的是波形拼接的方法。而在國內(nèi),大多數(shù)公司都是使用參數(shù)法。所以我們關(guān)鍵來看一下參數(shù)法可能的后端錯(cuò)誤。
后端系統(tǒng)在拿到前端給的語言信息后,要做的第一件事情是,決定每個(gè)漢字到底要發(fā)音多長時(shí)間(甚至是每個(gè)聲母,韻母要發(fā)音多長時(shí)間)。這個(gè)決定發(fā)音長短的組件在專業(yè)領(lǐng)域里叫“時(shí)長模型”。
有了這個(gè)時(shí)間信息后,后端系統(tǒng)就可以通過我們前面說的一個(gè)轉(zhuǎn)換器(也叫聲學(xué)模型)把這個(gè)語言學(xué)規(guī)格書轉(zhuǎn)化為音頻特征了。然后再用另一個(gè)叫“聲碼器”的組件把這些音頻特征還原成聲音。從時(shí)長模型到聲學(xué)模型,再到聲碼器,這里面的每一步都可能犯錯(cuò)或者不能完美的生成我們想要的結(jié)果。
一個(gè) TTS 系統(tǒng)里,典型的后端錯(cuò)誤有以下幾種類型:
1、時(shí)長模型錯(cuò)誤
在一句話朗讀的時(shí)候,根據(jù)上下文語境的不同,每個(gè)字朗讀發(fā)音時(shí)間是不一樣的。TTS系統(tǒng)必須根據(jù)上下文去決定到底哪些字應(yīng)該讀音拖長一點(diǎn),哪些字應(yīng)該讀短一些,其中一個(gè)比較典型的例子就是語氣詞的朗讀。
通常這些語氣詞由于攜帶了說話人的語氣情感,它們的發(fā)音都會比普通的字要長一些,比如這句:“嗯。。。我想他是對的?!保c(diǎn)擊聽音頻)
這里的“嗯”,在這個(gè)場景下,很明顯需要被拖長,用于表示一種“思考之后的判斷”。
但是并不是所有的“嗯”都要拖這么長,比如這一句:“嗯?你剛才說什么?”
這里的“嗯”代表是一種疑問的語氣,發(fā)音就要比上面句子中的“嗯”要短得多。如果時(shí)長模型不能正確的決策出發(fā)音時(shí)長的話,就會給人一種不自然感覺。
2、聲學(xué)模型錯(cuò)誤
最主要的聲學(xué)模型錯(cuò)誤就是遇到在訓(xùn)練后端這個(gè)“發(fā)音人”時(shí),沒有見過的發(fā)音。聲學(xué)模型的作用是從訓(xùn)練音庫里,學(xué)習(xí)到各種“語言學(xué)規(guī)格書”所對應(yīng)的語音聲學(xué)特征。如果在合成的時(shí)候遇到了訓(xùn)練過程中沒有見過的語言學(xué)表現(xiàn),那么機(jī)器就不太容易輸出正確的聲學(xué)特征。
一個(gè)常見的例子是兒化音。原則上來說,每個(gè)漢語拼音都有對應(yīng)的兒化音,但在實(shí)際說話中有些兒化音被使用到的頻次極低,因此錄制音庫的時(shí)候通常并不會覆蓋所有的兒化音,而是僅僅保留最常見的一些。這個(gè)時(shí)候就會出現(xiàn)一些兒化音發(fā)不出來,或者發(fā)不好的現(xiàn)象。
3、聲碼器錯(cuò)誤
聲碼器的種類比較多,但是比較傳統(tǒng)、比較常見的聲碼器通常都會用到基頻信息。那什么是基頻呢?基頻就是你在說話的時(shí)候聲帶震動的快慢程度。這里教你一個(gè)簡單的方法來感受自己說話的基頻:把自己的除大拇指以外的其他四個(gè)手指按壓到自己的喉嚨部分,然后自己開始對自己隨便說話。
這個(gè)時(shí)候你就會感受到你的喉嚨在震動,這個(gè)震動的信息就是我們的基頻信息。發(fā)濁音時(shí)會伴隨聲帶振動,聲帶不振動發(fā)出的音稱為清音。輔音有清有濁,而元音一般均為濁音。所以合成語音中元音和濁輔音的位置都應(yīng)該對應(yīng)有基頻,如果我們前面提到的聲學(xué)模型輸出的基頻出現(xiàn)偏差,聲碼器合成的聲音就會聽起來很奇怪。
在訓(xùn)練后端這個(gè)“發(fā)音人”時(shí),我們也要通過算法來計(jì)算出基頻信息。不好的基頻提取算法可能會造成基頻丟失、倍頻或者半頻的現(xiàn)象。這些都會直接影響基頻預(yù)測模型的效果。如果應(yīng)該有基頻的地方?jīng)]有預(yù)測出基頻,合成聲音聽起來就是沙啞的,對聽感的影響十分明顯。
一個(gè)好的聲碼器還要處理好基頻和諧波的關(guān)系。如果高頻諧波過于明顯,在聽感上會造成嗡嗡的聲響,機(jī)械感明顯。
總結(jié)在這篇文章里,我們介紹了 TTS 的基礎(chǔ)原理,以及分析了語音助手不能像真人一樣說話的原因:TTS 在做各種決策中會犯錯(cuò),導(dǎo)致朗讀出錯(cuò)或者不自然。同時(shí),為了讓電腦可以合成聲音,工程師會對文本轉(zhuǎn)語音問題做簡化,導(dǎo)致沒有準(zhǔn)確的刻畫聲音生成的過程。這種簡化一方面來自于對語音語言生成過程的認(rèn)知局限,同時(shí)也受限制于目前的計(jì)算工具。
盡管現(xiàn)在在這個(gè)領(lǐng)域內(nèi)有很多新的方法,特別是使用深度學(xué)習(xí)(Deep Learning)方法來直接做文本到語音的轉(zhuǎn)化,而且已經(jīng)展示出來了非常自然的聲音,但是讓你的 AI 助手完全像人一樣說話仍然是一項(xiàng)非常具有挑戰(zhàn)性的工作。
記者(公眾號:記者)按:本文作者鄭杰文,愛丁堡大學(xué)人工智能碩士,師從國際著名語音合成專家Simon King教授。 現(xiàn)任職Rokid ALab 語音合成算法工程師,負(fù)責(zé)語音合成引擎架構(gòu)設(shè)計(jì),后端聲學(xué)模型開發(fā)等工作。