# coding=utf-8 import time import gradio as gr import librosa import numpy as np import soundfile import io from inference.infer_tool import Svc import logging logging.getLogger("numba").setLevel(logging.WARNING) model_path = "model/model.pth" config_path = "model/config.json" svc_model = Svc(model_path, config_path) def sovits(input_audio, vc_transform): start = time.perf_counter() if input_audio is None: return "请上传音频", None, None sampling_rate, audio = input_audio duration = audio.shape[0] / sampling_rate if duration > 30: return "请上传小于30s的音频,长音频的转换请在本地进行", None, None audio = (audio / np.iinfo(audio.dtype).max).astype(np.float32) if len(audio.shape) > 1: audio = librosa.to_mono(audio.transpose(1, 0)) if sampling_rate != 24000: audio = librosa.resample(audio, orig_sr=sampling_rate, target_sr=24000) out_wav_path = io.BytesIO() soundfile.write(out_wav_path, audio, 24000, format="wav") out_wav_path.seek(0) sid = 'xiaoke' out_audio, out_sr = svc_model.infer(sid, vc_transform, out_wav_path) _audio = out_audio.cpu().numpy() return "生成成功!", (48000, _audio), f"生成耗时 {round(time.perf_counter()-start, 2)} s" download_audio_js = """ () =>{{ let root = document.querySelector("body > gradio-app"); if (root.shadowRoot != null) root = root.shadowRoot; let audio = root.querySelector("#{audio_id}").querySelector("audio"); if (audio == undefined) return; audio = audio.src; let oA = document.createElement("a"); oA.download = Math.floor(Math.random()*100000000)+'.wav'; oA.href = audio; document.body.appendChild(oA); oA.click(); oA.remove(); }} """ if __name__ == '__main__': with gr.Blocks() as app: gr.Markdown( "#