sovits-xiaoke / app.py
sayashi's picture
Update app.py
9b0c0d4
# 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(
"# <center> AI小可\n"
"<div align='center'>输入音频应为尽可能干净的人声</div>"
'<div align="center"><a><font color="#dd0000">可使用UVR5/demucs分离人声和BGM</font></a></div>'
)
with gr.Row():
with gr.Column():
input_audio = gr.inputs.Audio(label="待转换音频")
vc = gr.inputs.Number(label="音高调整", default=0)
btn = gr.Button(value="生成")
with gr.Column():
o1 = gr.Textbox(label="Output Message")
o2 = gr.Audio(label="Output Audio", elem_id=f"vc-audio")
o3 = gr.Textbox(label="Extra Info")
download = gr.Button("Download Audio")
btn.click(sovits, inputs=[input_audio, vc], outputs=[o1, o2, o3])
download.click(None, [], [], _js=download_audio_js.format(audio_id=f"vc-audio"))
with gr.Row():
gr.Examples(
label="示例",
examples=[
["examples/你够不够我这样洒脱.wav", 0],
["examples/CREAM - Girl Like Me_(Vocals).wav", 0],
["examples/何嘉嘉Gaga - 难念的经_(Vocals).wav", 0],
["examples/何嘉嘉Gaga - 难念的经2_(Vocals).wav", 0],
],
inputs=[input_audio, vc],
outputs=[o1, o2, o3],
fn=sovits,
cache_examples=True)
app.queue(concurrency_count=1).launch()