Ascend-SACT/Qwen3-TTS-vLLM
模型介绍文件和版本Pull Requests讨论分析
下载使用量0

基于vLLM-Omni插件部署Qwen3-TTS模型服务化

1、模型与框架概述

Qwen3-TTS模型介绍

Qwen3-TTS 覆盖 10 种主要语言(中文、英文、日文、韩文、德文、法文、俄文、葡萄牙文、西班牙文和意大利文),并提供多种方言语音配置,以满足全球应用需求。此外,该模型具备强大的上下文理解能力,可根据指令和文本语义自适应地控制语调、语速和情感表达,并对含噪声的输入文本展现出显著增强的鲁棒性。

Qwen3-TTS 模型介绍:

模型特性
Qwen3-TTS-12Hz-1.7B-CustomVoice通过用户指令对目标音色进行风格控制;
支持 9 种优质音色,涵盖不同性别、年龄、语言和方言的组合。
Qwen3-TTS-12Hz-1.7B-VoiceDesign根据用户提供的描述进行音色设计。
Qwen3-TTS-12Hz-1.7B-Base基础模型,支持从用户提供的 3 秒音频快速克隆音色;
可用于微调(FT)其他模型。

vLLM-Omni介绍

vLLM最初设计用于支持大型语言模型,以完成基于文本的自回归生成任务。vLLM-Omni 是一个扩展其对全模态模型推理和服务支持的框架:

  • 全模态:文本、图像、视频和音频数据处理
  • 非自回归架构:将 vLLM 的自回归支持扩展到扩散变换器 (DiT) 和其他并行生成模型
  • 异构输出:从传统文本生成到多模态输出

2、环境准备

配套版本环境准备指导
vLLM-Ascendv0.19.1rc2-
vLLM-Omniv0.20.0vLLM-Omni插件安装指南
CANN8.5.1-
Python3.11.14-
torch2.9.0+cpu-
torch_npu2.9.0-
驱动版本25.2.0-
算力设备Atlas 800T A3-

3、推理服务部署

3.1、环境部署

  • vLLM-Ascend容器部署
# 1、拉取镜像
docker pull quay.io/ascend/vllm-omni:v0.20.0-a3

# 2、容器启动
export IMAGE=quay.io/ascend/vllm-omni:v0.20.0-a3
docker run -itd \
    --name Qwen3-TTS \
    --shm-size=1g \
    --net=host \
    --device /dev/davinci0 \
    --device /dev/davinci1 \
    --device /dev/davinci_manager \
    --device /dev/devmm_svm \
    --device /dev/hisi_hdc \
    -v /usr/local/dcmi:/usr/local/dcmi \
    -v /usr/local/Ascend/driver/tools/hccn_tool:/usr/local/Ascend/driver/tools/hccn_tool \
    -v /usr/local/bin/npu-smi:/usr/local/bin/npu-smi \
    -v /usr/local/Ascend/driver/lib64/:/usr/local/Ascend/driver/lib64/ \
    -v /usr/local/Ascend/driver/version.info:/usr/local/Ascend/driver/version.info \
    -v /etc/ascend_install.info:/etc/ascend_install.info \
    -v /mnt/weight/:/mnt/weight/ \
    $IMAGE bash

# 3、进入容器
docker exec -it {container_id} /bin/bash
  • vLLM-Omni补丁应用,目前版本使用Base模型执行clone任务时会出现音质混乱的情况,需参照此PR进行修复: Enable graph execution for Qwen3-TTS code2wav on NPU
# 修改 /vllm-workspace/vllm-omni/vllm_omni/model_executor/models/qwen3_tts/qwen3_tts_code2wav.py 文件
# 定位 _split_request_ids 方法,修改如下两行内容即可
# 具体可参照 PR:https://github.com/vllm-project/vllm-omni/pull/2823/changes

if seq_token_counts is not None and len(seq_token_counts) > 1:
--> if seq_token_counts is not None and len(seq_token_counts) >= 1:

boundaries.append(boundaries[-1] + count)
--> boundaries.append(boundaries[-1] + int(count))

3.2、模型权重下载

vllm启动服务时可自动下载模型权重至/root/.cache/目录下,如果离线环境不方便下载,也可手动下载准备

