59 lines
2.4 KiB
Python
59 lines
2.4 KiB
Python
|
import io
|
|||
|
import os.path
|
|||
|
from pathlib import Path
|
|||
|
|
|||
|
import numpy as np
|
|||
|
import soundfile
|
|||
|
|
|||
|
from infer_tools import infer_tool
|
|||
|
from infer_tools.infer_tool import Svc
|
|||
|
from utils.hparams import hparams
|
|||
|
|
|||
|
|
|||
|
def run_clip(raw_audio_path, svc_model, key, acc, use_crepe, spk_id=0, auto_key=False, units_mode=False):
|
|||
|
infer_tool.format_wav(raw_audio_path)
|
|||
|
key = svc_model.evaluate_key(raw_audio_path, key, auto_key)
|
|||
|
_f0_tst, _f0_pred, _audio = svc_model.infer(raw_audio_path, key=key, acc=acc, use_crepe=use_crepe, spk_id=spk_id,
|
|||
|
singer=not units_mode)
|
|||
|
if units_mode:
|
|||
|
out_path = io.BytesIO()
|
|||
|
soundfile.write(out_path, _audio, hparams["audio_sample_rate"], format='wav')
|
|||
|
out_path.seek(0)
|
|||
|
npy_path = Path(raw_audio_path).with_suffix(".npy")
|
|||
|
np.save(str(npy_path), svc_model.hubert.encode(out_path))
|
|||
|
else:
|
|||
|
out_path = f'./singer_data/{Path(raw_audio_path).name}'
|
|||
|
soundfile.write(out_path, _audio, hparams["audio_sample_rate"], 'PCM_16')
|
|||
|
|
|||
|
|
|||
|
if __name__ == '__main__':
|
|||
|
# 工程文件夹名,训练时用的那个
|
|||
|
project_name = "fox_cn"
|
|||
|
model_path = f'./checkpoints/{project_name}/model_ckpt_steps_370000.ckpt'
|
|||
|
config_path = f'./checkpoints/{project_name}/config.yaml'
|
|||
|
|
|||
|
# 此脚本为批量导出短音频(30s内)使用,同时生成f0、mel供diffsinger使用。
|
|||
|
# 支持wav文件,放在batch文件夹下,带扩展名
|
|||
|
wav_paths = infer_tool.get_end_file("./batch", "wav")
|
|||
|
trans = -6 # 音高调整,支持正负(半音)
|
|||
|
spk_id = 0 # 非多人模型不改
|
|||
|
# 特化专用,开启此项后,仅导出变更音色的units至batch目录,其余项不输出;关闭此项则切换为对接diffsinger的套娃导出模式
|
|||
|
units = True
|
|||
|
# 自适应变调,不懂别开
|
|||
|
auto_key = False
|
|||
|
# 加速倍数
|
|||
|
accelerate = 10
|
|||
|
|
|||
|
# 下面不动
|
|||
|
os.makedirs("./singer_data", exist_ok=True)
|
|||
|
model = Svc(project_name, config_path, hubert_gpu=True, model_path=model_path)
|
|||
|
count = 0
|
|||
|
for audio_path in wav_paths:
|
|||
|
count += 1
|
|||
|
if os.path.exists(Path(audio_path).with_suffix(".npy")) and units:
|
|||
|
print(f"{audio_path}:units已存在,跳过")
|
|||
|
continue
|
|||
|
run_clip(audio_path, model, trans, accelerate, spk_id=spk_id, auto_key=auto_key, use_crepe=False,
|
|||
|
units_mode=units)
|
|||
|
print(f"\r\nnum:{count}\r\ntotal process:{round(count * 100 / len(wav_paths), 2)}%\r\n")
|