继续前面一个实例,给转换后的文本配上一张图片,形成mp4视频文件
文本文件内容
bash
近日网络上一条网友的发言意外走红,相关观点迅速在数码和汽车圈层扩散,也随之引发了大范围的公众争议。
Python代码
bash
# 导入 PyTorch 深度学习框架,用于模型加载和指定运行设备(如 GPU)
import torch
# 导入 soundfile 库,用于将生成的音频数据保存为 WAV 等音频文件
import soundfile as sf
# 从 qwen_tts 库中导入 Qwen3TTSModel 类,这是核心的语音合成模型
from qwen_tts import Qwen3TTSModel
# 导入 moviepy 用于音视频合成
from moviepy import ImageClip, AudioFileClip
def txt_to_speech(txt_path, output_audio, output_video, model_path, image_path=None):
"""
将文本文件转换为语音并保存为音频文件,可选合成 MP4 视频。
"""
# 1. 加载模型
print(f"正在加载模型: {model_path} ...")
model = Qwen3TTSModel.from_pretrained(
model_path,
device_map="cuda:0",
dtype=torch.bfloat16,
attn_implementation="sdpa"
)
print("模型加载完成!")
# 2. 读取文本内容
with open(txt_path, 'r', encoding='utf-8') as f:
text_content = f.read().strip()
if not text_content:
print("文本文件为空,退出程序。")
return
# 3. 执行语音合成
print("正在合成语音...")
wavs, sr = model.generate_custom_voice(
text=text_content,
language="Chinese",
speaker="Vivian",
instruct="用温柔、专业的语气朗读。"
)
# 4. 保存音频文件 (WAV)
sf.write(output_audio, wavs[0], sr)
print(f"✅ 语音合成完毕,已保存至: {output_audio}")
# 5. 如果提供了背景图片,则合成 MP4 视频
if image_path:
print("正在合成 MP4 视频...")
try:
audio_clip = AudioFileClip(output_audio)
image_clip = ImageClip(image_path).with_duration(audio_clip.duration)
video_clip = image_clip.with_audio(audio_clip)
# ✅ 加上 fps=24 即可解决报错
video_clip.write_videofile(output_video, codec="libx264", audio_codec="aac", fps=24)
print(f"✅ MP4 视频合成完毕,已保存至: {output_video}")
except Exception as e:
print(f"❌ MP4 合成失败: {e}")
if __name__ == "__main__":
TXT_FILE = "test.txt"
OUTPUT_WAV = "output.wav"
OUTPUT_MP4 = "output.mp4"
MODEL_PATH = "../Qwen3-TTS-12Hz-0.6B-CustomVoice"
# 提供一张背景图片的路径(如 jpg 或 png)
BG_IMAGE = "tts.jpg"
txt_to_speech(TXT_FILE, OUTPUT_WAV, OUTPUT_MP4, MODEL_PATH, BG_IMAGE)
转换
bash
C:\Users\admin\Desktop>python tts.py
********
Warning: flash-attn is not installed. Will only run the manual PyTorch version. Please install flash-attn for faster inference.
********
正在加载模型: ../Qwen3-TTS-12Hz-0.6B-CustomVoice ...
模型加载完成!
正在合成语音...
Setting `pad_token_id` to `eos_token_id`:2150 for open-end generation.
✅ 语音合成完毕,已保存至: output.wav
正在合成 MP4 视频...
MoviePy - Building video output.mp4.
MoviePy - Writing audio in outputTEMP_MPY_wvf_snd.mp4
MoviePy - Done.
MoviePy - Writing video output.mp4
MoviePy - Done !
MoviePy - video ready output.mp4
✅ MP4 视频合成完毕,已保存至: output.mp4
转换结果
output
依赖
bash
pip install torch transformers qwen_tts soundfile moviepy imageio-ffmpeg
pip install torch torchvision --index-url https://download.pytorch.org/whl/cu121