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