From 3e1c3a235ca4858e3c56f11a51b9ad630c76c9b3 Mon Sep 17 00:00:00 2001 From: MistEO Date: Mon, 27 Feb 2023 16:03:15 +0800 Subject: [PATCH 1/2] feat: Add force slice option --- inference_main.py | 56 ++++++++++++++++++++++++++++++++--------------- 1 file changed, 38 insertions(+), 18 deletions(-) diff --git a/inference_main.py b/inference_main.py index f869369..e0f0e98 100644 --- a/inference_main.py +++ b/inference_main.py @@ -37,6 +37,7 @@ def main(): # 不用动的部分 parser.add_argument('-sd', '--slice_db', type=int, default=-40, help='默认-40,嘈杂的音频可以-30,干声保留呼吸可以-50') + parser.add_argument('-sf', '--slice_forced', type=int, default=0, help='强制切片,会在db切片的基础上再切一次,填入切片长度(秒),0则不切片') parser.add_argument('-d', '--device', type=str, default=None, help='推理设备,None则为自动选择cpu和gpu') parser.add_argument('-ns', '--noice_scale', type=float, default=0.4, help='噪音级别,会影响咬字和音质,较为玄学') parser.add_argument('-p', '--pad_seconds', type=float, default=0.5, help='推理音频pad秒数,由于未知原因开头结尾会有异响,pad一小段静音段后就不会出现') @@ -69,29 +70,48 @@ def main(): for spk in spk_list: audio = [] for (slice_tag, data) in audio_data: - print(f'#=====segment start, {round(len(data) / audio_sr, 3)}s======') + def len_in_secs(length): + return round(length / audio_sr, 3) + + def get_length(data): + return int(np.ceil(len(data) / audio_sr * svc_model.target_sample)) + + data_secs = len_in_secs(len(data)) + length = get_length(data) + print(f'#=====segment start, {data_secs}s======') - length = int(np.ceil(len(data) / audio_sr * svc_model.target_sample)) if slice_tag: print('jump empty segment') _audio = np.zeros(length) + audio.extend(list(infer_tool.pad_array(_audio, length))) else: - # padd - pad_len = int(audio_sr * pad_seconds) - data = np.concatenate([np.zeros([pad_len]), data, np.zeros([pad_len])]) - raw_path = io.BytesIO() - soundfile.write(raw_path, data, audio_sr, format="wav") - raw_path.seek(0) - out_audio, out_sr = svc_model.infer(spk, tran, raw_path, - cluster_infer_ratio=cluster_infer_ratio, - auto_predict_f0=auto_predict_f0, - noice_scale=noice_scale - ) - _audio = out_audio.cpu().numpy() - pad_len = int(svc_model.target_sample * pad_seconds) - _audio = _audio[pad_len:-pad_len] - - audio.extend(list(infer_tool.pad_array(_audio, length))) + def pad_and_infer(data): + # padd + pad_len = int(audio_sr * pad_seconds) + data = np.concatenate([np.zeros([pad_len]), data, np.zeros([pad_len])]) + data_with_pad = io.BytesIO() + soundfile.write(data_with_pad, data, audio_sr, format="wav") + data_with_pad.seek(0) + out_audio, out_sr = svc_model.infer(spk, tran, data_with_pad, + cluster_infer_ratio=cluster_infer_ratio, + auto_predict_f0=auto_predict_f0, + noice_scale=noice_scale) + _audio = out_audio.cpu().numpy() + pad_len = int(svc_model.target_sample * pad_seconds) + _audio = _audio[pad_len:-pad_len] + return _audio + + if data_secs > args.slice_forced: + step = int(args.slice_forced * audio_sr) + for i in range(0, len(data), step): + ends = i + step if i + step < len(data) else len(data) + print(f'forced slice {len_in_secs(i)}~{len_in_secs(ends)}') + _audio = pad_and_infer(data[i:ends]) + audio.extend(list(infer_tool.pad_array(_audio, get_length(data[i:ends])))) + else: + _audio = pad_and_infer(data) + audio.extend(list(infer_tool.pad_array(_audio, length))) + key = "auto" if auto_predict_f0 else f"{tran}key" cluster_name = "" if cluster_infer_ratio == 0 else f"_{cluster_infer_ratio}" res_path = f'./results/{clean_name}_{key}_{spk}{cluster_name}.{wav_format}' From 39b8527b1f3c209a7ded3882c6688c625cf60718 Mon Sep 17 00:00:00 2001 From: MistEO Date: Tue, 28 Feb 2023 00:36:06 +0800 Subject: [PATCH 2/2] fix: fix force slice --- inference_main.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/inference_main.py b/inference_main.py index e0f0e98..e73260e 100644 --- a/inference_main.py +++ b/inference_main.py @@ -101,7 +101,7 @@ def pad_and_infer(data): _audio = _audio[pad_len:-pad_len] return _audio - if data_secs > args.slice_forced: + if args.slice_forced > 0 and data_secs > args.slice_forced: step = int(args.slice_forced * audio_sr) for i in range(0, len(data), step): ends = i + step if i + step < len(data) else len(data)