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

运行环境准备

版本配套表

配套版本环境准备指导
CANN8.2.RC1快速安装CANN
Python3.10.12-
torch2.7.1+cpu-
torch_npu2.7.1.dev20250724-

安装软件包

执行如下命令:

apt update
apt install jq
pip insatll peft==0.17.0
pip install torchvision==0.22.1+cpu
pip install torchaudio==2.7.1+cpu
pip install vllm==0.10.0
pip install vllm-ascend==0.10.0rc1

检查软件包版本

如果torch版本被动升级,如下命令重新安装:

pip install torch==2.7.1+cpu --no-deps

依赖安装

最快捷地使用 Qwen3-TTS 的方式是从 PyPI 安装 qwen-tts Python 包。该包会自动安装所需的运行时依赖项,并允许您加载任意已发布的 Qwen3-TTS 模型。

运行

pip install -U qwen-tts

模型介绍

以下为已发布的 Qwen3-TTS 模型的介绍及下载信息。请根据您的需求选择并下载合适的模型。

Tokenizer 名称描述
Qwen3-TTS-Tokenizer-12HzQwen3-TTS-Tokenizer-12Hz 模型,可将输入语音编码为离散码,并能将其解码还原为语音。
模型特性语言支持流式生成指令控制
Qwen3-TTS-12Hz-1.7B-VoiceDesign根据用户提供的描述进行音色设计。中文、英文、日文、韩文、德文、法文、俄文、葡萄牙文、西班牙文、意大利文✅✅
Qwen3-TTS-12Hz-1.7B-CustomVoice通过用户指令对目标音色进行风格控制;支持 9 种优质音色,涵盖性别、年龄、语言和方言的多种组合。中文、英文、日文、韩文、德文、法文、俄文、葡萄牙文、西班牙文、意大利文✅✅
Qwen3-TTS-12Hz-1.7B-Base基础模型,支持从用户提供的 3 秒音频中快速克隆音色;可用于微调(FT)其他模型。中文、英文、日文、韩文、德文、法文、俄文、葡萄牙文、西班牙文、意大利文✅
Qwen3-TTS-12Hz-0.6B-CustomVoice支持 9 种优质音色,涵盖性别、年龄、语言和方言的多种组合。中文、英文、日文、韩文、德文、法文、俄文、葡萄牙文、西班牙文、意大利文✅
Qwen3-TTS-12Hz-0.6B-Base基础模型,支持从用户提供的 3 秒音频中快速克隆音色;可用于微调(FT)其他模型。中文、英文、日文、韩文、德文、法文、俄文、葡萄牙文、西班牙文、意大利文✅

此次案例将介绍一下Qwen3-TTS在语音生成、语音设计和语音克隆的应用,着重讲解Qwen3-TTS-12Hz-1.7B-CustomVoice、Qwen3-TTS-12Hz-1.7B-VoiceDesign和Qwen3-TTS-12Hz-1.7B-Base的使用步骤。

下载权重

pip install modelscope
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

自定义语音生成

创建脚本

vim CustomVoice.py

脚本如下:

import torch
import soundfile as sf
from qwen_tts import Qwen3TTSModel


model = Qwen3TTSModel.from_pretrained(
    "./Qwen3-TTS/Qwen3-TTS-12Hz-1.7B-CustomVoice",
    device_map="npu:0",
    dtype=torch.bfloat16,
    attn_implementation="flash_attention_2",
)

# single inference
wavs, sr = model.generate_custom_voice(
    text="其实我真的有发现,我是一个特别善于观察别人情绪的人。",
    language="Chinese", # Pass `Auto` (or omit) for auto language adaptive; if the target language is known, set it explicitly.
    speaker="Vivian",
    instruct="用特别愤怒的语气说", # Omit if not needed.
)
sf.write("./Qwen3-TTS/output_custom_voice.wav", wavs[0], sr)

然后运行

python CustomVoice.py

注意:device_map="auto"容易报错,报错日志见如下:

RuntimeError: Expected all tensors to be on the same device, but found at least two devices, npu:1 and npu:0! (when checking argument for argument tensors in method wrapper_NPU__cat)

主要原因:

transformers 库在某些版本中默认启用多 NPU 支持,特别是当使用 from_pretrained 加载模型时

解决办法:

显式指定设备,即device_map="npu:0"

语音设计

创建脚本

vim voice_design.py

脚本如下:

import torch
import soundfile as sf
from qwen_tts import Qwen3TTSModel

model = Qwen3TTSModel.from_pretrained(
    "./Qwen3-TTS/Qwen3-TTS-12Hz-1.7B-VoiceDesign",
    device_map="npu:0",
    dtype=torch.bfloat16,
    attn_implementation="flash_attention_2",
)

# single inference
wavs, sr = model.generate_voice_design(
    text="哥哥,你回来啦,人家等了你好久好久了,要抱抱!",
    language="Chinese",
    instruct="体现撒娇稚嫩的萝莉女声,音调偏高且起伏明显,营造出黏人、做作又刻意卖萌的听觉效果。",
)
sf.write("./Qwen3-TTS/output_voice_design.wav", wavs[0], sr)

# batch inference
wavs, sr = model.generate_voice_design(
    text=[
      "哥哥,你回来啦,人家等了你好久好久了,要抱抱!",
      "It's in the top drawer... wait, it's empty? No way, that's impossible! I'm sure I put it there!"
    ],
    language=["Chinese", "English"],
    instruct=[
      "体现撒娇稚嫩的萝莉女声,音调偏高且起伏明显,营造出黏人、做作又刻意卖萌的听觉效果。",
      "Speak in an incredulous tone, but with a hint of panic beginning to creep into your voice."
    ]
)
sf.write("./Qwen3-TTS/output_voice_design_1.wav", wavs[0], sr)
sf.write("./Qwen3-TTS/output_voice_design_2.wav", wavs[1], sr)

然后运行

python voice_design.py

语音克隆

创建脚本

vim voice_clone.py

脚本如下:

import torch
import soundfile as sf
from qwen_tts import Qwen3TTSModel

model = Qwen3TTSModel.from_pretrained(
    "./Qwen3-TTS/Qwen3-TTS-12Hz-1.7B-Base",
    device_map="npu:0",
    dtype=torch.bfloat16,
    attn_implementation="flash_attention_2",
)

ref_audio = "https://qianwen-res.oss-cn-beijing.aliyuncs.com/Qwen3-TTS-Repo/clone.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."

wavs, sr = model.generate_voice_clone(
    text="I am solving the equation: x = [-b ± √(b²-4ac)] / 2a? Nobody can — it's a disaster (◍•͈⌔•͈◍), very sad!",
    language="English",
    ref_audio=ref_audio,
    ref_text=ref_text,
)
sf.write("./Qwen3-TTS/output_voice_clone.wav", wavs[0], sr)

然后运行

python voice_clone.py