由于之前的音频速度较慢,因此这里调整到1.3倍速
文本转语音代码
bash
import torch
import soundfile as sf
from qwen_tts import Qwen3TTSModel
from moviepy import ImageClip, AudioFileClip, vfx
from pydub import AudioSegment
import os
def txt_to_speech(txt_path, output_audio, output_video, model_path, image_path=None, speed=1.0):
# 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="用温柔、专业的语气朗读。"
)
sf.write(output_audio, wavs[0], sr)
print(f"✅ 原始语音合成完毕,已保存至: {output_audio}")
# 4. 处理音频变速(核心优化部分)
processed_audio_path = output_audio
if speed != 1.0:
print(f"🎵 正在使用专业算法处理 {speed}x 变速不变调...")
try:
# 使用 pydub 加载音频
audio_seg = AudioSegment.from_file(output_audio)
# speedup 方法可以实现变速不变调,crossfade=0 避免拼接杂音
processed_audio_seg = audio_seg.speedup(playback_speed=speed, crossfade=0)
# 导出处理后的音频(覆盖原文件或保存为新文件)
processed_audio_path = "temp_spaced_audio.wav"
processed_audio_seg.export(processed_audio_path, format="wav")
print("✅ 音频变速处理完成!")
except Exception as e:
print(f"⚠️ pydub 处理失败,将回退到普通变速: {e}")
# 5. 合成 MP4 视频
if image_path:
print(f"正在合成 MP4 视频...")
try:
# 使用处理后的音频路径加载
audio_clip = AudioFileClip(processed_audio_path)
image_clip = ImageClip(image_path).with_duration(audio_clip.duration)
video_clip = image_clip.with_audio(audio_clip)
video_clip.write_videofile(output_video, codec="libx264", audio_codec="aac", fps=24)
print(f"✅ MP4 视频合成完毕,已保存至: {output_video}")
# 清理临时文件
if processed_audio_path != output_audio and os.path.exists(processed_audio_path):
os.remove(processed_audio_path)
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"
BG_IMAGE = "tts.jpg"
SPEED = 1.3
txt_to_speech(TXT_FILE, OUTPUT_WAV, OUTPUT_MP4, MODEL_PATH, BG_IMAGE, speed=SPEED)
转换
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
🎵 正在使用专业算法处理 1.3x 变速不变调...
✅ 音频变速处理完成!
正在合成 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
输出
文本转视频demo