This repository has been archived on 2026-08-12. You can view files and clone it. You cannot open issues or pull requests or push a commit.
Files
Cyrene/scripts/voice/test_rvc.py
T
AskaEth 41f653b672 refactor: QQ → OBv11 重命名 + 平台格式统一抽象
- 所有对外称呼从 QQ 改为 OBv11(注释/提示词/日志/配置项)
- 新增 PlatformFormat 结构体,统一管理平台消息标记格式
- defaultPlatformFormats() 注册表替代硬编码 qqTargetRe
- extractProactiveMessage 改为 Thinker 方法,遍历格式注册表匹配
- 配置项重命名: QQ_BOT_PORT → OBV11_BOT_PORT, QQBotPort → OBv11BotPort
- 标记格式: 【QQ群聊】→【OBv11群聊】、【QQ私聊】→【OBv11私聊】

Co-Authored-By: Claude <noreply@anthropic.com>
2026-06-22 20:48:07 +08:00

104 lines
3.2 KiB
Python

#!/usr/bin/env python3
"""
RVC 模型推理测试。纯 CPU 模式。
两个音频:参考音频 (提取昔涟音色) + 输入音频 (要转换的声音)
"""
import os, sys, time, warnings
warnings.filterwarnings('ignore')
# 添加 RVC 到路径
sys.path.insert(0, os.path.join(os.path.dirname(__file__), 'rvc'))
import torch
import librosa
import soundfile as sf
import numpy as np
from infer.modules.vc.modules import VC
# === 配置 ===
MODEL_PATH = r"D:\Users\Aska\Documents\G_2333333.pth"
HUBERT_PATH = r"D:\Project\Code\Uni\Cyrene\scripts\voice\rvc\assets\hubert\hubert_base.pt"
REF_AUDIO = r"D:\Project\Code\Uni\Cyrene-Voice-Model\data\cyrene_group01\VoBanks31_0078_004ab065.wav" # 昔涟参考
INPUT_AUDIO = REF_AUDIO # 测试: 用同一文件验证模型能正确重建
OUTPUT_AUDIO = r"D:\Users\Aska\Documents\rvc_test_output.wav"
print("=" * 50)
print("RVC 推理测试 (CPU)")
print("=" * 50)
# 检查文件
for label, path in [("模型", MODEL_PATH), ("HuBERT", HUBERT_PATH), ("参考音频", REF_AUDIO)]:
if not os.path.exists(path):
print(f"[ERROR] {label} 不存在: {path}")
sys.exit(1)
print(f"[OK] {label}: {os.path.getsize(path)/1024/1024:.1f} MB")
# 加载参考音频
print(f"\n[1/3] 加载参考音频...")
ref_audio, ref_sr = librosa.load(REF_AUDIO, sr=40000, mono=True)
print(f" 采样率: {ref_sr}Hz, 时长: {len(ref_audio)/ref_sr:.1f}s")
# 加载输入音频
print(f"[2/3] 加载输入音频...")
input_audio, input_sr = librosa.load(INPUT_AUDIO, sr=40000, mono=True)
print(f" 采样率: {input_sr}Hz, 时长: {len(input_audio)/input_sr:.1f}s")
# 推理
print(f"[3/3] RVC 推理中...")
t0 = time.time()
# 路径中有中文,先复制到临时路径
import tempfile, shutil
tmp_dir = tempfile.mkdtemp()
tmp_model = os.path.join(tmp_dir, "model.pth")
tmp_ref = os.path.join(tmp_dir, "ref.wav")
tmp_input = os.path.join(tmp_dir, "input.wav")
shutil.copy(MODEL_PATH, tmp_model)
sf.write(tmp_ref, ref_audio, 40000)
sf.write(tmp_input, input_audio, 40000)
# 保存当前目录
old_cwd = os.getcwd()
rvc_dir = os.path.join(os.path.dirname(__file__), 'rvc')
os.chdir(rvc_dir)
# RVC 需要 assets/hubert/hubert_base.pt
os.makedirs('assets/hubert', exist_ok=True)
if not os.path.exists('assets/hubert/hubert_base.pt'):
import shutil as _sh
_sh.copy(HUBERT_PATH, 'assets/hubert/hubert_base.pt')
try:
# 初始化 VC pipeline
vc = VC()
vc.get_vc(tmp_model, device="cpu", use_jit=False)
# 转换
output, output_sr = vc.vc_single(
sid=0,
input_audio_path=tmp_input,
f0_up_key=0, # 不改变音高
f0_file=None,
f0_method="rmvpe",
file_index="", # 不使用 index
file_index2="",
index_rate=0,
filter_radius=3,
resample_sr=40000,
rms_mix_rate=0.25,
protect=0.33,
)
elapsed = time.time() - t0
print(f"\n 完成! 耗时: {elapsed:.1f}s")
print(f" 输出采样率: {output_sr}Hz, 时长: {len(output)/output_sr:.1f}s")
# 保存
sf.write(OUTPUT_AUDIO, output, output_sr)
print(f" 已保存: {OUTPUT_AUDIO}")
finally:
os.chdir(old_cwd)
shutil.rmtree(tmp_dir, ignore_errors=True)
print(f"\n试听: {OUTPUT_AUDIO}")