安全防護層層加碼,新一代耐用戰(zhàn)神 OPPO A5 Pro 正式開售
深度解讀 TTS 技術(shù)的原理及挑戰(zhàn)
為啥你的語音助手說話不像人?看完這篇你就知道了
編者按:在電影《Her》中越除,男主憑著一個小巧的真無線耳機扮念,就解鎖了一個溫柔又風(fēng)趣的「女朋友」薩曼薩。不過郭宝,在現(xiàn)實生活中摔敛,和語音助手談戀愛還是一件十分遙遠的事情——刨去現(xiàn)階段的語音助手們雙商水平還有限廷蓉,語音助手的語言表達能力還遠遠達不到我們理想狀態(tài)。
為啥你的機器人女友說話不像薩曼薩马昙?本文中苦酱,Rokid A-Lab 語音合成算法工程師鄭杰文將從語音合成技術(shù)談起,給大家分析其中原因给猾。
作者介紹:鄭杰文疫萤,愛丁堡大學(xué)人工智能碩士,師從國際著名語音合成專家Simon King教授敢伸。 現(xiàn)任職Rokid ALab 語音合成算法工程師扯饶,負責(zé)語音合成引擎架構(gòu)設(shè)計,后端聲學(xué)模型開發(fā)等工作池颈。
TTS背后的技術(shù)原理——前端和后端系統(tǒng)
?讓語音助手說話的技術(shù)叫 TTS(text-to-speech)尾序,也就是語音合成。
打造自然躯砰、真實每币、悅耳的 TTS,是 AI 領(lǐng)域的科學(xué)家和工程師一直努力的方向琢歇。但前進過程中總會碰到各種「攔路虎」兰怠,它們究竟是什么??我們先從 TTS 的基礎(chǔ)原理講起李茫。
TTS 技術(shù)本質(zhì)上解決的是「從文本轉(zhuǎn)化為語音的問題」揭保,通過這種方式讓機器開口說話。
但這個過程并不容易秸侣,為了降低機器理解的難度,科學(xué)家們將這個轉(zhuǎn)化過程拆分成了兩個部分——前端系統(tǒng)和后端系統(tǒng)宠互。
前端負責(zé)把輸入的文本轉(zhuǎn)化為一個中間結(jié)果味榛,然后把這個中間結(jié)果送給后端,由后端生成聲音予跌。
接下來搏色,我們先來了解一下前端和后端系統(tǒng)是如何分工協(xié)作的?
生成「語言學(xué)規(guī)格書」的前端系統(tǒng)
小時候我們在認字之前需要先學(xué)習(xí)拼音匕得,有了拼音继榆,我們就可以用它去拼讀我們不認識的字。對于 TTS 來說汁掠,前端系統(tǒng)從文本轉(zhuǎn)化出的中間結(jié)果就好像是拼音略吨。
不過,光有拼音還不行考阱,因為我們要朗讀的不是一個字翠忠,而是一句一句的話。如果一個人說話的時候不能正確的使用抑揚頓挫的語調(diào)來控制自己說話的節(jié)奏乞榨,就會讓人聽著不舒服秽之,甚至誤解說話人想要傳達的意思。所以前端還需要加上這種抑揚頓挫的信息來告訴后端怎么正確的「說話」吃既。
我們將這種抑揚頓挫的信息稱之為韻律(Prosody)考榨。韻律是一個非常綜合的信息,為了簡化問題鹦倚,韻律又被分解成了如停頓河质,重讀等信息。停頓就是告訴后端在句子的朗讀中應(yīng)該怎么停震叙,重讀就是在朗讀的時候應(yīng)該著重強調(diào)那一部分掀鹅。這些所有的信息綜合到一起,我們可以叫」語言學(xué)規(guī)格書」媒楼。
前端就像一個語言學(xué)家,把給它的純文本做各種各樣的分析划址,然后給后端開出一份規(guī)格書扔嵌,告訴后端應(yīng)該合成什么樣的聲音。
在實際的系統(tǒng)中夺颤,為了讓機器能正確的說話对人,這份兒「規(guī)格書」遠遠比我們這里描述的要復(fù)雜。
扮演「發(fā)音人」的后端系統(tǒng)
當(dāng)后端系統(tǒng)拿到「語言學(xué)規(guī)格書」后拂共,目標(biāo)是生成盡量符合這個規(guī)格書里描述的聲音牺弄。
當(dāng)然,機器是不能憑空直接生成一個聲音的宜狐。在這之前势告,我們還需要在錄音棚里錄上幾個到幾十個小時不等的音頻數(shù)據(jù)(根據(jù)技術(shù)不同,使用的數(shù)據(jù)量會不同)抚恒,然后用這些數(shù)據(jù)來做后端系統(tǒng)咱台。
目前主流的后端系統(tǒng)有兩種方法:一種是基于波形拼接的方法,一種是基于參數(shù)生成的方法俭驮。
波形拼接的方法思路很簡單:那就是把事先錄制好的音頻存儲在電腦上回溺,當(dāng)我們要合成聲音的時候春贸,我們就可以根據(jù)前端開出的「規(guī)格書」,來從這些音頻里去尋找那些最適合規(guī)格書的音頻片段遗遵,然后把片段一個一個的拼接起來萍恕,最后就形成了最終的合成語音。
比如:我們想要合成「你真好看」這句話车要,我們就會從數(shù)據(jù)庫里去尋找「你允粤、真、好翼岁、看」這四個字的音頻片段类垫,然后把這四個片段拼接起來。
當(dāng)然琅坡,實際的拼接并沒有這么簡單悉患,首先要選擇拼接單元的粒度,選好粒度還需要設(shè)計拼接代價函數(shù)等榆俺。
參數(shù)生成法和波形拼接法的原理很不相同购撼,使用參數(shù)生成法的系統(tǒng)直接使用數(shù)學(xué)的方法,先從音頻里總結(jié)出音頻最明顯的特征谴仙,然后使用學(xué)習(xí)算法來學(xué)習(xí)一個如何把前端語言學(xué)規(guī)格書映射到這些音頻特征的轉(zhuǎn)換器迂求。
一但我們有了這個從語言學(xué)規(guī)格書到音頻特征的轉(zhuǎn)換器,在同樣合成「你真好看」這四個字的時候晃跺,我們先使用這個轉(zhuǎn)換器轉(zhuǎn)換出音頻特征揩局,然后用另一個組件,把這些音頻特征還原成我們可以聽到的聲音掀虎。在專業(yè)領(lǐng)域里凌盯,這個轉(zhuǎn)換器叫「聲學(xué)模型」,把聲音特征轉(zhuǎn)化為聲音的組件叫「聲碼器」烹玉。
為啥你的 AI 語音助手說話不像人驰怎?
如果簡單的給這個問題一個答案的話,主要有兩個方面的原因:
1.你的 AI 會犯錯二打。為了合成出聲音县忌,AI 需要做一連串的決定,一但這些決定出錯继效,就會導(dǎo)致最終合成出來的聲音有問題症杏,有強烈的機械感,聽著不自然瑞信。TTS 的前端系統(tǒng)和后端系統(tǒng)都有犯錯的可能厉颤。
2.使用 AI 合成聲音時,工程師對這個問題過度簡化凡简,導(dǎo)致沒有準確的刻畫聲音生成的過程逼友。這種簡化一方面是來自于我們?nèi)祟愖约簩φZ言精肃,和人類語音生成的認識還不足夠;另外一方面也來自于商用語音合成系統(tǒng)在運轉(zhuǎn)的時候要對成本控制進行考量帜乞。
下面我們具體來聊聊造成 AI 語音助手說話不自然的前端錯誤和后端錯誤問題司抱。
前端錯誤
前端系統(tǒng),做為一個語言學(xué)家挖函,是整個TTS系統(tǒng)里最復(fù)雜的部分状植。為了從純文本生成出最后的「語言學(xué)規(guī)格書」浊竟,這個語言學(xué)家做的事情要比我們想像的多得多怨喘。
一個典型的前端處理流程是:
- 文本結(jié)構(gòu)分析:我們給系統(tǒng)輸入一個文本,系統(tǒng)要先判斷這個文本是什么語言振定,只有知道是什么語言才知道接下來如何處理必怜。然后把文本劃分成一個一個的句子。這些句子再送給后面的模塊處理后频。
- 文本正則:在中文場景下梳庆,文本正則的目的是把那些不是漢字的標(biāo)點或者數(shù)字轉(zhuǎn)化為漢字。比如「這個操作666啊」卑惜,系統(tǒng)需要把「666」轉(zhuǎn)化為「六六六」膏执。
- 文本轉(zhuǎn)音素:也就是把文本轉(zhuǎn)化為拼音,由于中文中多音字的存在露久,所以我們不能直接通過像查新華字典一樣的方法去找一個字的讀音更米,必須通過其他輔助信息和一些算法來正確的決策到底要怎么讀。這些輔助信息就包括了分詞和每個詞的詞性毫痕。
- 韻律預(yù)測:用于決定讀一句話時的節(jié)奏征峦,也就是抑揚頓挫。但是一般的簡化的系統(tǒng)都只是預(yù)測句子中的停頓信息消请。也就是一個字讀完后是否需要停頓栏笆,停頓多久的決策。
從上面四個步驟可以看出臊泰,任何步驟都是有可能出錯的蛉加,一但出錯,生成的語言學(xué)規(guī)格書就會錯缸逃,導(dǎo)致后端合成的聲音也會錯七婴。一個TTS系統(tǒng),典型的前端錯誤有以下幾種類型:
1察滑、文本正則錯誤
由于我們的書寫形式和朗讀形式是不一樣的打厘,所以在前端非常早期的階段,需要把書寫形式轉(zhuǎn)化為我們實際朗讀的形式贺辰。這個過程在專業(yè)領(lǐng)域里叫「文本正則」户盯。比如我們前面說到的「666」
要轉(zhuǎn)為「六六六」嵌施。我們非常容易感受到 TTS 系統(tǒng)中文本正則的錯誤。比如下面這句:
我花了 666 塊住進了一個房號是 666 的房間吗伤。
我們知道前面的「666」應(yīng)該讀成「六百六十六」,后面的「666」應(yīng)該要讀「六六六」硫眨。但是TTS系統(tǒng)卻很容易搞錯足淆。
另外一個例子:
我覺得有 2-4 的把握,這場比分是 2-4礁阁。
這兩個「2-4」到底應(yīng)該是讀「二到四」巧号,「兩到四」,還是「二比四」呢姥闭?你應(yīng)該一眼就能知道到底怎么樣讀才是正確的丹鸿。但是,對于前端系統(tǒng)來說棚品,這又是一個難題靠欢。
2、注音錯誤
中文是一門博大精深的語言铜跑,正確的朗讀它可并沒有好么容易门怪。其中一個比較棘手的問題就是,面對多音字時锅纺,到底應(yīng)該選擇哪一個音來朗讀呢掷空?
比如這兩句:「我的頭發(fā)又長長了∩」悖」和「我的頭發(fā)長長的拣帽。」這里的「長」到底應(yīng)該是讀二聲的「chang」還是讀四聲的「zhang」呢?
當(dāng)然嚼锄,人可以很輕松的挑選出正確的答案减拭。那么下面這一句呢:
人要是行,干一行行一行宴杀,行行都行癣朗,要是不行,干一行不行一行旺罢,行行不行旷余。
可能你也要略加思索绢记,才能讀對這中間的所有「行」。對于 AI 來說就更難了正卧。
你可能時不時的就能聽到AI助手在朗讀多音字時讀錯了蠢熄,這種錯誤很容易就被你的耳朵捕捉到,并讓你立刻有一個印象:「這絕對不是真人在說話~」炉旷。
當(dāng)然签孔,多音字錯誤只是注音錯誤中的一種,還有其他的一些錯誤窘行,如輕聲饥追,兒化音,音調(diào)變調(diào)等抽高∨懈總之透绩,準確的讓你的AI助手朗讀所有的內(nèi)容并不容易翘骂。
3、韻律錯誤
如前面所說帚豪,為了更準確的傳遞信息碳竟,人在說一句話的時候需要有節(jié)奏感。如果一個人在說話的時候中間不做任何的停頓狸臣,會讓我們很難理解他說的意思莹桅,甚至我們會覺得這個人不禮貌。我們的科學(xué)家烛亦,工程師诈泼,都在想方設(shè)法的讓TTS朗讀得更具備節(jié)奏感一些,更禮貌一些煤禽。但是在很多時候TTS的表現(xiàn)卻總是差強人意铐达。
這是因為語言的變化太豐富了,根據(jù)不同的上下文檬果,甚至不同的場合瓮孙,我們的朗讀的韻律節(jié)奏都不太一樣。韻律中选脊,最重要的就是討論一句話的停頓節(jié)奏杭抠,因為停頓是一句話朗讀正確的基礎(chǔ),如果停頓不對恳啥,錯誤很容易被人耳朵抓住偏灿。
比如這句:;為你切換單曲循環(huán)模式」钝的。如果我們用「|」來表示停頓翁垂,那么一個正常的人朗讀的停頓節(jié)奏一般是這樣的:「為你切換 | 單曲循環(huán)模式」忿墅。
但是如果一但你的 AI 助手說「為你切 | 換單曲循環(huán)模式」這種奇怪的節(jié)奏感時,你內(nèi)心可能是奔潰的沮峡。
后端錯誤
聊完前面這個「經(jīng)常犯錯的語言學(xué)家」疚脐,我們再來看看后端:這個按照「語言學(xué)家」給的 「規(guī)格書」來讀稿子的「發(fā)音人」。
前面提到邢疙,后端主要有拼接法和參數(shù)法兩種方式」髋現(xiàn)在蘋果,亞馬遜的AI助手Siri和Alexa 使用的是波形拼接的方法疟游。而在國內(nèi)呼畸,大多數(shù)公司都是使用參數(shù)法。Rokid的若琪也是使用參數(shù)法颁虐,所以我們關(guān)鍵來看一下參數(shù)法可能的后端錯誤蛮原。
后端系統(tǒng)在拿到前端給的語言信息后,要做的第一件事情是另绩,決定每個漢字到底要發(fā)音多長時間(甚至是每個聲母儒陨,韻母要發(fā)音多長時間)。這個決定發(fā)音長短的組件在專業(yè)領(lǐng)域里叫「時長模型」笋籽。
有了這個時間信息后蹦漠,后端系統(tǒng)就可以通過我們前面說的一個轉(zhuǎn)換器(也叫聲學(xué)模型)把這個語言學(xué)規(guī)格書轉(zhuǎn)化為音頻特征了。然后再用另一個叫「聲碼器」的組件把這些音頻特征還原成聲音车海。從時長模型到聲學(xué)模型笛园,再到聲碼器,這里面的每一步都可能犯錯或者不能完美的生成我們想要的結(jié)果侍芝。
一個 TTS 系統(tǒng)里研铆,典型的后端錯誤有以下幾種類型:
1、時長模型錯誤
在一句話朗讀的時候州叠,根據(jù)上下文語境的不同棵红,每個字朗讀發(fā)音時間是不一樣的。TTS系統(tǒng)必須根據(jù)上下文去決定到底哪些字應(yīng)該讀音拖長一點留量,哪些字應(yīng)該讀短一些窄赋,其中一個比較典型的例子就是語氣詞的朗讀。
通常這些語氣詞由于攜帶了說話人的語氣情感楼熄,它們的發(fā)音都會比普通的字要長一些忆绰,比如這句:
嗯。稚茅。纸淮。我想他是對的。
這里的「嗯」亚享,在這個場景下咽块,很明顯需要被拖長,用于表示一種「思考之后的判斷」欺税。
但是并不是所有的「嗯」都要拖這么長侈沪,比如這一句:「嗯?你剛才說什么晚凿?」
這里的「嗯」代表是一種疑問的語氣亭罪,發(fā)音就要比上面句子中的「嗯」要短得多。如果時長模型不能正確的決策出發(fā)音時長的話歼秽,就會給人一種不自然感覺应役。當(dāng)然,Rokid在語氣詞發(fā)音上也有自己的一套專利方法燥筷,用于生成非常自然的語氣詞發(fā)音箩祥。在后續(xù)的文章中,我們將會推一個專題文章介紹荆责。
2滥比、聲學(xué)模型錯誤
最主要的聲學(xué)模型錯誤就是遇到在訓(xùn)練后端這個「發(fā)音人」時亚脆,沒有見過的發(fā)音做院。聲學(xué)模型的作用是從訓(xùn)練音庫里,學(xué)習(xí)到各種「語言學(xué)規(guī)格書」所對應(yīng)的語音聲學(xué)特征濒持。如果在合成的時候遇到了訓(xùn)練過程中沒有見過的語言學(xué)表現(xiàn)键耕,那么機器就不太容易輸出正確的聲學(xué)特征。
一個常見的例子是兒化音柑营。原則上來說屈雄,每個漢語拼音都有對應(yīng)的兒化音,但在實際說話中有些兒化音被使用到的頻次極低官套,因此錄制音庫的時候通常并不會覆蓋所有的兒化音酒奶,而是僅僅保留最常見的一些。這個時候就會出現(xiàn)一些兒化音發(fā)不出來奶赔,或者發(fā)不好的現(xiàn)象惋嚎。
3、聲碼器錯誤
聲碼器的種類比較多站刑,但是比較傳統(tǒng)另伍、比較常見的聲碼器通常都會用到基頻信息。那什么是基頻呢绞旅?基頻就是你在說話的時候聲帶震動的快慢程度摆尝。這里教你一個簡單的方法來感受自己說話的基頻:把自己的除大拇指以外的其他四個手指按壓到自己的喉嚨部分温艇,然后自己開始對自己隨便說話。
這個時候你就會感受到你的喉嚨在震動堕汞,這個震動的信息就是我們的基頻信息勺爱。發(fā)濁音時會伴隨聲帶振動,聲帶不振動發(fā)出的音稱為清音讯检。輔音有清有濁邻寿,而元音一般均為濁音。所以合成語音中元音和濁輔音的位置都應(yīng)該對應(yīng)有基頻视哑,如果我們前面提到的聲學(xué)模型輸出的基頻出現(xiàn)偏差绣否,聲碼器合成的聲音就會聽起來很奇怪。
在訓(xùn)練后端這個「發(fā)音人」時挡毅,我們也要通過算法來計算出基頻信息蒜撮。不好的基頻提取算法可能會造成基頻丟失、倍頻或者半頻的現(xiàn)象跪呈。這些都會直接影響基頻預(yù)測模型的效果段磨。如果應(yīng)該有基頻的地方?jīng)]有預(yù)測出基頻,合成聲音聽起來就是沙啞的耗绿,對聽感的影響十分明顯苹支。
一個好的聲碼器還要處理好基頻和諧波的關(guān)系。如果高頻諧波過于明顯误阻,在聽感上會造成嗡嗡的聲響债蜜,機械感明顯。
總結(jié)
在這篇文章里究反,我們介紹了 TTS 的基礎(chǔ)原理寻定,以及分析了語音助手不能像真人一樣說話的原因:TTS 在做各種決策中會犯錯,導(dǎo)致朗讀出錯或者不自然精耐。同時狼速,為了讓電腦可以合成聲音,工程師會對文本轉(zhuǎn)語音問題做簡化卦停,導(dǎo)致沒有準確的刻畫聲音生成的過程向胡。這種簡化一方面來自于對語音語言生成過程的認知局限,同時也受限制于目前的計算工具惊完。
盡管現(xiàn)在在這個領(lǐng)域內(nèi)有很多新的方法僵芹,特別是使用深度學(xué)習(xí)(Deep Learning)方法來直接做文本到語音的轉(zhuǎn)化,而且已經(jīng)展示出來了非常自然的聲音专执,但是讓你的 AI 助手完全像人一樣說話仍然是一項非常具有挑戰(zhàn)性的工作淮捆。Rokid ALab 團隊也致力于與大家一起探索 TTS 技術(shù)的突破與應(yīng)用,期待為用戶帶來更加自然的聲音。