前言
「語音處理」是實時互動領域中非常重要的一個場景,在「RTC Dev Meetup丨語音處理在實時互動領域的技術實踐和應用」活動中,來自聲網、微軟和數美的技術專家,圍繞該話題進行了相關分享。
本文基於聲網音訊體驗演算法專家馮建元在活動中分享內容整理。 關注公眾號「聲網開發者」,回覆關鍵詞「DM0428」即可下載活動相關 PPT 資料。
01 基於傳統音效的實時變聲演算法的困境
1、變聲改變的是什麼
■圖 1
要通過發音來識別一個人,有很多維度需要考慮。
首先,每個人的發音腔體各有不同,口腔的張合以及喉部的聲帶震動,都可能有個體聲學方面的區別,這導致由於每個人的發音有不同的音色,在此基礎上運用語言進行表達,就可能產生不同的韻律;其次,每個人所處的房間不同,也可能會伴有不同的混響,對識別造成影響;此外,有時通過變聲唱歌,可能還需要樂器配合以及一些樂理知識。
而且,我們在感知聲音的時候,也會受心理影響,同一個聲音,有的人可能會覺得有磁性,但有些人可能會覺得比較粗糙。心理感知根據個人經歷的不同,也會有些區別。
2、人為什麼會有不同的音色
那麼在實時場景下,如何實時變化聲音呢?當韻律較長時,雖然我們無法改變遣詞造句,但可以改變發音腔體的音色,因為它對實時性的要求比較高。
舉例來說,比如“今天是幾號”這樣一句話,可以把這些字拆成一些音素,比如“今”可以拆成 “J” 和“in” 這兩個音素,它是一個濁音,可以由聲帶震動發出聲音,此時每個人的音色區別比較大;而“是”是一個清音,通過脣齒的氣流形式實現,對於這個字來說,每個人的音色區別比較小。這是為什麼呢?
■圖 2
本質上來說,聲帶的震動頻率決定了發音的音調高低。不同的人通過不同的聲帶震動頻率發同樣一個音,其音色在濁音上會有很大的不同。比如上面的例子,“今天幾號”這幾個字,不同的人發音可能會有比較大的區別,而“是”這個字可能區別就比較小。
傳統的變身演算法也是從這個角度來考慮,不同的人有不同的基頻,根據聲帶振動頻率不同,可以調整基頻的分佈。不同的基頻會有不同的諧波,諧波就是基頻的倍數。這樣就可以通過變調方式來改變聲音。
■圖 3
在發不同的音時,嘴巴的開合程度決定了發音腔體的共振情況,開合程度的不同會導致不同頻響的增強或削弱,如果和口腔的共振頻率達到同一頻率,頻段就會被增強,不同則會被削弱。這就是共振峰的原理。從濁音的角度來說,聲帶震動產生基頻,基頻會有相應的諧波,諧波在不同頻率的分佈由腔體的開合來決定。這樣,改變基頻和頻響的分佈就可以對音色有所調整。
3、基於傳統音效的變聲
傳統演算法其實就是通過不同的效果器對不同的發音維度進行調整,圖 4 所示為傳統演算法常用的效果器,比如變調,現在變調的演算法大部分都是通過 pitch shifting 把基頻和諧波向上或者向下擴充套件。在這種情況下,shift 操作會同時改變共振峰,使聲音都根據頻譜的能量向上或者向下移動,從而改變人的基頻發聲。
女生的基頻比較高,而男生的基頻比較低,通過這個方法就可以使兩者的基頻方向一致。但是男女發音時的口腔開合也會隨字的變化而變化,僅僅改變基頻不能做到完美的聲音轉變。比如電影《神偷奶爸》,其中的小黃人說的是西班牙語,由於基頻提高它變成了小孩子的聲音,但是這並不自然,還需要均衡器進行調節。
前面的例子在變調的時候只改變了基頻,其實共振峰和頻響可以通過均衡器或者共振峰濾波器來進行調整,這些也是調整音色的關鍵模組。另外,經過美聲訓練的人在唱歌或者說話的時候,高頻音較多,發音比較飽滿,從這個角度來說,可以通過激勵器對其諧波進行增強。
■圖 4
傳統演算法大部分都是通過效果器的串聯鏈路,從不同的維度對聲音進行改變。常用的效果器軟體包括 MorphVOX PRO 或者 voicemod,它們有不同的效果器,通過調整引數就可以產生不同的人物特徵。選擇音效其實就是不同效果器的疊加,每個人說話的聲音最後變聲出來也都是不一樣的,因為基礎位置就不一樣,所以很難把所有人的聲音都變成一樣的,但是可以做方向性的調整。
我使用 MorphVOX 軟體進行了男變女或者女變男的跨性別變化,在男聲變女聲的時候,使用預設的選項進行調整就有變成了小黃人的感覺。如果使女聲變成男聲,發現聲音聽上去有點憨,像鼻音比較重的情況。出現這種情況是因為女聲變成男聲的時候需要降調,使整個頻譜往下進行壓縮,這樣很多高頻資訊就丟失了。
可見,傳統的效果器都有各自的缺陷,導致變化不那麼準確。要想得到比較好聽的聲音,傳統的鏈路方式都需要手動改變引數,無法做到精準的音色變換,而如果僅使用預設值進行調整,音色變換的效果並不理想。另外,每個人的聲音想變成另外一個指定的人是一件很難的事情,可能只有專業的調音師才能做到。
02 ASR+TTS=VC?基於 AI 的實時變聲可能性探索
1、ASR
傳統變聲有很多侷限性,那麼基於 AI 的方式能否改善實時的變聲效果呢?我們知道,ASR 技術可以實現語音轉文字的功能,其實在進行變聲的時候,也需要對語義資訊進行保留,只進行整體的調整可能出現漏字或者表達意義存在錯誤的情況。
如圖 5 所示,現在有很多的識別框架,比如 hybrid(框架)的 Kaldi 等,這種框架會通過聲學模型、發音詞典以及語言模型等對聲音轉換進行綜合的判定,要同時滿足發音正確和語言合理兩個條件。
■圖 5
從這個角度來說,它是一個解釋性比較強的鏈路,同時也便於搭建,因為有很多現成的發音詞典、語言模型可以使用。它也存在一定的缺點,就是解碼過程比較複雜,這種框架包含多個模型,如果其中一個出現問題,那麼在識別的時候就會出現偏差。
針對這一問題出現了很多端到端語音識別框架,比如 Espnet,其準確率從通用模型的角度來說,在資料充足的情況下,能做到比 hybrid 更好的識別效果。而且其訓練流程也比較簡單,不像 hybrid 框架,需要訓練聲學模型、語言模型,然後進行解碼。這種框架只需要語音和文字資料配對,然後直接進行端到端訓練就可以了。但是它的缺點也很明顯,因為要進行端到端的訓練,所以其要求更高,需要更大的訓練集以及更準確的標註。另外,不同的場景可能需要定製,所要求的資料更多,如果是端到端的模型,則可能沒有較好的語料進行訓練。
目前從變聲的角度來說,其實不一定要識別文字,只要準確識別音素即可,這是與 ASR 模型的區別。
2、TTS
ASR 可以識別發音,那麼同樣一個音,由不同的人發出,就需要用到 TTS。對於這一點,也有很多現成的框架可以使用,過程無非是把 ASR 提取到的文字進行歸一化處理,然後進行頻譜預測,再通過聲碼器生成聲音,如圖 6 所示。谷歌的 Tacontron、微軟的 Fastspeech 都對這一功能進行了實踐,能夠以較低的延遲合成語音。對於圖 6 的鏈路來說,Fastspeech 也可以直接跳過聲碼器部分直接生成語音,也就是說,直接從文字到語音就可以做到這一部分的 end to end 的生成。這樣,結合 ASR 加 TTS 的形式,就可以實現變聲。
■圖 6
TTS 中的聲碼器技術其實已經比較成熟,它所做的工作其實就是,從一個壓縮的頻譜資訊預測語音,圖 7 展示了不同聲碼器的 mushra scores,它可以理解為發音轉化的自然度,作為轉換是否自然的評判。
我們可以看到,像 wnet 或者 wRNN 這種基於主點生成的聲碼器,在語音合成上已經取得了比較好的效果,能夠和真人的聲音從自然度上來說沒有太大的區別。另外,Hifi-GAN 或者 Mel-GAN 在實時性比較好的情況下,也能夠達到類似 WaveRNN 的效果。聲碼器技術發展到現在,已經達到了較好的語音生成效果,成為變聲效果器的前提。
■圖 7
3、VC
通過 ASR+TTS 的串聯方式實現聲音轉換的基本步驟如圖 8 所示,Speaker A 說一段話,然後通過 ASR 提取跟說話人無關的文字或音素資訊,再利用 TTS 技術轉換成 Speaker B 的音色進行還原,以實現變聲。
■圖 8
對於這條鏈路,如果聲音只能由一個人變成另外一個人,就是 One-to-one 的形式。而 ASR 其實跟說話人是無關的,如果是這樣的情況,就可以做到 Any-to-one。也就是說,ASR 模型無論 Speaker 是誰,都能識別出準確的文字,使所有人都變成 Speaker B。而變聲的終極目標是變成 Any-to-any 的形式,就是說一個模型可以把任何人的聲音變成任意一種聲音,進行變聲能力的擴充套件。
我們知道,很多端到端的模型,像 CycleGAN、StarGAN 或者 VAEGAN 等,可以實現在有限集合中進行聲音變換,使訓練集中的人能夠在 group 中互相轉換,但這也是其設計的侷限性所在,如果能夠切換 TTS 的音色,就可能解決聲音的可定製性,使其變成任何一個人的聲音。可見,ASR + TTS 等於 VC 的理論實際上是可以實現的。
如果想變成 Any-to-any 的形式,需要一個快捷的方式,不能每新增一個人,就對整個模型重新進行訓練。這就需要借鑑可遷移學習的思想。圖 9 展示的是基於遷移學習的語音生成方式。
■圖 9
遷移學習的思想就是,通過 speaker encoder 模組對目標音色進行 embedding 操作,以提取音色的特徵,然後把特徵放到語音生成模組 synthesizer 中,這樣就可以進行不同音色的語音生成。這其實是谷歌之前的發現,他們將 speaker encoder 模組加入 TTS 中,就可以實現不同的音色變化,當新增新的 ID,也就是說話人時,只需要識別說話人的一段一分鐘或幾十秒的語料,就可以提取 speaker 的特徵,生成相應的音色。這種思想其實就是遷移學習的方法。
現在有很多不同的 speaker encoding 方法,比如 I-vector、X-vector、谷歌的 GE2E (generalized end to end) 這種主要偏向 loss 設計的模型,以及中文(比較好)的 Deep Speaker、韓文(比較好)的 RawNet 等。因此,我們就可以把它拆開來,除了 ASR 和 TTS,再加入這個 speaker encoder 模組來進行調整,實現目標說話人的音色,做到 Any-to-any 了。
03 實時變聲系統的演算法實現
1、實時變聲系統的演算法框架
接下來看一看實時變聲系統是怎樣實現的,如圖 10 所示,將目標說話人的小段語料加入聲紋識別(speaker encoding 部分),獲取聲紋特徵,同時經過語音識別模組提取音素特徵。然後在頻譜轉換模組,進行頻譜特徵的生成,再通過聲碼器得到語音。
■圖 10
其實整個過程存在 offline 和 online 的區別,聲紋識別模組可以通過 offline training 實現。這裡的主要難點在於:
①實時變聲要考慮算力以及實時性。就算力而言,語音識別、頻譜轉換和聲碼器,即使採用目前業內最快的演算法,其算力也都在GFLOPS 量級,如果是在手機上部署,很可能無法去實現,但是在伺服器上可以實現。
②就實時性而言,在實時的溝通過程中,如果變聲花費了很長的延遲,則可能會導致溝通時需要很長的時間進行反應,在 RTC 環境下這種情況出現的頻率較多。這就要求端到端的延遲儘可能小,一般來說不能超過 1 秒,如果超過 1 秒,會感覺到變聲有明顯的延遲效應。當然,端到端的延遲還包括編解碼、採集播放等鏈路上的延遲,最終,整個演算法的延遲就不能高於 400 毫秒。
③要做到 Any-to-any 的變聲,則變聲效果是否穩定、錯字率是否足夠低也是很有挑戰的方向。語音識別的錯字率在 5% 左右就已經是比較好的效果了,如果希望錯字率更低,則可能需要更大的模型或者更有針對性的場景。另外,音色的相似度取決於聲紋識別模組是否能準確地提取音色,這也是一個巨大的挑戰。
2、實時變聲系統
其實不同的語音識別框架、聲紋識別框架以及聲碼器框架可以自由地進行組合,形成一套完整的變聲系統。但是為了將演算法延遲降到 400 毫秒,可能考慮更多的是聲紋系統的部署。如圖 11 所示的例子,在部署實時變聲系統的時候,我們會考慮究竟是在雲端進行變聲,還是在端側實現,這兩套鏈路其實是有各自的優缺點。首先看在雲端上進行變聲的優缺點。
■圖 11
如果在雲端做變聲,則需要在本地進行 speaker 的音訊採集,然後經過 APM 聲音處理模組去除降噪、回聲等。接下來進行語音的編解碼,語音經過編碼之後會傳輸到伺服器進行變聲。這部分因為受到網路的影響,可能需要引入 NetEQ 模組進行抗弱網,進行解碼後再變聲。變聲之後的音訊還需要進行編碼再傳到 listener 端,listener 也會引入 NetEQ 模組進行抗弱網,然後解碼和播放。
這種形式比端側實現變聲增加了 NetEQ 和伺服器上編解碼的過程,如果是在沒有弱網的情況下,它控制的延遲可能增加 30~40 毫秒。但是如果是在有弱網的情況下,為了抗丟包,延遲可能就會達到 100 毫秒或者 200 毫秒,甚至更高。
雲端變聲的優點非常明顯,就是在伺服器上變聲的算力要求比較低,在部署的時候,可以用更好的聲碼器、ASR 或者頻譜轉換通過算力來提升音質。如果是從端側來考慮,則可以把變聲放到傳送端,因為接收端可能不止一個,只要在傳送端做一次變聲就可以,這樣就省掉了 NetEQ 和 Codec 在伺服器上進行的轉換,其他鏈路上的延遲跟雲端部署是一樣的。如果從這個角度來考慮,端到端的方式即使沒有變聲,它在一般情況下可以做到 400 毫秒左右的延遲,加上演算法 400 毫秒的延遲,端側變聲的延遲將小於 800 毫秒,能夠在很大程度上降低實時傳輸過程中的延遲消耗,使溝通更加順暢。
端側變聲還受到算力的影響。前面提到,端側的效率在 GFLOPS 量級,比如 iPhone X 或者是更新的版本中有 GPU 處理晶片,這種情況在端上也是可以實現實時計算的,但是模型算力還是不能太大。
04 Demo 展示與應用場景
■圖12
接下來介紹通過前面提到的鏈路進行變聲的 Demo 的效果,以及它的應用場景。Demo 是一段男女的對話。在虛擬社交中,其實發出的聲音與人物本身不一定是符合的,比如女生想用男生的形象表達,如果聲音沒有改變,則可能跟男生的形象不符,產生性別的錯位。通過 Demo 變聲前後的對比可以發現,為了解決這個問題,可以採用變聲效果實現人物和發音的對應。另外,剛才的對話也沒有因為變聲而遭到打斷。
1、實時變聲的應用場景
那麼變聲會在什麼樣的場景下使用呢?其實變聲無論是在元語聊這種 MetaChat 場景,還是傳統的直播語聊中,都有用武之地。比如在聊天的時候,可能需要對虛擬形象進行定製,包括更換形象或聲音等,以提升沉浸感。如果你是萌妹的形象,但是使用渾厚的聲音,可能很快就會被人識別出來。又比如在遊戲中,如果你能用目標人物的聲音,則會有更多的代入感。
另外,現在還出現了很多虛擬數字人的場景,很多明星都會通過給自己定製虛擬的形象進行直播,不需要自己進入直播間,其他人通過後臺的模擬就可以常態化的 24 小時的直播。語聊房場景的代表就是線上劇本殺,使用者在進行角色演繹的時候,會有不同的場景代入,也就需要不同的聲線切換,通過變聲就可以實現。
2、更好的實時變聲效果
就目前的實時變身效果來說,還有很多的方向可以進行優化。這裡舉幾個例子,大家可以討論。首先,前面提到,為了保證實時性,只是通過改變說話人音色這一維度進行了調整,其實通過說話人的抑揚頓挫或者發音情感的表達還可以提升識別的相似性。因此,在滿足實時性要求的情況下,可以進行更多的探索,將表達的特徵更多地放到變聲效果器中。
其次,就聲碼器來說,需要更小的算力以及更好的效果。其實現在的聲碼器,從自然度來說,已經能夠有比較好的表現,但是對於逐點生成的聲碼器而言,在算力上仍有很大的挑戰。因此算力和效果需要得到均衡,並在均衡的基礎上獲得更加合適的聲碼器。
另外,更為魯棒的音素提取模組也是目前困擾 ASR 語音識別的一大難題。在噪聲或者複雜場景下,除了人聲之外還有別的聲音,這會影響語音識別的效果。對於這種情況,可以引入降噪模組提取人聲,也可以通過研發對噪聲更魯棒的音素提取模組,使其在噪聲中識別出人聲。我們在溝通的時候,不管是 ASR 還是變聲,還可能會遇到多語種的問題,比如中文中間夾帶英文,甚至引用日文等,在這種情況下,就會存在多語種識別的問題,也就是 code-switch,針對這一問題目前還沒有完美的解決方案,是今後可以提升的方向。
最後,硬體決定了能夠部署的模型的上限能夠複雜到怎樣的程度。如果在端上有更好的硬體進行部署,就可以在降低端到端延遲的同時實現更好的變聲效果。這也是未來需要關注的一個方向。
05 問答環節
1、對於實時變聲有什麼方法可以有效降低延遲?
我們在做實時變聲,尤其是在還需要互動的時候,首先,最好是在雲端上進行部署,這樣可以降低在伺服器進行傳輸和抗弱網的時候帶來的延遲。其次,在做演算法的同時,比如進行實時的流式 ASR 會有 lookahead,就比如說我們往後要多看幾幀,才能夠保證它的識別性準確性。對於這部分,無論是 ASR、TTS 還是頻譜轉換,都需要控制 lookahead 的 量,讓它能夠在保證實時性的同時,不至於對效果產生過大的影響。從實踐上來說,能夠把整體的演算法延遲控制到 400 毫秒以內,具體分到每個模組,估計在 100 毫秒左右。
2、Any-to-any 變聲的功能在哪裡可以體驗?個人可以使用嗎?
這部分還在打磨階段,但是我們已經有 demo 可以體驗了。最近幾個月內會發布 demo 供大家體驗。
3、小白如果想系統化學習音訊,有比較好的學習資源或者學習路徑推薦嗎?
我之前跟極客時間合作了“搞定音訊技術”的欄目。我發現說其實音訊這個領域可能確實有點小眾,但它涉及的領域卻又非常多。大家可以在網上找一些資源系統化地學習,除了音訊本身,其實還包括音訊的 3A 處理(音訊鏈路處理)、聲學和基於 AI 的技術。
可以先從這幾個角度尋找相關的資料,互相融合學習,效果會比較好。
活動預告
「RTC Dev Meetup - 杭州站」,我們將聚焦大前端技術,邀請來自聲網、螞蟻集團和海康威視的技術專家,為我們分享大前端時代在實時互動領域的業務架構和跨端實踐。
心動不如行動,趕快點選此處報名吧!