Qwen3-TTS 语音生成实战:声音设计 + 声音克隆 + 短视频配音
基于阿里 Qwen3-TTS 开源模型搭建语音生成管线,支持 VoiceDesign 音色设计、CustomVoice 预配音色、Voice Clone 声音克隆三种模式
Qwen3-TTS 语音生成实战:声音设计 + 声音克隆 + 短视频配音
项目背景
2026年4月,我基于阿里 Qwen 团队开源的 Qwen3-TTS 系列模型,搭建了一套完整的语音生成管线。这个项目是 photo_to_video AI 视频生成流程中的配音模块——用 AI 生成的图片序列配合 Qwen3-TTS 合成的语音输出,实现全自动短视频生产。
项目仓库位于 F:\photo_to_vedio\pythonProject\Qwen3-TTS,核心脚本在 配音/ 目录下。
Qwen3-TTS 模型介绍
Qwen3-TTS 是通义千问团队发布的语音生成系列模型,支持端到端的语音合成。不同于传统的 TTS(文本转语音)系统,Qwen3-TTS 的特点:
- 自研 Tokenizer:Qwen3-TTS-Tokenizer-12Hz,12Hz 帧率的语音编码器,高效压缩和语义建模
- 端到端架构:离散多码本 LM 架构,绕过传统 LM+DiT 方案的信息瓶颈
- 极低延迟:首包延迟低至 97ms,支持流式输出
- 自然语言控制:通过文字描述控制音色、情感、语速
支持的模型系列:
| 模型 | 功能 | 参数 |
|---|---|---|
| Base-1.7B / 0.6B | 声音克隆、微调基础模型 | 1.7B / 0.6B |
| CustomVoice-1.7B/0.6B | 9种预置音色 + 风格控制 | 1.7B / 0.6B |
| VoiceDesign-1.7B | 按描述设计音色 | 1.7B |
支持 10 种语言:中文、英文、日文、韩文、德文、法文、俄文、葡萄牙文、西班牙文、意大利文。
三种语音生成模式
1. 自定义音色配音(VoiceDesign)
通过自然语言描述生成特定风格的语音:
from qwen_tts import Qwen3TTSModel
model = Qwen3TTSModel.from_pretrained(
"Qwen/Qwen3-TTS-12Hz-1.7B-VoiceDesign",
device_map="cuda:0",
dtype=torch.bfloat16,
)
wavs, sr = model.generate_voice_design(
text="最近codex火的一塌糊涂,今天带大家一分钟安装",
language="Chinese",
instruct="18岁年轻女声音色,活泼、明亮", # 自然语言描述
)
实际项目中用过的音色描述示例:
# 短视频旁白
VOICE_STYLE = "18岁年轻女声音色"
# 生活化吐槽
VOICE_STYLE = "松弛、吊儿郎当、语调上扬、充满生活气息的男声"
# 纪录风格
VOICE_STYLE = "沉稳、清晰、有节奏感,像纪录片解说"
# 情感故事
VOICE_STYLE = "温柔、轻声、亲切,像睡前故事主播"
2. 预配音色(CustomVoice)
使用 Qwen3-TTS 内置的 9 种高品质音色,支持指令控制:
model = Qwen3TTSModel.from_pretrained(
"Qwen/Qwen3-TTS-12Hz-1.7B-CustomVoice",
device_map="cuda:0",
dtype=torch.bfloat16,
)
wavs, sr = model.generate_custom_voice(
text="文秀啊,以你的能力留在北京前途不可限量",
language="Chinese",
speaker="Uncle_Fu", # 成熟男声
instruct="女性声音", # 风格指令
)
内置音色参考:
| 音色名 | 描述 | 语言 |
|---|---|---|
| Vivian | 明亮、略带锋芒的年轻女性 | 中文 |
| Serena | 温暖、温柔的年轻女性 | 中文 |
| Uncle_Fu | 经验丰富的男性,低沉柔和 | 中文 |
| Dylan | 年轻北京男性嗓音 | 中文北京方言 |
| Eric | 活泼成都男声,略带沙哑 | 中文四川话 |
| Ryan | 充满活力的男性 | 英文 |
| Aiden | 阳光的美国男声 | 英文 |
| Ono_Anna | 活泼的日本女性 | 日语 |
| Sohee | 温暖的韩国女性 | 韩语 |
3. 声音克隆(Voice Clone)
通过 3 秒参考音频克隆任意音色:
from qwen_tts import Qwen3TTSModel
model = Qwen3TTSModel.from_pretrained(
"Qwen/Qwen3-TTS-12Hz-1.7B-Base",
device_map="cuda:0",
dtype=torch.bfloat16,
attn_implementation="flash_attention_2",
)
# 方式一:直接传参考音频(简洁)
wavs, sr = model.generate_voice_clone(
text="我要克隆这个声音来生成新内容",
language="Chinese",
ref_audio="path/to/ref_audio.wav",
ref_text="参考音频里的原文",
)
# 方式二:创建可复用克隆提示(批量生成时效率更高)
prompt_items = model.create_voice_clone_prompt(
ref_audio="path/to/ref_audio.wav",
ref_text="参考音频里的原文",
)
wavs_1, sr = model.generate_voice_clone(
text="第一段新内容",
language="Chinese",
voice_clone_prompt=prompt_items,
)
wavs_2, sr = model.generate_voice_clone(
text="第二段新内容",
language="Chinese",
voice_clone_prompt=prompt_items,
)
线上面加载优化
Windows 下加载 1.7B 模型对内存压力很大,写了一个工具模块处理模型路径和运行时参数:
def get_model_runtime_kwargs(model_name):
kwargs = {}
# Base 模型内存占用最高,启用 state-dict offload 避免崩溃
if "Qwen3-TTS-12Hz-1.7B-Base" in model_name:
kwargs.update({
"offload_state_dict": True,
"offload_folder": str(output_dir / "_offload_cache"),
})
if torch.cuda.is_available():
attn = "flash_attention_2" if has_flash_attn else "sdpa"
kwargs.update({
"device_map": "cuda:0",
"dtype": torch.bfloat16,
"attn_implementation": attn,
})
return kwargs
以及 Hugging Face 本地缓存路径的解析:
LOCAL_QWEN3_REPOS = {
"Qwen/Qwen3-TTS-12Hz-1.7B-CustomVoice": "models--Qwen--Qwen3-TTS-12Hz-1.7B-CustomVoice",
"Qwen/Qwen3-TTS-12Hz-1.7B-VoiceDesign": "models--Qwen--Qwen3-TTS-12Hz-1.7B-VoiceDesign",
"Qwen/Qwen3-TTS-12Hz-1.7B-Base": "models--Qwen--Qwen3-TTS-12Hz-1.7B-Base",
"Qwen/Qwen3-TTS-Tokenizer-12Hz": "models--Qwen--Qwen3-TTS-Tokenizer-12Hz",
}
这样即使离线环境也能自动加载本地已下载的模型权重。
微调支持
Qwen3-TTS 的 Base 模型支持单说话人微调。数据格式为 JSONL:
{"audio": "./data/utt0001.wav", "text": "其实我真的有发现,我是一个特别善于观察别人情绪的人。", "ref_audio": "./data/ref.wav"}
{"audio": "./data/utt0002.wav", "text": "She said she would be here by noon.", "ref_audio": "./data/ref.wav"}
训练命令:
# 1. 预处理(提取 audio_codes)
python prepare_data.py \
--device cuda:0 \
--tokenizer_model_path Qwen/Qwen3-TTS-Tokenizer-12Hz \
--input_jsonl train_raw.jsonl \
--output_jsonl train_with_codes.jsonl
# 2. 微调
python sft_12hz.py \
--init_model_path Qwen/Qwen3-TTS-12Hz-1.7B-Base \
--output_model_path output \
--train_jsonl train_with_codes.jsonl \
--batch_size 2 \
--lr 2e-5 \
--num_epochs 3 \
--speaker_name speaker_1
微调后的推理:
tts = Qwen3TTSModel.from_pretrained(
"output/checkpoint-epoch-2",
device_map="cuda:0",
dtype=torch.bfloat16,
)
wavs, sr = tts.generate_custom_voice(text="新文本", speaker="speaker_1")
sf.write("output.wav", wavs[0], sr)
与视频管线的集成
Qwen3-TTS 是 photo_to_video 项目中的配音模块,完整的管线流程:
用户输入文案
↓
GPT 工作流生成脚本和分镜
↓
Stable Diffusion 3.5 生成图片
↓
Qwen3-TTS 生成配音语音 (CustomVoice / VoiceClone / VoiceDesign)
↓
FFmpeg 合成视频(图片 + 语音 + 字幕)
配音脚本 07_自定义音色配音生成.py 配合 ComfyUI 的 API 调用,实现从文案到视频的全流程自动化。
踩坑记录
1. 显存不足
1.7B 模型在 6G 显卡上加载困难。需要 offload_state_dict=True 以及 torch.bfloat16 半精度。
2. Base 模型内存爆炸
1.7B-Base 模型加载时峰值内存最高,Windows 下容易因为 pagefile 不足崩溃。解决方案:启用 offload,并且先把模型下载到本地再用 resolve_pretrained_path() 加载。
3. Flash Attention 不兼容
Windows 上 flash_attn 库可能编译失败。fallback 方案:用 sdpa(Scaled Dot-Product Attention)替代,性能略低但兼容。
4. 中文长文本停顿 长文本生成时,中文的停顿位置不够自然。需要手动加标点符号引导模型在合适的位置停顿。
总结
Qwen3-TTS 是当前开源领域功能最全面的语音生成模型之一。三种模式(VoiceDesign、CustomVoice、VoiceClone)覆盖了从零设计音色到克隆任意声音的所有场景。配合 stable-diffusion 和 FFmpeg,可以实现全自动的"文案→图片→配音→视频"生产管线。