騰訊語音合成技術(shù):模型優(yōu)化與推理加速實踐
一、背景-產(chǎn)品展示
首先,讓我們來看一下騰訊自研的知音語音大模型在語音合成領(lǐng)域的應(yīng)用展示。該模型能夠提供更自然、韻律豐富且實時性更強的語音合成體驗。其兩大顯著優(yōu)點如下:
- 聲音復(fù)刻:僅需 10 秒音頻即可完成聲音復(fù)刻。
- 實時性能:通過加速優(yōu)化,其實時率約為 0.085。
我們的產(chǎn)品主要分為三種形態(tài):
- 文本問答:
輸入方式:玩家通過文本輸入問題或指令。
輸出方式:系統(tǒng)利用人工智能技術(shù)處理后,返回相應(yīng)的文本回答。 - 語音交互:
輸入方式:玩家通過語音與 AI 語音助手進行交流。
輸出方式:系統(tǒng)經(jīng)過 AI 處理后,以語音形式回應(yīng)玩家。 - 多模態(tài) NPC(非玩家角色):
輸入方式:玩家可以通過文本或語音與 NPC 進行互動。
輸出方式:系統(tǒng)經(jīng)過 AI 處理后,NPC 可以返回文本、語音、肢體動作、面部表情和口型動作等多種形式的數(shù)據(jù),提供更加豐富和自然的交互體驗。
這三種產(chǎn)品形態(tài)分別涵蓋了文本、語音以及多模態(tài)交互,旨在為用戶提供多樣化且高度沉浸式的互動體驗。
二、模型結(jié)構(gòu)選型與分析
接下來,我將詳細講解我們語音合成模型的結(jié)構(gòu)選型和分析。傳統(tǒng)的語音合成方案通常包括以下步驟:
- 輸入文本。
- 通過聲學(xué)模型生成梅爾譜圖(Mel-spectrogram)。
- 通過聲碼器(Vocoder)將梅爾譜圖轉(zhuǎn)換為語音。
然而,這種傳統(tǒng)方案存在一個顯著缺點:需要大量的訓(xùn)練語料。在游戲場景中,例如 NPC(非玩家角色),往往難以獲取如此大量的訓(xùn)練數(shù)據(jù)。因此,我們的研究方向轉(zhuǎn)向了基于語言模型的解決方案。
1. 語音合成大模型結(jié)構(gòu)
新方案的主要流程如下:
- 輸入文本:
輸入一段文本。 - Tokenization:
對輸入文本和需要克隆的語音分別進行 Token 化處理,生成文本 Token 和語音 Token。 - 連接與編碼:
將文本 Token 和語音 Token 連接在一起。
通過旋轉(zhuǎn)位置編碼(Rotary Position Encoding)對文本和音頻分別進行編碼,生成最終的嵌入向量(Embedding)。 - 自回歸模型(AR Model):
將嵌入向量輸入到 AR 模型中,逐步生成第一層音素 Token。
AR 模型的結(jié)構(gòu)與傳統(tǒng)的自然語言處理大模型(如 GPT 類模型)類似,采用 Transformer 架構(gòu)。 - 非自回歸模型(NAR Model):
將 AR 模型生成的音素 Token 輸入到 NAR 模型中,生成所有語音 Token。
Codec Decoder:
最后,通過 Codec Decoder 將語音 Token 轉(zhuǎn)換為最終的語音輸出。
2. 面臨的挑戰(zhàn)
高并發(fā)場景的挑戰(zhàn):在高并發(fā)環(huán)境下,模型需要高效處理大量請求。
實時率要求:特別是在游戲場景中,需要實時處理語音并觸達玩家,對實時率的要求非常高。
針對上述挑戰(zhàn),第三部分我們將詳細介紹模型推理的加速方案,以提高系統(tǒng)的并發(fā)處理能力和實時性能。
三、模型推理加速方案
在選擇加速方案時,我們首先考慮借鑒自然語言處理(NLP)領(lǐng)域的一些成熟加速方法,并將其應(yīng)用到語音合成大模型上。在 NLP 領(lǐng)域的大模型中,已經(jīng)有許多成熟的推理加速方法,這些方法可以分為工程上的優(yōu)化(KV Cache,prefix KV Cache,flash attention,flash decode和page attention)和偏算法上的優(yōu)化(投機采樣,int4/int8 量化等)。這給我們帶來了非常多的啟發(fā)。
1. KV Cache
為了將 KV Cache 技術(shù)應(yīng)用于語音合成大模型,我們需要確保 Attention Mask 的設(shè)計滿足特定條件。這些條件使得 KV Cache 能夠有效地緩存之前的計算結(jié)果,從而減少冗余計算并提高推理速度。
(1)使用 KV Cache 的條件
- Attention 輸出的第 n 行只與第 n 個 Query (Q)相關(guān):這意味著每個 Token 的輸出只依賴于當前 Token 的 Query 和之前所有 Token 的 Key (K) 和 Value (V)。
- 第 1 到第 n 個 Token 的 Attention 計算包含第 1 到第 n-1 個 Token 的Attention 計算:這意味著每次計算新的 Token 時,可以復(fù)用之前 Token 的 K 和 V 值,而不需要重新計算。
- 每次 Attention 的計算都使用前面的 K 和 V:每次生成新的 Token 時,只需計算新 Token 的 K 和 V 值,并結(jié)合之前緩存的 K 和 V 值進行計算。
(2)語音 AR 模型中的 Attention Mask 設(shè)計
在語音自回歸(AR)模型中,Attention Mask 的設(shè)計通常滿足上述條件,因此可以有效地使用 KV Cache。注意力掩碼(attention_mask)和掩碼后的 QK 矩陣(Mask(QK))的變化過程:左側(cè)展示了一個注意力掩碼的例子,其中每個元素表示對應(yīng)位置的 token 是否參與注意力計算。中間展示了掩碼后的 Q*K 矩陣,其中非零元素表示有效的注意力權(quán)重。當生成第 n 個 token 時,注意力掩碼會發(fā)生相應(yīng)的變化,新的 token 會被加入到掩碼中。右側(cè)展示了更新后的注意力掩碼和相應(yīng)的掩碼后的 Q*K 矩陣。
通過這種方式,每次生成新 token 時,只需要計算新增的部分,而不需要重新計算整個序列的注意力權(quán)重,從而大大減少了計算量,提高了推理速度。
2. GQA
在預(yù)填充(Prefill)階段,計算瓶頸是主要的限制因素。這一階段通常涉及大量的并行計算,特別是在處理初始輸入時,模型需要對整個序列進行編碼,生成所有 Token 的 Key (K) 和 Value (V) 值。這種大規(guī)模的計算需求使得計算資源成為主要瓶頸。
而在解碼(Decode)階段,內(nèi)存訪問瓶頸則成為主導(dǎo)。在解碼過程中,模型逐步生成新的 Token,并且每次生成新 Token 時都需要訪問之前生成的所有 Token 的 K 和 V 值。頻繁的內(nèi)存訪問導(dǎo)致了較高的延遲,使得內(nèi)存帶寬成為主要的性能瓶頸。
相比于使用 KV Cache、INT8/FP8 量化等方法,選擇組量化注意力(Grouped Query Attention, GQA)可以提供更可控的壓縮率。GQA 通過將多個查詢頭(Query Heads)組合在一起,減少了模型中注意力頭的數(shù)量,從而降低了計算復(fù)雜度和內(nèi)存訪問量。這種方法可以在保證模型效果的同時,顯著提高推理效率。
具體來說,通過將注意力頭數(shù)量從 16 減少到 4,我們不僅減少了模型的計算復(fù)雜度,還降低了內(nèi)存訪問的需求。實驗結(jié)果顯示,這種優(yōu)化可以使推理耗時降低 20%。這表明,GQA 是一種有效的手段,能夠在保持模型性能的同時,顯著提升推理速度。
3. BPE
在引入 KV Cache 機制后,AR 模型被劃分為兩個主要階段:預(yù)填充(Prefill)階段和解碼(Decode)階段。預(yù)填充階段負責(zé)初始化模型的狀態(tài),并為后續(xù)的解碼過程準備必要的上下文信息;而解碼階段則基于這些上下文信息逐個生成音頻樣本或 token。對于生成一段時長為 10 秒的高質(zhì)量音頻而言,采用傳統(tǒng)方法通常需要 AR 模型產(chǎn)生大約 500 個 token。
NLP 領(lǐng)域中廣泛采用字節(jié)對編碼(Byte Pair Encoding, BPE)技術(shù)來解決 OOV 問題。BPE 算法首先將輸入文本中的每個單詞拆分成單個字符序列,隨后通過統(tǒng)計分析找出出現(xiàn)頻率最高的字符對,并用一個新的復(fù)合符號代替這對字符。這一替換步驟會重復(fù)進行,直至達到預(yù)設(shè)的最大循環(huán)次數(shù)或滿足其他停止條件為止。這種方法有效地增加了詞典容量的同時,保持了相對較小的詞匯表大小,有助于提高模型訓(xùn)練效率及泛化能力。
為了直接使用 NLP BPE,先將原始音頻數(shù)據(jù)轉(zhuǎn)換成一系列離散化的 audio token,然后將這些 token 與唯一的 Unicode 字符建立一一對應(yīng)關(guān)系。這樣一來,每一個特定的 Unicode 字符實際上就編碼了一個或一組相關(guān)的音頻信號片段。這種做法不僅簡化了模型結(jié)構(gòu),還極大地提升了處理效率。實驗結(jié)果顯示,通過應(yīng)用上述優(yōu)化策略,合成相同長度即 10 秒鐘音頻所需的 token 數(shù)量可由原來的約 500 個減少至約 170 個左右,顯著降低了計算復(fù)雜度并加速了整個生成流程。
4. 連續(xù)性批處理
LLM 中優(yōu)化吞吐主要有兩種方式:
樸素批處理:每個時間步(T1 到 T8)分別獨立地處理不同的句子(S1 到 S4),并且每個句子在達到結(jié)束標記(END)之前都會被單獨處理。
連續(xù)性批處理:試圖在同一時間步內(nèi)同時處理多個句子,以實現(xiàn)更高的并行性和效率。例如,在第一個時間步(T1),四個句子(S1 到 S4)都被處理;隨后的時間步繼續(xù)處理這些句子直到它們各自完成。
這里可以直觀的看到兩種批處理方法的區(qū)別:
左上角圖表:顯示了樸素批處理的結(jié)果,每個時間步僅處理一個句子。
右上角圖表:顯示了樸素批處理的最終狀態(tài),每個句子都在各自的結(jié)束點停止。
左下角圖表:顯示了連續(xù)性批處理的開始階段,所有句子在第一個時間步都被處理。
右下角圖表:顯示了連續(xù)性批處理的最終狀態(tài),不同句子在不同的時間步完成。
在大型語音合成模型中,可以采用兩種不同的批處理(batching)策略。下面分別介紹了這兩種方案及其優(yōu)缺點:
- 訓(xùn)練時采用的方案一
優(yōu)點:當需要對文本和音頻特征進行類似嵌入(embedding, emb)的操作時,這種方案提供了更加簡潔直接的方法。它允許模型分別處理文本和音頻數(shù)據(jù),從而簡化了特征處理流程。
缺點:在推理階段,尤其是在解碼過程中執(zhí)行注意力機制計算時,必須為每次計算提供填充注意力掩碼(padding attention mask)。這增加了推理框架實現(xiàn)上的復(fù)雜性,因為需要額外處理這些掩碼以確保正確地忽略掉填充部分。
- 推理時采用的方案二
優(yōu)點:該方案簡化了注意力機制在推理過程中的應(yīng)用,無需為每次計算單獨定義或傳遞填充注意力掩碼。因此,它可以無縫集成到現(xiàn)有的大規(guī)模語言模型(LLM)推理框架中,提高了易用性和效率。
缺點:然而,在面對需要同時處理文本和音頻特征的情況時,如進行嵌入操作,這種方法可能導(dǎo)致處理流程變得更為復(fù)雜。由于不能像方案一那樣直接分離處理,因此可能需要設(shè)計額外的邏輯來協(xié)調(diào)不同模態(tài)之間的交互,增加了系統(tǒng)的整體復(fù)雜度。
這里我們介紹一下結(jié)合騰訊 Trpc 微服務(wù)框架,在語音合成大模型中實踐 continuous batching 推理的過程。該框架旨在提升模型推理性能,降低延遲并提高資源利用率。
左側(cè)的架構(gòu)圖介紹的是一個典型的分布式系統(tǒng)結(jié)構(gòu)。其中,“master”進程作為主控節(jié)點,負責(zé)任務(wù)調(diào)度和管理。從“master”分支出來的“Dispatcher”進程用于接收用戶請求并將它們分配給各個工作進程組。工作進程組包含多個“Worker”進程,它們運行在 GPU 或 CPU 上,負責(zé)實際的模型推理任務(wù)。此外,還有一個“Task”進程,其內(nèi)部有一個緩沖區(qū)(buffer),用于存儲待處理的任務(wù)。這些任務(wù)經(jīng)過前處理后,進入模型推理階段,最后返回結(jié)果并進行后處理。
右側(cè)的流程圖詳細描述了具體的持續(xù)批量推理過程。首先,通過 rpc 框架請求隊列收集用戶請求,然后進行二次批量處理和優(yōu)先級調(diào)整。接著,這些請求被送入 AR 模型進行連續(xù)性的推理。完成推理后,異步式地返回結(jié)果,并將其放入 NAR 隊列中等待進一步處理。最后,將處理好的結(jié)果發(fā)送回用戶端。
5. 推理加速效果
實時率從 2.09 優(yōu)化到 0.085,吞吐可達到 1 秒 2500tokens。
四、未來展望
在未來的研究與開發(fā)中,我們計劃實施以下幾項關(guān)鍵舉措以進一步優(yōu)化語音合成技術(shù)。
- 引入投機采樣技術(shù):我們將探索將投機采樣方法應(yīng)用于大型語音合成模型的可能性。通過這種技術(shù),可以在生成過程中提前預(yù)測并選擇最有可能的輸出路徑,從而加速音頻合成過程,并可能提高最終合成音頻的質(zhì)量。
- 改造非自回歸(NAR)模型為流式輸出架構(gòu):為了實現(xiàn)更低延遲和更高效的音頻生成,我們打算對現(xiàn)有的 NAR 模型進行調(diào)整,使其支持流式輸出模式。這樣,模型能夠一邊生成音頻數(shù)據(jù)一邊實時輸出,極大地提升了用戶體驗,特別是在需要即時響應(yīng)的應(yīng)用場景中。
- 研究更多非 Transformer 網(wǎng)絡(luò)架構(gòu):雖然 Transformer 架構(gòu)在許多方面表現(xiàn)優(yōu)異,但我們認為探索其他類型的神經(jīng)網(wǎng)絡(luò)結(jié)構(gòu)同樣重要。這包括但不限于卷積神經(jīng)網(wǎng)絡(luò)(CNN)、循環(huán)神經(jīng)網(wǎng)絡(luò)(RNN)及其變體等。我們的目標是發(fā)現(xiàn)那些在特定任務(wù)上具有優(yōu)勢且能提供更高效率或更好性能的新架構(gòu)。