modelscope download --model Qwen/Qwen3-TTS-12Hz-1.7B-CustomVoice --local_dir ./Qwen3-TTS-12Hz-1.7B-CustomVoice
modelscope download --model Qwen/Qwen3-TTS-12Hz-1.7B-VoiceDesign --local_dir ./Qwen3-TTS-12Hz-1.7B-VoiceDesign
modelscope download --model Qwen/Qwen3-TTS-12Hz-1.7B-Base --local_dir ./Qwen3-TTS-12Hz-1.7B-Base

3.3、模型部署

模型默认使用配置文件路径如下,部署前可修改相关参数,本次部署将 stage_0 的 gpu_memory_utilization 修改为0.6,充分利用 NPU 卡显存

  • /vllm-workspace/vllm-omni/vllm_omni/deploy/qwen3_tts.yaml
stages:
  - stage_id: 0
    max_num_seqs: 10
    gpu_memory_utilization: 0.6
    trust_remote_code: true

模型启动

# 指定模型名称,自动下载模型
# Qwen/Qwen3-TTS-12Hz-1.7B-CustomVoice
# Qwen/Qwen3-TTS-12Hz-1.7B-VoiceDesign
# Qwen/Qwen3-TTS-12Hz-1.7B-Base
export VLLM_USE_MODELSCOPE=true
vllm serve "Qwen/Qwen3-TTS-12Hz-1.7B-CustomVoice" \
    --host 0.0.0.0 \
    --port 8091 \
    --omni

# 指定模型下载路径,启动服务
vllm serve /mnt/weight/Qwen3-TTS-12Hz-1.7B-CustomVoice \
    --served-model-name "Qwen/Qwen3-TTS-12Hz-1.7B-CustomVoice" \
    --host 0.0.0.0 \
    --port 8091 \
    --omni 

3.4、模型验证

  • CustomVoice 模型请求示例,使用预定义说话人,输出语音参考:custom_output.wav
curl -s -X POST http://0.0.0.0:8091/v1/audio/speech \
    -H "Content-Type: application/json" \
    -d '{
        "model": "Qwen/Qwen3-TTS-12Hz-1.7B-CustomVoice",
        "input": "你好,我是通义千问。今天我们来做一段稍微长一点的语音生成测试,主要观察声音在连续表达时的稳定性、自然度和情绪一致性。一个好的语音模型,不仅要把每个字读清楚,还要在长句子里保持合适的停顿、语速和语调变化。比如在讲解复杂内容的时候,声音应该听起来从容、连贯,而不是忽快忽慢,或者在句子中间突然变得生硬。如果这段音频从开头到结尾都比较自然,发音清晰,节奏稳定,听起来没有明显的机械感,那就说明当前模型在中文长文本生成上的表现是比较可靠的。",
        "voice": "Vivian",
        "language": "Chinese"
    }' --output custom_output.wav
  • VoiceDesign 模型请求示例,通过文本描述生成声音,输出语音参考:design_output.wav
curl -s -X POST http://0.0.0.0:8091/v1/audio/speech \
    -H "Content-Type: application/json" \
    -d '{
        "model": "Qwen/Qwen3-TTS-12Hz-1.7B-VoiceDesign",
        "task_type": "VoiceDesign",
        "input": "今天我给你讲一个小笑话。有一只小猫第一次去上学,老师问它,一加一等于几呀?小猫想了半天,认真地说,等于两条小鱼!老师愣了一下,问它为什么。小猫眨眨眼说,因为我只要看到数字,就会想起午饭啦。虽然这个答案不太对,但是它说得太认真了,大家都忍不住笑了起来。",
        "instructions": "体现稚嫩的萝莉女声,音调偏高,语气活泼可爱,讲笑话时带一点俏皮和开心的感觉"
    }' --output design_output.wav
  • Base 模型请求示例,使用参考音频进行声音克隆,输出语音参考base_output.wav
curl -s -X POST http://0.0.0.0:8091/v1/audio/speech \
    -H "Content-Type: application/json" \
    -d '{
        "model": "Qwen/Qwen3-TTS-12Hz-1.7B-Base",
        "input": "Today I want to take a moment to reflect on how quickly technology is changing the way we communicate, learn, and create. A few years ago, speaking naturally with an intelligent system still felt like science fiction, but now it is becoming part of everyday life. What matters most is not only whether the voice sounds clear, but whether it feels steady, expressive, and comfortable to listen to over time. A good speech model should handle long sentences, short pauses, changes in rhythm, and subtle emotional tone without sounding mechanical or rushed. If this audio sounds smooth from beginning to end, with natural pacing and consistent pronunciation, then it is a strong sign that the generation quality is moving in the right direction.",
        "task_type": "Base",
        "ref_audio": "https://qianwen-res.oss-cn-beijing.aliyuncs.com/Qwen3-TTS-Repo/clone_2.wav",
        "ref_text": "Okay. Yeah. I resent you. I love you. I respect you. But you know what? You blew it! And thanks to you."
    }' --output base_output.wav

