RVC-Boss/GPT-SoVITS

关于一些加速做法的询问

Open

#2,467 opened on Jun 15, 2025

View on GitHub
 (27 comments) (3 reactions) (0 assignees)Python (57,476 stars) (6,271 forks)batch import
In follow-upgood first issue

Description

    codes = gpt_sovits.vits.vq_model.extract_latent(ssl_content)
    prompt_semantic = codes[0, 0]
    prompts = prompt_semantic.unsqueeze(0)

    audio_16k = resamplex(ref_audio_sr, 32000, 16000).to(ref_audio_sr.dtype)
    sv_emb = gpt_sovits.sv_model(audio_16k)
    ts = time.time()
    pred_semantic = gpt_sovits.t2s(prompts, ref_seq, text_seq, ref_bert, text_bert, top_k)
    print("pred_semantic.shape",pred_semantic.shape)
    te = time.time()
    print(f"t2s time: {te - ts:.4f} seconds")
    audio = gpt_sovits.vits(text_seq, pred_semantic, ref_audio_sr, 1.0, sv_emb)
    print(f"vits time: {time.time() - te:.4f} seconds")
    print("audio.shape", audio.shape)    
    
    # audio = gpt_sovits(ssl_content, ref_audio_sr, ref_seq, text_seq, ref_bert, text_bert, top_k)
    print("start write wav1")
    soundfile.write("out1.wav", audio.float().detach().cpu().numpy(), 32000)

    audio = gpt_sovits.vits(text_seq, pred_semantic[:,:,:200], ref_audio_sr, 1.0, sv_emb)
    print("audio.shape", audio.shape)
    print("start write wav2")
    soundfile.write("out2.wav", audio.float().detach().cpu().numpy(), 32000)

    audio = gpt_sovits.vits(text_seq, pred_semantic[:,:,200:], ref_audio_sr, 1.0, sv_emb)
    print("audio.shape", audio.shape)
    print("start write wav3")
    soundfile.write("out3.wav", audio.float().detach().cpu().numpy(), 32000)

我并不懂 GPT-Sovits 的原理。但是我想让 torchScript 的模型更快出声音。然后我发现我的瓶颈在 t2s(应该是 gpt) 的部分。 于是我自然而然的想到了能不能在 t2s 输出一部分的时候(因为它是一个循环嘛)就丢给 vits先生成声音 (streaming)。而且 我发现 t2s 的输出长度 和 audio 有线性关系。 于是我今天尝试了一段这样的代码。将 t2s 的 output pred_semantic 分段送入 vits 部分。 结果我感觉听起来还挺正常。但是 vits 的输入包含 text_seq ,这个是没有分段的。 所以我想请问如果从原理上来说,vits 输入的 text_seq 跟最后的 audio 有很强的关联性吗?我的想法:在 t2s 生成 pred_semantic 的同时直接进行下一步的 vits 部分可以吗?因为如果这样的改动ok, 那么 gpt-sovits 的实时性将会有极大的提升(首 token 会非常快) @RVC-Boss

Contributor guide