跳到正文
Joeplover
项目实战·2026-04-22·约 6 分钟阅读

Qwen3-TTS 语音生成实战:声音设计 + 声音克隆 + 短视频配音

基于阿里 Qwen3-TTS 开源模型搭建语音生成管线,支持 VoiceDesign 音色设计、CustomVoice 预配音色、Voice Clone 声音克隆三种模式

Audio waveform visualization with colorful sound bars

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.6B9种预置音色 + 风格控制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,可以实现全自动的"文案→图片→配音→视频"生产管线。