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