1import json
2import soundfile as sf
3from voxcpm.core import VoxCPM
4from voxcpm.model.voxcpm import LoRAConfig
5
6# 配置基础模型路径(示例路径,请根据实际情况修改)
7base_model_path = "G:\mergelora\嫦娥_拒霜思"
8
9# 配置输出文件路径(示例路径,请根据实际情况修改)
10output_wav_path = "G:\mergelora\嫦娥_拒霜思\output.wav"
11
12# 自动设置LoRA检查点目录和提示文件路径
13lora_ckpt_dir = f"{base_model_path}/step_0002000"
14prompt_wav_path = f"{base_model_path}/1.wav"
15prompt_jsonl_path = f"{base_model_path}/1.jsonl"
16
17# 加载LoRA配置
18with open(f"{lora_ckpt_dir}/lora_config.json") as f:
19 lora_info = json.load(f)
20
21# 修改base_model路径为当前模型路径
22lora_info["base_model"] = base_model_path
23lora_cfg = LoRAConfig(**lora_info["lora_config"])
24
25# 加载模型和LoRA权重
26model = VoxCPM.from_pretrained(
27 hf_model_id=base_model_path,
28 lora_config=lora_cfg,
29 lora_weights_path=lora_ckpt_dir,
30)
31
32# 读取提示文本
33with open(prompt_jsonl_path, "r", encoding="utf-8") as f:
34 prompt_data = json.loads(f.read().strip())
35 prompt_text = prompt_data["text"]
36
37# 生成语音
38wav = model.generate(
39 text="你叫什么名字,我叫嫦娥。", # 要生成的文本内容
40 prompt_wav_path=prompt_wav_path, # 提示音频路径,用于声音克隆
41 prompt_text=prompt_text, # 提示文本,与提示音频对应的文本内容
42 cfg_value=2.0, # LocDiT的语言模型引导强度,值越高对提示音频的 adherence 越强,但可能导致质量下降
43 inference_timesteps=10, # LocDiT推理的时间步数,值越高生成质量越好,但速度越慢
44 normalize=False, # 是否启用外部TN(文本规范化)工具,启用后将禁用原生raw text支持
45 denoise=False, # 是否启用外部降噪工具,启用后可能导致失真并限制采样率为16kHz
46 retry_badcase=True, # 是否启用坏例重试模式,用于处理一些困难案例(不可中断)
47 retry_badcase_max_times=3, # 坏例重试的最大次数
48 retry_badcase_ratio_threshold=6.0, # 坏例检测的最大长度限制(简单但有效),可根据慢速语音调整
49)
50
51sf.write(output_wav_path, wav, model.tts_model.sample_rate) # 保存输出文件
52print(f"saved: {output_wav_path}")