95 lines
2.9 KiB
Python
95 lines
2.9 KiB
Python
import os
|
|
import sys
|
|
import soundfile as sf
|
|
import numpy as np
|
|
import time
|
|
|
|
# 设置路径
|
|
WORKSPACE = "/root/tts"
|
|
OUTPUT_DIR = os.path.join(WORKSPACE, "audio_files")
|
|
OUTPUT_FILE = os.path.join(OUTPUT_DIR, "wuzidengke_final.wav")
|
|
|
|
# 确保输出目录存在
|
|
os.makedirs(OUTPUT_DIR, exist_ok=True)
|
|
print(f"✅ 输出目录创建成功: {OUTPUT_DIR}")
|
|
|
|
# 添加VoxCPM到Python路径
|
|
sys.path.insert(0, os.path.join(WORKSPACE, "VoxCPM", "src"))
|
|
print(f"✅ 添加VoxCPM路径: {os.path.join(WORKSPACE, 'VoxCPM', 'src')}")
|
|
|
|
# 导入VoxCPM
|
|
from voxcpm.core import VoxCPM
|
|
|
|
# 要生成的文本
|
|
text = "老牛 只有 累死的命,那是 舐犊跪乳 的 恩情! 替罪 才是 羔羊的运,自有 虎踞龙盘 的 妖精! 亢龙 有悔 悔断了筋,那是 哪吒抽筋 的 极刑! 黑鱼 贪食 吞下了肉,那是 人为刀俎 的 报应!"
|
|
print(f"📄 要生成的文本: {text}")
|
|
|
|
# 使用本地模型路径
|
|
local_model_path = "/root/tts/VoxCPM/models/openbmb__VoxCPM1.5"
|
|
print(f"🔍 检查模型路径: {local_model_path}")
|
|
|
|
if os.path.exists(local_model_path):
|
|
print(f"✅ 模型路径存在")
|
|
else:
|
|
print(f"❌ 模型路径不存在,尝试使用另一个路径...")
|
|
local_model_path = "/root/tts/VoxCPM/models/VoxCPM1.5"
|
|
if os.path.exists(local_model_path):
|
|
print(f"✅ 找到模型路径: {local_model_path}")
|
|
else:
|
|
print(f"❌ 找不到模型路径")
|
|
sys.exit(1)
|
|
|
|
print(f"\n🚀 开始初始化模型...")
|
|
start_time = time.time()
|
|
|
|
# 初始化模型
|
|
model = VoxCPM(
|
|
voxcpm_model_path=local_model_path,
|
|
enable_denoiser=False,
|
|
optimize=False
|
|
)
|
|
|
|
print(f"✅ 模型初始化完成,耗时: {time.time()-start_time:.2f} 秒")
|
|
|
|
print(f"\n🎵 开始生成音频...")
|
|
start_time = time.time()
|
|
|
|
# 生成音频(不使用参考音频,使用默认音色)
|
|
audio = model.generate(
|
|
text=text,
|
|
cfg_value=2.0,
|
|
inference_timesteps=20,
|
|
normalize=True
|
|
)
|
|
|
|
print(f"✅ 音频生成完成,耗时: {time.time()-start_time:.2f} 秒")
|
|
print(f"🎵 音频信息:")
|
|
print(f" - 类型: {type(audio)}")
|
|
print(f" - 形状: {audio.shape}")
|
|
print(f" - 长度: {len(audio)} samples")
|
|
print(f" - 最小值: {np.min(audio):.6f}")
|
|
print(f" - 最大值: {np.max(audio):.6f}")
|
|
print(f" - 采样率: 44100 Hz")
|
|
print(f" - 时长: {len(audio)/44100:.2f} 秒")
|
|
|
|
# 保存音频
|
|
print(f"\n💾 保存音频到: {OUTPUT_FILE}")
|
|
sf.write(OUTPUT_FILE, audio, 44100)
|
|
|
|
# 验证文件
|
|
if os.path.exists(OUTPUT_FILE):
|
|
file_size = os.path.getsize(OUTPUT_FILE)
|
|
print(f"✅ 音频保存成功!")
|
|
print(f"📊 文件大小: {file_size} 字节 ({file_size/1024:.2f} KB)")
|
|
|
|
# 检查目录内容
|
|
print(f"\n📁 目录 {OUTPUT_DIR} 内容:")
|
|
for item in os.listdir(OUTPUT_DIR):
|
|
item_path = os.path.join(OUTPUT_DIR, item)
|
|
if os.path.isfile(item_path):
|
|
print(f" 📄 {item} ({os.path.getsize(item_path)} 字节)")
|
|
else:
|
|
print(f"❌ 音频保存失败!")
|
|
|
|
print(f"\n🎉 任务完成!")
|