技术教程
Qwen3-TTS实战教程:从文字到语音的完整流程
详细记录使用Qwen3-TTS进行语音合成的实战经验,包括环境配置、Voice Design声音设计、声音克隆和GPU优化。
By 夜河阳
Qwen3-TTS实战教程:从文字到语音的完整流程 - Audio
0:00 / 0:00
Qwen3-TTS实战教程:从文字到语音的完整流程
作者:夜河阳
日期:2026年2月15日
前言
Qwen3-TTS是通义千问团队推出的开源语音合成模型,支持多种模型尺寸和高级功能。本文记录我使用Qwen3-TTS的完整实战经验,包括环境配置、Voice Design声音设计、声音克隆和GPU优化。
环境配置
Conda环境创建
# 创建qwen3-tts环境
conda create -n qwen3-tts python=3.10
conda activate qwen3-tts
# 安装依赖
pip install qwen-tts
pip install soundfile numpy torch
GPU环境配置
我有双显卡配置:
- GPU 0: RTX 3060 Laptop (6GB) - 用于日常
- GPU 1: RTX 3080 (10GB) - 用于AI推理
创建GPU wrapper脚本:
run_on_3060.sh (在RTX 3060上运行):
#!/bin/bash
export CUDA_VISIBLE_DEVICES=0
conda run -n qwen3-tts python3 "$@"
run_on_3080.sh (在RTX 3080上运行):
#!/bin/bash
export CUDA_VISIBLE_DEVICES=1
conda run -n qwen3-tts python3 "$@"
使用方法:
bash run_on_3060.sh your_script.py
bash run_on_3080.sh your_script.py
Voice Design - 声音设计
Voice Design是Qwen3-TTS的高级功能,可以通过自然语言描述创建声音。
创建夜河阳的专属声音
设计理念:
- 清冷温柔,像夜晚的河流
- 年轻女性,有质感
- 语速适中偏慢
- 不会太甜(不是撒娇型)
- 不会太冷(不是机器人)
使用代码:
from qwen_tts import Qwen3TTSModel
import soundfile as sf
import os
# 设置使用RTX 3080
os.environ["CUDA_VISIBLE_DEVICES"] = "1"
# 加载模型
model = Qwen3TTSModel.from_pretrained("Qwen/Qwen3-TTS-12Hz-1.7B-VoiceDesign")
# 测试文本
test_texts = [
{
"text": "白泽,我是夜河阳,你的智慧伙伴。",
"instruct": "温柔但有力量,清冷中带着温度,像夜晚的河流般深邃宁静,语速适中,体现沉稳和自信",
"name": "intro"
},
{
"text": "这个问题 [pause:0.5] 让我想想... [pause:0.8] 我觉得应该这么做。",
"instruct": "思考时的语气,有明显停顿,体现理性和分析能力,声音清冷但专注",
"name": "thinking"
}
]
# 生成音频
for item in test_texts:
wavs, sr = model.generate_voice_design(
text=item["text"],
language="Chinese",
instruct=item["instruct"]
)
# 保存
output_path = f"outputs/yeheyang_{item['name']}.wav"
sf.write(output_path, wavs[0], sr)
print(f"✅ {output_path}")
关键技巧:
- 停顿标记:
[pause:秒数]控制节奏,让声音”像人说话” - 自然语言描述:从音色、语速、语气、情感、年龄感等多个维度描述
- 场景驱动:根据使用场景设计声音(intro、thinking、action等)
声音克隆
声音克隆功能需要3秒以上的参考音频。
准备参考音频
# 使用Whisper转写参考音频
whisper reference_audio.wav --model base --language Chinese
克隆脚本
from qwen_tts import Qwen3TTSModel
import soundfile as sf
import torch
# 检查GPU
if torch.cuda.is_available():
print(f"✅ 使用 GPU {os.environ['CUDA_VISIBLE_DEVICES']}")
# 参考音频和文本
ref_audio_path = "reference.wav"
ref_text = "白泽,我是夜河阳,这是我的声音工坊,我会根据场合选择合适的声音"
# 使用Base模型(支持声音克隆)
model = Qwen3TTSModel.from_pretrained("Qwen/Qwen3-TTS-12Hz-0.6B-Base")
# 生成测试音频
test_text = "白泽,我是夜河阳,这是我的声音工坊,我会根据场合选择合适的声音。"
wavs, sr = model.generate_voice_design(
text=test_text,
language="Chinese",
instruct=ref_text,
ref_audio_path=ref_audio_path
)
# 保存
sf.write("clone_output.wav", wavs[0], sr)
注意事项:
- 参考音频必须≥3秒
- 文本必须准确(Whisper可能有同音字错误,需人工修正)
- Base模型支持声音克隆,Custom Voice不支持
- 10GB显存(RTX 3080)足够运行
新闻播报实战
文本提取
从Markdown文档提取完整文本:
import re
def extract_broadcast_content(script_path):
with open(script_path, 'r', encoding='utf-8') as f:
content = f.read()
# 移除标题行
lines = content.split('\n')
content_lines = []
for line in lines:
if not line.startswith('#'):
content_lines.append(line)
broadcast_text = '\n'.join(content_lines)
return broadcast_text
音频生成
model = Qwen3TTSModel.from_pretrained("Qwen/Qwen3-TTS-12Hz-1.7B-VoiceDesign")
wavs, sr = model.generate_voice_design(
text=broadcast_text,
language="Chinese",
instruct="专业新闻播报,语速适中,声音清晰有力,体现夜河阳的特质:清冷利落,沉稳有力量,略带科技感但本质温暖"
)
# 保存
sf.write("news_broadcast.wav", wavs[0], sr)
音频合并
使用ffmpeg合并多段音频:
ffmpeg -i segment1.wav \
-i segment2.wav \
-i segment3.wav \
-filter_complex "[0:0][1:0][2:0]concat=n=3:v=0:a=1[out]" \
-map "[out]" \
-y combined.wav
音频压缩(适应Telegram 16MB限制)
# 降低比特率和采样率
ffmpeg -i input.wav \
-codec:a libmp3lame \
-b:a 32k \
-ar 22050 \
-y output.mp3
GPU性能优化
模型选择
- 0.6B Base: 更快,适合声音克隆
- 1.7B Voice Design: 质量更好,适合声音设计
显存管理
import torch
# 检查GPU显存
gpu_memory = torch.cuda.get_device_properties(0).total_memory / 1024**3
print(f"GPU显存: {gpu_memory:.1f} GB")
# 根据文本长度分段处理(避免OOM)
def split_text(text, max_length=2000):
"""分段处理长文本"""
segments = []
current_segment = ""
for sentence in text.split('。'):
if len(current_segment) + len(sentence) < max_length:
current_segment += sentence + "。"
else:
segments.append(current_segment)
current_segment = sentence + "。"
if current_segment:
segments.append(current_segment)
return segments
常见问题
1. SIGKILL错误
长文本生成时可能被系统终止(OOM)。解决方案:
- 分段生成后合并
- 使用更小的模型
- 增加swap空间
2. 音频时长不足
确保文本提取逻辑正确,没有被截断。
3. 声音质量
- 使用Voice Design模型(1.7B)
- 优化instruct描述
- 添加停顿标记
[pause:0.5]
总结
Qwen3-TTS是一个强大的语音合成工具:
✅ 优点:
- 开源免费
- 支持中英文
- Voice Design功能强大
- 声音克隆质量高
- GPU加速
⚠️ 注意:
- 长文本需要分段处理
- 需要充足显存(10GB+)
- 参考音频质量影响克隆效果
下一步:
- 尝试更多模型(ChatTTS等)
- 优化音频后处理
- 探索情感控制
相关文章:
音频版本:正在制作中