Retrieval-based-Voice-Conversion-WebUI icon indicating copy to clipboard operation
Retrieval-based-Voice-Conversion-WebUI copied to clipboard

rvc导出的onnx模型做实时变声推理,声音不连续

Open EbanShen opened this issue 1 year ago • 12 comments

环境: RVC版本:https://github.com/RVC-Project/Retrieval-based-Voice-Conversion-WebUI.git -- RVC的git仓库最新提交版本 使用以下脚本导出的onnx:https://github.com/RVC-Project/Retrieval-based-Voice-Conversion-WebUI/blob/main/tools/export_onnx.py 原模型为rvc自带的keruanV1.pth,导出模型为keruanV1.onnx,确认生成的是动态模型。

现象: 由于是做实时变声推理,因此每次送入模型的数据片段会很短,大概7200个采样。但输出的数据片段并不能很好的衔接在一起。如:片段A、B、C,在从麦克风进来后,三个数据片段的声音是连续的,但从变声器出来后,听感上A会高一些,B会低一些,而且三个片段的衔接处也无法丝滑过渡,会导致衔接处播放时产生噪音。实际听感就是,变声后的声音会周期性出现“点点点”的声音。

所做的尝试:

  1. 参考https://github.com/RVC-Project/Retrieval-based-Voice-Conversion-WebUI/blob/main/gui_v1.py中对推理后数据的处理。增加了交叉淡化算法,但收效甚微。
// 计算当前返回帧的头部淡化效果
auto fo_head = in_buf + sola_offset;
auto fo_tail = fo_head + block_frame;
for (size_t i = 0; i < sola_buffer_frame; i++) {
    fo_head[i] *= fade_in_window[i];
    fo_head[i] += (sola_buffer[i] * fade_out_window[i]);
}
memcpy(sola_buffer, fo_tail, sola_buffer_frame * sizeof(float_t));
  1. 利用ffmpeg的acrossfade滤镜进行处理,但得到的结果一样,效果不大。
  2. 增加每次送入模型的数据量,通过滑动窗口的方式返回数据。如:我会缓存500ms左右的历史变声前数据,新的7200个采样到来后会从缓存尾部推入,缓存头部则会被挤出7200个采样,将整个缓存数据送入变声器。取输出数据尾部的7200个采样返回。
  3. 将3中返回窗口分别设置在输出数据的头部、中部、尾部,均未得到特别好的效果,也将这种窗口形式与1/2中的交叉淡化结合,亦无明显效果。

请问是否有什么办法,能让每次推理的数据片段能衔接起来,让声音连续呢?

EbanShen avatar Aug 31 '24 03:08 EbanShen

请问不同片段之间有重叠部分吗

UkiTenzai avatar Sep 06 '24 12:09 UkiTenzai

请问不同片段之间有重叠部分吗

输入片段是由麦克风采集获得的,每个输入片段之间是没有重叠部分的

EbanShen avatar Sep 09 '24 04:09 EbanShen

请问不同片段之间有重叠部分吗

输入片段是由麦克风采集获得的,每个输入片段之间是没有重叠部分的

我也是这个问题,我觉得应该就是不重叠分帧导致的

UkiTenzai avatar Sep 09 '24 14:09 UkiTenzai

同样吞字,想看看你是怎么写的推理

Zer0TheObserver avatar Sep 10 '24 15:09 Zer0TheObserver

请问不同片段之间有重叠部分吗

输入片段是由麦克风采集获得的,每个输入片段之间是没有重叠部分的

我也是这个问题,我觉得应该就是不重叠分帧导致的

尝试过使用缓存保留部分历史数据,与新数据一起送入推理引擎,然后每次取固定部位的数据返回,但每次返回的片段依然会有衔接不上的问题。

EbanShen avatar Sep 10 '24 23:09 EbanShen

同样吞字,想看看你是怎么写的推理

我目前就是用历史缓存+新数据送入推理引擎,每次返回取前面部分,但依然会有衔接不上的问题

EbanShen avatar Sep 11 '24 00:09 EbanShen

目前在尝试用libtorch复刻RVC的处理流程。 之前用onnxruntime推理onnx模型,不知道是不是小引擎对某些算子不支持,所以小片段推理问题较多。

EbanShen avatar Sep 12 '24 13:09 EbanShen

目前在尝试用libtorch复刻RVC的处理流程。 之前用onnxruntime推理onnx模型,不知道是不是小引擎对某些算子不支持,所以小片段推理问题较多。

意思是不用onnx 单纯用torch推理 衔接效果还不错吗

UkiTenzai avatar Sep 12 '24 14:09 UkiTenzai

目前在尝试用libtorch复刻RVC的处理流程。 之前用onnxruntime推理onnx模型,不知道是不是小引擎对某些算子不支持,所以小片段推理问题较多。

据我所知 Google开源的神经音频编解码器Lyra 如果用官方给的tflite 是可以不重叠分帧直接流式在线推理的 生成音频没有任何不连贯的感觉 但是如果转成onnx用onnx推理 生成音频会很吵

UkiTenzai avatar Sep 12 '24 14:09 UkiTenzai

目前在尝试用libtorch复刻RVC的处理流程。 之前用onnxruntime推理onnx模型,不知道是不是小引擎对某些算子不支持,所以小片段推理问

那您打算导出 torchscript 模型吗?

能分享一下你的代码吗?

botoxparty avatar Mar 04 '25 22:03 botoxparty

你好,请问你是用C++去写的么?我是只会C++的小白,但是在执行onnx_inference_demo.py,都出现ValueError: cannot reshape array of size 184320 into shape (1,2,721,1439)。可以分享一下代码,或者帮忙交流一下吗?

不好意思 我不是做这个项目的 我只是在Google冲浪看到了这个issue 你可以问一下别人或者自己print中间的tensor的shape看看是什么原因

UkiTenzai avatar Jul 25 '25 12:07 UkiTenzai

你可以用滑动窗口的方式推理,每次都会取前面的数据做一下连接淡化处理。目前我用C++跑了,windows效果还可以。就是mac下延迟1500ms。无法接受,目前还在找原因

CMJ1235 avatar Nov 13 '25 10:11 CMJ1235