利用 NVIDIA Riva 快速部署企業級中文語音 AI 服務并進行優化加速
一、Riva 概覽
1. Overview
Riva 是 NVIDIA 推出的一款 SDK,用于實時的 Speech AI 服務。它是一個高度可定制的工具,并且使用 GPU 進行加速。NGC 上提供了很多預訓練好的模型,這些模型開箱即用,可以直接使用 Riva 提供的 ASR 和 TTS 解決方案進行部署。
為了滿足特定領域的需求或者進行定制化功能的開發,用戶也可以使用 NeMo 對這些模型進行重新訓練或微調。從而進一步提升模型的性能,使其更加適應用戶的需求。
Riva Skills 是一個高度可定制化的工具,它利用 GPU 加速實時流式的語音識別和語音合成,并且能夠同時處理成千上萬個并發請求。它支持多種部署平臺,包括本地、云端和端側。
2. Riva ASR
在語音識別方面,Riva使用了準確度很高的 SOTA 模型,比如 Citrinet、Conformer 和 NeMo 自研的 FastConformer 等。目前,Riva 支持超過 10 種單語言模型,并且還支持多語種的語音識別,包括英語-西班牙語、英語-中文和英語-日語等的多語言語音識別。
通過定制化的功能,可以進一步提升模型的準確率。例如,針對特定行業術語、口音或方言的支持,以及對噪聲環境的定制化處理,都可以幫助提高語音識別的性能。
Riva 的整體框架能夠應用于多種場景,例如客服和會議系統等。除了通用場景外,Riva 的服務還可以根據不同行業的需求進行定制化,比如 CSP、教育、金融等行業。
3. ASR Pipeline & Customization
在 Riva ASR 的整個流程中,有一些可定制化的模塊,這些模塊可以按照難度分為三類。
首先,橙色框中是在 inference 過程中,在客戶端即可做的定制化。比如支持熱詞功能,通過在 inference 過程中添加產品名稱或專有名詞,使語音模型能夠更準確地識別這些特定的詞匯。這一功能是 Riva 本身就支持的,在不重新訓練模型或重新啟動 Riva 服務器的情況下即可完成定制化。
紫色框中是部署時可以進行的一些定制化。例如,在 Riva 的流式識別中,提供了延遲優化或吞吐優化兩種模式,可以根據業務需求進行選擇,以獲得更好的性能表現。此外,在部署過程中,還可以進行發音詞典的定制化。通過定制化發音詞典,可以確保特定術語、名稱或行業術語的正確發音,并提高語音識別的準確性。
綠色框中是訓練過程中可以進行的定制化,即在服務器端進行的訓練和調整。比如在訓練開始的文本正則化階段,可以加入一些對特定文本的處理。另外,可以微調或重新訓練聲學模型,以解決特定業務場景下的諸如口音、噪聲等問題,使模型更加魯棒。還可以重新訓練語言模型、微調標點模型、逆文本正則化等。
以上就是 Riva 可以定制化的部分。
4. Riva TTS
Riva TTS 流程如上圖中右側所示,它包含以下幾個模塊:
- 第一步是文本正則化。
- 第二步是 G2P,將文本的基本單位轉換為發音或口語的基本單位。例如,將單詞轉換為音素。
- 第三步是頻譜合成,將文本轉換為聲學頻譜。
- 第四步是音頻合成,也稱為 vocoder。在這一步中,將前一步得到的頻譜轉換為音頻。
上圖中,以合成"Hello World"這句話為例,首先進入文本正則化模塊,對文本進行標準化處理,例如將大小寫規范化。接著進入 G2P 模塊,將文本轉換為音素序列。之后進入頻譜合成模塊,通過神經網絡訓練,得到頻譜。最后進入 vocoder,將頻譜轉換為最終的聲音。
Riva 提供流式 TTS 支持,使用了目前流行的 FastPitch 和 HiFi-GAN 模型的組合。目前支持多種語言,包括英語、中文普通話、西班牙語、意大利語和德語等。
5. TTS Pipeline & Customization
在 Riva 的 TTS 流程中,為定制化提供了兩種方式。第一種方式是使用語音合成標記語言(SSML),這是一種比較容易的定制化方式。通過一些配置,可以調整發音的音調、語速、音量等。通常情況下,如果想改變特定詞的發音,會選擇這種方式。
另一種方式是進行微調或重新訓練 FastPitch 或 HiFi-GAN 模型。可以使用自己的特定數據對這兩個模型進行微調或重新訓練。
二、中文語音識別模型的最新更新
1. Overview
在過去的一年中,Riva 對中文模型進行了一些更新和改進。接下來介紹其中一些重要的更新。
首先,持續優化中文語音識別(ASR)模型。可以在相應的鏈接中找到最新的 ASR 模型。
其次,引入了統一模型(Unified Model)的支持。這意味著在一次推理中,可以同時做語音識別標點符號預測。
第三,增加了中英文混合模型的支持。這意味著模型可以同時處理中文和英文的語音輸入。
此外,還引入了一些新的模塊和功能支持。包括基于神經網絡的語音活動檢測(VAD)和說話人日志(Speaker Diarization)模塊。還引入了中文逆文本正則化的功能。這些模型的詳細信息都可以在相應的鏈接中找到。
2. Word Boosting
除此之外,我們還為中文提供了詳細的教程。第一部分是關于熱詞(Word Boosting)的教程。
熱詞是通過在識別時候對特定的詞語的權重做調整,從而使得這個詞語識別得更準。在教程中,展示了一個中文模型使用熱詞的示例,如"望岳",這是一首古詩的名字,我們為這個詞賦予了一個分數為 20 的權重。接著,使用 Riva 提供的 add_word_boosting_to_config 方法,將我們希望添加的詞匯及其分數配置到客戶端中。然后,將配置好的請求發送給 ASR 服務器,就可以獲得加入熱詞后的識別結果。
在配置熱詞時,需要設置兩個參數:boosted_lm_words 和boosted_lm_score。boosted_lm_words 是我們希望提高識別準確度的詞匯列表。而 boosted_lm_score 則是為這些詞匯設置的分數,通常在 20 到 100 之間。
除了前面的基本配置,Riva 的熱詞功能還支持一些高級用法。例如,可以同時提升多個詞匯的權重。比如,在例子中我們給"五 G"和"四 G"這兩個詞匯,分別設置了權重 20 和 30。
此外,我們還可以使用 word boosting 來降低某些詞匯的準確度,即給它們分配負的權重,從而降低其出現的概率。例如,在例子中,我們給出了一個漢字"她",它的分數設置為 -100。這樣,模型就會傾向于不識別出這個漢字。理論上,我們可以設置任意數量的熱詞,不會對延遲造成影響。另外值得注意的是,boosting 的過程是在客戶端實現的,對服務器端沒有影響。
3. Finetuning Conformer AM
第二個教程,是關于如何微調 Conformer 聲學模型。
微調 ASR 使用的是 NeMo 工具。配置好 NGC 賬戶后,就可以使用"NGC download"命令直接下載 Riva 所提供的預訓練好的中文模型。在這個例子中,下載了第五個版本的中文 ASR 模型。下載完成后,需要加載預訓練模型。
首先,需要導入一些包。參數 model path 設置為剛剛下載好的模型的路徑。接下來,使用 NeMo 提供的 ASRModel.restore_from 函數獲取模型的配置文件,通過 target 這個參數可以獲取原始 ASR 模型的類別。接著,使用 import_class_by_path 函數獲取實際的模型類別。最后,使用該類別下模型的 restore_from 方法來加載指定路徑下的 ASR 模型參數。
加載了模型后,就可以使用 NeMo 提供的訓練腳本來進行微調。在這個例子中,我們以訓練 CTC 模型為例,使用的腳本是 speech_to_text_ctc.py。需要配置的一些參數包括 train_ds.manifest_filepath,即訓練數據的 JSON 文件路徑,還有是否使用 GPU、優化器以及最大迭代輪數等。
在訓練完模型之后,可以進行評估。評估時需要注意將 use_cer 參數設置為true,因為對于中文,我們使用字符錯誤率(Character Error Rate)作為指標。完成了模型的訓練和評估之后,可以使用 nemo2riva 命令將 NeMo 模型轉換為 Riva 模型。然后使用 Riva 的 Quickstart 工具來部署模型。
三、Riva TTS(Text-to-Speech)服務
接下來介紹 Riva TTS 服務。
1. Demo
在這一演示中,Riva TTS 提供的自定義功能,使合成出的語音更加自然。
接下來將介紹 Riva TTS 提供的兩種定制化方式。
2. SSML
首先是前面提到的 SSML(Speech Synthesis Markup Language),它通過一個腳本來進行配置。通過 SSML,可以調整 TTS 中的韻律,包括音高(pitch)和語速(rate),另外還可以調整音量。
如上圖所示,對第一句話“Today is a sunny day“,將其韻律的 pitch 改成了 2.5。對第二句話,做了兩個配置,一個是將它的 rate 設成 high,另外一個將音量加 1DB。這樣就可以獲得一個定制化的結果。
3. TTS Finetuning using NeMo
除了 SSML 之外,還可以使用 NeMo 工具微調或重新訓練 Riva TTS 的FastPitch 或 HiFi-GAN 模型。
Riva 提供了相關教程,在 NGC 上也提供了一些預訓練模型(參見上圖中的鏈接)。
圖中舉了一個微調 HiFi-GAN 模型的例子。使用 hifigan_finetune.py 命令,并配置模型配置名稱、批處理大小、最大迭代步數、學習率等參數。通過設置train_dataset 參數設置微調 HiFi-GAN 所需的數據集路徑。如果從 NGC 下載了預訓練模型,還可以使用 init_from_pretrained_model 參數來加載預訓練模型。這樣就可以重新訓練 HiFi-GAN 模型。
四、Riva Quickstart 工具
定制化好的模型就可以使用 Quickstart 工具來進行部署。
1. 準備
在開始之前,需要注冊一個 NGC 賬號,并確保 GPU 支持 Riva,并且已經安裝了 Docker 環境。
一旦準備工作完成,即可通過提供的鏈接下載 Riva Quickstart。如果已經配置好了 NGC CLI,也可以使用 NGC CLI 直接下載 Riva Quickstart。
2. 服務器啟停
在下載完成 Riva Quick Start 之后,可以使用其中提供的腳本來進行服務器的初始化、啟動和關閉等操作。
以最新版本的 Riva(2.13.1)為例,下載完成后,只需運行 riva_init.sh、riva_start.sh 或 riva_stop.sh 即可完成服務器的初始化、啟動和關閉操作。
如果想要使用中文模型,只需將語言代碼設置為 zh-CN,工具就會自動下載相應的預訓練模型。即可啟動服務使用中文的 ASR(自動語音識別)和 TTS(文本轉語音)功能。
3. Riva Client
一旦服務器啟動成功,即可使用 Riva 提供的腳本 riva_start_client.sh 來調用服務。如果希望進行離線語音識別,只需運行 riva_asr_client 命令并指定要識別的音頻文件路徑。如果要進行流式語音識別,則可以使用 riva_streaming_asr_client 命令。如果要進行語音合成,可以使用 riva_tts_client 命令,向剛剛啟動的服務器發送要處理或合成的音頻。
五、參考資源
以下是一些 Riva 相關的文檔資源:
Riva 官方文檔:這個文檔提供了關于 Riva 的詳細信息,包括安裝、配置和使用指南等。您可以在這里找到 Riva 的官方文檔,以便深入了解和學習 Riva 的各個方面。
Riva Quick Start 用戶指南:這個指南為用戶提供了 Riva Quick Start 的詳細說明,包括安裝和配置步驟,以及常見問題的解答。如果您在使用 Riva Quick Start 過程中遇到任何問題,您可以在這個用戶指南中找到答案。
Riva Release Notes:這個文檔提供了關于 Riva 最新模型的更新信息。您可以在這里了解每個版本的更新內容和改進。
以上這些資源將可以為用戶更好地理解和使用 Riva 提供幫助。
以上就是本次分享的內容,謝謝大家。
六、問答環節
Q1:Riva 和 Triton 的關系是怎樣的?是否有些功能重疊?
A1:對,Riva 使用的是 Nvidia Triton 的inference 框架,是基于 Nvidia Triton 做的一些開發。
Q2:Riva 在 RAG 領域有實際落地嗎?或者開源項目?
A2:Riva 目前應該主要還是聚焦在 Speech AI 領域。
Q3:Riva 和 Nemo 有什么關系嗎?
A3:Riva 更側重于部署的解決方案,用 Nemo 訓練的模型可以用 Riva 來部署,我們也可以使用 Nemo 來做一些 fine-tuning 和訓練的工作,然后 fine-tune 好的模型也可以在 Riva 當中進行部署。
Q4:其他框架訓練的模型可以適用嗎?
A4:其他框架訓練的暫時是不支持的,或者需要一些額外的開發工作。
Q5:Riva 能部署 PyTorch 或 TensorFlow 訓練框架的模型嗎?
A5:Riva 現在主要支持的是 Nemo 訓練出來的模型,Nemo 其實就是基于 PyTorch 做的一些開發。
Q6:如果在 Nemo 里自定義了一個新的模型,需要在 Riva 中寫部署代碼嗎?
A6:對于自研的模型,想在 Riva 里面支持的話,是需要做一些額外的開發的。
Q7:小內存 GPU 能否使用 Riva?
A7:可以參照 Riva 提供的適配平臺相關文檔,其中有不同型號 GPU 的適配的情況。
Q8:怎么快速地試用 Riva?
A8:可以直接在 NGC 上下載 Riva Quickstart 工具包來試用 Riva。
Q9:如果要支持中文方言,Riva 是不是要做定制化訓練?
A9:對的。可以使用自己的一些方言的數據。在 Riva 提供的預訓練模型基礎上進行微調,再在 Riva 里面部署就可以了。
Q10:Riva 和 Tensor LM 的定位有沒有一些重合,或者區別?
A10:Riva 的加速其實也是使用 Tensor RT,Riva 是一個基于 Tensor RT 和 Triton 的產品。