針對基于 Diffusion 和 LLM 類別的 TTS 模型,NVIDIA Triton 和 TensorRT-LLM 方案能顯著提升推理速度。在單張 NVIDIA Ada Lovelace GPU 上,F(xiàn)5-TTS 模型每秒可生成長達(dá) 25 秒的音頻;Spark-TTS 在流式合成場景下,首包延遲可低至 200 余毫秒。
Text-to-Speech (TTS) 是智能語音技術(shù)的核心組成部分。隨著大模型時代的到來,TTS 模型的參數(shù)量和計算量持續(xù)增長,如何高效利用 GPU 部署 TTS 模型,構(gòu)建低延遲、高吞吐的生產(chǎn)級應(yīng)用,已成為開發(fā)者日益關(guān)注的焦點(diǎn)。
本文將圍繞兩款 Github 社區(qū)流行的 TTS 模型——F5-TTS[1] 和 Spark-TTS[2]——詳細(xì)介紹運(yùn)用NVIDIA Triton推理服務(wù)器和 TensorRT-LLM 框架實(shí)現(xiàn)高效部署的實(shí)踐經(jīng)驗,包括部署方案的實(shí)現(xiàn)細(xì)節(jié)、具體使用方法及最終的推理效果等。開發(fā)者可根據(jù)不同的應(yīng)用場景選擇合適的方案,并可利用性能分析工具調(diào)整配置,以最大化利用 GPU 資源。
方案介紹
當(dāng)前主流的 TTS 大模型大致可分為兩類:非自回歸擴(kuò)散模型和自回歸 LLM 模型。非自回歸擴(kuò)散模型因其解碼速度快,易于實(shí)現(xiàn)高吞吐性能;而自回歸 LLM 模型則以更佳的擬人效果和對流式合成的天然支持為特點(diǎn)。實(shí)踐中,常有方案將兩者結(jié)合,先使用自回歸 LLM 生成語義 Token,再利用非自回歸擴(kuò)散模型生成音頻細(xì)節(jié)。
圖1: TTS 部署方案結(jié)構(gòu)
F5-TTS
F5-TTS 是一款非自回歸擴(kuò)散 TTS 模型,它基于 DiT (Diffusion Transformer) 和 Flow-matching 算法,移除了傳統(tǒng)非自回歸 TTS 模型中的 Duration 模塊,使模型能直接學(xué)習(xí)文本到語音特征的對齊。
其推理加速方案利用NVIDIA TensorRT-LLM加速計算密集的 DiT 模塊,并采用 NVIDIA TensorRT 優(yōu)化 Vocos 聲碼器,最后通過 NVIDIA Triton 進(jìn)行服務(wù)部署。
方案地址:
https://github.com/SWivid/F5-TTS/tree/main/src/f5_tts/runtime/triton_trtllm
Spark-TTS
Spark-TTS 是一款自回歸 LLM TTS 模型,它采用經(jīng)過擴(kuò)詞表預(yù)訓(xùn)練的 Qwen2.5-0.5B LLM 來預(yù)測 Speech Token,并基于 VAE Decoder 重構(gòu)最終音頻。
其部署方案通過 NVIDIA TensorRT-LLM 加速基于 LLM 的語義 Token 預(yù)測模塊,并借助 NVIDIA Triton 串聯(lián)其余組件,支持離線合成與流式推理兩種模式。
方案地址:
https://github.com/SparkAudio/Spark-TTS/tree/main/runtime/triton_trtllm
方案性能
我們從 WenetSpeech4TTS 測試集[3] 中選取了 26 組 Prompt Audio 和 Target Text 音頻文本對,在 Zero-shot 音色克隆任務(wù)上測試了模型的推理性能。測試細(xì)節(jié)如下:
F5-TTS
針對 F5-TTS,我們在 Offline 模式下(即直接在本地進(jìn)行推理,不涉及服務(wù)部署和請求調(diào)度)測試了 TensorRT-LLM 推理方案的性能:
測試結(jié)果如下(Batch Size 固定為 1,因當(dāng)前 F5-TTS 版本暫不支持 Batch 推理;Flow-matching 推理步數(shù)固定為 16):
如上表所示,與原生 PyTorch 實(shí)現(xiàn)(默認(rèn)啟用 SDPA 加速)相比,NVIDIA TensorRT-LLM 方案在 Ada Lovelace GPU 上實(shí)現(xiàn)了約 3.6 倍的加速,每秒可生成的音頻時長從 7 秒提升至 25 秒。
Spark-TTS
對于 Spark-TTS,我們在 Client-Server 模式下(即客戶端向服務(wù)器發(fā)送請求)測試了端到端推理服務(wù)的性能。測試結(jié)果如下(Offline 模式不統(tǒng)計首包延遲,Streaming 模式首包音頻長度為 1 秒):
上表結(jié)果中,LLM 模塊默認(rèn)啟用了 TensorRT-LLM 的 inflight batching 模式。為模擬多路并發(fā)場景,我們基于 Python asyncio 庫實(shí)現(xiàn)了一個異步并發(fā)客戶端。此部署方案在 Ada Lovelace GPU 上,每秒可生成約 15 秒音頻,流式模式下的首包延遲低至 200 余毫秒。
快速上手
本節(jié)將指導(dǎo)您如何快速部署和測試 F5-TTS 與 Spark-TTS 模型。在此之前,建議您先克隆對應(yīng)的代碼倉庫,并進(jìn)入 runtime/triton_trtllm 目錄操作。
F5-TTS
詳細(xì)步驟請參考 F5-TTS/src/f5_tts/runtime/triton_trtllm/README.md 和 run.sh 腳本。
1. 最簡部署 (Docker Compose):這是啟動 F5-TTS 服務(wù)最快捷的方式。
# 根據(jù)您的模型選擇,例如 F5TTS_BaseMODEL=F5TTS_Base docker compose up
(注意:F5TTS_v1_Base 的支持可能仍在開發(fā)中,請檢查項目 README)
2. 手動部署與服務(wù)啟動:如果您需要更細(xì)致地控制部署流程,可以使用 run.sh 腳本分階段執(zhí)行。
# 腳本參數(shù): [model_name]# 例如,執(zhí)行階段0到4,使用 F5TTS_Base 模型bash run.sh 0 4 F5TTS_Base
這個命令會依次執(zhí)行以下主要步驟:
- Stage 0:下載 F5-TTS 模型文件。
- Stage 1:轉(zhuǎn)換模型權(quán)重為 TensorRT-LLM 格式并構(gòu)建引擎。
- Stage 2:導(dǎo)出 Vocos 聲碼器為 TensorRT 引擎。
- Stage 3:構(gòu)建 Triton 推理服務(wù)器所需的模型倉庫。
- Stage 4:啟動 Triton 推理服務(wù)器。
3. 測試服務(wù):服務(wù)啟動后,您可以使用提供的客戶端腳本進(jìn)行測試。
- gRPC 客戶端 (數(shù)據(jù)集 Benchmark):
# 示例命令,對應(yīng) run.sh stage 5# 具體參數(shù)(如 num_task, dataset)請根據(jù)需求調(diào)整python3 client_grpc.py --num-tasks 1 --huggingface-dataset yuekai/seed_tts --split-name wenetspeech4tts --log-dir ./log_f5_grpc_bench
- HTTP 客戶端(單句測試):
# 示例命令,對應(yīng) run.sh stage 6# audio, reference_text, target_text 請?zhí)鎿Q為您的測試數(shù)據(jù)python3 client_http.py --reference-audio ../../infer/examples/basic/basic_ref_en.wav \\ --reference-text "Some call me nature, others call me mother nature." \\ --target-text "I don\\'t really care what you call me. I\\'ve been a silent spectator, watching species evolve, empires rise and fall. But always remember, I am mighty and enduring."
4. OfflineTensorRT-LLM基準(zhǔn)測試:如果您希望直接測試 TensorRT-LLM 在 Offline 模式下的性能(不通過 Triton 服務(wù)),可以執(zhí)行 run.sh 中的 Stage 7。
# 此命令對應(yīng) run.sh stage 7# 環(huán)境變量如 F5_TTS_HF_DOWNLOAD_PATH, model, vocoder_trt_engine_path, F5_TTS_TRT_LLM_ENGINE_PATH# 通常在 run.sh 腳本頂部定義,請確保它們已正確設(shè)置或替換為實(shí)際路徑。batch_size=1model=F5TTS_Base # 示例模型名稱split_name=wenetspeech4ttsbackend_type=trtlog_dir=./log_benchmark_batch_size_${batch_size}_${split_name}_${backend_type}# 確保以下路徑變量已設(shè)置,或直接替換# F5_TTS_HF_DOWNLOAD_PATH=./F5-TTS (示例)# F5_TTS_TRT_LLM_ENGINE_PATH=./f5_trt_llm_engine (示例)# vocoder_trt_engine_path=vocos_vocoder.plan (示例)rm -r $log_dir 2>/dev/null# ln -s ... # 符號鏈接通常在 run.sh 中處理,按需創(chuàng)建torchrun --nproc_per_node=1 \\benchmark.py --output-dir $log_dir \\--batch-size $batch_size \\--enable-warmup \\--split-name $split_name \\--model-path $F5_TTS_HF_DOWNLOAD_PATH/$model/model_1200000.pt \\--vocab-file $F5_TTS_HF_DOWNLOAD_PATH/$model/vocab.txt \\--vocoder-trt-engine-path $vocoder_trt_engine_path \\--backend-type $backend_type \\--tllm-model-dir $F5_TTS_TRT_LLM_ENGINE_PATH || exit 1
Spark-TTS
詳細(xì)步驟請參考 Spark-TTS/runtime/triton_trtllm/README.md 和 run.sh 腳本。
1. 最簡部署 (Docker Compose):
docker compose up
2. 手動部署與服務(wù)啟動:使用 run.sh 腳本進(jìn)行分階段部署。
# 腳本參數(shù): [service_type]# service_type 可為 'streaming' 或 'offline',影響模型倉庫配置# 例如,執(zhí)行階段0到3,部署為 offline 服務(wù)bash run.sh 0 3 offline
此命令會執(zhí)行:
- Stage 0:下載 Spark-TTS 模型。
- Stage 1:轉(zhuǎn)換模型權(quán)重并構(gòu)建 TensorRT 引擎。
- Stage 2:根據(jù)指定的 service_type (streaming/offline) 創(chuàng)建 Triton 模型倉庫。
- Stage 3:啟動 Triton 推理服務(wù)器。
3. 測試服務(wù) (Client-Server 模式):服務(wù)啟動后,可使用客戶端腳本進(jìn)行測試。
- gRPC 客戶端 (數(shù)據(jù)集 Benchmark):此命令對應(yīng) run.sh 中的 stage 4。
# 示例:測試 offline 模式,并發(fā)數(shù)為2# bash run.sh 4 4 offline# 其核心命令如下:num_task=2mode=offline # 或 streamingpython3 client_grpc.py \\ --server-addr localhost \\ --model-name spark_tts \\ --num-tasks $num_task \\ --mode $mode \\ --huggingface-dataset yuekai/seed_tts \\ --split-name wenetspeech4tts \\ --log-dir ./log_concurrent_tasks_${num_task}_${mode}
- 單句測試客戶端: 此命令對應(yīng) run.sh 中的 stage 5。
- Streaming 模式 (gRPC):
# bash run.sh 5 5 streaming# 其核心命令如下:python client_grpc.py \\ --server-addr localhost \\ --reference-audio ../../example/prompt_audio.wav \\ --reference-text $prompt_audio_transcript \\ --target-text $target_audio_text \\ --model-name spark_tts \\ --chunk-overlap-duration 0.1 \\ --mode streaming
- Offline 模式 (HTTP):
# bash run.sh 5 5 offline# 其核心命令如下:python client_http.py \\ --reference-audio ../../example/prompt_audio.wav \\ --reference-text $prompt_audio_transcript \\ --target-text $target_audio_text \\ --model-name spark_tts
兼容 OpenAI 格式的 API
許多開源對話項目 (如 OpenWebUI)[4] 已支持 OpenAI 格式的 TTS API。為方便開發(fā)者集成,我們提供了兼容 OpenAI API 的服務(wù),用法如下:
git clone https://github.com/yuekaizhang/Triton-OpenAI-Speech.gitcd Triton-OpenAI-Speechdocker compose upcurl $OPENAI_API_BASE/audio/speech \\ -H "Content-Type: application/json" \\ -d '{ "model": "spark_tts", "input": $target_audio_text, "voice": "leijun", "response_format": "pcm" }' | \\sox -t raw -r 16000 -e signed-integer -b 16 -c 1 - output3_from_pcm.wav
總結(jié)
無論是 F5-TTS 或是 Spark-TTS,都可以看到 NVIDIA Triton 推理服務(wù)器和 TensorRT-LLM 框架可以大幅提升 TTS 模型的推理速度,也方便開發(fā)者進(jìn)行模型部署。我們將持續(xù)增加對更多語音多模態(tài)模型的部署支持。
除了 TTS,NVIDIA 技術(shù)團(tuán)隊也為多種社區(qū)流行的多模態(tài)模型開發(fā)了最佳實(shí)踐,詳細(xì)方案介紹以及教程,請參閱 mair-hub[5] 項目。
近期我們還將舉辦一場和該主題相關(guān)的在線研討會,歡迎大家報名參加,共同交流和探討。
活動地址:
https://scrm.nvidia.cn/mF/websiteEditorLandingPage/page/0050a3cc15a248489910cdf136d819ad?pushId=tnwrNs5X6CMJXbYNT4Fbwg1
引用鏈接
[1] F5-TTS:
https://github.com/SWivid/F5-TTS
[2] Spark-TTS:
https://github.com/SparkAudio/Spark-TTS
[3] WenetSpeech4TTS:
https://arxiv.org/abs/2406.05763
[4] OpenWebUI:
https://github.com/open-webui/open-webui
[5] mair-hub 項目:
https://github.com/nvidia-china-sae/mair-hub
作者
張悅鎧
張悅鎧是 NVIDIA 解決方案架構(gòu)師,碩士畢業(yè)于約翰霍普金斯大學(xué),導(dǎo)師為 Shinji Watanabe 教授,主要研究方向為語音識別。NVIDIA 中文語音識別解決方案主要開發(fā)者,對基于 GPU 的語音識別服務(wù)部署及優(yōu)化有豐富經(jīng)驗。
特別聲明:以上內(nèi)容(如有圖片或視頻亦包括在內(nèi))為自媒體平臺“網(wǎng)易號”用戶上傳并發(fā)布,本平臺僅提供信息存儲服務(wù)。
Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.