4、模型性能

本次性能测试使用 Atlas 800T A3 设备单卡部署验证,供参考

Qwen3-TTS-12Hz-1.7B-CustomVoice

# 压测命令参考
vllm bench serve --omni \
    --host 0.0.0.0 --port 8091 \
    --model /mnt/weight/Qwen3-TTS-12Hz-1.7B-CustomVoice \
    --served-model-name "Qwen/Qwen3-TTS-12Hz-1.7B-CustomVoice" \
    --backend openai-audio-speech \
    --endpoint /v1/audio/speech \
    --dataset-name seed-tts-text \
    --dataset-path /vllm-workspace/vllm-omni/benchmarks/build_dataset/seed_tts_smoke \
    --seed-tts-locale en \
    --num-prompts 10 \
    --num-warmups 2 \
    --extra-body '{"task_type":"CustomVoice"}' \
    --max-concurrency 1 --request-rate inf \
    --percentile-metrics ttft,e2el,audio_rtf,audio_ttfp,audio_duration \
    --save-result --result-dir ./results
指标并发数 1并发数 4
平均音频首包时间(ms)219.061145.31
音频吞吐量(音频时长/秒)1.493.56
平均音频实时率0.671.08
平均音频时长(秒)5.345.47

Qwen3-TTS-12Hz-1.7B-VoiceDesign

# 压测命令参考
vllm bench serve --omni \
    --host 0.0.0.0 --port 8091 \
    --model /mnt/weight/Qwen3-TTS-12Hz-1.7B-VoiceDesign \
    --served-model-name "Qwen/Qwen3-TTS-12Hz-1.7B-VoiceDesign" \
    --backend openai-audio-speech \
    --endpoint /v1/audio/speech \
    --dataset-name seed-tts-design \
    --dataset-path /vllm-workspace/vllm-omni/benchmarks/build_dataset/seed_tts_design \
    --seed-tts-locale en \
    --num-prompts 10 \
    --num-warmups 2 \
    --extra-body '{"task_type":"VoiceDesign"}' \
    --max-concurrency 1 --request-rate inf \
    --percentile-metrics ttft,e2el,audio_rtf,audio_ttfp,audio_duration \
    --save-result --result-dir ./results
指标并发数 1并发数 4
平均 AUDIO_TTFP(毫秒)204.711013.65
音频吞吐量(音频时长/秒)1.513.39
平均 AUDIO_RTF0.661.09
平均 AUDIO_DURATION(秒)4.384.43

Qwen3-TTS-12Hz-1.7B-Base

# 数据集下载
wget --no-check-certificate https://modelscope.cn/datasets/CowboyZ/seed-tts-eval/resolve/master/seedtts_testset.tar

# 解压至数据集目录: /vllm-workspace/vllm-omni/benchmarks/build_dataset/
tar -xf seedtts_testset.tar

# 压测命令参考
vllm bench serve --omni \
    --host 0.0.0.0 --port 8000 \
    --model Qwen/Qwen3-TTS-12Hz-1.7B-Base \
    --backend openai-audio-speech \
    --endpoint /v1/audio/speech \
    --dataset-name seed-tts \
    --dataset-path /vllm-workspace/vllm-omni/benchmarks/build_dataset/seedtts_testset \
    --seed-tts-locale en \
    --num-prompts 10 --num-warmups 2 \
    --extra-body '{"task_type":"Base"}' \
    --max-concurrency 1 --request-rate inf \
    --percentile-metrics ttft,e2el,audio_rtf,audio_ttfp,audio_duration \
    --save-result --result-dir ./results
指标并发数 1并发数 4
平均音频首包时间(毫秒)760.165879.20
音频吞吐量(音频时长/秒)0.911.29
平均音频实时率1.142.58
平均音频时长(秒)3.864.03